File indexing completed on 2026-11-07 10:15:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FMPZ_MOD_POLY_H
0014 #define FMPZ_MOD_POLY_H
0015
0016 #ifdef FMPZ_MOD_POLY_INLINES_C
0017 #define FMPZ_MOD_POLY_INLINE
0018 #else
0019 #define FMPZ_MOD_POLY_INLINE static inline
0020 #endif
0021
0022 #include "nmod_types.h"
0023 #include "fmpz_mod_types.h"
0024
0025 #ifdef __cplusplus
0026 extern "C" {
0027 #endif
0028
0029 #define FMPZ_MOD_POLY_HGCD_CUTOFF 128
0030 #define FMPZ_MOD_POLY_GCD_CUTOFF 256
0031
0032 #define FMPZ_MOD_POLY_INV_NEWTON_CUTOFF 64
0033 #define FMPZ_MOD_POLY_DIV_DIVCONQUER_CUTOFF
0034
0035 #define FMPZ_MOD_POLY_EVALUATE_FMPZ_VEC 32
0036
0037
0038
0039 typedef struct
0040 {
0041 fmpz_t res;
0042 fmpz_t lc;
0043 slong len0;
0044 slong len1;
0045 slong off;
0046 } fmpz_mod_poly_res_struct;
0047
0048 typedef fmpz_mod_poly_res_struct fmpz_mod_poly_res_t[1];
0049
0050 typedef struct
0051 {
0052 fmpz_mod_poly_struct * pow;
0053 slong len;
0054 } fmpz_mod_poly_frobenius_powers_2exp_struct;
0055
0056 typedef fmpz_mod_poly_frobenius_powers_2exp_struct fmpz_mod_poly_frobenius_powers_2exp_t[1];
0057
0058 typedef struct
0059 {
0060 fmpz_mod_poly_struct * pow;
0061 slong len;
0062 } fmpz_mod_poly_frobenius_powers_struct;
0063
0064 typedef fmpz_mod_poly_frobenius_powers_struct fmpz_mod_poly_frobenius_powers_t[1];
0065
0066 typedef struct
0067 {
0068 fmpz_mat_struct * A;
0069 fmpz_mod_poly_struct * poly1;
0070 fmpz_mod_poly_struct * poly2;
0071 fmpz_mod_poly_struct * poly2inv;
0072 const fmpz_mod_ctx_struct * ctx;
0073 }
0074 fmpz_mod_poly_matrix_precompute_arg_t;
0075
0076 typedef struct
0077 {
0078 fmpz_mat_struct * A;
0079 fmpz_mod_poly_struct * res;
0080 fmpz_mod_poly_struct * poly1;
0081 fmpz_mod_poly_struct * poly3;
0082 fmpz_mod_poly_struct * poly3inv;
0083 const fmpz_mod_ctx_struct * ctx;
0084 }
0085 fmpz_mod_poly_compose_mod_precomp_preinv_arg_t;
0086
0087
0088
0089
0090 FMPZ_MOD_POLY_INLINE
0091 void fmpz_mod_poly_init(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0092 {
0093 poly->coeffs = NULL;
0094 poly->alloc = 0;
0095 poly->length = 0;
0096 }
0097
0098 void fmpz_mod_poly_init2(fmpz_mod_poly_t poly, slong alloc,
0099 const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0100
0101 void fmpz_mod_poly_clear(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0102
0103 void fmpz_mod_poly_realloc(fmpz_mod_poly_t poly, slong alloc,
0104 const fmpz_mod_ctx_t ctx);
0105
0106 void _fmpz_mod_poly_fit_length(fmpz_mod_poly_t poly, slong len);
0107
0108 FMPZ_MOD_POLY_INLINE
0109 void fmpz_mod_poly_fit_length(fmpz_mod_poly_t poly, slong len,
0110 const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0111 {
0112 _fmpz_mod_poly_fit_length(poly, len);
0113 }
0114
0115
0116
0117
0118 FMPZ_MOD_POLY_INLINE
0119 void _fmpz_mod_poly_normalise(fmpz_mod_poly_t poly)
0120 {
0121 slong i;
0122
0123 for (i = poly->length - 1; (i >= 0) && !poly->coeffs[i]; i--) ;
0124 poly->length = i + 1;
0125 }
0126
0127 void _fmpz_mod_poly_set_length(fmpz_mod_poly_t poly, slong len);
0128
0129 void fmpz_mod_poly_truncate(fmpz_mod_poly_t poly, slong len, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0130
0131 void fmpz_mod_poly_set_trunc(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t ctx);
0132
0133 int fmpz_mod_poly_is_canonical(const fmpz_mod_poly_t A, const fmpz_mod_ctx_t ctx);
0134
0135
0136
0137
0138 void fmpz_mod_poly_randtest(fmpz_mod_poly_t f, flint_rand_t state,
0139 slong len, const fmpz_mod_ctx_t ctx);
0140
0141 void fmpz_mod_poly_randtest_irreducible(fmpz_mod_poly_t f,
0142 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0143
0144 void fmpz_mod_poly_randtest_not_zero(fmpz_mod_poly_t f,
0145 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0146
0147 void fmpz_mod_poly_randtest_monic(fmpz_mod_poly_t f,
0148 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0149
0150 void fmpz_mod_poly_randtest_monic_irreducible(fmpz_mod_poly_t f,
0151 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0152
0153 void fmpz_mod_poly_randtest_monic_primitive(fmpz_mod_poly_t f,
0154 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0155
0156 void fmpz_mod_poly_randtest_trinomial(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0157
0158 int fmpz_mod_poly_randtest_trinomial_irreducible(fmpz_mod_poly_t f,
0159 flint_rand_t state, slong len, slong max_attempts,
0160 const fmpz_mod_ctx_t ctx);
0161
0162 void fmpz_mod_poly_randtest_pentomial(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0163
0164 int fmpz_mod_poly_randtest_pentomial_irreducible(fmpz_mod_poly_t f,
0165 flint_rand_t state, slong len, slong max_attempts,
0166 const fmpz_mod_ctx_t ctx);
0167
0168 void fmpz_mod_poly_randtest_sparse_irreducible(fmpz_mod_poly_t poly,
0169 flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx);
0170
0171
0172
0173 FMPZ_MOD_POLY_INLINE
0174 slong fmpz_mod_poly_length(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0175 {
0176 return poly->length;
0177 }
0178 FMPZ_MOD_POLY_INLINE
0179 slong fmpz_mod_poly_degree(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0180 {
0181 return poly->length - 1;
0182 }
0183
0184 FMPZ_MOD_POLY_INLINE
0185 fmpz * fmpz_mod_poly_lead(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0186 {
0187 if (poly->length)
0188 return poly->coeffs + (poly->length - 1);
0189 else
0190 return NULL;
0191 }
0192
0193 FMPZ_MOD_POLY_INLINE
0194 int fmpz_mod_poly_is_monic(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0195 {
0196 return f->length > 0 && f->coeffs[f->length - 1] == WORD(1);
0197 }
0198
0199 FMPZ_MOD_POLY_INLINE
0200 int fmpz_mod_poly_is_one(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0201 {
0202 return poly->length == 1 && poly->coeffs[0] == WORD(1);
0203 }
0204
0205 int fmpz_mod_poly_is_gen(const fmpz_mod_poly_t op, const fmpz_mod_ctx_t ctx);
0206
0207 int fmpz_mod_poly_is_unit(const fmpz_mod_poly_t op, const fmpz_mod_ctx_t ctx);
0208
0209
0210
0211 void fmpz_mod_poly_set(fmpz_mod_poly_t poly1,
0212 const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx);
0213
0214 FMPZ_MOD_POLY_INLINE
0215 void fmpz_mod_poly_swap(fmpz_mod_poly_t poly1,
0216 fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0217 {
0218 FLINT_SWAP(fmpz_mod_poly_struct, *poly1, *poly2);
0219 }
0220
0221 void _fmpz_mod_poly_reverse(fmpz * res, const fmpz * poly, slong len, slong n);
0222
0223 void fmpz_mod_poly_reverse(fmpz_mod_poly_t res,
0224 const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t ctx);
0225
0226 FMPZ_MOD_POLY_INLINE
0227 void fmpz_mod_poly_zero(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
0228 {
0229 _fmpz_mod_poly_set_length(poly, 0);
0230 }
0231
0232 void fmpz_mod_poly_one(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0233
0234 void fmpz_mod_poly_gen(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0235
0236 void fmpz_mod_poly_zero_coeffs(fmpz_mod_poly_t poly, slong i, slong j, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0237
0238 ulong fmpz_mod_poly_deflation(const fmpz_mod_poly_t input, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0239 void fmpz_mod_poly_deflate(fmpz_mod_poly_t result, const fmpz_mod_poly_t input, ulong deflation, const fmpz_mod_ctx_t ctx);
0240 void fmpz_mod_poly_inflate(fmpz_mod_poly_t result, const fmpz_mod_poly_t input, ulong inflation, const fmpz_mod_ctx_t ctx);
0241
0242
0243
0244 void fmpz_mod_poly_set_ui(fmpz_mod_poly_t f, ulong x, const fmpz_mod_ctx_t ctx);
0245 void fmpz_mod_poly_set_nmod_poly(fmpz_mod_poly_t f, const nmod_poly_t g);
0246 void fmpz_mod_poly_set_fmpz(fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx);
0247 void fmpz_mod_poly_set_fmpz_poly(fmpz_mod_poly_t f, const fmpz_poly_t g, const fmpz_mod_ctx_t ctx);
0248
0249 void fmpz_mod_poly_get_nmod_poly(nmod_poly_t f, const fmpz_mod_poly_t g);
0250 void fmpz_mod_poly_get_fmpz_poly(fmpz_poly_t f, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0251
0252
0253
0254 int fmpz_mod_poly_equal(const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0255 int fmpz_mod_poly_equal_trunc(const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0256
0257 int fmpz_mod_poly_is_zero(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0258
0259
0260
0261 void fmpz_mod_poly_set_coeff_fmpz(fmpz_mod_poly_t poly, slong n, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0262 void fmpz_mod_poly_set_coeff_ui(fmpz_mod_poly_t poly, slong n, ulong x, const fmpz_mod_ctx_t ctx);
0263 void fmpz_mod_poly_set_coeff_si(fmpz_mod_poly_t poly, slong n, slong x, const fmpz_mod_ctx_t ctx);
0264
0265 void fmpz_mod_poly_get_coeff_fmpz(fmpz_t x, const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0266
0267
0268
0269 void _fmpz_mod_poly_shift_left(fmpz * res, const fmpz * poly, slong len, slong n);
0270 void fmpz_mod_poly_shift_left(fmpz_mod_poly_t f, const fmpz_mod_poly_t g, slong n, const fmpz_mod_ctx_t ctx);
0271
0272 void _fmpz_mod_poly_shift_right(fmpz * res, const fmpz * poly, slong len, slong n);
0273
0274 void fmpz_mod_poly_shift_right(fmpz_mod_poly_t f, const fmpz_mod_poly_t g, slong n, const fmpz_mod_ctx_t ctx);
0275
0276
0277
0278 void _fmpz_mod_poly_neg(fmpz *res, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx);
0279 void fmpz_mod_poly_neg(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0280
0281 void _fmpz_mod_poly_add(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx);
0282 void fmpz_mod_poly_add(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx);
0283
0284 void _fmpz_mod_poly_sub(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx);
0285 void fmpz_mod_poly_sub(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx);
0286
0287 void fmpz_mod_poly_add_series(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx);
0288 void fmpz_mod_poly_sub_series(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx);
0289
0290
0291
0292 void _fmpz_mod_poly_scalar_mul_fmpz(fmpz *res, const fmpz *poly, slong len, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0293 void _fmpz_mod_poly_scalar_mul_ui(fmpz *res, const fmpz *poly, slong len, ulong x, const fmpz_mod_ctx_t ctx);
0294
0295 void fmpz_mod_poly_scalar_mul_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0296 void fmpz_mod_poly_scalar_mul_ui(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong x, const fmpz_mod_ctx_t ctx);
0297
0298 void fmpz_mod_poly_scalar_addmul_fmpz(fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0299
0300
0301
0302 void _fmpz_mod_poly_scalar_div_fmpz(fmpz *res, const fmpz *poly, slong len, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0303 void fmpz_mod_poly_scalar_div_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t x, const fmpz_mod_ctx_t ctx);
0304
0305
0306
0307 void _fmpz_mod_poly_mul(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx);
0308 void fmpz_mod_poly_mul(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx);
0309
0310 void _fmpz_mod_poly_mullow(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, slong n, const fmpz_mod_ctx_t ctx);
0311 void fmpz_mod_poly_mullow(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx);
0312
0313 void _fmpz_mod_poly_mulmid(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, slong nlo, slong nhi, const fmpz_mod_ctx_t ctx);
0314 void fmpz_mod_poly_mulmid(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong nlo, slong nhi, const fmpz_mod_ctx_t ctx);
0315
0316 void _fmpz_mod_poly_sqr(fmpz *res, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx);
0317
0318 void fmpz_mod_poly_mulhigh(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong start, const fmpz_mod_ctx_t ctx);
0319
0320 void fmpz_mod_poly_sqr(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0321
0322 void _fmpz_mod_poly_mulmod(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz * f, slong lenf, const fmpz_mod_ctx_t ctx);
0323 void fmpz_mod_poly_mulmod(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx);
0324
0325 void _fmpz_mod_poly_mulmod_preinv(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz * f, slong lenf, const fmpz* finv, slong lenfinv, const fmpz_mod_ctx_t ctx);
0326 void fmpz_mod_poly_mulmod_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx);
0327
0328
0329
0330 void _fmpz_mod_poly_pow(fmpz *rop, const fmpz *op, slong len, ulong e, const fmpz_mod_ctx_t ctx);
0331 void fmpz_mod_poly_pow(fmpz_mod_poly_t rop, const fmpz_mod_poly_t op, ulong e, const fmpz_mod_ctx_t ctx);
0332
0333 void _fmpz_mod_poly_pow_trunc(fmpz * res, const fmpz * poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx);
0334
0335 void fmpz_mod_poly_pow_trunc(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx);
0336 void _fmpz_mod_poly_pow_trunc_binexp(fmpz * res, const fmpz * poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx);
0337
0338 void fmpz_mod_poly_pow_trunc_binexp(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx);
0339
0340 void _fmpz_mod_poly_powmod_ui_binexp(fmpz * res, const fmpz * poly, ulong e, const fmpz * f, slong lenf, const fmpz_mod_ctx_t ctx);
0341 void fmpz_mod_poly_powmod_ui_binexp(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx);
0342
0343 void _fmpz_mod_poly_powmod_ui_binexp_preinv(fmpz * res, const fmpz * poly,
0344 ulong e, const fmpz * f, slong lenf,
0345 const fmpz * finv, slong lenfinv, const fmpz_mod_ctx_t ctx);
0346
0347 void fmpz_mod_poly_powmod_ui_binexp_preinv(fmpz_mod_poly_t res,
0348 const fmpz_mod_poly_t poly, ulong e,
0349 const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv,
0350 const fmpz_mod_ctx_t ctx);
0351
0352 void _fmpz_mod_poly_powmod_fmpz_binexp(fmpz * res, const fmpz * poly,
0353 const fmpz_t e, const fmpz * f,
0354 slong lenf, const fmpz_mod_ctx_t ctx);
0355
0356 void fmpz_mod_poly_powmod_fmpz_binexp(fmpz_mod_poly_t res,
0357 const fmpz_mod_poly_t poly, const fmpz_t e,
0358 const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx);
0359
0360 void _fmpz_mod_poly_powmod_fmpz_binexp_preinv(fmpz * res, const fmpz * poly,
0361 const fmpz_t e, const fmpz * f, slong lenf,
0362 const fmpz* finv, slong lenfinv, const fmpz_mod_ctx_t ctx);
0363
0364 void fmpz_mod_poly_powmod_fmpz_binexp_preinv(fmpz_mod_poly_t res,
0365 const fmpz_mod_poly_t poly, const fmpz_t e,
0366 const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv,
0367 const fmpz_mod_ctx_t ctx);
0368
0369 void _fmpz_mod_poly_powmod_x_fmpz_preinv(fmpz * res, const fmpz_t e,
0370 const fmpz * f, slong lenf, const fmpz* finv, slong lenfinv,
0371 const fmpz_mod_ctx_t ctx);
0372
0373 void fmpz_mod_poly_powmod_x_fmpz_preinv(fmpz_mod_poly_t res,
0374 const fmpz_t e, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv,
0375 const fmpz_mod_ctx_t ctx);
0376
0377 void fmpz_mod_poly_powmod_linear_fmpz_preinv(fmpz_mod_poly_t res,
0378 const fmpz_t a, const fmpz_t e, const fmpz_mod_poly_t f,
0379 const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx);
0380
0381 void _fmpz_mod_poly_powers_mod_preinv_naive(fmpz ** res,
0382 const fmpz * f, slong flen, slong n, const fmpz * g,
0383 slong glen, const fmpz * ginv, slong ginvlen, const fmpz_mod_ctx_t ctx);
0384
0385 void fmpz_mod_poly_powers_mod_naive(fmpz_mod_poly_struct * res,
0386 const fmpz_mod_poly_t f, slong n, const fmpz_mod_poly_t g,
0387 const fmpz_mod_ctx_t ctx);
0388
0389 void _fmpz_mod_poly_powers_mod_preinv_threaded_pool(fmpz ** res,
0390 const fmpz * f, slong flen, slong n, const fmpz * g, slong glen,
0391 const fmpz * ginv, slong ginvlen, const fmpz_mod_ctx_t ctx,
0392 thread_pool_handle * threads, slong num_threads);
0393
0394 void fmpz_mod_poly_powers_mod_bsgs(fmpz_mod_poly_struct * res,
0395 const fmpz_mod_poly_t f, slong n, const fmpz_mod_poly_t g,
0396 const fmpz_mod_ctx_t ctx);
0397
0398 void fmpz_mod_poly_frobenius_powers_2exp_precomp(
0399 fmpz_mod_poly_frobenius_powers_2exp_t pow, const fmpz_mod_poly_t f,
0400 const fmpz_mod_poly_t finv, ulong m, const fmpz_mod_ctx_t ctx);
0401
0402
0403 void fmpz_mod_poly_frobenius_powers_2exp_clear(
0404 fmpz_mod_poly_frobenius_powers_2exp_t pow, const fmpz_mod_ctx_t ctx);
0405
0406 void fmpz_mod_poly_frobenius_power(fmpz_mod_poly_t res,
0407 fmpz_mod_poly_frobenius_powers_2exp_t pow,
0408 const fmpz_mod_poly_t f, ulong m, const fmpz_mod_ctx_t ctx);
0409
0410 void fmpz_mod_poly_frobenius_powers_precomp(
0411 fmpz_mod_poly_frobenius_powers_t pow, const fmpz_mod_poly_t f,
0412 const fmpz_mod_poly_t finv, ulong m, const fmpz_mod_ctx_t ctx);
0413
0414 void fmpz_mod_poly_frobenius_powers_clear(
0415 fmpz_mod_poly_frobenius_powers_t pow, const fmpz_mod_ctx_t ctx);
0416
0417
0418
0419 void _fmpz_mod_poly_divrem_basecase(fmpz * Q, fmpz * R,
0420 const fmpz * A, slong lenA, const fmpz * B, slong lenB,
0421 const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0422
0423 void fmpz_mod_poly_divrem_basecase(fmpz_mod_poly_t Q, fmpz_mod_poly_t R,
0424 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0425 const fmpz_mod_ctx_t ctx);
0426
0427 void _fmpz_mod_poly_div_newton_n_preinv (fmpz* Q, const fmpz* A, slong lenA,
0428 const fmpz* FLINT_UNUSED(B), slong lenB, const fmpz* Binv,
0429 slong lenBinv, const fmpz_mod_ctx_t ctx);
0430
0431 void fmpz_mod_poly_div_newton_n_preinv(fmpz_mod_poly_t Q,
0432 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0433 const fmpz_mod_poly_t Binv, const fmpz_mod_ctx_t ctx);
0434
0435 void _fmpz_mod_poly_divrem_newton_n_preinv (fmpz* Q, fmpz* R,
0436 const fmpz* A, slong lenA, const fmpz* B, slong lenB,
0437 const fmpz* Binv, slong lenBinv, const fmpz_mod_ctx_t ctx);
0438
0439 void fmpz_mod_poly_divrem_newton_n_preinv(fmpz_mod_poly_t Q,
0440 fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0441 const fmpz_mod_poly_t Binv, const fmpz_mod_ctx_t ctx);
0442
0443 ulong fmpz_mod_poly_remove(fmpz_mod_poly_t f,
0444 const fmpz_mod_poly_t p, const fmpz_mod_ctx_t ctx);
0445
0446 void _fmpz_mod_poly_rem_basecase(fmpz * R,
0447 const fmpz * A, slong lenA, const fmpz * B, slong lenB,
0448 const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0449
0450 void fmpz_mod_poly_rem_basecase(fmpz_mod_poly_t R,
0451 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0452 const fmpz_mod_ctx_t ctx);
0453
0454 void _fmpz_mod_poly_divrem(fmpz *Q, fmpz *R,
0455 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0456 const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0457
0458 void fmpz_mod_poly_divrem(fmpz_mod_poly_t Q, fmpz_mod_poly_t R,
0459 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0460
0461 void _fmpz_mod_poly_div(fmpz *Q,
0462 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0463 const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0464
0465 void fmpz_mod_poly_div(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A,
0466 const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0467
0468 void _fmpz_mod_poly_divrem_f(fmpz_t f, fmpz *Q, fmpz *R,
0469 const fmpz *A, slong lenA,
0470 const fmpz *B, slong lenB, const fmpz_mod_ctx_t ctx);
0471
0472 void fmpz_mod_poly_divrem_f(fmpz_t f, fmpz_mod_poly_t Q,
0473 fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0474 const fmpz_mod_ctx_t ctx);
0475
0476 void _fmpz_mod_poly_rem(fmpz *R, const fmpz *A, slong lenA, const fmpz *B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0477 void fmpz_mod_poly_rem(fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0478 void fmpz_mod_poly_rem_f(fmpz_t f, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0479
0480
0481
0482 int _fmpz_mod_poly_divides_classical(fmpz * Q, const fmpz * A,
0483 slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx);
0484
0485 int fmpz_mod_poly_divides_classical(fmpz_mod_poly_t Q,
0486 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0487 const fmpz_mod_ctx_t ctx);
0488
0489 int _fmpz_mod_poly_divides(fmpz * Q, const fmpz * A, slong lenA,
0490 const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx);
0491
0492 int fmpz_mod_poly_divides(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A,
0493 const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0494
0495
0496
0497 void _fmpz_mod_poly_inv_series(fmpz * Qinv, const fmpz * Q, slong Qlen, slong n, const fmpz_mod_ctx_t ctx);
0498 void fmpz_mod_poly_inv_series(fmpz_mod_poly_t Qinv, const fmpz_mod_poly_t Q, slong n, const fmpz_mod_ctx_t ctx);
0499
0500 void
0501 fmpz_mod_poly_inv_series_f(fmpz_t f, fmpz_mod_poly_t Qinv,
0502 const fmpz_mod_poly_t Q, slong n, const fmpz_mod_ctx_t ctx);
0503
0504 void _fmpz_mod_poly_div_series(fmpz * Q, const fmpz * A, slong Alen,
0505 const fmpz * B, slong Blen, slong n, const fmpz_mod_ctx_t ctx);
0506 void fmpz_mod_poly_div_series(fmpz_mod_poly_t Q,
0507 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, slong n,
0508 const fmpz_mod_ctx_t ctx);
0509
0510
0511
0512 void fmpz_mod_poly_make_monic(fmpz_mod_poly_t res,
0513 const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0514
0515 void fmpz_mod_poly_make_monic_f(fmpz_t f, fmpz_mod_poly_t res,
0516 const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0517
0518 slong _fmpz_mod_poly_gcd(fmpz *G, const fmpz *A, slong lenA,
0519 const fmpz *B, slong lenB,
0520 const fmpz_mod_ctx_t ctx);
0521
0522 void fmpz_mod_poly_gcd(fmpz_mod_poly_t G,
0523 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0524 const fmpz_mod_ctx_t ctx);
0525
0526 slong _fmpz_mod_poly_gcd_euclidean_f(fmpz_t f, fmpz *G,
0527 const fmpz *A, slong lenA,
0528 const fmpz *B, slong lenB, const fmpz_mod_ctx_t ctx);
0529
0530 void fmpz_mod_poly_gcd_euclidean_f(fmpz_t f, fmpz_mod_poly_t G,
0531 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0532 const fmpz_mod_ctx_t ctx);
0533
0534 FMPZ_MOD_POLY_INLINE
0535 slong _fmpz_mod_poly_gcd_f(fmpz_t f, fmpz *G,
0536 const fmpz *A, slong lenA,
0537 const fmpz *B, slong lenB, const fmpz_mod_ctx_t ctx)
0538 {
0539 return _fmpz_mod_poly_gcd_euclidean_f(f, G, A, lenA, B, lenB, ctx);
0540 }
0541
0542 FMPZ_MOD_POLY_INLINE
0543 void fmpz_mod_poly_gcd_f(fmpz_t f, fmpz_mod_poly_t G, const fmpz_mod_poly_t A,
0544 const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx)
0545 {
0546 fmpz_mod_poly_gcd_euclidean_f(f, G, A, B, ctx);
0547 }
0548
0549 slong _fmpz_mod_poly_hgcd(fmpz **M, slong *lenM,
0550 fmpz *A, slong *lenA, fmpz *B, slong *lenB,
0551 const fmpz *a, slong lena, const fmpz *b, slong lenb,
0552 const fmpz_mod_ctx_t ctx);
0553
0554 slong _fmpz_mod_poly_xgcd_euclidean_f(fmpz_t f, fmpz *G, fmpz *S, fmpz *T,
0555 const fmpz *A, slong lenA,
0556 const fmpz *B, slong lenB,
0557 const fmpz_t invB, const fmpz_mod_ctx_t ctx);
0558
0559 void fmpz_mod_poly_xgcd_euclidean_f(fmpz_t f, fmpz_mod_poly_t G,
0560 fmpz_mod_poly_t S, fmpz_mod_poly_t T,
0561 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0562 const fmpz_mod_ctx_t ctx);
0563
0564 slong _fmpz_mod_poly_xgcd(fmpz *G, fmpz *S, fmpz *T,
0565 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0566 const fmpz_t FLINT_UNUSED(invB), const fmpz_mod_ctx_t ctx);
0567
0568 void fmpz_mod_poly_xgcd(fmpz_mod_poly_t G, fmpz_mod_poly_t S,
0569 fmpz_mod_poly_t T, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0570 const fmpz_mod_ctx_t ctx);
0571
0572 FMPZ_MOD_POLY_INLINE slong
0573 _fmpz_mod_poly_xgcd_f(fmpz_t f, fmpz *G, fmpz *S, fmpz *T,
0574 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0575 const fmpz_t invB, const fmpz_mod_ctx_t ctx)
0576 {
0577 return _fmpz_mod_poly_xgcd_euclidean_f(f, G, S, T, A, lenA, B, lenB, invB, ctx);
0578 }
0579
0580 FMPZ_MOD_POLY_INLINE void
0581 fmpz_mod_poly_xgcd_f(fmpz_t f, fmpz_mod_poly_t G, fmpz_mod_poly_t S,
0582 fmpz_mod_poly_t T, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0583 const fmpz_mod_ctx_t ctx)
0584 {
0585 fmpz_mod_poly_xgcd_euclidean_f(f, G, S, T, A, B, ctx);
0586 }
0587
0588 slong _fmpz_mod_poly_gcdinv_euclidean_f(fmpz_t f, fmpz *G, fmpz *S,
0589 const fmpz *A, slong lenA,
0590 const fmpz *B, slong lenB,
0591 const fmpz_t FLINT_UNUSED(invA), const fmpz_mod_ctx_t ctx);
0592
0593 void fmpz_mod_poly_gcdinv_euclidean_f(fmpz_t f, fmpz_mod_poly_t G,
0594 fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0595 const fmpz_mod_ctx_t ctx);
0596
0597 slong _fmpz_mod_poly_gcdinv_euclidean(fmpz *G, fmpz *S,
0598 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0599 const fmpz_t invA, const fmpz_mod_ctx_t ctx);
0600
0601 void fmpz_mod_poly_gcdinv_euclidean(fmpz_mod_poly_t G,
0602 fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0603 const fmpz_mod_ctx_t ctx);
0604
0605 slong _fmpz_mod_poly_gcdinv(fmpz *G, fmpz *S,
0606 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0607 const fmpz_mod_ctx_t ctx);
0608
0609 void fmpz_mod_poly_gcdinv(fmpz_mod_poly_t G, fmpz_mod_poly_t S,
0610 const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0611 const fmpz_mod_ctx_t ctx);
0612
0613 slong _fmpz_mod_poly_gcdinv_f(fmpz_t f, fmpz *G, fmpz *S,
0614 const fmpz *A, slong lenA, const fmpz *B, slong lenB,
0615 const fmpz_mod_ctx_t ctx);
0616
0617 void fmpz_mod_poly_gcdinv_f(fmpz_t f, fmpz_mod_poly_t G,
0618 fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0619 const fmpz_mod_ctx_t ctx);
0620
0621 int _fmpz_mod_poly_invmod(fmpz *A,
0622 const fmpz *B, slong lenB,
0623 const fmpz *P, slong lenP, const fmpz_mod_ctx_t ctx);
0624
0625 int _fmpz_mod_poly_invmod_f(fmpz_t f, fmpz *A,
0626 const fmpz *B, slong lenB,
0627 const fmpz *P, slong lenP, const fmpz_mod_ctx_t ctx);
0628
0629 int fmpz_mod_poly_invmod(fmpz_mod_poly_t A, const fmpz_mod_poly_t B,
0630 const fmpz_mod_poly_t P, const fmpz_mod_ctx_t ctx);
0631
0632 int fmpz_mod_poly_invmod_f(fmpz_t f, fmpz_mod_poly_t A,
0633 const fmpz_mod_poly_t B, const fmpz_mod_poly_t P,
0634 const fmpz_mod_ctx_t ctx);
0635
0636
0637
0638 void _fmpz_mod_poly_invsqrt_series(fmpz * g,
0639 const fmpz * h, slong hlen, slong n, const fmpz_mod_ctx_t mod);
0640
0641 void fmpz_mod_poly_invsqrt_series(fmpz_mod_poly_t g,
0642 const fmpz_mod_poly_t h, slong n, const fmpz_mod_ctx_t ctx);
0643
0644 void _fmpz_mod_poly_sqrt_series(fmpz * g,
0645 const fmpz * h, slong hlen, slong n, const fmpz_mod_ctx_t mod);
0646
0647 void fmpz_mod_poly_sqrt_series(fmpz_mod_poly_t g,
0648 const fmpz_mod_poly_t h, slong n, const fmpz_mod_ctx_t ctx);
0649
0650 int _fmpz_mod_poly_sqrt(fmpz * s,
0651 const fmpz * p, slong len, const fmpz_mod_ctx_t mod);
0652
0653 int fmpz_mod_poly_sqrt(fmpz_mod_poly_t b,
0654 const fmpz_mod_poly_t a, const fmpz_mod_ctx_t ctx);
0655
0656
0657
0658 slong _fmpz_mod_poly_minpoly_bm(fmpz * poly, const fmpz * seq, slong len, const fmpz_mod_ctx_t ctx);
0659 void fmpz_mod_poly_minpoly_bm(fmpz_mod_poly_t poly, const fmpz * seq, slong len, const fmpz_mod_ctx_t ctx);
0660
0661 slong _fmpz_mod_poly_minpoly_hgcd(fmpz * poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx);
0662 void fmpz_mod_poly_minpoly_hgcd(fmpz_mod_poly_t poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx);
0663
0664 slong _fmpz_mod_poly_minpoly(fmpz* poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx);
0665 void fmpz_mod_poly_minpoly(fmpz_mod_poly_t poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx);
0666
0667
0668
0669 void _fmpz_mod_poly_resultant(fmpz_t res, const fmpz *A, slong lenA, const fmpz *B, slong lenB, const fmpz_mod_ctx_t ctx);
0670 void fmpz_mod_poly_resultant(fmpz_t res, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx);
0671
0672
0673
0674 void _fmpz_mod_poly_discriminant(fmpz_t d, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx);
0675 void fmpz_mod_poly_discriminant(fmpz_t d, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx);
0676
0677
0678
0679 void _fmpz_mod_poly_derivative(fmpz *res, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx);
0680 void fmpz_mod_poly_derivative(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0681
0682
0683
0684 void _fmpz_mod_poly_evaluate_fmpz(fmpz_t res, const fmpz *poly, slong len, const fmpz_t a, const fmpz_mod_ctx_t ctx);
0685 void fmpz_mod_poly_evaluate_fmpz(fmpz_t res, const fmpz_mod_poly_t poly, const fmpz_t a, const fmpz_mod_ctx_t ctx);
0686
0687 fmpz_poly_struct ** _fmpz_mod_poly_tree_alloc(slong len);
0688 void _fmpz_mod_poly_tree_free(fmpz_poly_struct ** tree, slong len);
0689 void _fmpz_mod_poly_tree_build(fmpz_poly_struct ** tree, const fmpz * roots, slong len, const fmpz_mod_ctx_t ctx);
0690
0691 void _fmpz_mod_poly_evaluate_fmpz_vec_iter(fmpz * ys, const fmpz * coeffs, slong len, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0692 void fmpz_mod_poly_evaluate_fmpz_vec_iter(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0693
0694 void _fmpz_mod_poly_evaluate_fmpz_vec_fast_precomp(fmpz * vs, const fmpz * poly, slong plen, fmpz_poly_struct * const * tree, slong len, const fmpz_mod_ctx_t ctx);
0695
0696 void _fmpz_mod_poly_evaluate_fmpz_vec_fast(fmpz * ys, const fmpz * poly, slong plen, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0697 void fmpz_mod_poly_evaluate_fmpz_vec_fast(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0698
0699 void _fmpz_mod_poly_evaluate_fmpz_vec(fmpz * ys, const fmpz * coeffs, slong len, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0700 void fmpz_mod_poly_evaluate_fmpz_vec(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0701
0702
0703
0704 void _fmpz_mod_poly_compose(fmpz *res, const fmpz *poly1, slong len1,
0705 const fmpz *poly2, slong len2,
0706 const fmpz_mod_ctx_t ctx);
0707
0708 void fmpz_mod_poly_compose(fmpz_mod_poly_t res,
0709 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0710 const fmpz_mod_ctx_t ctx);
0711
0712
0713
0714 void _fmpz_mod_poly_compose_mod(fmpz * res, const fmpz * f, slong lenf, const fmpz * g,
0715 const fmpz * h, slong lenh, const fmpz_mod_ctx_t ctx);
0716
0717 void fmpz_mod_poly_compose_mod(fmpz_mod_poly_t res,
0718 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0719 const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx);
0720
0721 void _fmpz_mod_poly_compose_mod_brent_kung(fmpz * res, const fmpz * poly1, slong len1,
0722 const fmpz * poly2, const fmpz * poly3, slong len3, const fmpz_mod_ctx_t ctx);
0723
0724 void fmpz_mod_poly_compose_mod_brent_kung(fmpz_mod_poly_t res,
0725 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0726 const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx);
0727
0728 void _fmpz_mod_poly_reduce_matrix_mod_poly (fmpz_mat_t A,
0729 const fmpz_mat_t B, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx);
0730
0731 void _fmpz_mod_poly_precompute_matrix(fmpz_mat_t A, const fmpz * poly1,
0732 const fmpz * poly2, slong len2, const fmpz * poly2inv,
0733 slong len2inv, const fmpz_mod_ctx_t ctx);
0734
0735 void _fmpz_mod_poly_precompute_matrix_worker(void * arg_ptr);
0736
0737 void fmpz_mod_poly_precompute_matrix(fmpz_mat_t A,
0738 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0739 const fmpz_mod_poly_t poly2inv, const fmpz_mod_ctx_t ctx);
0740
0741 void _fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv(fmpz * res,
0742 const fmpz * poly1, slong len1, const fmpz_mat_t A, const fmpz * poly3,
0743 slong len3, const fmpz * poly3inv, slong len3inv, const fmpz_mod_ctx_t ctx);
0744
0745 void _fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv_worker(void * arg_ptr);
0746
0747 void fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv(fmpz_mod_poly_t res,
0748 const fmpz_mod_poly_t poly1, const fmpz_mat_t A,
0749 const fmpz_mod_poly_t poly3, const fmpz_mod_poly_t poly3inv,
0750 const fmpz_mod_ctx_t ctx);
0751
0752 void _fmpz_mod_poly_compose_mod_brent_kung_preinv(fmpz * res, const fmpz * poly1,
0753 slong len1, const fmpz * poly2, const fmpz * poly3, slong len3,
0754 const fmpz * poly3inv, slong len3inv, const fmpz_mod_ctx_t ctx);
0755
0756 void fmpz_mod_poly_compose_mod_brent_kung_preinv(fmpz_mod_poly_t res,
0757 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0758 const fmpz_mod_poly_t poly3, const fmpz_mod_poly_t poly3inv,
0759 const fmpz_mod_ctx_t ctx);
0760
0761 void _fmpz_mod_poly_compose_mod_horner(fmpz * res, const fmpz * f, slong lenf, const fmpz * g,
0762 const fmpz * h, slong lenh, const fmpz_mod_ctx_t ctx);
0763
0764 void fmpz_mod_poly_compose_mod_horner(fmpz_mod_poly_t res,
0765 const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2,
0766 const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx);
0767
0768 void
0769 _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv(fmpz_mod_poly_struct * res,
0770 const fmpz_mod_poly_struct *
0771 polys, slong FLINT_UNUSED(lenpolys), slong l,
0772 const fmpz * g, slong glen,
0773 const fmpz * poly, slong len,
0774 const fmpz * polyinv,
0775 slong leninv, const fmpz_mod_ctx_t ctx);
0776
0777 void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv(
0778 fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys,
0779 slong len1,slong n, const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly,
0780 const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx);
0781
0782 void
0783 _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(fmpz_mod_poly_struct * res,
0784 const fmpz_mod_poly_struct * polys,
0785 slong FLINT_UNUSED(lenpolys), slong l,
0786 const fmpz * g, slong glen,
0787 const fmpz * poly, slong len,
0788 const fmpz * polyinv, slong leninv,
0789 const fmpz_mod_ctx_t ctx,
0790 thread_pool_handle * threads,
0791 slong num_threads);
0792
0793 void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(fmpz_mod_poly_struct * res,
0794 const fmpz_mod_poly_struct * polys, slong len1, slong n,
0795 const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly,
0796 const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx,
0797 thread_pool_handle * threads, slong num_threads);
0798
0799 void
0800 fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded(fmpz_mod_poly_struct * res,
0801 const fmpz_mod_poly_struct * polys, slong len1, slong n,
0802 const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly,
0803 const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx);
0804
0805
0806
0807 slong fmpz_mod_poly_hamming_weight(const fmpz_mod_poly_t A, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0808
0809
0810
0811 typedef struct {
0812 fmpz *V;
0813 fmpz *W;
0814 fmpz **Rpow;
0815 fmpz **Rinv;
0816 slong degR;
0817 slong k;
0818 fmpz invL;
0819 } fmpz_mod_poly_radix_struct;
0820
0821 typedef fmpz_mod_poly_radix_struct fmpz_mod_poly_radix_t[1];
0822
0823 void _fmpz_mod_poly_radix_init(fmpz **Rpow, fmpz **Rinv,
0824 const fmpz *R, slong lenR, slong k,
0825 const fmpz_t invL, const fmpz_mod_ctx_t ctx);
0826
0827 void fmpz_mod_poly_radix_init(fmpz_mod_poly_radix_t D,
0828 const fmpz_mod_poly_t R, slong degF, const fmpz_mod_ctx_t ctx);
0829
0830 void fmpz_mod_poly_radix_clear(fmpz_mod_poly_radix_t D);
0831
0832 void _fmpz_mod_poly_radix(fmpz **B, const fmpz *F, fmpz **Rpow, fmpz **Rinv,
0833 slong degR, slong k, slong i, fmpz *W, const fmpz_mod_ctx_t ctx);
0834
0835 void fmpz_mod_poly_radix(fmpz_mod_poly_struct **B, const fmpz_mod_poly_t F,
0836 const fmpz_mod_poly_radix_t D, const fmpz_mod_ctx_t ctx);
0837
0838
0839
0840 char * fmpz_mod_poly_get_str(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0841 char * fmpz_mod_poly_get_str_pretty(const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0842
0843 #ifdef FLINT_HAVE_FILE
0844 int _fmpz_mod_poly_fprint(FILE * file, const fmpz *poly, slong len, const fmpz_t p);
0845 int fmpz_mod_poly_fprint(FILE * file, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0846 int fmpz_mod_poly_fprint_pretty(FILE * file, const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t FLINT_UNUSED(ctx));
0847
0848 int fmpz_mod_poly_fread(FILE * file, fmpz_mod_poly_t poly, fmpz_mod_ctx_t ctx);
0849 #endif
0850
0851 int _fmpz_mod_poly_print(const fmpz *poly, slong len, const fmpz_t p);
0852 int fmpz_mod_poly_print(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0853 int fmpz_mod_poly_print_pretty(const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t ctx);
0854
0855
0856
0857 void _fmpz_mod_poly_product_roots_fmpz_vec(fmpz * poly,
0858 const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0859
0860 void fmpz_mod_poly_product_roots_fmpz_vec(fmpz_mod_poly_t poly,
0861 const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx);
0862
0863 int fmpz_mod_poly_find_distinct_nonzero_roots(fmpz * roots,
0864 const fmpz_mod_poly_t P, const fmpz_mod_ctx_t ctx);
0865
0866 void _fmpz_mod_poly_split_rabin(fmpz_mod_poly_t a, fmpz_mod_poly_t b,
0867 const fmpz_mod_poly_t f, const fmpz_t halfp, fmpz_mod_poly_t t,
0868 fmpz_mod_poly_t t2, flint_rand_t randstate, const fmpz_mod_ctx_t ctx);
0869
0870
0871
0872 void _fmpz_mod_mat_charpoly(fmpz * p,
0873 const fmpz_mod_mat_t M, const fmpz_mod_ctx_t ctx);
0874 void fmpz_mod_mat_charpoly(fmpz_mod_poly_t p,
0875 const fmpz_mod_mat_t M, const fmpz_mod_ctx_t ctx);
0876
0877 void fmpz_mod_mat_minpoly(fmpz_mod_poly_t p, const fmpz_mod_mat_t M,
0878 const fmpz_mod_ctx_t ctx);
0879
0880
0881 typedef struct {
0882 slong npoints;
0883 fmpz_mod_poly_t R0, R1;
0884 fmpz_mod_poly_t V0, V1;
0885 fmpz_mod_poly_t qt, rt;
0886 fmpz_mod_poly_t points;
0887 } fmpz_mod_berlekamp_massey_struct;
0888 typedef fmpz_mod_berlekamp_massey_struct fmpz_mod_berlekamp_massey_t[1];
0889
0890 void fmpz_mod_berlekamp_massey_init(
0891 fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx);
0892
0893 void fmpz_mod_berlekamp_massey_start_over(
0894 fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx);
0895
0896 void fmpz_mod_berlekamp_massey_clear(fmpz_mod_berlekamp_massey_t B,
0897 const fmpz_mod_ctx_t ctx);
0898
0899 void fmpz_mod_berlekamp_massey_print(
0900 const fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx);
0901
0902 void fmpz_mod_berlekamp_massey_add_points(
0903 fmpz_mod_berlekamp_massey_t B, const fmpz * a, slong count,
0904 const fmpz_mod_ctx_t ctx);
0905
0906 void fmpz_mod_berlekamp_massey_add_zeros(
0907 fmpz_mod_berlekamp_massey_t B, slong count,
0908 const fmpz_mod_ctx_t ctx);
0909
0910 void fmpz_mod_berlekamp_massey_add_point(
0911 fmpz_mod_berlekamp_massey_t B, const fmpz_t a,
0912 const fmpz_mod_ctx_t ctx);
0913
0914 void fmpz_mod_berlekamp_massey_add_point_ui(
0915 fmpz_mod_berlekamp_massey_t B, ulong a,
0916 const fmpz_mod_ctx_t ctx);
0917
0918 int fmpz_mod_berlekamp_massey_reduce(
0919 fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx);
0920
0921 FMPZ_MOD_POLY_INLINE const fmpz * fmpz_mod_berlekamp_massey_points(
0922 const fmpz_mod_berlekamp_massey_t B)
0923 {
0924 return B->points->coeffs;
0925 }
0926
0927 FMPZ_MOD_POLY_INLINE slong fmpz_mod_berlekamp_massey_point_count(
0928 const fmpz_mod_berlekamp_massey_t B)
0929 {
0930 return B->points->length;
0931 }
0932
0933 FMPZ_MOD_POLY_INLINE const fmpz_mod_poly_struct * fmpz_mod_berlekamp_massey_V_poly(
0934 const fmpz_mod_berlekamp_massey_t B)
0935 {
0936 return B->V1;
0937 }
0938
0939 FMPZ_MOD_POLY_INLINE const fmpz_mod_poly_struct * fmpz_mod_berlekamp_massey_R_poly(
0940 const fmpz_mod_berlekamp_massey_t B)
0941 {
0942 return B->R1;
0943 }
0944
0945
0946
0947 void fmpz_mod_poly_add_si(fmpz_mod_poly_t res,
0948 const fmpz_mod_poly_t poly, slong c, const fmpz_mod_ctx_t ctx);
0949
0950 void fmpz_mod_poly_sub_si(fmpz_mod_poly_t res,
0951 const fmpz_mod_poly_t poly, slong c, const fmpz_mod_ctx_t ctx);
0952
0953 void fmpz_mod_poly_si_sub(fmpz_mod_poly_t res, slong c,
0954 const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0955
0956 void fmpz_mod_poly_add_fmpz(fmpz_mod_poly_t res,
0957 const fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx);
0958
0959 void fmpz_mod_poly_sub_fmpz(fmpz_mod_poly_t res,
0960 const fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx);
0961
0962 void fmpz_mod_poly_fmpz_sub(fmpz_mod_poly_t res, const fmpz_t c,
0963 const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx);
0964
0965
0966
0967 #define fmpz_mod_poly_set_coeff_mpz _Pragma("GCC error \"'fmpz_mod_poly_set_coeff_mpz' is deprecated. Use 'fmpz_mod_poly_set_coeff_fmpz' instead.\"")
0968 #define fmpz_mod_poly_get_coeff_mpz _Pragma("GCC error \"'fmpz_mod_poly_get_coeff_mpz' is deprecated. Use 'fmpz_mod_poly_get_coeff_fmpz' instead.\"")
0969
0970 #ifdef __cplusplus
0971 }
0972 #endif
0973
0974 #endif