padic_mat.h – matrices over p-adic numbers¶
Module documentation¶
We represent a matrix over \(\mathbf{Q}_p\) as a product \(p^v M\), where \(p\) is a prime number, \(v \in \mathbf{Z}\) and \(M\) a matrix over \(\mathbf{Z}\). We say this matrix is in canonical form if either \(M\) is zero, in which case we choose \(v = 0\), too, or if \(M\) contains at least one \(p\)-adic unit. We say this matrix is reduced modulo \(p^N\) if it is canonical form and if all coefficients of \(M\) lie in the range \([0, p^{N-v})\).
Macros¶
-
fmpz_mat_struct *padic_mat(const padic_mat_t A)¶
Returns a pointer to the unit part of the matrix, which is a matrix over \(\mathbf{Z}\).
The return value can be used as an argument to the functions in the
fmpz_mat
module.
-
fmpz *padic_mat_entry(const padic_mat_t A, slong i, slong j)¶
Returns a pointer to unit part of the entry in position \((i, j)\). Note that this is not necessarily a unit.
The return value can be used as an argument to the functions in the
fmpz
module.
-
slong padic_mat_val(const padic_mat_t A)¶
Allow access (as L-value or R-value) to
val
field of \(A\). This function is implemented as a macro.
Memory management¶
-
void padic_mat_init(padic_mat_t A, slong r, slong c)¶
Initialises the matrix \(A\) as a zero matrix with the specified numbers of rows and columns and precision
PADIC_DEFAULT_PREC
.
-
void padic_mat_init2(padic_mat_t A, slong r, slong c, slong prec)¶
Initialises the matrix \(A\) as a zero matrix with the specified numbers of rows and columns and the given precision.
-
void padic_mat_clear(padic_mat_t A)¶
Clears the matrix \(A\).
-
void _padic_mat_canonicalise(padic_mat_t A, const padic_ctx_t ctx)¶
Ensures that the matrix \(A\) is in canonical form.
-
void _padic_mat_reduce(padic_mat_t A, const padic_ctx_t ctx)¶
Ensures that the matrix \(A\) is reduced modulo \(p^N\), assuming that it is in canonical form already.
-
void padic_mat_reduce(padic_mat_t A, const padic_ctx_t ctx)¶
Ensures that the matrix \(A\) is reduced modulo \(p^N\), without assuming that it is necessarily in canonical form.
-
int padic_mat_is_empty(const padic_mat_t A)¶
Returns whether the matrix \(A\) is empty, that is, whether it has zero rows or zero columns.
-
int padic_mat_is_square(const padic_mat_t A)¶
Returns whether the matrix \(A\) is square.
-
int padic_mat_is_canonical(const padic_mat_t A, const padic_ctx_t p)¶
Returns whether the matrix \(A\) is in canonical form.
Basic assignment¶
-
void padic_mat_set(padic_mat_t B, const padic_mat_t A, const padic_ctx_t p)¶
Sets \(B\) to a copy of \(A\), respecting the precision of \(B\).
-
void padic_mat_swap(padic_mat_t A, padic_mat_t B)¶
Swaps the two matrices \(A\) and \(B\). This is done efficiently by swapping pointers.
-
void padic_mat_swap_entrywise(padic_mat_t mat1, padic_mat_t mat2)¶
Swaps two matrices by swapping the individual entries rather than swapping the contents of the structs.
-
void padic_mat_zero(padic_mat_t A)¶
Sets the matrix \(A\) to zero.
-
void padic_mat_one(padic_mat_t A)¶
Sets the matrix \(A\) to the identity matrix. If the precision is negative then the matrix will be the zero matrix.
Conversions¶
-
void padic_mat_set_fmpq_mat(padic_mat_t B, const fmpq_mat_t A, const padic_ctx_t ctx)¶
Sets the \(p\)-adic matrix \(B\) to the rational matrix \(A\), reduced according to the given context.
-
void padic_mat_get_fmpq_mat(fmpq_mat_t B, const padic_mat_t A, const padic_ctx_t ctx)¶
Sets the rational matrix \(B\) to the \(p\)-adic matrices \(A\); no reduction takes place.
Entries¶
Because of the choice of the data structure, representing the matrix as \(p^v M\), setting an entry of the matrix might lead to changes in all entries in the matrix \(M\). Also, a specific entry is not readily available as a \(p\)-adic number. Thus, there are separate functions available for getting and setting entries.
Comparison¶
-
int padic_mat_equal(const padic_mat_t A, const padic_mat_t B)¶
Returns whether the two matrices \(A\) and \(B\) are equal.
-
int padic_mat_is_zero(const padic_mat_t A)¶
Returns whether the matrix \(A\) is zero.
Input and output¶
-
int padic_mat_fprint(FILE *file, const padic_mat_t A, const padic_ctx_t ctx)¶
Prints a simple representation of the matrix \(A\) to the output stream
file
. The format is the number of rows, a space, the number of columns, two spaces, followed by a list of all the entries, one row after the other.In the current implementation, always returns \(1\).
-
int padic_mat_fprint_pretty(FILE *file, const padic_mat_t A, const padic_ctx_t ctx)¶
Prints a pretty representation of the matrix \(A\) to the output stream
file
.In the current implementation, always returns \(1\).
Random matrix generation¶
-
void padic_mat_randtest(padic_mat_t A, flint_rand_t state, const padic_ctx_t ctx)¶
Sets \(A\) to a random matrix.
The valuation will be in the range \([- \lceil N/10\rceil, N)\), \([N - \lceil -N/10\rceil, N)\), or \([-10, 0)\) as \(N\) is positive, negative or zero.
Transpose¶
-
void padic_mat_transpose(padic_mat_t B, const padic_mat_t A)¶
Sets \(B\) to \(A^t\).
Addition and subtraction¶
-
void _padic_mat_add(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to the exact sum \(A + B\), ensuring that the result is in canonical form.
-
void padic_mat_add(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to the sum \(A + B\) modulo \(p^N\).
-
void _padic_mat_sub(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to the exact difference \(A - B\), ensuring that the result is in canonical form.
-
void padic_mat_sub(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to \(A - B\), ensuring that the result is reduced.
-
void _padic_mat_neg(padic_mat_t B, const padic_mat_t A)¶
Sets \(B\) to \(-A\) in canonical form.
-
void padic_mat_neg(padic_mat_t B, const padic_mat_t A, const padic_ctx_t ctx)¶
Sets \(B\) to \(-A\), ensuring the result is reduced.
Scalar operations¶
-
void _padic_mat_scalar_mul_padic(padic_mat_t B, const padic_mat_t A, const padic_t c, const padic_ctx_t ctx)¶
Sets \(B\) to \(c A\), ensuring that the result is in canonical form.
-
void padic_mat_scalar_mul_padic(padic_mat_t B, const padic_mat_t A, const padic_t c, const padic_ctx_t ctx)¶
Sets \(B\) to \(c A\), ensuring that the result is reduced.
-
void _padic_mat_scalar_mul_fmpz(padic_mat_t B, const padic_mat_t A, const fmpz_t c, const padic_ctx_t ctx)¶
Sets \(B\) to \(c A\), ensuring that the result is in canonical form.
Multiplication¶
-
void _padic_mat_mul(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to the product \(A B\) of the two matrices \(A\) and \(B\), ensuring that \(C\) is in canonical form.
-
void padic_mat_mul(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx)¶
Sets \(C\) to the product \(A B\) of the two matrices \(A\) and \(B\), ensuring that \(C\) is reduced.