Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-07 10:15:13

0001 /*
0002     Copyright (C) 2017 Luca De Feo
0003     Copyright (C) 2021 Daniel Schultz
0004 
0005     This file is part of FLINT.
0006 
0007     FLINT is free software: you can redistribute it and/or modify it under
0008     the terms of the GNU Lesser General Public License (LGPL) as published
0009     by the Free Software Foundation; either version 3 of the License, or
0010     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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 /* Element access  ********************************************************/
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 /* Memory management  ********************************************************/
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 /* Basic manipulation  ********************************************************/
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 /* Conversions */
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 /* Random matrix generation */
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 /* Windows and concatenation */
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 /* Input/output */
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 /* Comparison */
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 /* Transpose */
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 /* Addition and subtraction */
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 /* Matrix-scalar arithmetic */
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 /* Matrix multiplication */
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 /* Trace */
0231 
0232 void fmpz_mod_mat_trace(fmpz_t trace, const fmpz_mod_mat_t mat, const fmpz_mod_ctx_t ctx);
0233 
0234 /* Gaussian elimination *********************************************/
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 /* Howell and strong echelon form ***********************************/
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 /* Transforms ****************************************************************/
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 /* Permutations ************************************************************/
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