Flint2-0.1.0.2: src/Data/Number/Flint/Calcium/Ca/Mat/FFI.hsc
module Data.Number.Flint.Calcium.Ca.Mat.FFI (
-- * Matrices over the real and complex numbers
CaMat (..)
, CCaMat (..)
, newCaMat
, withCaMat
, withNewCaMat
-- * Types, macros and constants
, ca_mat_entry
, ca_mat_entry_ptr
-- * Memory management
, ca_mat_init
, ca_mat_clear
, ca_mat_swap
, ca_mat_window_init
, ca_mat_window_clear
-- * Assignment and conversions
, ca_mat_set
, ca_mat_set_fmpz_mat
, ca_mat_set_fmpq_mat
, ca_mat_set_ca
, ca_mat_transfer
-- * Random generation
, ca_mat_randtest
, ca_mat_randtest_rational
, ca_mat_randops
-- * Input and output
, ca_mat_get_str
, ca_mat_fprint
, ca_mat_print
, ca_mat_printn
-- * Special matrices
, ca_mat_zero
, ca_mat_one
, ca_mat_ones
, ca_mat_pascal
, ca_mat_stirling
, ca_mat_hilbert
, ca_mat_dft
-- * Comparisons and properties
, ca_mat_check_equal
, ca_mat_check_is_zero
, ca_mat_check_is_one
-- * Conjugate and transpose
, ca_mat_transpose
, ca_mat_conj
, ca_mat_conj_transpose
-- * Arithmetic
, ca_mat_neg
, ca_mat_add
, ca_mat_sub
, ca_mat_mul_classical
, ca_mat_mul_same_nf
, ca_mat_mul
, ca_mat_mul_si
, ca_mat_mul_fmpz
, ca_mat_mul_fmpq
, ca_mat_mul_ca
, ca_mat_div_si
, ca_mat_div_fmpz
, ca_mat_div_fmpq
, ca_mat_div_ca
, ca_mat_add_ca
, ca_mat_sub_ca
, ca_mat_addmul_ca
, ca_mat_submul_ca
-- * Powers
, ca_mat_sqr
, ca_mat_pow_ui_binexp
-- * Polynomial evaluation
, _ca_mat_ca_poly_evaluate
, ca_mat_ca_poly_evaluate
-- * Gaussian elimination and LU decomposition
, ca_mat_find_pivot
, ca_mat_lu_classical
, ca_mat_lu_recursive
, ca_mat_lu
, ca_mat_fflu
, ca_mat_nonsingular_lu
, ca_mat_nonsingular_fflu
-- * Solving and inverse
, ca_mat_inv
, ca_mat_nonsingular_solve_adjugate
, ca_mat_nonsingular_solve_fflu
, ca_mat_nonsingular_solve_lu
, ca_mat_nonsingular_solve
, ca_mat_solve_tril_classical
, ca_mat_solve_tril_recursive
, ca_mat_solve_tril
, ca_mat_solve_triu_classical
, ca_mat_solve_triu_recursive
, ca_mat_solve_triu
, ca_mat_solve_fflu_precomp
, ca_mat_solve_lu_precomp
-- * Rank and echelon form
, ca_mat_rank
, ca_mat_rref_fflu
, ca_mat_rref_lu
, ca_mat_rref
, ca_mat_right_kernel
-- * Determinant and trace
, ca_mat_trace
, ca_mat_det_berkowitz
, ca_mat_det_lu
, ca_mat_det_bareiss
, ca_mat_det_cofactor
, ca_mat_det
, ca_mat_adjugate_cofactor
, ca_mat_adjugate_charpoly
, ca_mat_adjugate
-- * Characteristic polynomial
, _ca_mat_charpoly_berkowitz
, ca_mat_charpoly_berkowitz
, _ca_mat_charpoly_danilevsky
, ca_mat_charpoly_danilevsky
, _ca_mat_charpoly
, ca_mat_charpoly
, ca_mat_companion
-- * Eigenvalues and eigenvectors
, ca_mat_eigenvalues
, ca_mat_diagonalization
-- * Jordan canonical form
, ca_mat_jordan_blocks
, ca_mat_set_jordan_blocks
, ca_mat_jordan_transformation
, ca_mat_jordan_form
-- * Matrix functions
, ca_mat_exp
, ca_mat_log
) where
-- Matrices over the real and complex numbers ----------------------------------
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.C.Types
import Foreign.C.String
import Foreign.Storable
import Data.Number.Flint.Flint
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Mat
import Data.Number.Flint.Fmpq
import Data.Number.Flint.Fmpq.Mat
import Data.Number.Flint.Calcium
import Data.Number.Flint.Calcium.Ca
import Data.Number.Flint.Calcium.Ca.Types
#include <flint/ca_mat.h>
-- ca_mat_t --------------------------------------------------------------------
instance Storable CCaMat where
{-# INLINE sizeOf #-}
sizeOf _ = #{size ca_mat_t}
{-# INLINE alignment #-}
alignment _ = #{alignment ca_mat_t}
peek ptr = CCaMat
<$> #{peek ca_mat_struct, entries} ptr
<*> #{peek ca_mat_struct, r } ptr
<*> #{peek ca_mat_struct, c } ptr
<*> #{peek ca_mat_struct, rows } ptr
poke = error "CCaMat.poke: Not defined."
newCaMat rows cols ctx@(CaCtx fctx) = do
x <- mallocForeignPtr
withForeignPtr x $ \xp -> do
withCaCtx ctx $ \ctxp -> do
ca_mat_init xp rows cols ctxp
addForeignPtrFinalizerEnv p_ca_mat_clear xp fctx
return $ CaMat x
{-# INLINE withCaMat #-}
withCaMat (CaMat x) f = do
withForeignPtr x $ \px -> f px >>= return . (CaMat x,)
{-# INLINE withNewCaMat #-}
withNewCaMat rows cols ctx f = do
x <- newCaMat rows cols ctx
withCaMat x f
--------------------------------------------------------------------------------
-- | /ca_mat_entry_ptr/ /mat/ /i/ /j/
--
-- Returns a pointer to the entry at row /i/ and column /j/. Equivalent to
-- @ca_mat_entry@ but implemented as a function.
foreign import ccall "ca_mat.h ca_mat_entry_ptr"
ca_mat_entry_ptr :: Ptr CCaMat -> CLong -> CLong -> IO (Ptr CCa)
ca_mat_entry = ca_mat_entry_ptr
-- Memory management -----------------------------------------------------------
-- | /ca_mat_init/ /mat/ /r/ /c/ /ctx/
--
-- Initializes the matrix, setting it to the zero matrix with /r/ rows and
-- /c/ columns.
foreign import ccall "ca_mat.h ca_mat_init"
ca_mat_init :: Ptr CCaMat -> CLong -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_clear/ /mat/ /ctx/
--
-- Clears the matrix, deallocating all entries.
foreign import ccall "ca_mat.h ca_mat_clear"
ca_mat_clear :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
foreign import ccall "ca_mat.h &ca_mat_clear"
p_ca_mat_clear :: FunPtr (Ptr CCaMat -> Ptr CCaCtx -> IO ())
-- | /ca_mat_swap/ /mat1/ /mat2/ /ctx/
--
-- Efficiently swaps /mat1/ and /mat2/.
foreign import ccall "ca_mat.h ca_mat_swap"
ca_mat_swap :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_window_init/ /window/ /mat/ /r1/ /c1/ /r2/ /c2/ /ctx/
--
-- Initializes /window/ to a window matrix into the submatrix of /mat/
-- starting at the corner at row /r1/ and column /c1/ (inclusive) and
-- ending at row /r2/ and column /c2/ (exclusive).
foreign import ccall "ca_mat.h ca_mat_window_init"
ca_mat_window_init :: Ptr CCaMat -> Ptr CCaMat -> CLong -> CLong -> CLong -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_window_clear/ /window/ /ctx/
--
-- Frees the window matrix.
foreign import ccall "ca_mat.h ca_mat_window_clear"
ca_mat_window_clear :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Assignment and conversions --------------------------------------------------
-- | /ca_mat_set/ /dest/ /src/ /ctx/
foreign import ccall "ca_mat.h ca_mat_set"
ca_mat_set :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_set_fmpz_mat/ /dest/ /src/ /ctx/
foreign import ccall "ca_mat.h ca_mat_set_fmpz_mat"
ca_mat_set_fmpz_mat :: Ptr CCaMat -> Ptr CFmpzMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_set_fmpq_mat/ /dest/ /src/ /ctx/
--
-- Sets /dest/ to /src/. The operands must have identical dimensions.
foreign import ccall "ca_mat.h ca_mat_set_fmpq_mat"
ca_mat_set_fmpq_mat :: Ptr CCaMat -> Ptr CFmpqMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_set_ca/ /mat/ /c/ /ctx/
--
-- Sets /mat/ to the matrix with the scalar /c/ on the main diagonal and
-- zeros elsewhere.
foreign import ccall "ca_mat.h ca_mat_set_ca"
ca_mat_set_ca :: Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_transfer/ /res/ /res_ctx/ /src/ /src_ctx/
--
-- Sets /res/ to /src/ where the corresponding context objects /res_ctx/
-- and /src_ctx/ may be different.
--
-- This operation preserves the mathematical value represented by /src/,
-- but may result in a different internal representation depending on the
-- settings of the context objects.
foreign import ccall "ca_mat.h ca_mat_transfer"
ca_mat_transfer :: Ptr CCaMat -> Ptr CCaCtx -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Random generation -----------------------------------------------------------
-- | /ca_mat_randtest/ /mat/ /state/ /depth/ /bits/ /ctx/
--
-- Sets /mat/ to a random matrix with entries having complexity up to
-- /depth/ and /bits/ (see @ca_randtest@).
foreign import ccall "ca_mat.h ca_mat_randtest"
ca_mat_randtest :: Ptr CCaMat -> Ptr CFRandState -> CLong -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_randtest_rational/ /mat/ /state/ /bits/ /ctx/
--
-- Sets /mat/ to a random rational matrix with entries up to /bits/ bits in
-- size.
foreign import ccall "ca_mat.h ca_mat_randtest_rational"
ca_mat_randtest_rational :: Ptr CCaMat -> Ptr CFRandState -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_randops/ /mat/ /state/ /count/ /ctx/
--
-- Randomizes /mat/ in-place by performing elementary row or column
-- operations. More precisely, at most count random additions or
-- subtractions of distinct rows and columns will be performed. This leaves
-- the rank (and for square matrices, the determinant) unchanged.
foreign import ccall "ca_mat.h ca_mat_randops"
ca_mat_randops :: Ptr CCaMat -> Ptr CFRandState -> CLong -> Ptr CCaCtx -> IO ()
-- Input and output ------------------------------------------------------------
foreign import ccall "ca_mat.h ca_mat_get_str"
ca_mat_get_str :: Ptr CCaMat -> Ptr CCaCtx -> IO CString
foreign import ccall "ca_mat.h ca_mat_fprint"
ca_mat_fprint :: Ptr CFile -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_print/ /mat/ /ctx/
--
-- Prints /mat/ to standard output. The entries are printed on separate
-- lines.
ca_mat_print :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
ca_mat_print mat ctx = do
printCStr (flip ca_mat_get_str ctx) mat
return ()
-- | /ca_mat_printn/ /mat/ /digits/ /ctx/
--
-- Prints a decimal representation of /mat/ with precision specified by
-- /digits/. The entries are comma-separated with square brackets and comma
-- separation for the rows.
foreign import ccall "ca_mat.h ca_mat_printn"
ca_mat_printn :: Ptr CCaMat -> CLong -> Ptr CCaCtx -> IO ()
-- Special matrices ------------------------------------------------------------
-- | /ca_mat_zero/ /mat/ /ctx/
--
-- Sets all entries in /mat/ to zero.
foreign import ccall "ca_mat.h ca_mat_zero"
ca_mat_zero :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_one/ /mat/ /ctx/
--
-- Sets the entries on the main diagonal of /mat/ to one, and all other
-- entries to zero.
foreign import ccall "ca_mat.h ca_mat_one"
ca_mat_one :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_ones/ /mat/ /ctx/
--
-- Sets all entries in /mat/ to one.
foreign import ccall "ca_mat.h ca_mat_ones"
ca_mat_ones :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_pascal/ /mat/ /triangular/ /ctx/
--
-- Sets /mat/ to a Pascal matrix, whose entries are binomial coefficients.
-- If /triangular/ is 0, constructs a full symmetric matrix with the rows
-- of Pascal\'s triangle as successive antidiagonals. If /triangular/ is 1,
-- constructs the upper triangular matrix with the rows of Pascal\'s
-- triangle as columns, and if /triangular/ is -1, constructs the lower
-- triangular matrix with the rows of Pascal\'s triangle as rows.
foreign import ccall "ca_mat.h ca_mat_pascal"
ca_mat_pascal :: Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_stirling/ /mat/ /kind/ /ctx/
--
-- Sets /mat/ to a Stirling matrix, whose entries are Stirling numbers. If
-- /kind/ is 0, the entries are set to the unsigned Stirling numbers of the
-- first kind. If /kind/ is 1, the entries are set to the signed Stirling
-- numbers of the first kind. If /kind/ is 2, the entries are set to the
-- Stirling numbers of the second kind.
foreign import ccall "ca_mat.h ca_mat_stirling"
ca_mat_stirling :: Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_hilbert/ /mat/ /ctx/
--
-- Sets /mat/ to the Hilbert matrix, which has entries
-- \(A_{i,j} = 1/(i+j+1)\).
foreign import ccall "ca_mat.h ca_mat_hilbert"
ca_mat_hilbert :: Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_dft/ /mat/ /type/ /ctx/
--
-- Sets /mat/ to the DFT (discrete Fourier transform) matrix of order /n/
-- where /n/ is the smallest dimension of /mat/ (if /mat/ is not square,
-- the matrix is extended periodically along the larger dimension). The
-- /type/ parameter selects between four different versions of the DFT
-- matrix (in which \(\omega = e^{2\pi i/n}\)):
--
-- - Type 0 -- entries \(A_{j,k} = \omega^{-jk}\)
-- - Type 1 -- entries \(A_{j,k} = \omega^{jk} / n\)
-- - Type 2 -- entries \(A_{j,k} = \omega^{-jk} / \sqrt{n}\)
-- - Type 3 -- entries \(A_{j,k} = \omega^{jk} / \sqrt{n}\)
--
-- The type 0 and 1 matrices are inverse pairs, and similarly for the type
-- 2 and 3 matrices.
foreign import ccall "ca_mat.h ca_mat_dft"
ca_mat_dft :: Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- Comparisons and properties --------------------------------------------------
-- | /ca_mat_check_equal/ /A/ /B/ /ctx/
--
-- Compares /A/ and /B/ for equality.
foreign import ccall "ca_mat.h ca_mat_check_equal"
ca_mat_check_equal :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_check_is_zero/ /A/ /ctx/
--
-- Tests if /A/ is the zero matrix.
foreign import ccall "ca_mat.h ca_mat_check_is_zero"
ca_mat_check_is_zero :: Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_check_is_one/ /A/ /ctx/
--
-- Tests if /A/ has ones on the main diagonal and zeros elsewhere.
foreign import ccall "ca_mat.h ca_mat_check_is_one"
ca_mat_check_is_one :: Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- Conjugate and transpose -----------------------------------------------------
-- | /ca_mat_transpose/ /res/ /A/ /ctx/
--
-- Sets /res/ to the transpose of /A/.
foreign import ccall "ca_mat.h ca_mat_transpose"
ca_mat_transpose :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_conj/ /res/ /A/ /ctx/
--
-- Sets /res/ to the entrywise complex conjugate of /A/.
foreign import ccall "ca_mat.h ca_mat_conj"
ca_mat_conj :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_conj_transpose/ /res/ /A/ /ctx/
--
-- Sets /res/ to the conjugate transpose (Hermitian transpose) of /A/.
foreign import ccall "ca_mat.h ca_mat_conj_transpose"
ca_mat_conj_transpose :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Arithmetic ------------------------------------------------------------------
-- | /ca_mat_neg/ /res/ /A/ /ctx/
--
-- Sets /res/ to the negation of /A/.
foreign import ccall "ca_mat.h ca_mat_neg"
ca_mat_neg :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_add/ /res/ /A/ /B/ /ctx/
--
-- Sets /res/ to the sum of /A/ and /B/.
foreign import ccall "ca_mat.h ca_mat_add"
ca_mat_add :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_sub/ /res/ /A/ /B/ /ctx/
--
-- Sets /res/ to the difference of /A/ and /B/.
foreign import ccall "ca_mat.h ca_mat_sub"
ca_mat_sub :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_classical/ /res/ /A/ /B/ /ctx/
foreign import ccall "ca_mat.h ca_mat_mul_classical"
ca_mat_mul_classical :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_same_nf/ /res/ /A/ /B/ /K/ /ctx/
foreign import ccall "ca_mat.h ca_mat_mul_same_nf"
ca_mat_mul_same_nf :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaField -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul/ /res/ /A/ /B/ /ctx/
--
-- Sets /res/ to the matrix product of /A/ and /B/. The /classical/ version
-- uses classical multiplication. The /same_nf/ version assumes (not
-- checked) that both /A/ and /B/ have coefficients in the same simple
-- algebraic number field /K/ or in \(\mathbb{Q}\). The default version
-- chooses an algorithm automatically.
foreign import ccall "ca_mat.h ca_mat_mul"
ca_mat_mul :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_si/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_mul_si"
ca_mat_mul_si :: Ptr CCaMat -> Ptr CCaMat -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_fmpz/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_mul_fmpz"
ca_mat_mul_fmpz :: Ptr CCaMat -> Ptr CCaMat -> Ptr CFmpz -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_fmpq/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_mul_fmpq"
ca_mat_mul_fmpq :: Ptr CCaMat -> Ptr CCaMat -> Ptr CFmpq -> Ptr CCaCtx -> IO ()
-- | /ca_mat_mul_ca/ /B/ /A/ /c/ /ctx/
--
-- Sets /B/ to /A/ multiplied by the scalar /c/.
foreign import ccall "ca_mat.h ca_mat_mul_ca"
ca_mat_mul_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_div_si/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_div_si"
ca_mat_div_si :: Ptr CCaMat -> Ptr CCaMat -> CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_div_fmpz/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_div_fmpz"
ca_mat_div_fmpz :: Ptr CCaMat -> Ptr CCaMat -> Ptr CFmpz -> Ptr CCaCtx -> IO ()
-- | /ca_mat_div_fmpq/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_div_fmpq"
ca_mat_div_fmpq :: Ptr CCaMat -> Ptr CCaMat -> Ptr CFmpq -> Ptr CCaCtx -> IO ()
-- | /ca_mat_div_ca/ /B/ /A/ /c/ /ctx/
--
-- Sets /B/ to /A/ divided by the scalar /c/.
foreign import ccall "ca_mat.h ca_mat_div_ca"
ca_mat_div_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_add_ca/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_add_ca"
ca_mat_add_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_sub_ca/ /B/ /A/ /c/ /ctx/
--
-- Sets /B/ to /A/ plus or minus the scalar /c/ (interpreted as a diagonal
-- matrix).
foreign import ccall "ca_mat.h ca_mat_sub_ca"
ca_mat_sub_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_addmul_ca/ /B/ /A/ /c/ /ctx/
foreign import ccall "ca_mat.h ca_mat_addmul_ca"
ca_mat_addmul_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- | /ca_mat_submul_ca/ /B/ /A/ /c/ /ctx/
--
-- Sets the matrix /B/ to /B/ plus (or minus) the matrix /A/ multiplied by
-- the scalar /c/.
foreign import ccall "ca_mat.h ca_mat_submul_ca"
ca_mat_submul_ca :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCa -> Ptr CCaCtx -> IO ()
-- Powers ----------------------------------------------------------------------
-- | /ca_mat_sqr/ /B/ /A/ /ctx/
--
-- Sets /B/ to the square of /A/.
foreign import ccall "ca_mat.h ca_mat_sqr"
ca_mat_sqr :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_pow_ui_binexp/ /B/ /A/ /exp/ /ctx/
--
-- Sets /B/ to /A/ raised to the power /exp/, evaluated using binary
-- exponentiation.
foreign import ccall "ca_mat.h ca_mat_pow_ui_binexp"
ca_mat_pow_ui_binexp :: Ptr CCaMat -> Ptr CCaMat -> CULong -> Ptr CCaCtx -> IO ()
-- Polynomial evaluation -------------------------------------------------------
-- | /_ca_mat_ca_poly_evaluate/ /res/ /poly/ /len/ /A/ /ctx/
foreign import ccall "ca_mat.h _ca_mat_ca_poly_evaluate"
_ca_mat_ca_poly_evaluate :: Ptr CCaMat -> Ptr CCa -> CLong -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_ca_poly_evaluate/ /res/ /poly/ /A/ /ctx/
--
-- Sets /res/ to \(f(A)\) where /f/ is the polynomial given by /poly/ and
-- /A/ is a square matrix. Uses the Paterson-Stockmeyer algorithm.
foreign import ccall "ca_mat.h ca_mat_ca_poly_evaluate"
ca_mat_ca_poly_evaluate :: Ptr CCaMat -> Ptr CCaPoly -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Gaussian elimination and LU decomposition -----------------------------------
-- | /ca_mat_find_pivot/ /pivot_row/ /mat/ /start_row/ /end_row/ /column/ /ctx/
--
-- Attempts to find a nonzero entry in /mat/ with column index /column/ and
-- row index between /start_row/ (inclusive) and /end_row/ (exclusive).
--
-- If the return value is @T_TRUE@, such an element exists, and /pivot_row/
-- is set to the row index. If the return value is @T_FALSE@, no such
-- element exists (all entries in this part of the column are zero). If the
-- return value is @T_UNKNOWN@, it is unknown whether such an element
-- exists (zero certification failed).
--
-- This function is destructive: any elements that are nontrivially zero
-- but can be certified zero will be overwritten by exact zeros.
foreign import ccall "ca_mat.h ca_mat_find_pivot"
ca_mat_find_pivot :: Ptr CLong -> Ptr CCaMat -> CLong -> CLong -> CLong -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_lu_classical/ /rank/ /P/ /LU/ /A/ /rank_check/ /ctx/
foreign import ccall "ca_mat.h ca_mat_lu_classical"
ca_mat_lu_classical :: Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_lu_recursive/ /rank/ /P/ /LU/ /A/ /rank_check/ /ctx/
foreign import ccall "ca_mat.h ca_mat_lu_recursive"
ca_mat_lu_recursive :: Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_lu/ /rank/ /P/ /LU/ /A/ /rank_check/ /ctx/
--
-- Computes a generalized LU decomposition \(A = PLU\) of a given matrix
-- /A/, writing the rank of /A/ to /rank/.
--
-- If /A/ is a nonsingular square matrix, /LU/ will be set to a unit
-- diagonal lower triangular matrix /L/ and an upper triangular matrix /U/
-- (the diagonal of /L/ will not be stored explicitly).
--
-- If /A/ is an arbitrary matrix of rank /r/, /U/ will be in row echelon
-- form having /r/ nonzero rows, and /L/ will be lower triangular but
-- truncated to /r/ columns, having implicit ones on the /r/ first entries
-- of the main diagonal. All other entries will be zero.
--
-- If a nonzero value for @rank_check@ is passed, the function will abandon
-- the output matrix in an undefined state and set the rank to 0 if /A/ is
-- detected to be rank-deficient.
--
-- The algorithm can fail if it fails to certify that a pivot element is
-- zero or nonzero, in which case the correct rank cannot be determined.
-- The return value is 1 on success and 0 on failure. On failure, the data
-- in the output variables @rank@, @P@ and @LU@ will be meaningless.
--
-- The /classical/ version uses iterative Gaussian elimination. The
-- /recursive/ version uses a block recursive algorithm to take advantage
-- of fast matrix multiplication.
foreign import ccall "ca_mat.h ca_mat_lu"
ca_mat_lu :: Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_fflu/ /rank/ /P/ /LU/ /den/ /A/ /rank_check/ /ctx/
--
-- Similar to @ca_mat_lu@, but computes a fraction-free LU decomposition
-- using the Bareiss algorithm. The denominator is written to /den/. Note
-- that despite being \"fraction-free\", this algorithm may introduce
-- fractions due to incomplete symbolic simplifications.
foreign import ccall "ca_mat.h ca_mat_fflu"
ca_mat_fflu :: Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_nonsingular_lu/ /P/ /LU/ /A/ /ctx/
--
-- Wrapper for @ca_mat_lu@. If /A/ can be proved to be
-- invertible\/nonsingular, returns @T_TRUE@ and sets /P/ and /LU/ to a LU
-- decomposition \(A = PLU\). If /A/ can be proved to be singular, returns
-- @T_FALSE@. If /A/ cannot be proved to be either singular or nonsingular,
-- returns @T_UNKNOWN@. When the return value is @T_FALSE@ or @T_UNKNOWN@,
-- the LU factorization is not completed and the values of /P/ and /LU/ are
-- arbitrary.
foreign import ccall "ca_mat.h ca_mat_nonsingular_lu"
ca_mat_nonsingular_lu :: Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_nonsingular_fflu/ /P/ /LU/ /den/ /A/ /ctx/
--
-- Wrapper for @ca_mat_fflu@. Similar to @ca_mat_nonsingular_lu@, but
-- computes a fraction-free LU decomposition using the Bareiss algorithm.
-- The denominator is written to /den/. Note that despite being
-- \"fraction-free\", this algorithm may introduce fractions due to
-- incomplete symbolic simplifications.
foreign import ccall "ca_mat.h ca_mat_nonsingular_fflu"
ca_mat_nonsingular_fflu :: Ptr CLong -> Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- Solving and inverse ---------------------------------------------------------
-- | /ca_mat_inv/ /X/ /A/ /ctx/
--
-- Determines if the square matrix /A/ is nonsingular, and if successful,
-- sets \(X = A^{-1}\) and returns @T_TRUE@. Returns @T_FALSE@ if /A/ is
-- singular, and @T_UNKNOWN@ if the rank of /A/ cannot be determined.
foreign import ccall "ca_mat.h ca_mat_inv"
ca_mat_inv :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_nonsingular_solve_adjugate/ /X/ /A/ /B/ /ctx/
foreign import ccall "ca_mat.h ca_mat_nonsingular_solve_adjugate"
ca_mat_nonsingular_solve_adjugate :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_nonsingular_solve_fflu/ /X/ /A/ /B/ /ctx/
foreign import ccall "ca_mat.h ca_mat_nonsingular_solve_fflu"
ca_mat_nonsingular_solve_fflu :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_nonsingular_solve_lu/ /X/ /A/ /B/ /ctx/
foreign import ccall "ca_mat.h ca_mat_nonsingular_solve_lu"
ca_mat_nonsingular_solve_lu :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_nonsingular_solve/ /X/ /A/ /B/ /ctx/
--
-- Determines if the square matrix /A/ is nonsingular, and if successful,
-- solves \(AX = B\) and returns @T_TRUE@. Returns @T_FALSE@ if /A/ is
-- singular, and @T_UNKNOWN@ if the rank of /A/ cannot be determined.
foreign import ccall "ca_mat.h ca_mat_nonsingular_solve"
ca_mat_nonsingular_solve :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- | /ca_mat_solve_tril_classical/ /X/ /L/ /B/ /unit/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_tril_classical"
ca_mat_solve_tril_classical :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_tril_recursive/ /X/ /L/ /B/ /unit/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_tril_recursive"
ca_mat_solve_tril_recursive :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_tril/ /X/ /L/ /B/ /unit/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_tril"
ca_mat_solve_tril :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_triu_classical/ /X/ /U/ /B/ /unit/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_triu_classical"
ca_mat_solve_triu_classical :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_triu_recursive/ /X/ /U/ /B/ /unit/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_triu_recursive"
ca_mat_solve_triu_recursive :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_triu/ /X/ /U/ /B/ /unit/ /ctx/
--
-- Solves the lower triangular system \(LX = B\) or the upper triangular
-- system \(UX = B\), respectively. It is assumed (not checked) that the
-- diagonal entries are nonzero. If /unit/ is set, the main diagonal of /L/
-- or /U/ is taken to consist of all ones, and in that case the actual
-- entries on the diagonal are not read at all and can contain other data.
--
-- The /classical/ versions perform the computations iteratively while the
-- /recursive/ versions perform the computations in a block recursive way
-- to benefit from fast matrix multiplication. The default versions choose
-- an algorithm automatically.
foreign import ccall "ca_mat.h ca_mat_solve_triu"
ca_mat_solve_triu :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> CInt -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_fflu_precomp/ /X/ /perm/ /A/ /den/ /B/ /ctx/
foreign import ccall "ca_mat.h ca_mat_solve_fflu_precomp"
ca_mat_solve_fflu_precomp :: Ptr CCaMat -> Ptr CLong -> Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_solve_lu_precomp/ /X/ /P/ /LU/ /B/ /ctx/
--
-- Solves \(AX = B\) given the precomputed nonsingular LU decomposition
-- \(A = PLU\) or fraction-free LU decomposition with denominator /den/.
-- The matrices \(X\) and \(B\) are allowed to be aliased with each other,
-- but \(X\) is not allowed to be aliased with \(LU\).
foreign import ccall "ca_mat.h ca_mat_solve_lu_precomp"
ca_mat_solve_lu_precomp :: Ptr CCaMat -> Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Rank and echelon form -------------------------------------------------------
-- | /ca_mat_rank/ /rank/ /A/ /ctx/
--
-- Computes the rank of the matrix /A/. If successful, returns 1 and writes
-- the rank to @rank@. If unsuccessful, returns 0.
foreign import ccall "ca_mat.h ca_mat_rank"
ca_mat_rank :: Ptr CLong -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_rref_fflu/ /rank/ /R/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_rref_fflu"
ca_mat_rref_fflu :: Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_rref_lu/ /rank/ /R/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_rref_lu"
ca_mat_rref_lu :: Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_rref/ /rank/ /R/ /A/ /ctx/
--
-- Computes the reduced row echelon form (rref) of a given matrix. On
-- success, sets /R/ to the rref of /A/, writes the rank to /rank/, and
-- returns 1. On failure to certify the correct rank, returns 0, leaving
-- the data in /rank/ and /R/ meaningless.
--
-- The /fflu/ version computes a fraction-free LU decomposition and then
-- converts the output ro rref form. The /lu/ version computes a regular LU
-- decomposition and then converts the output to rref form. The default
-- version uses an automatic algorithm choice and may implement additional
-- methods for special cases.
foreign import ccall "ca_mat.h ca_mat_rref"
ca_mat_rref :: Ptr CLong -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_right_kernel/ /X/ /A/ /ctx/
--
-- Sets /X/ to a basis of the right kernel (nullspace) of /A/. The output
-- matrix /X/ will be resized in-place to have a number of columns equal to
-- the nullity of /A/. Returns 1 on success. On failure, returns 0 and
-- leaves the data in /X/ meaningless.
foreign import ccall "ca_mat.h ca_mat_right_kernel"
ca_mat_right_kernel :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- Determinant and trace -------------------------------------------------------
-- | /ca_mat_trace/ /trace/ /mat/ /ctx/
--
-- Sets /trace/ to the sum of the entries on the main diagonal of /mat/.
foreign import ccall "ca_mat.h ca_mat_trace"
ca_mat_trace :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_det_berkowitz/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_det_berkowitz"
ca_mat_det_berkowitz :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_det_lu/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_det_lu"
ca_mat_det_lu :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_det_bareiss/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_det_bareiss"
ca_mat_det_bareiss :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_det_cofactor/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_det_cofactor"
ca_mat_det_cofactor :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_det/ /det/ /A/ /ctx/
--
-- Sets /det/ to the determinant of the square matrix /A/. Various
-- algorithms are available:
--
-- - The /berkowitz/ version uses the division-free Berkowitz algorithm
-- performing \(O(n^4)\) operations. Since no zero tests are required,
-- it is guaranteed to succeed.
-- - The /cofactor/ version performs cofactor expansion. This is
-- currently only supported for matrices up to size 4.
-- - The /lu/ and /bareiss/ versions use rational LU decomposition and
-- fraction-free LU decomposition (Bareiss algorithm) respectively,
-- requiring \(O(n^3)\) operations. These algorithms can fail if zero
-- certification fails (see @ca_mat_nonsingular_lu@); they return 1 for
-- success and 0 for failure. Note that the Bareiss algorithm, despite
-- being \"fraction-free\", may introduce fractions due to incomplete
-- symbolic simplifications.
--
-- The default function chooses an algorithm automatically. It will, in
-- addition, recognize trivially rational and integer matrices and evaluate
-- those determinants using @fmpq_mat_t@ or @fmpz_mat_t@.
--
-- The various algorithms can produce different symbolic forms of the same
-- determinant. Which algorithm performs better depends strongly and
-- sometimes unpredictably on the structure of the matrix.
foreign import ccall "ca_mat.h ca_mat_det"
ca_mat_det :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_adjugate_cofactor/ /adj/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_adjugate_cofactor"
ca_mat_adjugate_cofactor :: Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_adjugate_charpoly/ /adj/ /det/ /A/ /ctx/
foreign import ccall "ca_mat.h ca_mat_adjugate_charpoly"
ca_mat_adjugate_charpoly :: Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_adjugate/ /adj/ /det/ /A/ /ctx/
--
-- Sets /adj/ to the adjuate matrix of /A/ and /det/ to the determinant of
-- /A/, both computed simultaneously. The /cofactor/ version uses cofactor
-- expansion. The /charpoly/ version computes and evaluates the
-- characteristic polynomial. The default version uses an automatic
-- algorithm choice.
foreign import ccall "ca_mat.h ca_mat_adjugate"
ca_mat_adjugate :: Ptr CCaMat -> Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- Characteristic polynomial ---------------------------------------------------
-- | /_ca_mat_charpoly_berkowitz/ /cp/ /mat/ /ctx/
foreign import ccall "ca_mat.h _ca_mat_charpoly_berkowitz"
_ca_mat_charpoly_berkowitz :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_charpoly_berkowitz/ /cp/ /mat/ /ctx/
foreign import ccall "ca_mat.h ca_mat_charpoly_berkowitz"
ca_mat_charpoly_berkowitz :: Ptr CCaPoly -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /_ca_mat_charpoly_danilevsky/ /cp/ /mat/ /ctx/
foreign import ccall "ca_mat.h _ca_mat_charpoly_danilevsky"
_ca_mat_charpoly_danilevsky :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_charpoly_danilevsky/ /cp/ /mat/ /ctx/
foreign import ccall "ca_mat.h ca_mat_charpoly_danilevsky"
ca_mat_charpoly_danilevsky :: Ptr CCaPoly -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /_ca_mat_charpoly/ /cp/ /mat/ /ctx/
foreign import ccall "ca_mat.h _ca_mat_charpoly"
_ca_mat_charpoly :: Ptr CCa -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_charpoly/ /cp/ /mat/ /ctx/
--
-- Sets /poly/ to the characteristic polynomial of /mat/ which must be a
-- square matrix. If the matrix has /n/ rows, the underscore method
-- requires space for \(n + 1\) output coefficients.
--
-- The /berkowitz/ version uses a division-free algorithm requiring
-- \(O(n^4)\) operations. The /danilevsky/ version only performs \(O(n^3)\)
-- operations, but performs divisions and needs to check for zero which can
-- fail. This version returns 1 on success and 0 on failure. The default
-- version chooses an algorithm automatically.
foreign import ccall "ca_mat.h ca_mat_charpoly"
ca_mat_charpoly :: Ptr CCaPoly -> Ptr CCaMat -> Ptr CCaCtx -> IO ()
-- | /ca_mat_companion/ /mat/ /poly/ /ctx/
--
-- Sets /mat/ to the companion matrix of /poly/. This function verifies
-- that the leading coefficient of /poly/ is provably nonzero and that the
-- output matrix has the right size, returning 1 on success. It returns 0
-- if the leading coefficient of /poly/ cannot be proved nonzero or if the
-- size of the output matrix does not match.
foreign import ccall "ca_mat.h ca_mat_companion"
ca_mat_companion :: Ptr CCaMat -> Ptr CCaPoly -> Ptr CCaCtx -> IO CInt
-- Eigenvalues and eigenvectors ------------------------------------------------
-- | /ca_mat_eigenvalues/ /lambda/ /exp/ /mat/ /ctx/
--
-- Attempts to compute all complex eigenvalues of the given matrix /mat/.
-- On success, returns 1 and sets /lambda/ to the distinct eigenvalues with
-- corresponding multiplicities in /exp/. The eigenvalues are returned in
-- arbitrary order. On failure, returns 0 and leaves the values in /lambda/
-- and /exp/ arbitrary.
--
-- This function effectively computes the characteristic polynomial and
-- then calls @ca_poly_roots@.
foreign import ccall "ca_mat.h ca_mat_eigenvalues"
ca_mat_eigenvalues :: Ptr CCaVec -> Ptr CULong -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_diagonalization/ /D/ /P/ /A/ /ctx/
--
-- Matrix diagonalization: attempts to compute a diagonal matrix /D/ and an
-- invertible matrix /P/ such that \(A = PDP^{-1}\). Returns @T_TRUE@ if
-- /A/ is diagonalizable and the computation succeeds, @T_FALSE@ if /A/ is
-- provably not diagonalizable, and @T_UNKNOWN@ if it is unknown whether
-- /A/ is diagonalizable. If the return value is not @T_TRUE@, the values
-- in /D/ and /P/ are arbitrary.
foreign import ccall "ca_mat.h ca_mat_diagonalization"
ca_mat_diagonalization :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)
-- Jordan canonical form -------------------------------------------------------
-- | /ca_mat_jordan_blocks/ /lambda/ /num_blocks/ /block_lambda/ /block_size/ /A/ /ctx/
--
-- Computes the blocks of the Jordan canonical form of /A/. On success,
-- returns 1 and sets /lambda/ to the unique eigenvalues of /A/, sets
-- /num_blocks/ to the number of Jordan blocks, entry /i/ of /block_lambda/
-- to the index of the eigenvalue in Jordan block /i/, and entry /i/ of
-- /block_size/ to the size of Jordan block /i/. On failure, returns 0,
-- leaving arbitrary values in the output variables. The user should
-- allocate space in /block_lambda/ and /block_size/ for up to /n/ entries
-- where /n/ is the size of the matrix.
--
-- The Jordan form is unique up to the ordering of blocks, which is
-- arbitrary.
foreign import ccall "ca_mat.h ca_mat_jordan_blocks"
ca_mat_jordan_blocks :: Ptr CCaVec -> Ptr CLong -> Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_set_jordan_blocks/ /mat/ /lambda/ /num_blocks/ /block_lambda/ /block_size/ /ctx/
--
-- Sets /mat/ to the concatenation of the Jordan blocks given in /lambda/,
-- /num_blocks/, /block_lambda/ and /block_size/. See
-- @ca_mat_jordan_blocks@ for an explanation of these variables.
foreign import ccall "ca_mat.h ca_mat_set_jordan_blocks"
ca_mat_set_jordan_blocks :: Ptr CCaMat -> Ptr CCaVec -> CLong -> Ptr CLong -> Ptr CLong -> Ptr CCaCtx -> IO ()
-- | /ca_mat_jordan_transformation/ /mat/ /lambda/ /num_blocks/ /block_lambda/ /block_size/ /A/ /ctx/
--
-- Given the precomputed Jordan block decomposition (/lambda/,
-- /num_blocks/, /block_lambda/, /block_size/) of the square matrix /A/,
-- computes the corresponding transformation matrix /P/ such that
-- \(A = P J P^{-1}\). On success, writes /P/ to /mat/ and returns 1. On
-- failure, returns 0, leaving the value of /mat/ arbitrary.
foreign import ccall "ca_mat.h ca_mat_jordan_transformation"
ca_mat_jordan_transformation :: Ptr CCaMat -> Ptr CCaVec -> CLong -> Ptr CLong -> Ptr CLong -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_jordan_form/ /J/ /P/ /A/ /ctx/
--
-- Computes the Jordan decomposition \(A = P J P^{-1}\) of the given square
-- matrix /A/. The user can pass /NULL/ for the output variable /P/, in
-- which case only /J/ is computed. On success, returns 1. On failure,
-- returns 0, leaving the values of /J/ and /P/ arbitrary.
--
-- This function is a convenience wrapper around @ca_mat_jordan_blocks@,
-- @ca_mat_set_jordan_blocks@ and @ca_mat_jordan_transformation@. For
-- computations with the Jordan decomposition, it is often better to use
-- those methods directly since they give direct access to the spectrum and
-- block structure.
foreign import ccall "ca_mat.h ca_mat_jordan_form"
ca_mat_jordan_form :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- Matrix functions ------------------------------------------------------------
-- | /ca_mat_exp/ /res/ /A/ /ctx/
--
-- Matrix exponential: given a square matrix /A/, sets /res/ to \(e^A\) and
-- returns 1 on success. If unsuccessful, returns 0, leaving the values in
-- /res/ arbitrary.
--
-- This function uses Jordan decomposition. The matrix exponential always
-- exists, but computation can fail if computing the Jordan decomposition
-- fails.
foreign import ccall "ca_mat.h ca_mat_exp"
ca_mat_exp :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO CInt
-- | /ca_mat_log/ /res/ /A/ /ctx/
--
-- Matrix logarithm: given a square matrix /A/, sets /res/ to a logarithm
-- \(\log(A)\) and returns @T_TRUE@ on success. If /A/ can be proved to
-- have no logarithm, returns @T_FALSE@. If the existence of a logarithm
-- cannot be proved, returns @T_UNKNOWN@.
--
-- This function uses the Jordan decomposition, and the branch of the
-- matrix logarithm is defined by taking the principal values of the
-- logarithms of all eigenvalues.
foreign import ccall "ca_mat.h ca_mat_log"
ca_mat_log :: Ptr CCaMat -> Ptr CCaMat -> Ptr CCaCtx -> IO (Ptr CTruth)