Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2011 Fredrik Johansson
0003 
0004     This file is part of FLINT.
0005 
0006     FLINT is free software: you can redistribute it and/or modify it under
0007     the terms of the GNU Lesser General Public License (LGPL) as published
0008     by the Free Software Foundation; either version 3 of the License, or
0009     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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 /* Memory management *********************************************************/
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 /* Truncate, shift *********************************************************/
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 /* Basic properties **********************************************************/
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 /* Comparison ****************************************************************/
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 /* Standard matrices *********************************************************/
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 /* Random matrices ***********************************************************/
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 /* Windows and concatenation ************************************************/
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 /* Input and output **********************************************************/
0164 
0165 void nmod_poly_mat_print(const nmod_poly_mat_t mat, const char * x);
0166 
0167 /* Norms *********************************************************************/
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 /* Scalar arithmetic *********************************************************/
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 /* Matrix arithmetic *********************************************************/
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 /* Evaluation ****************************************************************/
0219 
0220 void nmod_poly_mat_evaluate_nmod(nmod_mat_t B, const nmod_poly_mat_t A, ulong x);
0221 
0222 /* Row reduction *************************************************************/
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 /* Trace *********************************************************************/
0237 
0238 void nmod_poly_mat_trace(nmod_poly_t trace, const nmod_poly_mat_t mat);
0239 
0240 /* Determinant and rank ******************************************************/
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 /* Inverse *******************************************************************/
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 /* Nullspace *****************************************************************/
0256 
0257 slong nmod_poly_mat_nullspace(nmod_poly_mat_t res, const nmod_poly_mat_t mat);
0258 
0259 /* Solving *******************************************************************/
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