File indexing completed on 2026-11-07 10:15:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef NMOD_POLY_MAT_H
0013 #define NMOD_POLY_MAT_H
0014
0015 #ifdef NMOD_POLY_MAT_INLINES_C
0016 #define NMOD_POLY_MAT_INLINE
0017 #else
0018 #define NMOD_POLY_MAT_INLINE static inline
0019 #endif
0020
0021 #include "nmod_types.h"
0022
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026
0027 NMOD_POLY_MAT_INLINE
0028 nmod_poly_struct * nmod_poly_mat_entry(const nmod_poly_mat_t mat, slong i, slong j)
0029 {
0030 return mat->entries + i * mat->stride + j;
0031 }
0032
0033 NMOD_POLY_MAT_INLINE slong
0034 nmod_poly_mat_nrows(const nmod_poly_mat_t mat)
0035 {
0036 return mat->r;
0037 }
0038
0039 NMOD_POLY_MAT_INLINE slong
0040 nmod_poly_mat_ncols(const nmod_poly_mat_t mat)
0041 {
0042 return mat->c;
0043 }
0044
0045
0046
0047 void nmod_poly_mat_init(nmod_poly_mat_t mat, slong rows, slong cols, ulong n);
0048
0049 void nmod_poly_mat_init_set(nmod_poly_mat_t mat, const nmod_poly_mat_t src);
0050
0051 NMOD_POLY_MAT_INLINE void
0052 nmod_poly_mat_swap(nmod_poly_mat_t mat1, nmod_poly_mat_t mat2)
0053 {
0054 FLINT_SWAP(nmod_poly_mat_struct, *mat1, *mat2);
0055 }
0056
0057 NMOD_POLY_MAT_INLINE void
0058 nmod_poly_mat_swap_entrywise(nmod_poly_mat_t mat1, nmod_poly_mat_t mat2)
0059 {
0060 slong i, j;
0061
0062 for (i = 0; i < nmod_poly_mat_nrows(mat1); i++)
0063 for (j = 0; j < nmod_poly_mat_ncols(mat1); j++)
0064 FLINT_SWAP(nmod_poly_struct, *nmod_poly_mat_entry(mat2, i, j), *nmod_poly_mat_entry(mat1, i, j));
0065 }
0066
0067 void nmod_poly_mat_set(nmod_poly_mat_t mat1, const nmod_poly_mat_t mat2);
0068
0069 void nmod_poly_mat_set_nmod_mat(nmod_poly_mat_t pmat, const nmod_mat_t cmat);
0070
0071 void nmod_poly_mat_clear(nmod_poly_mat_t mat);
0072
0073 void nmod_poly_mat_transpose(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0074
0075
0076
0077 void nmod_poly_mat_set_trunc(nmod_poly_mat_t res,
0078 const nmod_poly_mat_t pmat,
0079 long len);
0080
0081 NMOD_POLY_MAT_INLINE
0082 void nmod_poly_mat_truncate(nmod_poly_mat_t pmat, long len)
0083 {
0084 nmod_poly_mat_set_trunc(pmat, pmat, len);
0085 }
0086
0087 void nmod_poly_mat_shift_left(nmod_poly_mat_t res,
0088 const nmod_poly_mat_t pmat,
0089 slong k);
0090
0091 void nmod_poly_mat_shift_right(nmod_poly_mat_t res,
0092 const nmod_poly_mat_t pmat,
0093 slong k);
0094
0095
0096
0097 NMOD_POLY_MAT_INLINE ulong
0098 nmod_poly_mat_modulus(const nmod_poly_mat_t mat)
0099 {
0100 return mat->modulus;
0101 }
0102
0103 void nmod_poly_mat_get_coeff_mat(nmod_mat_t coeff,
0104 const nmod_poly_mat_t pmat,
0105 slong deg);
0106
0107 void nmod_poly_mat_set_coeff_mat(nmod_poly_mat_t pmat,
0108 const nmod_mat_t coeff,
0109 slong deg);
0110
0111
0112
0113
0114 int nmod_poly_mat_equal(const nmod_poly_mat_t mat1,
0115 const nmod_poly_mat_t mat2);
0116
0117 int nmod_poly_mat_equal_nmod_mat(const nmod_poly_mat_t pmat,
0118 const nmod_mat_t cmat);
0119
0120 int nmod_poly_mat_is_zero(const nmod_poly_mat_t mat);
0121
0122 int nmod_poly_mat_is_one(const nmod_poly_mat_t mat);
0123
0124 NMOD_POLY_MAT_INLINE int
0125 nmod_poly_mat_is_empty(const nmod_poly_mat_t mat)
0126 {
0127 return (mat->r == 0) || (mat->c == 0);
0128 }
0129
0130 NMOD_POLY_MAT_INLINE int
0131 nmod_poly_mat_is_square(const nmod_poly_mat_t mat)
0132 {
0133 return (mat->r == mat->c);
0134 }
0135
0136
0137
0138 void nmod_poly_mat_zero(nmod_poly_mat_t mat);
0139
0140 void nmod_poly_mat_one(nmod_poly_mat_t mat);
0141
0142
0143
0144 void nmod_poly_mat_randtest(nmod_poly_mat_t mat, flint_rand_t state,
0145 slong len);
0146
0147 void nmod_poly_mat_randtest_sparse(nmod_poly_mat_t A, flint_rand_t state,
0148 slong len, float density);
0149
0150
0151
0152 void nmod_poly_mat_window_init(nmod_poly_mat_t window, const nmod_poly_mat_t mat, slong r1,
0153 slong c1, slong r2, slong c2);
0154
0155 void nmod_poly_mat_window_clear(nmod_poly_mat_t window);
0156
0157 void nmod_poly_mat_concat_horizontal(nmod_poly_mat_t res,
0158 const nmod_poly_mat_t mat1, const nmod_poly_mat_t mat2);
0159
0160 void nmod_poly_mat_concat_vertical(nmod_poly_mat_t res,
0161 const nmod_poly_mat_t mat1, const nmod_poly_mat_t mat2);
0162
0163
0164
0165 void nmod_poly_mat_print(const nmod_poly_mat_t mat, const char * x);
0166
0167
0168
0169 slong nmod_poly_mat_max_length(const nmod_poly_mat_t A);
0170
0171 NMOD_POLY_MAT_INLINE
0172 slong nmod_poly_mat_degree(const nmod_poly_mat_t pmat)
0173 {
0174 return nmod_poly_mat_max_length(pmat)-1;
0175 }
0176
0177
0178
0179
0180 void nmod_poly_mat_scalar_mul_nmod_poly(nmod_poly_mat_t B,
0181 const nmod_poly_mat_t A, const nmod_poly_t c);
0182
0183 void nmod_poly_mat_scalar_mul_nmod(nmod_poly_mat_t B,
0184 const nmod_poly_mat_t A, ulong c);
0185
0186
0187
0188 void nmod_poly_mat_add(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0189 const nmod_poly_mat_t B);
0190
0191 void nmod_poly_mat_sub(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0192 const nmod_poly_mat_t B);
0193
0194 void nmod_poly_mat_neg(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0195
0196 void nmod_poly_mat_mul(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0197 const nmod_poly_mat_t B);
0198
0199 void nmod_poly_mat_mul_interpolate(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0200 const nmod_poly_mat_t B);
0201
0202 void nmod_poly_mat_mul_classical(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0203 const nmod_poly_mat_t B);
0204
0205 void nmod_poly_mat_mul_KS(nmod_poly_mat_t C, const nmod_poly_mat_t A,
0206 const nmod_poly_mat_t B);
0207
0208 void nmod_poly_mat_sqr(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0209
0210 void nmod_poly_mat_sqr_classical(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0211
0212 void nmod_poly_mat_sqr_KS(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0213
0214 void nmod_poly_mat_sqr_interpolate(nmod_poly_mat_t B, const nmod_poly_mat_t A);
0215
0216 void nmod_poly_mat_pow(nmod_poly_mat_t B, const nmod_poly_mat_t A, ulong exp);
0217
0218
0219
0220 void nmod_poly_mat_evaluate_nmod(nmod_mat_t B, const nmod_poly_mat_t A, ulong x);
0221
0222
0223
0224 slong nmod_poly_mat_find_pivot_any(const nmod_poly_mat_t mat,
0225 slong start_row, slong end_row, slong c);
0226
0227 slong nmod_poly_mat_find_pivot_partial(const nmod_poly_mat_t mat,
0228 slong start_row, slong end_row, slong c);
0229
0230 slong nmod_poly_mat_fflu(nmod_poly_mat_t B, nmod_poly_t den, slong * perm,
0231 const nmod_poly_mat_t A, int rank_check);
0232
0233 slong nmod_poly_mat_rref(nmod_poly_mat_t B, nmod_poly_t den,
0234 const nmod_poly_mat_t A);
0235
0236
0237
0238 void nmod_poly_mat_trace(nmod_poly_t trace, const nmod_poly_mat_t mat);
0239
0240
0241
0242 void nmod_poly_mat_det(nmod_poly_t det, const nmod_poly_mat_t A);
0243
0244 void nmod_poly_mat_det_fflu(nmod_poly_t det, const nmod_poly_mat_t A);
0245
0246 void nmod_poly_mat_det_interpolate(nmod_poly_t det, const nmod_poly_mat_t A);
0247
0248 slong nmod_poly_mat_rank(const nmod_poly_mat_t A);
0249
0250
0251
0252 int nmod_poly_mat_inv(nmod_poly_mat_t Ainv, nmod_poly_t den,
0253 const nmod_poly_mat_t A);
0254
0255
0256
0257 slong nmod_poly_mat_nullspace(nmod_poly_mat_t res, const nmod_poly_mat_t mat);
0258
0259
0260
0261 int nmod_poly_mat_solve(nmod_poly_mat_t X, nmod_poly_t den,
0262 const nmod_poly_mat_t A, const nmod_poly_mat_t B);
0263
0264 int nmod_poly_mat_solve_fflu(nmod_poly_mat_t X, nmod_poly_t den,
0265 const nmod_poly_mat_t A, const nmod_poly_mat_t B);
0266
0267 void nmod_poly_mat_solve_fflu_precomp(nmod_poly_mat_t X,
0268 const slong * perm,
0269 const nmod_poly_mat_t FFLU, const nmod_poly_mat_t B);
0270
0271 #ifdef __cplusplus
0272 }
0273 #endif
0274
0275 #endif