FLINT3.7.0-dev
Module · 129 functions

arb_mat.h

#include <flint/arb_mat.h>

This module implements dense matrices whose entries are real balls (arb_t). A matrix of balls represents the set of all real matrices whose entries lie in the balls, and the functions return enclosures of the exact results for every matrix in that set. Besides the usual arithmetic, the module provides verified linear algebra: solving linear systems, inversion and determinants by Gaussian elimination in ball arithmetic or by preconditioning with an approximate inverse, Cholesky and LDL^T decompositions of symmetric positive definite matrices, the characteristic polynomial and the matrix exponential. The functions with approx in their names ignore the radii and compute floating-point approximations without error bounds; they serve to compute preconditioners and starting values for the verified algorithms.

Large products are computed by splitting the matrices into blocks of similarly scaled entries and multiplying the midpoints as integer matrices with fmpz_mat_mul, while the radii are bounded by a product of nonnegative matrices in double precision (Ball matrix multiplication). The solvers follow Verified linear algebra. Complex matrices, including eigenvalues and eigenvectors, are in acb_mat.h. Several functions are wrappers around the generic implementations in gr_mat.h with the real ball context, and a matrix over the generic real ball context uses this module for multiplication, determinants and the exponential. The guide Getting started with arb_mat introduces the module, and Solving linear systems with ball matrices describes the solvers in detail.

AlgorithmVerified linear algebraHow arb_mat and acb_mat solve linear systems, invert matrices and compute determinants with rigorous enclosures, by interval Gaussian elimination, by preconditioning with an approximate inverse, and by certifying an approximate solution with a residual bound.

Guides#

Types and conventions#

A matrix with real ball entries. The structure has the fields entries (a pointer to the entry in the top left corner), r and c (the numbers of rows and columns) and stride (the distance in arb_struct between the starts of consecutive rows). An arb_mat_t is an array of one arb_mat_struct, so it is passed by reference.

arb_mat_entry(mat, i, j)

Evaluates to a pointer to the entry in row i and column j of mat (no bounds check).

arb_ptr arb_mat_entry_ptr(arb_mat_t mat, slong i, slong j)

Returns a pointer to the entry in row i and column j of mat; the same as arb_mat_entry, as a function.

Evaluate to the number of rows and columns of mat.

  • The dimensions of a matrix are fixed when it is initialised, and the caller must pass operands of compatible dimensions. Multiplication, solving and the decompositions throw an exception (FLINT_ERROR) otherwise; entrywise functions such as arb_mat_add do not check. Matrices may have zero rows or columns.
  • Outputs may be the same object as inputs (for square matrices where this makes sense) unless stated otherwise; the functions use temporary storage when needed.
  • Functions that can fail numerically (arb_mat_solve, arb_mat_inv, arb_mat_lu, arb_mat_cho, ...) return an int: nonzero means that the result is certified (for example, that the matrix is certainly invertible and the output contains the exact solution); zero means that the matrix is singular, or that the input or the working precision is not accurate enough to decide. The output is then undefined.
  • Predicates such as arb_mat_eq return 1 if the property certainly holds for all matrices represented, and 0 otherwise.
  • The functions with approx in their name use only the midpoints and return matrices of floating-point numbers (zero radii, unless stated otherwise) without any error bound.
  • Functions described as wrappers of a gr_mat function call it with gr_ctx_init_real_arb(ctx, prec) (see gr_domains) on the same data.

Memory management#

Initialises mat as the zero matrix with r rows and c columns.

Frees the memory used by mat.

Swap two matrices. arb_mat_swap swaps the structures (also when the dimensions differ); arb_mat_swap_entrywise swaps the entries one by one and requires equal dimensions, which also works for windows.

Returns the number of bytes allocated on the heap by x, excluding sizeof(arb_mat_struct).

void arb_mat_window_init(arb_mat_t window, const arb_mat_t mat, slong r1, slong c1, slong r2, slong c2)

Initialise window as a view of the submatrix of mat formed by rows r_1 \le i < r_2 and columns c_1 \le j < c_2, sharing its entries, and release it again (which frees nothing). Require 0 \le r_1 \le r_2 \le the number of rows and likewise for the columns. A window must not be used after mat has been cleared.

Conversions#

void arb_mat_set(arb_mat_t dest, const arb_mat_t src)
void arb_mat_set_fmpq_mat(arb_mat_t dest, const fmpq_mat_t src, slong prec)

Set dest to src, which must have the same dimensions: exactly, or with the entries rounded to prec bits.

Random generation#

void arb_mat_randtest(arb_mat_t mat, flint_rand_t state, slong prec, slong mag_bits)

Sets mat to a random matrix of random density whose nonzero entries are generated by arb_randtest or arb_randtest_precise with midpoints of up to prec bits and exponents of up to mag_bits bits.

void arb_mat_randtest_cho(arb_mat_t mat, flint_rand_t state, slong prec, slong mag_bits)
void arb_mat_randtest_spd(arb_mat_t mat, flint_rand_t state, slong prec, slong mag_bits)

Set the square matrix mat to a random lower triangular matrix with exact entries and a positive diagonal (a Cholesky factor), or to the symmetric positive definite matrix L L^T for such a random L.

Input and output#

void arb_mat_printd(const arb_mat_t mat, slong digits)
void arb_mat_fprintd(FILE * file, const arb_mat_t mat, slong digits)

Print mat to standard output or to file, one row per line as [a, b, ...], each entry printed with arb_fprintd to digits decimal digits.

Comparisons#

int arb_mat_equal(const arb_mat_t mat1, const arb_mat_t mat2)

Returns whether the matrices have the same dimensions and identical balls as entries.

int arb_mat_overlaps(const arb_mat_t mat1, const arb_mat_t mat2)

Returns whether the matrices have the same dimensions and each entry of mat1 overlaps the corresponding entry of mat2.

int arb_mat_contains(const arb_mat_t mat1, const arb_mat_t mat2)
int arb_mat_contains_fmpz_mat(const arb_mat_t mat1, const fmpz_mat_t mat2)
int arb_mat_contains_fmpq_mat(const arb_mat_t mat1, const fmpq_mat_t mat2)

Return whether the matrices have the same dimensions and each entry of mat2 is contained in the corresponding entry of mat1.

int arb_mat_eq(const arb_mat_t mat1, const arb_mat_t mat2)
int arb_mat_ne(const arb_mat_t mat1, const arb_mat_t mat2)

Return whether mat1 and mat2 certainly represent the same matrix (same dimensions and all entries exact and equal), respectively certainly represent different matrices (different dimensions, or some pair of entries that do not overlap).

Return whether mat has zero rows or zero columns, respectively as many rows as columns.

int arb_mat_is_zero(const arb_mat_t mat)

Return whether all entries of mat have zero radius, are exactly zero, or are finite.

int arb_mat_is_triu(const arb_mat_t mat)
int arb_mat_is_tril(const arb_mat_t mat)
int arb_mat_is_diag(const arb_mat_t mat)

Return whether all entries below, above, respectively off the main diagonal of mat are exactly zero. The matrix need not be square.

Special matrices#

Set all entries of mat to zero; the diagonal entries to one and the others to zero; all entries to one; or all entries to indeterminate balls [\operatorname{NaN} \pm \infty].

Sets mat to the Hilbert matrix with entries 1/(j + k + 1), rounded to prec bits. A wrapper of gr_mat_hilbert.

void arb_mat_pascal(arb_mat_t mat, int triangular, slong prec)

Sets mat to a Pascal matrix of binomial coefficients: for triangular 0 the symmetric matrix with entries \binom{j+k}{j} (the rows of Pascal's triangle as antidiagonals), for 1 the upper triangular matrix with entries \binom{k}{j}, for -1 the lower triangular matrix with entries \binom{j}{k}. A wrapper of gr_mat_pascal; the entries are computed by recurrences and are exact as long as they fit in prec bits.

void arb_mat_stirling(arb_mat_t mat, int kind, slong prec)

Sets mat to the matrix of Stirling numbers s(j, k): unsigned of the first kind for kind 0, signed of the first kind for 1, of the second kind for 2. A wrapper of gr_mat_stirling; the entries are computed by recurrences.

void arb_mat_dct(arb_mat_t mat, int type, slong prec)

Sets mat to the orthogonal DCT-II matrix of order n, the smaller dimension of mat,

A_{j,k} = \sqrt{\frac{2 - \delta_{j,0}}{n}} \cos\left(\frac{\pi j}{n} \left(k + \frac{1}{2}\right)\right),

which satisfies A^{-1} = A^T (if mat is not square, the formula is used for all entries). type is ignored and should be 0.

Transpose#

void arb_mat_transpose(arb_mat_t dest, const arb_mat_t src)

Sets dest to the transpose of src, exactly. Aliasing is allowed for square matrices.

Norms#

Sets b to an upper bound for the infinity norm \max_i \sum_j |a_{ij}| of every matrix in A.

void arb_mat_frobenius_norm(arb_t res, const arb_mat_t A, slong prec)

Set res to an enclosure, respectively an upper bound, of the Frobenius norm (\sum_{i,j} a_{ij}^2)^{1/2}.

Arithmetic#

void arb_mat_neg(arb_mat_t dest, const arb_mat_t src)

Sets dest to -\mathit{src}, exactly.

void arb_mat_add(arb_mat_t res, const arb_mat_t mat1, const arb_mat_t mat2, slong prec)
void arb_mat_sub(arb_mat_t res, const arb_mat_t mat1, const arb_mat_t mat2, slong prec)

Set res to the sum or difference of matrices of equal dimensions.

void arb_mat_mul_classical(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong prec)
void arb_mat_mul_threaded(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong prec)
void arb_mat_mul_block(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong prec)
void arb_mat_mul(arb_mat_t res, const arb_mat_t mat1, const arb_mat_t mat2, slong prec)

Set C (res) to the matrix product AB. The classical version computes each entry with arb_dot; the threaded version does the same with the rows of the output distributed over the threads of flint_get_num_threads(); the block version multiplies the midpoints exactly as integer matrices and bounds the radii separately. The default chooses automatically.

More
void arb_mat_mul_entrywise(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong prec)

Sets C to the entrywise (Hadamard) product of matrices of equal dimensions.

void arb_mat_sqr(arb_mat_t res, const arb_mat_t mat, slong prec)

Set the output to A^2 for a square matrix A. The classical version uses the symmetry of the products a_{ik} a_{kj} to save multiplications.

void arb_mat_pow_ui(arb_mat_t res, const arb_mat_t mat, ulong exp, slong prec)

Sets res to A^e for a square matrix A, by binary exponentiation. A wrapper of gr_mat_pow_ui.

void arb_mat_approx_mul(arb_mat_t res, const arb_mat_t mat1, const arb_mat_t mat2, slong prec)

Approximate matrix multiplication: the input radii are ignored and the output is a floating-point approximation of the product of the midpoints. The radii of the output are not necessarily zero (they are whatever the algorithm used leaves), and carry no meaning.

Scalar arithmetic#

Sets B to 2^c A, exactly.

void arb_mat_scalar_addmul_arb(arb_mat_t B, const arb_mat_t A, const arb_t c, slong prec)

Set B to B + cA.

void arb_mat_scalar_mul_fmpz(arb_mat_t B, const arb_mat_t A, const fmpz_t c, slong prec)
void arb_mat_scalar_mul_arb(arb_mat_t B, const arb_mat_t A, const arb_t c, slong prec)

Set B to cA.

void arb_mat_scalar_div_fmpz(arb_mat_t B, const arb_mat_t A, const fmpz_t c, slong prec)
void arb_mat_scalar_div_arb(arb_mat_t B, const arb_mat_t A, const arb_t c, slong prec)

Set B to A / c.

Matrix-vector products#

Set res to the product vA of the row vector v (of length the number of rows of A) by A, respectively the product Av of A by the column vector v, each entry computed by arb_dot. The underscore versions do not allow res to alias v.

LU decomposition and solving#

int arb_mat_lu_classical(slong * perm, arb_mat_t LU, const arb_mat_t A, slong prec)
int arb_mat_lu_recursive(slong * perm, arb_mat_t LU, const arb_mat_t A, slong prec)
int arb_mat_lu(slong * perm, arb_mat_t LU, const arb_mat_t A, slong prec)

Compute an LU decomposition PA = LU of an n \times n matrix A by Gaussian elimination with partial pivoting in ball arithmetic. Return nonzero if n pivots that do not contain zero are found, which proves that A is invertible; then L (unit lower triangular, without its diagonal) and U are stored in LU, and perm[i] is the row of A that became row i. Return zero, leaving perm and LU undefined, otherwise. LU may be the same object as A.

More
void arb_mat_solve_tril_classical(arb_mat_t X, const arb_mat_t L, const arb_mat_t B, int unit, slong prec)
void arb_mat_solve_tril_recursive(arb_mat_t X, const arb_mat_t L, const arb_mat_t B, int unit, slong prec)
void arb_mat_solve_tril(arb_mat_t X, const arb_mat_t L, const arb_mat_t B, int unit, slong prec)
void arb_mat_solve_triu_classical(arb_mat_t X, const arb_mat_t U, const arb_mat_t B, int unit, slong prec)
void arb_mat_solve_triu_recursive(arb_mat_t X, const arb_mat_t U, const arb_mat_t B, int unit, slong prec)
void arb_mat_solve_triu(arb_mat_t X, const arb_mat_t U, const arb_mat_t B, int unit, slong prec)

Solve LX = B for a lower triangular L, respectively UX = B for an upper triangular U, by substitution. Only the relevant triangle is read; the diagonal must not contain zero (not checked; otherwise the output is not finite). If unit is nonzero, the diagonal is taken to be all ones and is not read. The recursive versions use block substitution with matrix products; the defaults use them when B has at least 40 rows and 40 columns.

void arb_mat_solve_lu_precomp(arb_mat_t X, const slong * perm, const arb_mat_t LU, const arb_mat_t B, slong prec)

Solves AX = B given an LU decomposition PA = LU computed by arb_mat_lu (assumed valid, not checked). X may be the same object as B but not as LU.

int arb_mat_solve(arb_mat_t X, const arb_mat_t A, const arb_mat_t B, slong prec)
int arb_mat_solve_lu(arb_mat_t X, const arb_mat_t A, const arb_mat_t B, slong prec)

Solve AX = B for a square matrix A and X, B with m columns. Return nonzero if A is proved invertible, in which case X contains the exact solution for every pair of matrices in the balls A and B; return zero (with X undefined) if m > 0 and this could not be proved. The lu version uses Gaussian elimination in ball arithmetic, the precond version preconditions with an approximate inverse [HS1967], and the default uses the lu version if n \le 4 or \mathit{prec} > 10n and the precond version otherwise. See Solving linear systems with ball matrices.

Full documentation
int arb_mat_solve_preapprox(arb_mat_t X, const arb_mat_t A, const arb_mat_t B, const arb_mat_t R, const arb_mat_t T, slong prec)

Solves AX = B given an approximate inverse R of A and an approximate solution T, by bounding the error of T (Theorem 10.2 of [Rum2010]). Returns nonzero if \|I - RA\|_\infty < 1 could be proved, which shows that A is invertible; X then contains the exact solution. Returns zero (with X undefined) otherwise, for example if R is not a good enough approximation.

Full documentation
int arb_mat_inv(arb_mat_t X, const arb_mat_t A, slong prec)

Sets X to A^{-1} by solving AX = I with arb_mat_solve. Returns nonzero if A is proved invertible (and X contains the exact inverse) and zero otherwise, with X undefined.

Full documentation
void arb_mat_det_lu(arb_t det, const arb_mat_t A, slong prec)
void arb_mat_det_precond(arb_t det, const arb_mat_t A, slong prec)
void arb_mat_det(arb_t det, const arb_mat_t A, slong prec)

Set det to an enclosure of the determinant of the square matrix A. The lu version uses Gaussian elimination and bounds the remaining submatrix by Hadamard's inequality when no more pivots can be found; the precond version multiplies A by approximate inverses of the factors of an approximate LU decomposition and encloses the determinant of the result, which is close to the identity [Rum2010]. The default uses direct formulas for n \le 3 and triangular matrices, the lu version if n \le 10 or \mathit{prec} > 10n, and the precond version otherwise; it throws an exception for a non-square matrix.

Full documentation

Approximate solving#

These functions perform floating-point linear algebra on the midpoints of the input, without any error control. The input radii are ignored, and the output matrices hold the approximate results with zero radii. They use the same algorithms as the rigorous versions (partial pivoting, block recursion for large matrices).

void arb_mat_approx_solve_triu(arb_mat_t X, const arb_mat_t U, const arb_mat_t B, int unit, slong prec)
void arb_mat_approx_solve_tril(arb_mat_t X, const arb_mat_t L, const arb_mat_t B, int unit, slong prec)

Approximately solve UX = B or LX = B for a triangular matrix with nonzero diagonal (not checked); with unit set, the diagonal is taken to be ones and not read.

int arb_mat_approx_lu(slong * P, arb_mat_t LU, const arb_mat_t A, slong prec)
void arb_mat_approx_solve_lu_precomp(arb_mat_t X, const slong * perm, const arb_mat_t A, const arb_mat_t B, slong prec)

Compute an approximate LU decomposition with partial pivoting, returning zero if an exactly zero pivot column is encountered, and solve with such a decomposition (assumed to come from arb_mat_approx_lu).

int arb_mat_approx_solve(arb_mat_t X, const arb_mat_t A, const arb_mat_t B, slong prec)

Approximately solve AX = B or invert A. Return zero if the approximate LU decomposition fails, nonzero otherwise; a nonzero return value says nothing about the accuracy of the result.

Cholesky and LDL decompositions#

The functions in this section read only the lower triangular part of their symmetric input matrix A (including the diagonal).

int arb_mat_cho(arb_mat_t L, const arb_mat_t A, slong prec)

Compute the Cholesky decomposition A = LL^T with L lower triangular, by the Cholesky–Banachiewicz algorithm. Return nonzero if all pivots are certainly positive, which proves that every symmetric matrix represented by the lower triangle of A is positive definite; return zero if A is not positive definite or the precision is insufficient. The underscore version works in place and leaves the strict upper triangle undefined.

Solves AX = B given the Cholesky factor L of A computed by arb_mat_cho (assumed valid, not checked). X may be the same object as B but not as L.

int arb_mat_spd_solve(arb_mat_t X, const arb_mat_t A, const arb_mat_t B, slong prec)

Solves AX = B for a symmetric positive definite matrix A using arb_mat_cho. Returns nonzero if the decomposition succeeds, which proves that A is positive definite and that X contains the exact solution, and zero (if B has at least one column) otherwise, with X undefined.

Set X to A^{-1} for a symmetric positive definite A, given its Cholesky factor L (assumed valid) or computing it. The inverse is obtained by the method of [Kri2013], which computes fewer intermediate results than solving AX = I. arb_mat_spd_inv returns zero (with X undefined) if the Cholesky decomposition fails.

int arb_mat_ldl(arb_mat_t res, const arb_mat_t A, slong prec)

Compute the decomposition A = LDL^T with L unit lower triangular and D diagonal, stored in res: the strict lower triangle holds L and the diagonal holds D. Return nonzero if all entries of D are certainly positive, which proves that A is positive definite, and zero otherwise. The underscore versions work in place and leave the strict upper triangle undefined; the default uses Algorithm 4.1.2 of [GVL1996] (_arb_mat_ldl_golub_and_van_loan).

Solve AX = B, respectively compute A^{-1} (by the method of [Kri2013]), given the LDL^T decomposition of A encoded in L as computed by arb_mat_ldl (assumed valid). X may be the same object as B but not as L.

Characteristic polynomial and companion matrix#

void _arb_mat_charpoly(arb_ptr poly, const arb_mat_t mat, slong prec)
void arb_mat_charpoly(arb_poly_t poly, const arb_mat_t mat, slong prec)

Set poly to the characteristic polynomial \det(xI - A) of the square n \times n matrix A (an exception is raised otherwise). The underscore version writes n + 1 coefficients. Wrappers of _gr_mat_charpoly_berkowitz, the division-free algorithm of Berkowitz with O(n^4) operations, which avoids divisions by balls that contain zero (Characteristic and minimal polynomials). A non-finite matrix gives indeterminate coefficients.

void arb_mat_companion(arb_mat_t mat, const arb_poly_t poly, slong prec)

Set the n \times n matrix mat to the companion matrix of the polynomial of degree n (the underscore version reads n + 1 coefficients). If the leading coefficient cannot be inverted, the result is indeterminate. Wrappers of _gr_mat_companion and gr_mat_companion.

Matrix functions#

Sets S to the truncated exponential series \sum_{k=0}^{N-1} A^k / k!, using rectangular splitting with O(\sqrt{N}) matrix multiplications. The factorials are generated by their recurrence so that the scalars are small integers, and the divisions are postponed by computing partial factorials of length O(\sqrt{N}) [Joh2014b].

void arb_mat_exp(arb_mat_t B, const arb_mat_t A, slong prec)

Sets B to the exponential \exp(A) = \sum_{k \ge 0} A^k/k! of the square matrix A.

More
void arb_mat_trace(arb_t trace, const arb_mat_t mat, slong prec)

Sets trace to the sum of the diagonal entries of the square matrix mat.

void _arb_mat_diag_prod(arb_t res, const arb_mat_t mat, slong a, slong b, slong prec)
void arb_mat_diag_prod(arb_t res, const arb_mat_t mat, slong prec)

Set res to the product of the diagonal entries of mat; the underscore version takes the product of the entries with index a \le i < b (which must be in range; the empty product is 1).

Sparsity structure#

Return the number of entries of mat that are exactly zero (arb_is_zero), respectively not exactly zero.

Component and error operations#

Sets B to the matrix of midpoints of A, with zero radii.

Adds err to the radius of every entry of mat.

Eigenvalues#

There are no eigenvalue functions for real matrices in this module. Convert the matrix to an acb_mat_t with acb_mat_set_arb_mat and use the functions in Eigenvalues and eigenvectors.

LLL reduction of quadratic forms#

Attempts to set B to the symmetric positive definite integer matrix obtained by rounding 2^{\mathit{prec}} A entrywise, using the midpoint of the intersection of a_{jk} and a_{kj} for both entries. Returns 1 on success, and 0 (with B undefined) if some pair a_{jk}, a_{kj} does not overlap or the rounded matrix is not positive definite. As for arf_get_fmpz, huge exponents can exhaust memory.

void arb_mat_spd_lll_reduce(fmpz_mat_t U, const arb_mat_t A, double delta, double eta, slong prec)

Given a symmetric positive definite matrix A, sets U to an invertible integer matrix such that U A U^T is close to being LLL-reduced with the parameters \delta, \eta: if arb_mat_spd_get_fmpz_mat succeeds at precision prec, fmpz_lll is applied to the rounded Gram matrix, and otherwise U is the identity. If A is not finite, U is not modified.

int arb_mat_spd_is_lll_reduced(const arb_mat_t A, double delta, double eta, slong prec)

Given a symmetric positive definite matrix A (only the lower triangle is read; neither property is checked), returns nonzero if A is certainly LLL-reduced for the parameters \delta, \eta as a Gram matrix: the Gram–Schmidt coefficients satisfy |\mu_{j,k}| \le \eta and \delta \|b_{k-1}^*\|^2 \le \|b_k^*\|^2 + \mu_{k,k-1}^2 \|b_{k-1}^*\|^2.

Internal functions#

void arb_mat_swap_rows(arb_mat_t mat, slong * perm, slong r, slong s)

Swaps rows r and s of mat and, if perm is not NULL, the entries r and s of perm.

slong arb_mat_find_pivot_partial(const arb_mat_t mat, slong start_row, slong end_row, slong c)

Returns the index i with \mathit{start\_row} \le i < \mathit{end\_row} of the entry in column c that does not contain zero and has the largest midpoint in absolute value, or -1 if every entry in that range contains zero.

Adds to the radii of C an upper bound for the product of the nonnegative matrices A (\mathit{ar} \times \mathit{ac}, row-major array) and B (\mathit{ac} \times \mathit{bc}, given as a column-major array). The exponents of all entries must be small (this is not checked), which arb_mat_mul_block ensures. Products are computed in double precision when the exponent range permits and the result is multiplied by 1 + 2.01(\mathit{ac} + 1) 2^{-52} to account for rounding errors.

References#

  • [HS1967] E. Hansen and R. Smith, "Interval Arithmetic in Matrix Computations, Part II", SIAM Journal of Numerical Analysis, 4(1):1-9 (1967). https://doi.org/10.1137/0704001
  • [Rum2010] S. M. Rump, "Verification methods: Rigorous results using floating-point arithmetic", Acta Numerica 19 (2010), 287-449.
  • [Kri2013] A. Krishnamoorthy and D. Menon, "Matrix Inversion Using Cholesky Decomposition" Proc. of the International Conference on Signal Processing Algorithms, Architectures, Arrangements, and Applications (SPA-2013), pp. 70-72, 2013.
  • [GVL1996] G. H. Golub and C. F. Van Loan, Matrix Computations, third edition, Johns Hopkins University Press (1996).
  • [Joh2014b] F. Johansson, "Evaluating parametric holonomic sequences using rectangular splitting", ISSAC 2014, 256-263. https://doi.org/10.1145/2608628.2608629
Cite this page

The FLINT team, “arb_mat.h (module overview),” FLINT: Fast Library for Number Theory, documentation, version 3.7.0-dev, 2026. https://flintlib.org/doc/arb_mat/index.html (generated 2026-10-20).