Back to home page

EIC code displayed by LXR

 
 

    


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

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 POLY_MAT_H
0013 #define POLY_MAT_H
0014 
0015 #ifdef FMPZ_POLY_MAT_INLINES_C
0016 #define FMPZ_POLY_MAT_INLINE
0017 #else
0018 #define FMPZ_POLY_MAT_INLINE static inline
0019 #endif
0020 
0021 #include "fmpz_types.h"
0022 
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026 
0027 /* Types *********************************************************************/
0028 
0029 FMPZ_POLY_MAT_INLINE
0030 fmpz_poly_struct * fmpz_poly_mat_entry(const fmpz_poly_mat_t mat, slong i, slong j)
0031 {
0032    return mat->entries + i * mat->stride + j;
0033 }
0034 
0035 FMPZ_POLY_MAT_INLINE
0036 slong fmpz_poly_mat_nrows(const fmpz_poly_mat_t mat)
0037 {
0038     return mat->r;
0039 }
0040 
0041 FMPZ_POLY_MAT_INLINE
0042 slong fmpz_poly_mat_ncols(const fmpz_poly_mat_t mat)
0043 {
0044     return mat->c;
0045 }
0046 
0047 /* Memory management *********************************************************/
0048 
0049 void fmpz_poly_mat_init(fmpz_poly_mat_t mat, slong rows, slong cols);
0050 
0051 void fmpz_poly_mat_init_set(fmpz_poly_mat_t mat, const fmpz_poly_mat_t src);
0052 
0053 void fmpz_poly_mat_swap(fmpz_poly_mat_t mat1, fmpz_poly_mat_t mat2);
0054 
0055 FMPZ_POLY_MAT_INLINE void
0056 fmpz_poly_mat_swap_entrywise(fmpz_poly_mat_t mat1, fmpz_poly_mat_t mat2)
0057 {
0058     slong i, j;
0059 
0060     for (i = 0; i < fmpz_poly_mat_nrows(mat1); i++)
0061         for (j = 0; j < fmpz_poly_mat_ncols(mat1); j++)
0062             FLINT_SWAP(fmpz_poly_struct, *fmpz_poly_mat_entry(mat2, i, j), *fmpz_poly_mat_entry(mat1, i, j));
0063 }
0064 
0065 void fmpz_poly_mat_set(fmpz_poly_mat_t mat1, const fmpz_poly_mat_t mat2);
0066 
0067 void fmpz_poly_mat_clear(fmpz_poly_mat_t mat);
0068 
0069 /* Comparison ****************************************************************/
0070 
0071 int fmpz_poly_mat_equal(const fmpz_poly_mat_t mat1,
0072                         const fmpz_poly_mat_t mat2);
0073 
0074 int fmpz_poly_mat_is_zero(const fmpz_poly_mat_t mat);
0075 
0076 int fmpz_poly_mat_is_one(const fmpz_poly_mat_t mat);
0077 
0078 FMPZ_POLY_MAT_INLINE
0079 int fmpz_poly_mat_is_empty(const fmpz_poly_mat_t mat)
0080 {
0081     return (mat->r == 0) || (mat->c == 0);
0082 }
0083 
0084 FMPZ_POLY_MAT_INLINE
0085 int fmpz_poly_mat_is_square(const fmpz_poly_mat_t mat)
0086 {
0087     return (mat->r == mat->c);
0088 }
0089 
0090 /* Standard matrices *********************************************************/
0091 
0092 void fmpz_poly_mat_zero(fmpz_poly_mat_t mat);
0093 
0094 void fmpz_poly_mat_one(fmpz_poly_mat_t mat);
0095 
0096 /* Random matrices ***********************************************************/
0097 
0098 void fmpz_poly_mat_randtest(fmpz_poly_mat_t mat, flint_rand_t state,
0099                                 slong len, flint_bitcnt_t bits);
0100 
0101 void fmpz_poly_mat_randtest_unsigned(fmpz_poly_mat_t mat, flint_rand_t state,
0102                              slong len, flint_bitcnt_t bits);
0103 
0104 void fmpz_poly_mat_randtest_sparse(fmpz_poly_mat_t A, flint_rand_t state,
0105                         slong len, flint_bitcnt_t bits, float density);
0106 
0107 /* Windows and concatenation */
0108 
0109 void fmpz_poly_mat_window_init(fmpz_poly_mat_t window, const fmpz_poly_mat_t mat, slong r1,
0110     slong c1, slong r2, slong c2);
0111 
0112 void fmpz_poly_mat_window_clear(fmpz_poly_mat_t window);
0113 
0114 void fmpz_poly_mat_concat_horizontal(fmpz_poly_mat_t res,
0115                            const fmpz_poly_mat_t mat1,  const fmpz_poly_mat_t mat2);
0116 
0117 void fmpz_poly_mat_concat_vertical(fmpz_poly_mat_t res,
0118                            const fmpz_poly_mat_t mat1,  const fmpz_poly_mat_t mat2);
0119 
0120 /* Input and output **********************************************************/
0121 
0122 void fmpz_poly_mat_print(const fmpz_poly_mat_t mat, const char * x);
0123 
0124 /* Norms *********************************************************************/
0125 
0126 slong fmpz_poly_mat_max_bits(const fmpz_poly_mat_t A);
0127 
0128 slong fmpz_poly_mat_max_length(const fmpz_poly_mat_t A);
0129 
0130 /* Transpose *****************************************************************/
0131 
0132 void fmpz_poly_mat_transpose(fmpz_poly_mat_t B, const fmpz_poly_mat_t A);
0133 
0134 /* Truncation ****************************************************************/
0135 
0136 void fmpz_poly_mat_truncate(fmpz_poly_mat_t A, slong len);
0137 
0138 /* Scalar arithmetic *********************************************************/
0139 
0140 void fmpz_poly_mat_scalar_mul_fmpz_poly(fmpz_poly_mat_t B,
0141                     const fmpz_poly_mat_t A, const fmpz_poly_t c);
0142 
0143 void fmpz_poly_mat_scalar_mul_fmpz(fmpz_poly_mat_t B,
0144                     const fmpz_poly_mat_t A, const fmpz_t c);
0145 
0146 /* Matrix arithmetic *********************************************************/
0147 
0148 void fmpz_poly_mat_add(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0149                                             const fmpz_poly_mat_t B);
0150 
0151 void fmpz_poly_mat_sub(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0152                                             const fmpz_poly_mat_t B);
0153 
0154 void fmpz_poly_mat_neg(fmpz_poly_mat_t B, const fmpz_poly_mat_t A);
0155 
0156 void fmpz_poly_mat_mul(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0157                                             const fmpz_poly_mat_t B);
0158 
0159 void fmpz_poly_mat_mul_classical(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0160                                                 const fmpz_poly_mat_t B);
0161 
0162 void fmpz_poly_mat_mul_KS(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0163                                             const fmpz_poly_mat_t B);
0164 
0165 void fmpz_poly_mat_mullow(fmpz_poly_mat_t C, const fmpz_poly_mat_t A,
0166     const fmpz_poly_mat_t B, slong len);
0167 
0168 void fmpz_poly_mat_sqr(fmpz_poly_mat_t B, const fmpz_poly_mat_t A);
0169 
0170 void fmpz_poly_mat_sqr_classical(fmpz_poly_mat_t B, const fmpz_poly_mat_t A);
0171 
0172 void fmpz_poly_mat_sqr_KS(fmpz_poly_mat_t B, const fmpz_poly_mat_t A);
0173 
0174 void fmpz_poly_mat_sqrlow(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, slong len);
0175 
0176 void fmpz_poly_mat_pow(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, ulong exp);
0177 
0178 void fmpz_poly_mat_pow_trunc(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, ulong exp,
0179                             slong len);
0180 
0181 void fmpz_poly_mat_prod(fmpz_poly_mat_t res,
0182                         fmpz_poly_mat_t * const factors, slong n);
0183 
0184 /* Evaluation ****************************************************************/
0185 
0186 void fmpz_poly_mat_evaluate_fmpz(fmpz_mat_t B,
0187                         const fmpz_poly_mat_t A, const fmpz_t x);
0188 
0189 /* Row reduction *************************************************************/
0190 
0191 slong fmpz_poly_mat_find_pivot_any(const fmpz_poly_mat_t mat,
0192                                     slong start_row, slong end_row, slong c);
0193 
0194 slong fmpz_poly_mat_find_pivot_partial(const fmpz_poly_mat_t mat,
0195                                     slong start_row, slong end_row, slong c);
0196 
0197 slong fmpz_poly_mat_fflu(fmpz_poly_mat_t B, fmpz_poly_t den, slong * perm,
0198                             const fmpz_poly_mat_t A, int rank_check);
0199 
0200 slong fmpz_poly_mat_rref(fmpz_poly_mat_t B, fmpz_poly_t den,
0201                             const fmpz_poly_mat_t A);
0202 
0203 /* Trace *********************************************************************/
0204 
0205 void fmpz_poly_mat_trace(fmpz_poly_t trace, const fmpz_poly_mat_t mat);
0206 
0207 /* Determinant and rank ******************************************************/
0208 
0209 void fmpz_poly_mat_det(fmpz_poly_t det, const fmpz_poly_mat_t A);
0210 
0211 void fmpz_poly_mat_det_fflu(fmpz_poly_t det, const fmpz_poly_mat_t A);
0212 
0213 void fmpz_poly_mat_det_interpolate(fmpz_poly_t det, const fmpz_poly_mat_t A);
0214 
0215 slong fmpz_poly_mat_rank(const fmpz_poly_mat_t A);
0216 
0217 /* Inverse *******************************************************************/
0218 
0219 int fmpz_poly_mat_inv(fmpz_poly_mat_t Ainv, fmpz_poly_t den,
0220     const fmpz_poly_mat_t A);
0221 
0222 /* Nullspace *****************************************************************/
0223 
0224 slong fmpz_poly_mat_nullspace(fmpz_poly_mat_t res, const fmpz_poly_mat_t mat);
0225 
0226 /* Solving *******************************************************************/
0227 
0228 int fmpz_poly_mat_solve(fmpz_poly_mat_t X, fmpz_poly_t den,
0229                     const fmpz_poly_mat_t A, const fmpz_poly_mat_t B);
0230 
0231 int fmpz_poly_mat_solve_fflu(fmpz_poly_mat_t X, fmpz_poly_t den,
0232                             const fmpz_poly_mat_t A, const fmpz_poly_mat_t B);
0233 
0234 void fmpz_poly_mat_solve_fflu_precomp(fmpz_poly_mat_t X,
0235                     const slong * perm,
0236                     const fmpz_poly_mat_t FFLU, const fmpz_poly_mat_t B);
0237 
0238 #ifdef __cplusplus
0239 }
0240 #endif
0241 
0242 #endif