File indexing completed on 2026-11-07 10:15:13
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FMPZ_MOD_MAT_H
0014 #define FMPZ_MOD_MAT_H
0015
0016 #ifdef FMPZ_MOD_MAT_INLINES_C
0017 #define FMPZ_MOD_MAT_INLINE
0018 #else
0019 #define FMPZ_MOD_MAT_INLINE static inline
0020 #endif
0021
0022 #include "fmpz_mat.h"
0023 #include "fmpz_mod_types.h"
0024
0025 #ifdef __cplusplus
0026 extern "C" {
0027 #endif
0028
0029
0030
0031 FMPZ_MOD_MAT_INLINE
0032 fmpz * fmpz_mod_mat_entry(const fmpz_mod_mat_t mat, slong i, slong j)
0033 {
0034 return fmpz_mat_entry(mat, i, j);
0035 }
0036
0037 FMPZ_MOD_MAT_INLINE
0038 fmpz * fmpz_mod_mat_row(const fmpz_mod_mat_t mat, slong i)
0039 {
0040 return fmpz_mod_mat_entry(mat, i, 0);
0041 }
0042
0043 void fmpz_mod_mat_set_entry(fmpz_mod_mat_t mat, slong i, slong j, const fmpz_t val, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0044 void fmpz_mod_mat_get_entry(fmpz_t x, const fmpz_mod_mat_t mat, slong i, slong j, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0045
0046
0047
0048 void fmpz_mod_mat_init(fmpz_mod_mat_t mat, slong rows, slong cols, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0049
0050 void fmpz_mod_mat_init_set(fmpz_mod_mat_t mat, const fmpz_mod_mat_t src, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0051
0052 void fmpz_mod_mat_clear(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0053
0054
0055
0056 FMPZ_MOD_MAT_INLINE
0057 slong fmpz_mod_mat_nrows(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0058 {
0059 return fmpz_mat_nrows(mat);
0060 }
0061
0062 FMPZ_MOD_MAT_INLINE
0063 slong fmpz_mod_mat_ncols(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0064 {
0065 return fmpz_mat_ncols(mat);
0066 }
0067
0068 FMPZ_MOD_MAT_INLINE
0069 void fmpz_mod_mat_one(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx)
0070 {
0071 if (*ctx->n == WORD(1))
0072 fmpz_mat_zero(mat);
0073 else
0074 fmpz_mat_one(mat);
0075 }
0076
0077 FMPZ_MOD_MAT_INLINE
0078 void fmpz_mod_mat_zero(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0079 {
0080 fmpz_mat_zero(mat);
0081 }
0082
0083 FMPZ_MOD_MAT_INLINE
0084 int fmpz_mod_mat_is_empty(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0085 {
0086 return fmpz_mat_is_empty(mat);
0087 }
0088
0089 FMPZ_MOD_MAT_INLINE
0090 int fmpz_mod_mat_is_square(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0091 {
0092 return fmpz_mat_is_square(mat);
0093 }
0094
0095 void fmpz_mod_mat_swap(fmpz_mod_mat_t mat1, fmpz_mod_mat_t mat2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0096 void fmpz_mod_mat_swap_entrywise(fmpz_mod_mat_t mat1, fmpz_mod_mat_t mat2, const fmpz_mod_ctx_t ctx);
0097
0098 void fmpz_mod_mat_set(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0099
0100
0101
0102 FMPZ_MOD_MAT_INLINE
0103 void fmpz_mod_mat_set_nmod_mat(fmpz_mod_mat_t A, const nmod_mat_t B, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0104 {
0105 fmpz_mat_set_nmod_mat_unsigned(A, B);
0106 }
0107
0108 void fmpz_mod_mat_set_fmpz_mat(fmpz_mod_mat_t A, const fmpz_mat_t B, const fmpz_mod_ctx_t ctx);
0109
0110 void fmpz_mod_mat_get_fmpz_mat(fmpz_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0111
0112 FMPZ_MOD_MAT_INLINE void _fmpz_mod_mat_reduce(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx)
0113 {
0114 fmpz_mod_mat_set_fmpz_mat(mat, mat, ctx);
0115 }
0116
0117
0118
0119 void fmpz_mod_mat_randtest(fmpz_mod_mat_t mat, flint_rand_t state, const fmpz_mod_ctx_t ctx);
0120
0121 void fmpz_mod_mat_randfull(fmpz_mod_mat_t mat, flint_rand_t state, const fmpz_mod_ctx_t ctx);
0122
0123 void fmpz_mod_mat_rand(fmpz_mod_mat_t mat, flint_rand_t state, const fmpz_mod_ctx_t ctx);
0124
0125 void fmpz_mod_mat_randrank(fmpz_mod_mat_t mat, flint_rand_t state, slong rank, const fmpz_mod_ctx_t ctx);
0126
0127 void fmpz_mod_mat_randtril(fmpz_mod_mat_t mat, flint_rand_t state, int unit, const fmpz_mod_ctx_t ctx);
0128
0129 void fmpz_mod_mat_randtriu(fmpz_mod_mat_t mat, flint_rand_t state, int unit, const fmpz_mod_ctx_t ctx);
0130
0131 FMPZ_MOD_MAT_INLINE
0132 void fmpz_mod_mat_randops(fmpz_mod_mat_t mat, flint_rand_t state, slong count, const fmpz_mod_ctx_t ctx)
0133 {
0134 fmpz_mat_randops(mat, state, count);
0135 _fmpz_mod_mat_reduce(mat, ctx);
0136 }
0137
0138
0139
0140 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, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0141
0142 void fmpz_mod_mat_window_clear(fmpz_mod_mat_t window, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0143
0144 FMPZ_MOD_MAT_INLINE
0145 void fmpz_mod_mat_concat_horizontal(fmpz_mod_mat_t res,
0146 const fmpz_mod_mat_t mat1,
0147 const fmpz_mod_mat_t mat2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0148 {
0149 fmpz_mat_concat_horizontal(res, mat1, mat2);
0150 }
0151
0152 FMPZ_MOD_MAT_INLINE
0153 void fmpz_mod_mat_concat_vertical(fmpz_mod_mat_t res,
0154 const fmpz_mod_mat_t mat1,
0155 const fmpz_mod_mat_t mat2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0156 {
0157 fmpz_mat_concat_vertical(res, mat1, mat2);
0158 }
0159
0160
0161
0162 #ifdef FLINT_HAVE_FILE
0163 int fmpz_mod_mat_fprint(FILE * file, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0164 int fmpz_mod_mat_fprint_pretty(FILE * file, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0165 #endif
0166
0167 int fmpz_mod_mat_print(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0168 void fmpz_mod_mat_print_pretty(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0169
0170
0171
0172 int fmpz_mod_mat_equal(const fmpz_mod_mat_t mat1, const fmpz_mod_mat_t mat2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0173 int fmpz_mod_mat_is_zero(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0174 int fmpz_mod_mat_is_one(const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0175
0176
0177
0178 FMPZ_MOD_MAT_INLINE
0179 void fmpz_mod_mat_transpose(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0180 {
0181 fmpz_mat_transpose(B, A);
0182 }
0183
0184
0185
0186 void fmpz_mod_mat_add(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0187
0188 void fmpz_mod_mat_sub(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0189
0190 void fmpz_mod_mat_neg(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t ctx);
0191
0192
0193
0194 void fmpz_mod_mat_scalar_mul_si(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, slong c, const fmpz_mod_ctx_t ctx);
0195
0196 void fmpz_mod_mat_scalar_mul_ui(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, ulong c, const fmpz_mod_ctx_t ctx);
0197
0198 void fmpz_mod_mat_scalar_mul_fmpz(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, fmpz_t c, const fmpz_mod_ctx_t ctx);
0199
0200
0201
0202 void fmpz_mod_mat_mul(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0203
0204 void _fmpz_mod_mat_mul_classical_threaded_pool_op(fmpz_mod_mat_t D,
0205 const fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B,
0206 int op, thread_pool_handle * threads, slong num_threads, const fmpz_mod_ctx_t ctx);
0207
0208 void fmpz_mod_mat_mul_classical_threaded(fmpz_mod_mat_t C,
0209 const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0210
0211 void fmpz_mod_mat_sqr(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t ctx);
0212
0213 void fmpz_mod_mat_pow_ui(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, ulong exp, const fmpz_mod_ctx_t ctx);
0214
0215 void fmpz_mod_mat_submul(fmpz_mod_mat_t D, const fmpz_mod_mat_t C,
0216 const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0217
0218 void fmpz_mod_mat_mul_fmpz_vec(fmpz * c, const fmpz_mod_mat_t A,
0219 const fmpz * b, slong blen, const fmpz_mod_ctx_t ctx);
0220
0221 void fmpz_mod_mat_mul_fmpz_vec_ptr(fmpz * const * c,
0222 const fmpz_mod_mat_t A, const fmpz * const * b, slong blen, const fmpz_mod_ctx_t ctx);
0223
0224 void fmpz_mod_mat_fmpz_vec_mul(fmpz * c, const fmpz * a, slong alen,
0225 const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0226
0227 void fmpz_mod_mat_fmpz_vec_mul_ptr(fmpz * const * c,
0228 const fmpz * const * a, slong alen, const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0229
0230
0231
0232 void fmpz_mod_mat_trace(fmpz_t trace, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0233
0234
0235
0236 void fmpz_mod_mat_det(fmpz_t res, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0237
0238 slong fmpz_mod_mat_rref(fmpz_mod_mat_t res, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0239
0240 int fmpz_mod_mat_reduce_row(slong * column, fmpz_mod_mat_t A, slong * P, slong * L, slong m, const fmpz_mod_ctx_t ctx);
0241
0242 slong fmpz_mod_mat_lu(slong * P, fmpz_mod_mat_t A, int rank_check, const fmpz_mod_ctx_t ctx);
0243
0244 void fmpz_mod_mat_solve_triu(fmpz_mod_mat_t X, const fmpz_mod_mat_t L,
0245 const fmpz_mod_mat_t B, int unit, const fmpz_mod_ctx_t ctx);
0246
0247 void fmpz_mod_mat_solve_tril(fmpz_mod_mat_t X, const fmpz_mod_mat_t L,
0248 const fmpz_mod_mat_t B, int unit, const fmpz_mod_ctx_t ctx);
0249
0250 int fmpz_mod_mat_can_solve(fmpz_mod_mat_t X, const fmpz_mod_mat_t A,
0251 const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0252
0253 int fmpz_mod_mat_solve(fmpz_mod_mat_t X, const fmpz_mod_mat_t A,
0254 const fmpz_mod_mat_t B, const fmpz_mod_ctx_t ctx);
0255
0256 int fmpz_mod_mat_inv(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t ctx);
0257
0258 slong fmpz_mod_mat_rank(const fmpz_mod_mat_t A, const fmpz_mod_ctx_t ctx);
0259
0260 slong fmpz_mod_mat_nullspace(fmpz_mod_mat_t X, const fmpz_mod_mat_t A, const fmpz_mod_ctx_t ctx);
0261
0262
0263
0264 slong fmpz_mod_mat_howell_form(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0265
0266 void fmpz_mod_mat_strong_echelon_form(fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0267
0268
0269
0270 void fmpz_mod_mat_similarity(fmpz_mod_mat_t A, slong r, fmpz_t d, const fmpz_mod_ctx_t ctx);
0271
0272
0273
0274 FMPZ_MOD_MAT_INLINE
0275 void fmpz_mod_mat_swap_rows(fmpz_mod_mat_t mat, slong * perm, slong r, slong s, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0276 {
0277 fmpz_mat_swap_rows(mat, perm, r, s);
0278 }
0279
0280 FMPZ_MOD_MAT_INLINE
0281 void fmpz_mod_mat_invert_rows(fmpz_mod_mat_t mat, slong * perm, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0282 {
0283 fmpz_mat_invert_rows(mat, perm);
0284 }
0285
0286 FMPZ_MOD_MAT_INLINE
0287 void fmpz_mod_mat_swap_cols(fmpz_mod_mat_t mat, slong * perm, slong r, slong s, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0288 {
0289 fmpz_mat_swap_cols(mat, perm, r, s);
0290 }
0291
0292 FMPZ_MOD_MAT_INLINE
0293 void fmpz_mod_mat_invert_cols(fmpz_mod_mat_t mat, slong * perm, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0294 {
0295 fmpz_mat_invert_cols(mat, perm);
0296 }
0297
0298 #ifdef __cplusplus
0299 }
0300 #endif
0301
0302 #endif