fmpz_mod_mat.h – matrices over integers mod n¶
Description.
Types, macros and constants¶
-
type fmpz_mod_mat_struct¶
Element access¶
-
fmpz *fmpz_mod_mat_entry(const fmpz_mod_mat_t mat, slong i, slong j)¶
Return a reference to the element at row
iand columnjofmat.
-
void fmpz_mod_mat_set_entry(fmpz_mod_mat_t mat, slong i, slong j, const fmpz_t val)¶
Set the entry at row
iand columnjofmattoval.
Memory management¶
-
void fmpz_mod_mat_init(fmpz_mod_mat_t mat, slong rows, slong cols, const fmpz_t n)¶
Initialise
matas a matrix with the given number ofrowsandcolsand modulusn.
-
void fmpz_mod_mat_init_set(fmpz_mod_mat_t mat, const fmpz_mod_mat_t src)¶
Initialise
matand set it equal to the matrixsrc, including the number of rows and columns and the modulus.
-
void fmpz_mod_mat_clear(fmpz_mod_mat_t mat)¶
Clear
matand release any memory it used.
Basic manipulation ——————————————————————————–
-
slong fmpz_mod_mat_nrows(const fmpz_mod_mat_t mat)¶
Return the number of rows of
mat.
-
slong fmpz_mod_mat_ncols(const fmpz_mod_mat_t mat)¶
Return the number of columns of
mat.
-
void _fmpz_mod_mat_set_mod(fmpz_mod_mat_t mat, const fmpz_t n)¶
Set the modulus of the matrix
matton.
-
void fmpz_mod_mat_one(fmpz_mod_mat_t mat)¶
Set
matto the identity matrix (ones down the diagonal).
-
void fmpz_mod_mat_zero(fmpz_mod_mat_t mat)¶
Set
matto the zero matrix.
-
void fmpz_mod_mat_swap(fmpz_mod_mat_t mat1, fmpz_mod_mat_t mat2)¶
Efficiently swap the matrices
mat1andmat2.
-
void fmpz_mod_mat_swap_entrywise(fmpz_mod_mat_t mat1, fmpz_mod_mat_t mat2)¶
Swaps two matrices by swapping the individual entries rather than swapping the contents of the structs.
-
int fmpz_mod_mat_is_empty(const fmpz_mod_mat_t mat)¶
Return \(1\) if
mathas either zero rows or columns.
-
int fmpz_mod_mat_is_square(const fmpz_mod_mat_t mat)¶
Return \(1\) if
mathas the same number of rows and columns.
-
void _fmpz_mod_mat_reduce(fmpz_mod_mat_t mat)¶
Reduce all the entries of
matby the modulusn. This function is only needed internally.
Random generation¶
-
void fmpz_mod_mat_randtest(fmpz_mod_mat_t mat, flint_rand_t state)¶
Generate a random matrix with the existing dimensions and entries in \([0, n)\) where
nis the modulus.
Windows and concatenation¶
-
void fmpz_mod_mat_window_init(fmpz_mod_mat_t window, const fmpz_mod_mat_t mat, slong r1, slong c1, slong r2, slong c2)¶
Initializes the matrix
windowto be anr2 - r1byc2 - c1submatrix ofmatwhose(0, 0)entry is the(r1, c1)entry ofmat. The memory for the elements ofwindowis shared withmat.
-
void fmpz_mod_mat_window_clear(fmpz_mod_mat_t window)¶
Clears the matrix
windowand releases any memory that it uses. Note that the memory to the underlying matrix thatwindowpoints to is not freed.
-
void fmpz_mod_mat_concat_horizontal(fmpz_mod_mat_t res, const fmpz_mod_mat_t mat1, const fmpz_mod_mat_t mat2)¶
Sets
resto vertical concatenation of (mat1,mat2) in that order. Matrix dimensions :mat1: \(m \times n\),mat2: \(k \times n\),res: \((m + k) \times n\).
-
void fmpz_mod_mat_concat_vertical(fmpz_mod_mat_t res, const fmpz_mod_mat_t mat1, const fmpz_mod_mat_t mat2)¶
Sets
resto horizontal concatenation of (mat1,mat2) in that order. Matrix dimensions :mat1: \(m \times n\),mat2: \(m \times k\),res: \(m \times (n + k)\).
Input and output¶
-
void fmpz_mod_mat_print_pretty(const fmpz_mod_mat_t mat)¶
Prints the given matrix to
stdout. The format is an opening square bracket then on each line a row of the matrix, followed by a closing square bracket. Each row is written as an opening square bracket followed by a space separated list of coefficients followed by a closing square bracket.
Comparison¶
-
int fmpz_mod_mat_is_zero(const fmpz_mod_mat_t mat)¶
Return \(1\) if
matis the zero matrix.
Set and transpose¶
-
void fmpz_mod_mat_set(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
Bto equalA.
-
void fmpz_mod_mat_transpose(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
Bto the transpose ofA.
Conversions¶
-
void fmpz_mod_mat_set_fmpz_mat(fmpz_mod_mat_t A, const fmpz_mat_t B)¶
Set
Ato the matrixBreducing modulo the modulus ofA.
-
void fmpz_mod_mat_get_fmpz_mat(fmpz_mat_t A, const fmpz_mod_mat_t B)¶
Set
Ato a lift ofB.
Addition and subtraction¶
-
void fmpz_mod_mat_add(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B)¶
Set
Cto \(A + B\).
-
void fmpz_mod_mat_sub(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B)¶
Set
Cto \(A - B\).
-
void fmpz_mod_mat_neg(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
Bto \(-A\).
Scalar arithmetic¶
-
void fmpz_mod_mat_scalar_mul_si(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, slong c)¶
Set
Bto \(cA\) wherecis a constant.
-
void fmpz_mod_mat_scalar_mul_ui(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, slong c)¶
Set
Bto \(cA\) wherecis a constant.
-
void fmpz_mod_mat_scalar_mul_fmpz(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, fmpz_t c)¶
Set
Bto \(cA\) wherecis a constant.
Matrix multiplication¶
-
void fmpz_mod_mat_mul(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B)¶
Set
CtoA\times B. The number of rows ofBmust match the number of columns ofA.
-
void _fmpz_mod_mat_mul_classical_threaded_pool_op(fmpz_mod_mat_t D, const fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, int op, thread_pool_handle *threads, slong num_threads)¶
Set
DtoA\times B + op*Cwhereopis+1,-1or0.
-
void _fmpz_mod_mat_mul_classical_threaded_op(fmpz_mod_mat_t D, const fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, int op)¶
Set
DtoA\times B + op*Cwhereopis+1,-1or0.
-
void fmpz_mod_mat_mul_classical_threaded(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B)¶
Set
CtoA\times B. The number of rows ofBmust match the number of columns ofA.
-
void fmpz_mod_mat_sqr(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
BtoA^2. The matrixAmust be square.
-
void fmpz_mod_mat_mul_fmpz_vec(fmpz *c, const fmpz_mod_mat_t A, const fmpz *b, slong blen)¶
-
void fmpz_mod_mat_mul_fmpz_vec_ptr(fmpz *const *c, const fmpz_mod_mat_t A, const fmpz *const *b, slong blen)¶
Compute a matrix-vector product of
Aand(b, blen)and store the result inc. The vector(b, blen)is either truncated or zero-extended to the number of columns ofA. The number entries written tocis always equal to the number of rows ofA.
-
void fmpz_mod_mat_fmpz_vec_mul(fmpz *c, const fmpz *a, slong alen, const fmpz_mod_mat_t B)¶
-
void fmpz_mod_mat_fmpz_vec_mul_ptr(fmpz *const *c, const fmpz *const *a, slong alen, const fmpz_mod_mat_t B)¶
Compute a vector-matrix product of
(a, alen)andBand and store the result inc. The vector(a, alen)is either truncated or zero-extended to the number of rows ofB. The number entries written tocis always equal to the number of columns ofB.
Trace¶
-
void fmpz_mod_mat_trace(fmpz_t trace, const fmpz_mod_mat_t mat)¶
Set
traceto the trace of the matrixmat.
Gaussian elimination¶
-
slong fmpz_mod_mat_rref(slong *perm, fmpz_mod_mat_t mat)¶
Uses Gauss-Jordan elimination to set
matto its reduced row echelon form and returns the rank ofmat.If
permis non-NULL, the permutation of rows in the matrix will also be applied toperm.
Strong echelon form and Howell form¶
-
void fmpz_mod_mat_strong_echelon_form(fmpz_mod_mat_t mat)¶
Transforms \(mat\) into the strong echelon form of \(mat\). The Howell form and the strong echelon form are equal up to permutation of the rows, see [FieHof2014] for a definition of the strong echelon form and the algorithm used here.
\(mat\) must have at least as many rows as columns.
-
slong fmpz_mod_mat_howell_form(fmpz_mod_mat_t mat)¶
Transforms \(mat\) into the Howell form of \(mat\). For a definition of the Howell form see [StoMul1998]. The Howell form is computed by first putting \(mat\) into strong echelon form and then ordering the rows.
\(mat\) must have at least as many rows as columns.