## 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.

slong padic_mat_prec(const padic_mat_t A)

Allow access (as L-value or R-value) to prec field of $$A$$. This function is implemented as a macro.

slong padic_mat_get_val(const padic_mat_t A)

Returns the valuation of the matrix.

slong padic_mat_get_prec(const padic_mat_t A)

Returns the $$p$$-adic precision of the matrix.

slong padic_mat_val(const padic_mat_t A)

Returns the valuation of the matrix.

This is implemented as a macro and can be used as an lvalue as well as an rvalue.

slong padic_mat_nrows(const padic_mat_t A)

Returns the number of rows of the matrix $$A$$.

slong padic_mat_ncols(const padic_mat_t A)

Returns the number of columns of the matrix $$A$$.

## 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 fmpz_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)

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.

void padic_mat_get_entry_padic(padic_t rop, const padic_mat_t op, slong i, slong j, const padic_ctx_t ctx)

Sets rop to the entry in position $$(i, j)$$ in the matrix op.

void padic_mat_set_entry_padic(padic_mat_t rop, slong i, slong j, const padic_t op, const padic_ctx_t ctx)

Sets the entry in position $$(i, j)$$ in the matrix to rop.

## 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$$.

int padic_mat_print(const padic_mat_t A, const padic_ctx_t ctx)
int padic_mat_print_pretty(const padic_mat_t A, const padic_ctx_t ctx)

## 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$$.

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.

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 reduced.

void padic_mat_scalar_div_fmpz(padic_mat_t B, const padic_mat_t A, const fmpz_t c, const padic_ctx_t ctx)

Sets $$B$$ to $$c^{-1} A$$, assuming that $$c \neq 0$$. Ensures that the result $$B$$ is reduced.

## 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.