fmpz_mod_mat.h – matrices over integers mod n¶
Description.
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
i
and columnj
ofmat
.
-
void fmpz_mod_mat_set_entry(fmpz_mod_mat_t mat, slong i, slong j, const fmpz_t val)¶
Set the entry at row
i
and columnj
ofmat
toval
.
Memory management¶
-
void fmpz_mod_mat_init(fmpz_mod_mat_t mat, slong rows, slong cols, const fmpz_t n)¶
Initialise
mat
as a matrix with the given number ofrows
andcols
and modulusn
.
-
void fmpz_mod_mat_init_set(fmpz_mod_mat_t mat, const fmpz_mod_mat_t src)¶
Initialise
mat
and 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
mat
and 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
mat
ton
.
-
void fmpz_mod_mat_one(fmpz_mod_mat_t mat)¶
Set
mat
to the identity matrix (ones down the diagonal).
-
void fmpz_mod_mat_zero(fmpz_mod_mat_t mat)¶
Set
mat
to the zero matrix.
-
void fmpz_mod_mat_swap(fmpz_mod_mat_t mat1, fmpz_mod_mat_t mat2)¶
Efficiently swap the matrices
mat1
andmat2
.
-
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
mat
has either zero rows or columns.
-
int fmpz_mod_mat_is_square(const fmpz_mod_mat_t mat)¶
Return \(1\) if
mat
has the same number of rows and columns.
-
void _fmpz_mod_mat_reduce(fmpz_mod_mat_t mat)¶
Reduce all the entries of
mat
by 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
n
is 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
window
to be anr2 - r1
byc2 - c1
submatrix ofmat
whose(0, 0)
entry is the(r1, c1)
entry ofmat
. The memory for the elements ofwindow
is shared withmat
.
-
void fmpz_mod_mat_window_clear(fmpz_mod_mat_t window)¶
Clears the matrix
window
and releases any memory that it uses. Note that the memory to the underlying matrix thatwindow
points 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
res
to 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
res
to 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
mat
is the zero matrix.
Set and transpose¶
-
void fmpz_mod_mat_set(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
B
to equalA
.
-
void fmpz_mod_mat_transpose(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
B
to the transpose ofA
.
Conversions¶
-
void fmpz_mod_mat_set_fmpz_mat(fmpz_mod_mat_t A, const fmpz_mat_t B)¶
Set
A
to the matrixB
reducing modulo the modulus ofA
.
-
void fmpz_mod_mat_get_fmpz_mat(fmpz_mat_t A, const fmpz_mod_mat_t B)¶
Set
A
to 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
C
to \(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
C
to \(A - B\).
-
void fmpz_mod_mat_neg(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
B
to \(-A\).
Scalar arithmetic¶
-
void fmpz_mod_mat_scalar_mul_si(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, slong c)¶
Set
B
to \(cA\) wherec
is a constant.
-
void fmpz_mod_mat_scalar_mul_ui(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, slong c)¶
Set
B
to \(cA\) wherec
is a constant.
-
void fmpz_mod_mat_scalar_mul_fmpz(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, fmpz_t c)¶
Set
B
to \(cA\) wherec
is 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
C
toA\times B
. The number of rows ofB
must 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
D
toA\times B + op*C
whereop
is+1
,-1
or0
.
-
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
D
toA\times B + op*C
whereop
is+1
,-1
or0
.
-
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
C
toA\times B
. The number of rows ofB
must match the number of columns ofA
.
-
void fmpz_mod_mat_sqr(fmpz_mod_mat_t B, const fmpz_mod_mat_t A)¶
Set
B
toA^2
. The matrixA
must 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
A
and(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 toc
is 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)
andB
and 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 toc
is always equal to the number of columns ofB
.
Trace¶
-
void fmpz_mod_mat_trace(fmpz_t trace, const fmpz_mod_mat_t mat)¶
Set
trace
to 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
mat
to its reduced row echelon form and returns the rank ofmat
.If
perm
is 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.