File indexing completed on 2026-11-07 10:15:18
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FQ_DEFAULT_POLY_H
0014 #define FQ_DEFAULT_POLY_H
0015
0016 #ifdef FQ_DEFAULT_POLY_INLINES_C
0017 #define FQ_DEFAULT_POLY_INLINE
0018 #else
0019 #define FQ_DEFAULT_POLY_INLINE static inline
0020 #endif
0021
0022 #include "fq_default.h"
0023 #include "fq_vec.h"
0024 #include "fq_poly.h"
0025 #include "fq_nmod_poly.h"
0026 #include "fq_zech_poly.h"
0027
0028 #ifdef __cplusplus
0029 extern "C" {
0030 #endif
0031
0032
0033
0034 typedef union fq_default_poly_struct
0035 {
0036 fq_poly_t fq;
0037 fq_nmod_poly_t fq_nmod;
0038 fq_zech_poly_t fq_zech;
0039 nmod_poly_t nmod;
0040 fmpz_mod_poly_t fmpz_mod;
0041 }
0042 fq_default_poly_struct;
0043
0044 typedef fq_default_poly_struct fq_default_poly_t[1];
0045
0046
0047
0048 FQ_DEFAULT_POLY_INLINE void fq_default_poly_init(fq_default_poly_t poly,
0049 const fq_default_ctx_t ctx)
0050 {
0051 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0052 {
0053 fq_zech_poly_init(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0054 }
0055 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0056 {
0057 fq_nmod_poly_init(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0058 }
0059 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0060 {
0061 nmod_poly_init(poly->nmod, FQ_DEFAULT_CTX_NMOD(ctx).n);
0062 }
0063 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0064 {
0065 fmpz_mod_poly_init(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0066 }
0067 else
0068 {
0069 fq_poly_init(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0070 }
0071 }
0072
0073 FQ_DEFAULT_POLY_INLINE void fq_default_poly_init2(fq_default_poly_t poly,
0074 slong alloc, const fq_default_ctx_t ctx)
0075 {
0076 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0077 {
0078 fq_zech_poly_init2(poly->fq_zech, alloc, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0079 }
0080 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0081 {
0082 fq_nmod_poly_init2(poly->fq_nmod, alloc, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0083 }
0084 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0085 {
0086 nmod_poly_init2(poly->nmod, FQ_DEFAULT_CTX_NMOD(ctx).n, alloc);
0087 }
0088 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0089 {
0090 fmpz_mod_poly_init2(poly->fmpz_mod, alloc, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0091 }
0092 else
0093 {
0094 fq_poly_init2(poly->fq, alloc, FQ_DEFAULT_CTX_FQ(ctx));
0095 }
0096 }
0097
0098 FQ_DEFAULT_POLY_INLINE void fq_default_poly_realloc(fq_default_poly_t poly,
0099 slong alloc, const fq_default_ctx_t ctx)
0100 {
0101 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0102 {
0103 fq_zech_poly_realloc(poly->fq_zech, alloc, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0104 }
0105 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0106 {
0107 fq_nmod_poly_realloc(poly->fq_nmod, alloc, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0108 }
0109 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0110 {
0111 nmod_poly_realloc(poly->nmod, alloc);
0112 }
0113 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0114 {
0115 fmpz_mod_poly_realloc(poly->fmpz_mod, alloc, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0116 }
0117 else
0118 {
0119 fq_poly_realloc(poly->fq, alloc, FQ_DEFAULT_CTX_FQ(ctx));
0120 }
0121 }
0122
0123 FQ_DEFAULT_POLY_INLINE void fq_default_poly_truncate(fq_default_poly_t poly,
0124 slong len, const fq_default_ctx_t ctx)
0125 {
0126 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0127 {
0128 fq_zech_poly_truncate(poly->fq_zech, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0129 }
0130 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0131 {
0132 fq_nmod_poly_truncate(poly->fq_nmod, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0133 }
0134 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0135 {
0136 nmod_poly_truncate(poly->nmod, len);
0137 }
0138 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0139 {
0140 fmpz_mod_poly_truncate(poly->fmpz_mod, len, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0141 }
0142 else
0143 {
0144 fq_poly_truncate(poly->fq, len, FQ_DEFAULT_CTX_FQ(ctx));
0145 }
0146 }
0147
0148 FQ_DEFAULT_POLY_INLINE void fq_default_poly_set_trunc(fq_default_poly_t poly1,
0149 fq_default_poly_t poly2, slong len, const fq_default_ctx_t ctx)
0150 {
0151 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0152 {
0153 fq_zech_poly_set_trunc(poly1->fq_zech,
0154 poly2->fq_zech, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0155 }
0156 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0157 {
0158 fq_nmod_poly_set_trunc(poly1->fq_nmod,
0159 poly2->fq_nmod, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0160 }
0161 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0162 {
0163 nmod_poly_set_trunc(poly1->nmod, poly2->nmod, len);
0164 }
0165 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0166 {
0167 fmpz_mod_poly_set_trunc(poly1->fmpz_mod,
0168 poly2->fmpz_mod, len, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0169 }
0170 else
0171 {
0172 fq_poly_set_trunc(poly1->fq, poly2->fq, len, FQ_DEFAULT_CTX_FQ(ctx));
0173 }
0174 }
0175
0176 FQ_DEFAULT_POLY_INLINE void fq_default_poly_fit_length(fq_default_poly_t poly,
0177 slong len, const fq_default_ctx_t ctx)
0178 {
0179 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0180 {
0181 fq_zech_poly_fit_length(poly->fq_zech, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0182 }
0183 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0184 {
0185 fq_nmod_poly_fit_length(poly->fq_nmod, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0186 }
0187 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0188 {
0189 nmod_poly_fit_length(poly->nmod, len);
0190 }
0191 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0192 {
0193 fmpz_mod_poly_fit_length(poly->fmpz_mod, len, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0194 }
0195 else
0196 {
0197 fq_poly_fit_length(poly->fq, len, FQ_DEFAULT_CTX_FQ(ctx));
0198 }
0199 }
0200
0201 FQ_DEFAULT_POLY_INLINE
0202 void _fq_default_poly_set_length(fq_default_poly_t poly,
0203 slong len, const fq_default_ctx_t ctx)
0204 {
0205 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0206 {
0207 _fq_zech_poly_set_length(poly->fq_zech, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0208 }
0209 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0210 {
0211 _fq_nmod_poly_set_length(poly->fq_nmod, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0212 }
0213 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0214 {
0215 _nmod_poly_set_length(poly->nmod, len);
0216 }
0217 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0218 {
0219 _fmpz_mod_poly_set_length(poly->fmpz_mod, len);
0220 }
0221 else
0222 {
0223 _fq_poly_set_length(poly->fq, len, FQ_DEFAULT_CTX_FQ(ctx));
0224 }
0225 }
0226
0227 FQ_DEFAULT_POLY_INLINE void fq_default_poly_clear(fq_default_poly_t poly,
0228 const fq_default_ctx_t ctx)
0229 {
0230 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0231 {
0232 fq_zech_poly_clear(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0233 }
0234 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0235 {
0236 fq_nmod_poly_clear(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0237 }
0238 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0239 {
0240 nmod_poly_clear(poly->nmod);
0241 }
0242 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0243 {
0244 fmpz_mod_poly_clear(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0245 }
0246 else
0247 {
0248 fq_poly_clear(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0249 }
0250 }
0251
0252
0253
0254 FQ_DEFAULT_POLY_INLINE slong
0255 fq_default_poly_length(const fq_default_poly_t poly,
0256 const fq_default_ctx_t ctx)
0257 {
0258 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0259 {
0260 return fq_zech_poly_length(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0261 }
0262 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0263 {
0264 return fq_nmod_poly_length(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0265 }
0266 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0267 {
0268 return nmod_poly_length(poly->nmod);
0269 }
0270 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0271 {
0272 return fmpz_mod_poly_length(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0273 }
0274 else
0275 {
0276 return fq_poly_length(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0277 }
0278 }
0279
0280 FQ_DEFAULT_POLY_INLINE slong
0281 fq_default_poly_degree(const fq_default_poly_t poly,
0282 const fq_default_ctx_t ctx)
0283 {
0284 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0285 {
0286 return fq_zech_poly_degree(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0287 }
0288 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0289 {
0290 return fq_nmod_poly_degree(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0291 }
0292 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0293 {
0294 return nmod_poly_degree(poly->nmod);
0295 }
0296 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0297 {
0298 return fmpz_mod_poly_degree(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0299 }
0300 else
0301 {
0302 return fq_poly_degree(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0303 }
0304 }
0305
0306
0307
0308 FQ_DEFAULT_POLY_INLINE void fq_default_poly_randtest(fq_default_poly_t f,
0309 flint_rand_t state, slong len, const fq_default_ctx_t ctx)
0310 {
0311 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0312 {
0313 fq_zech_poly_randtest(f->fq_zech, state, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0314 }
0315 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0316 {
0317 fq_nmod_poly_randtest(f->fq_nmod, state, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0318 }
0319 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0320 {
0321 nmod_poly_randtest(f->nmod, state, len);
0322 }
0323 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0324 {
0325 fmpz_mod_poly_randtest(f->fmpz_mod, state, len, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0326 }
0327 else
0328 {
0329 fq_poly_randtest(f->fq, state, len, FQ_DEFAULT_CTX_FQ(ctx));
0330 }
0331 }
0332
0333 FQ_DEFAULT_POLY_INLINE
0334 void fq_default_poly_randtest_not_zero(fq_default_poly_t f,
0335 flint_rand_t state, slong len, const fq_default_ctx_t ctx)
0336 {
0337 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0338 {
0339 fq_zech_poly_randtest_not_zero(f->fq_zech, state, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0340 }
0341 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0342 {
0343 fq_nmod_poly_randtest_not_zero(f->fq_nmod, state, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0344 }
0345 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0346 {
0347 nmod_poly_randtest_not_zero(f->nmod, state, len);
0348 }
0349 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0350 {
0351 fmpz_mod_poly_randtest_not_zero(f->fmpz_mod, state, len,
0352 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0353 }
0354 else
0355 {
0356 fq_poly_randtest_not_zero(f->fq, state, len, FQ_DEFAULT_CTX_FQ(ctx));
0357 }
0358 }
0359
0360 FQ_DEFAULT_POLY_INLINE
0361 void fq_default_poly_randtest_monic(fq_default_poly_t f,
0362 flint_rand_t state, slong len, const fq_default_ctx_t ctx)
0363 {
0364 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0365 {
0366 fq_zech_poly_randtest_monic(f->fq_zech, state, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0367 }
0368 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0369 {
0370 fq_nmod_poly_randtest_monic(f->fq_nmod, state, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0371 }
0372 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0373 {
0374 nmod_poly_randtest_monic(f->nmod, state, len);
0375 }
0376 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0377 {
0378 fmpz_mod_poly_randtest_monic(f->fmpz_mod, state, len,
0379 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0380 }
0381 else
0382 {
0383 fq_poly_randtest_monic(f->fq, state, len, FQ_DEFAULT_CTX_FQ(ctx));
0384 }
0385 }
0386
0387 FQ_DEFAULT_POLY_INLINE
0388 void fq_default_poly_randtest_irreducible(fq_default_poly_t f,
0389 flint_rand_t state, slong len, const fq_default_ctx_t ctx)
0390 {
0391 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0392 {
0393 fq_zech_poly_randtest_irreducible(f->fq_zech,
0394 state, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0395 }
0396 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0397 {
0398 fq_nmod_poly_randtest_irreducible(f->fq_nmod,
0399 state, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0400 }
0401 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0402 {
0403 nmod_poly_randtest_irreducible(f->nmod, state, len);
0404 }
0405 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0406 {
0407 fmpz_mod_poly_randtest_irreducible(f->fmpz_mod, state, len,
0408 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0409 }
0410 else
0411 {
0412 fq_poly_randtest_irreducible(f->fq, state, len, FQ_DEFAULT_CTX_FQ(ctx));
0413 }
0414 }
0415
0416
0417
0418 FQ_DEFAULT_POLY_INLINE void fq_default_poly_set(fq_default_poly_t rop,
0419 const fq_default_poly_t op, const fq_default_ctx_t ctx)
0420 {
0421 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0422 {
0423 fq_zech_poly_set(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0424 }
0425 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0426 {
0427 fq_nmod_poly_set(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0428 }
0429 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0430 {
0431 nmod_poly_set(rop->nmod, op->nmod);
0432 }
0433 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0434 {
0435 fmpz_mod_poly_set(rop->fmpz_mod, op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0436 }
0437 else
0438 {
0439 fq_poly_set(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
0440 }
0441 }
0442
0443 FQ_DEFAULT_POLY_INLINE
0444 void fq_default_poly_set_fq_default(fq_default_poly_t poly,
0445 const fq_default_t c, const fq_default_ctx_t ctx)
0446 {
0447 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0448 {
0449 fq_zech_poly_set_fq_zech(poly->fq_zech, c->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0450 }
0451 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0452 {
0453 fq_nmod_poly_set_fq_nmod(poly->fq_nmod, c->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0454 }
0455 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0456 {
0457 nmod_poly_zero(poly->nmod);
0458 nmod_poly_set_coeff_ui(poly->nmod, 0, c->nmod);
0459 }
0460 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0461 {
0462 fmpz_mod_poly_set_fmpz(poly->fmpz_mod, c->fmpz_mod,
0463 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0464 }
0465 else
0466 {
0467 fq_poly_set_fq(poly->fq, c->fq, FQ_DEFAULT_CTX_FQ(ctx));
0468 }
0469 }
0470
0471 FQ_DEFAULT_POLY_INLINE void fq_default_poly_swap(fq_default_poly_t op1,
0472 fq_default_poly_t op2, const fq_default_ctx_t ctx)
0473 {
0474 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0475 {
0476 fq_zech_poly_swap(op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0477 }
0478 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0479 {
0480 fq_nmod_poly_swap(op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0481 }
0482 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0483 {
0484 nmod_poly_swap(op1->nmod, op2->nmod);
0485 }
0486 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0487 {
0488 fmpz_mod_poly_swap(op1->fmpz_mod, op2->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0489 }
0490 else
0491 {
0492 fq_poly_swap(op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
0493 }
0494 }
0495
0496 FQ_DEFAULT_POLY_INLINE void
0497 fq_default_poly_zero(fq_default_poly_t poly, const fq_default_ctx_t ctx)
0498 {
0499 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0500 {
0501 fq_zech_poly_zero(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0502 }
0503 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0504 {
0505 fq_nmod_poly_zero(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0506 }
0507 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0508 {
0509 nmod_poly_zero(poly->nmod);
0510 }
0511 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0512 {
0513 fmpz_mod_poly_zero(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0514 }
0515 else
0516 {
0517 fq_poly_zero(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0518 }
0519 }
0520
0521 FQ_DEFAULT_POLY_INLINE void fq_default_poly_one(fq_default_poly_t poly,
0522 const fq_default_ctx_t ctx)
0523 {
0524 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0525 {
0526 fq_zech_poly_one(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0527 }
0528 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0529 {
0530 fq_nmod_poly_one(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0531 }
0532 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0533 {
0534 nmod_poly_one(poly->nmod);
0535 }
0536 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0537 {
0538 fmpz_mod_poly_one(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0539 }
0540 else
0541 {
0542 fq_poly_one(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0543 }
0544 }
0545
0546 FQ_DEFAULT_POLY_INLINE void fq_default_poly_gen(fq_default_poly_t f,
0547 const fq_default_ctx_t ctx)
0548 {
0549 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0550 {
0551 fq_zech_poly_gen(f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0552 }
0553 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0554 {
0555 fq_nmod_poly_gen(f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0556 }
0557 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0558 {
0559 nmod_poly_one(f->nmod);
0560 nmod_poly_shift_left(f->nmod, f->nmod, 1);
0561 }
0562 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0563 {
0564 fmpz_mod_poly_gen(f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0565 }
0566 else
0567 {
0568 fq_poly_gen(f->fq, FQ_DEFAULT_CTX_FQ(ctx));
0569 }
0570 }
0571
0572 FQ_DEFAULT_POLY_INLINE void fq_default_poly_make_monic(fq_default_poly_t rop,
0573 const fq_default_poly_t op, const fq_default_ctx_t ctx)
0574 {
0575 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0576 {
0577 fq_zech_poly_make_monic(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0578 }
0579 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0580 {
0581 fq_nmod_poly_make_monic(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0582 }
0583 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0584 {
0585 nmod_poly_make_monic(rop->nmod, op->nmod);
0586 }
0587 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0588 {
0589 fmpz_mod_poly_make_monic(rop->fmpz_mod, op->fmpz_mod,
0590 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0591 }
0592 else
0593 {
0594 fq_poly_make_monic(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
0595 }
0596 }
0597
0598 FQ_DEFAULT_POLY_INLINE void fq_default_poly_reverse(fq_default_poly_t res,
0599 const fq_default_poly_t poly, slong n, const fq_default_ctx_t ctx)
0600 {
0601 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0602 {
0603 fq_zech_poly_reverse(res->fq_zech, poly->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0604 }
0605 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0606 {
0607 fq_nmod_poly_reverse(res->fq_nmod, poly->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0608 }
0609 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0610 {
0611 nmod_poly_reverse(res->nmod, poly->nmod, n);
0612 }
0613 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0614 {
0615 fmpz_mod_poly_reverse(res->fmpz_mod, poly->fmpz_mod, n,
0616 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0617 }
0618 else
0619 {
0620 fq_poly_reverse(res->fq, poly->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
0621 }
0622 }
0623
0624 FQ_DEFAULT_POLY_INLINE
0625 ulong fq_default_poly_deflation(const fq_default_poly_t input,
0626 const fq_default_ctx_t ctx)
0627 {
0628 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0629 {
0630 return fq_zech_poly_deflation(input->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0631 }
0632 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0633 {
0634 return fq_nmod_poly_deflation(input->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0635 }
0636 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0637 {
0638 return nmod_poly_deflation(input->nmod);
0639 }
0640 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0641 {
0642 return fmpz_mod_poly_deflation(input->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0643 }
0644 else
0645 {
0646 return fq_poly_deflation(input->fq, FQ_DEFAULT_CTX_FQ(ctx));
0647 }
0648 }
0649
0650 FQ_DEFAULT_POLY_INLINE void fq_default_poly_deflate(fq_default_poly_t result,
0651 const fq_default_poly_t input, ulong deflation, const fq_default_ctx_t ctx)
0652 {
0653 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0654 {
0655 fq_zech_poly_deflate(result->fq_zech,
0656 input->fq_zech, deflation, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0657 }
0658 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0659 {
0660 fq_nmod_poly_deflate(result->fq_nmod,
0661 input->fq_nmod, deflation, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0662 }
0663 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0664 {
0665 nmod_poly_deflate(result->nmod, input->nmod, deflation);
0666 }
0667 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0668 {
0669 fmpz_mod_poly_deflate(result->fmpz_mod, input->fmpz_mod, deflation,
0670 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0671 }
0672 else
0673 {
0674 fq_poly_deflate(result->fq, input->fq, deflation, FQ_DEFAULT_CTX_FQ(ctx));
0675 }
0676 }
0677
0678 FQ_DEFAULT_POLY_INLINE void fq_default_poly_inflate(fq_default_poly_t result,
0679 const fq_default_poly_t input, ulong inflation, const fq_default_ctx_t ctx)
0680 {
0681 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0682 {
0683 fq_zech_poly_inflate(result->fq_zech,
0684 input->fq_zech, inflation, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0685 }
0686 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0687 {
0688 fq_nmod_poly_inflate(result->fq_nmod,
0689 input->fq_nmod, inflation, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0690 }
0691 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0692 {
0693 nmod_poly_inflate(result->nmod, input->nmod, inflation);
0694 }
0695 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0696 {
0697 fmpz_mod_poly_inflate(result->fmpz_mod, input->fmpz_mod, inflation,
0698 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0699 }
0700 else
0701 {
0702 fq_poly_inflate(result->fq, input->fq, inflation, FQ_DEFAULT_CTX_FQ(ctx));
0703 }
0704 }
0705
0706
0707
0708 FQ_DEFAULT_POLY_INLINE void fq_default_poly_get_coeff(fq_default_t x,
0709 const fq_default_poly_t poly, slong n, const fq_default_ctx_t ctx)
0710 {
0711 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0712 {
0713 fq_zech_poly_get_coeff(x->fq_zech, poly->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0714 }
0715 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0716 {
0717 fq_nmod_poly_get_coeff(x->fq_nmod, poly->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0718 }
0719 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0720 {
0721 x->nmod = nmod_poly_get_coeff_ui(poly->nmod, n);
0722 }
0723 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0724 {
0725 fmpz_mod_poly_get_coeff_fmpz(x->fmpz_mod, poly->fmpz_mod, n,
0726 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0727 }
0728 else
0729 {
0730 fq_poly_get_coeff(x->fq, poly->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
0731 }
0732 }
0733
0734 FQ_DEFAULT_POLY_INLINE void fq_default_poly_set_coeff(fq_default_poly_t poly,
0735 slong n, const fq_default_t x, const fq_default_ctx_t ctx)
0736 {
0737 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0738 {
0739 fq_zech_poly_set_coeff(poly->fq_zech, n, x->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0740 }
0741 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0742 {
0743 fq_nmod_poly_set_coeff(poly->fq_nmod, n, x->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0744 }
0745 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0746 {
0747 nmod_poly_set_coeff_ui(poly->nmod, n, x->nmod);
0748 }
0749 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0750 {
0751 fmpz_mod_poly_set_coeff_fmpz(poly->fmpz_mod, n, x->fmpz_mod,
0752 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0753 }
0754 else
0755 {
0756 fq_poly_set_coeff(poly->fq, n, x->fq, FQ_DEFAULT_CTX_FQ(ctx));
0757 }
0758 }
0759
0760 FQ_DEFAULT_POLY_INLINE void
0761 fq_default_poly_set_coeff_fmpz(fq_default_poly_t poly,
0762 slong n, const fmpz_t x, const fq_default_ctx_t ctx)
0763 {
0764 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0765 {
0766 fq_zech_poly_set_coeff_fmpz(poly->fq_zech, n, x, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0767 }
0768 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0769 {
0770 fq_nmod_poly_set_coeff_fmpz(poly->fq_nmod, n, x, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0771 }
0772 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0773 {
0774 nmod_poly_set_coeff_ui(poly->nmod, n, fmpz_get_nmod(x, FQ_DEFAULT_CTX_NMOD(ctx)));
0775 }
0776 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0777 {
0778 fmpz_mod_poly_set_coeff_fmpz(poly->fmpz_mod, n, x,
0779 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0780 }
0781 else
0782 {
0783 fq_poly_set_coeff_fmpz(poly->fq, n, x, FQ_DEFAULT_CTX_FQ(ctx));
0784 }
0785 }
0786
0787 FQ_DEFAULT_POLY_INLINE
0788 void fq_default_poly_set_nmod_poly(fq_default_poly_t rop,
0789 const nmod_poly_t op, const fq_default_ctx_t ctx)
0790 {
0791 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0792 {
0793 fq_zech_poly_set_nmod_poly(rop->fq_zech, op, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0794 }
0795 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0796 {
0797 fq_nmod_poly_set_nmod_poly(rop->fq_nmod, op, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0798 }
0799 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0800 {
0801 nmod_poly_set(rop->nmod, op);
0802 }
0803 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0804 {
0805 fmpz_mod_poly_set_nmod_poly(rop->fmpz_mod, op);
0806 }
0807 else
0808 {
0809 fq_poly_set_nmod_poly(rop->fq, op, FQ_DEFAULT_CTX_FQ(ctx));
0810 }
0811 }
0812
0813 FQ_DEFAULT_POLY_INLINE
0814 void fq_default_poly_set_fmpz_mod_poly(fq_default_poly_t rop,
0815 const fmpz_mod_poly_t op, const fq_default_ctx_t ctx)
0816 {
0817 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0818 {
0819 fq_zech_poly_set_fmpz_mod_poly(rop->fq_zech, op, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0820 }
0821 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0822 {
0823 fq_nmod_poly_set_fmpz_mod_poly(rop->fq_nmod, op, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0824 }
0825 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0826 {
0827 fmpz_mod_poly_get_nmod_poly(rop->nmod, op);
0828 }
0829 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0830 {
0831 fmpz_mod_poly_set(rop->fmpz_mod, op, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0832 }
0833 else
0834 {
0835 fq_poly_set_fmpz_mod_poly(rop->fq, op, FQ_DEFAULT_CTX_FQ(ctx));
0836 }
0837 }
0838
0839
0840 void fq_default_poly_set_fmpz_poly(fq_default_poly_t rop,
0841 const fmpz_poly_t op, const fq_default_ctx_t ctx);
0842
0843
0844
0845 FQ_DEFAULT_POLY_INLINE
0846 int fq_default_poly_equal(const fq_default_poly_t poly1,
0847 const fq_default_poly_t poly2, const fq_default_ctx_t ctx)
0848 {
0849 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0850 {
0851 return fq_zech_poly_equal(poly1->fq_zech, poly2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0852 }
0853 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0854 {
0855 return fq_nmod_poly_equal(poly1->fq_nmod, poly2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0856 }
0857 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0858 {
0859 return nmod_poly_equal(poly1->nmod, poly2->nmod);
0860 }
0861 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0862 {
0863 return fmpz_mod_poly_equal(poly1->fmpz_mod, poly2->fmpz_mod,
0864 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0865 }
0866 else
0867 {
0868 return fq_poly_equal(poly1->fq, poly2->fq, FQ_DEFAULT_CTX_FQ(ctx));
0869 }
0870 }
0871
0872 FQ_DEFAULT_POLY_INLINE
0873 int fq_default_poly_equal_trunc(const fq_default_poly_t poly1,
0874 const fq_default_poly_t poly2, slong n, const fq_default_ctx_t ctx)
0875 {
0876 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0877 {
0878 return fq_zech_poly_equal_trunc(poly1->fq_zech,
0879 poly2->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0880 }
0881 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0882 {
0883 return fq_nmod_poly_equal_trunc(poly1->fq_nmod,
0884 poly2->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0885 }
0886 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0887 {
0888 return nmod_poly_equal_trunc(poly1->nmod, poly2->nmod, n);
0889 }
0890 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0891 {
0892 return fmpz_mod_poly_equal_trunc(poly1->fmpz_mod, poly2->fmpz_mod, n,
0893 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0894 }
0895 else
0896 {
0897 return fq_poly_equal_trunc(poly1->fq, poly2->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
0898 }
0899 }
0900
0901 FQ_DEFAULT_POLY_INLINE int
0902 fq_default_poly_is_zero(const fq_default_poly_t poly,
0903 const fq_default_ctx_t ctx)
0904 {
0905 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0906 {
0907 return fq_zech_poly_is_zero(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0908 }
0909 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0910 {
0911 return fq_nmod_poly_is_zero(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0912 }
0913 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0914 {
0915 return nmod_poly_is_zero(poly->nmod);
0916 }
0917 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0918 {
0919 return fmpz_mod_poly_is_zero(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0920 }
0921 else
0922 {
0923 return fq_poly_is_zero(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
0924 }
0925 }
0926
0927 FQ_DEFAULT_POLY_INLINE int
0928 fq_default_poly_is_one(const fq_default_poly_t op, const fq_default_ctx_t ctx)
0929 {
0930 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0931 {
0932 return fq_zech_poly_is_one(op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0933 }
0934 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0935 {
0936 return fq_nmod_poly_is_one(op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0937 }
0938 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0939 {
0940 return nmod_poly_is_one(op->nmod);
0941 }
0942 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0943 {
0944 return fmpz_mod_poly_is_one(op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0945 }
0946 else
0947 {
0948 return fq_poly_is_one(op->fq, FQ_DEFAULT_CTX_FQ(ctx));
0949 }
0950 }
0951
0952 FQ_DEFAULT_POLY_INLINE int
0953 fq_default_poly_is_unit(const fq_default_poly_t op, const fq_default_ctx_t ctx)
0954 {
0955 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0956 {
0957 return fq_zech_poly_is_unit(op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0958 }
0959 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0960 {
0961 return fq_nmod_poly_is_unit(op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0962 }
0963 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0964 {
0965 return nmod_poly_is_unit(op->nmod);
0966 }
0967 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0968 {
0969 return fmpz_mod_poly_is_unit(op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0970 }
0971 else
0972 {
0973 return fq_poly_is_unit(op->fq, FQ_DEFAULT_CTX_FQ(ctx));
0974 }
0975 }
0976
0977 FQ_DEFAULT_POLY_INLINE int
0978 fq_default_poly_is_gen(const fq_default_poly_t poly,
0979 const fq_default_ctx_t ctx)
0980 {
0981 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0982 {
0983 return fq_zech_poly_is_gen(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0984 }
0985 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0986 {
0987 return fq_nmod_poly_is_gen(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0988 }
0989 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0990 {
0991 return nmod_poly_is_gen(poly->nmod);
0992 }
0993 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0994 {
0995 return fmpz_mod_poly_is_gen(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0996 }
0997 else
0998 {
0999 return fq_poly_is_gen(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
1000 }
1001 }
1002
1003 FQ_DEFAULT_POLY_INLINE int
1004 fq_default_poly_equal_fq_default(const fq_default_poly_t poly,
1005 const fq_default_t c, const fq_default_ctx_t ctx)
1006 {
1007 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1008 {
1009 return fq_zech_poly_equal_fq_zech(poly->fq_zech,
1010 c->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1011 }
1012 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1013 {
1014 return fq_nmod_poly_equal_fq_nmod(poly->fq_nmod,
1015 c->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1016 }
1017 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1018 {
1019 if (c->nmod == 0)
1020 return poly->nmod->length == 0;
1021 else
1022 return poly->nmod->length == 1 && poly->nmod->coeffs[0] == c->nmod;
1023 }
1024 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1025 {
1026 if (fmpz_is_zero(c->fmpz_mod))
1027 return poly->fmpz_mod->length == 0;
1028 else
1029 return poly->fmpz_mod->length == 1 &&
1030 fmpz_equal(poly->fmpz_mod->coeffs + 0, c->fmpz_mod);
1031 }
1032 else
1033 {
1034 return fq_poly_equal_fq(poly->fq, c->fq, FQ_DEFAULT_CTX_FQ(ctx));
1035 }
1036 }
1037
1038
1039
1040 FQ_DEFAULT_POLY_INLINE
1041 void fq_default_poly_add(fq_default_poly_t rop, const fq_default_poly_t op1,
1042 const fq_default_poly_t op2, const fq_default_ctx_t ctx)
1043 {
1044 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1045 {
1046 fq_zech_poly_add(rop->fq_zech,
1047 op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1048 }
1049 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1050 {
1051 fq_nmod_poly_add(rop->fq_nmod,
1052 op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1053 }
1054 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1055 {
1056 nmod_poly_add(rop->nmod, op1->nmod, op2->nmod);
1057 }
1058 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1059 {
1060 fmpz_mod_poly_add(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod,
1061 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1062 }
1063 else
1064 {
1065 fq_poly_add(rop->fq, op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
1066 }
1067 }
1068
1069 FQ_DEFAULT_POLY_INLINE void fq_default_poly_add_si(fq_default_poly_t rop,
1070 const fq_default_poly_t op1, slong c, const fq_default_ctx_t ctx)
1071 {
1072 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1073 {
1074 fq_zech_poly_add_si(rop->fq_zech, op1->fq_zech, c, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1075 }
1076 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1077 {
1078 fq_nmod_poly_add_si(rop->fq_nmod, op1->fq_nmod, c, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1079 }
1080 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1081 {
1082 nmod_poly_add_ui(rop->nmod, op1->nmod, nmod_set_si(c, FQ_DEFAULT_CTX_NMOD(ctx)));
1083 }
1084 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1085 {
1086 fmpz_mod_poly_add_si(rop->fmpz_mod, op1->fmpz_mod, c,
1087 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1088 }
1089 else
1090 {
1091 fq_poly_add_si(rop->fq, op1->fq, c, FQ_DEFAULT_CTX_FQ(ctx));
1092 }
1093 }
1094
1095 FQ_DEFAULT_POLY_INLINE
1096 void fq_default_poly_add_series(fq_default_poly_t rop,
1097 const fq_default_poly_t op1, const fq_default_poly_t op2,
1098 slong n, const fq_default_ctx_t ctx)
1099 {
1100 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1101 {
1102 fq_zech_poly_add_series(rop->fq_zech,
1103 op1->fq_zech, op2->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1104 }
1105 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1106 {
1107 fq_nmod_poly_add_series(rop->fq_nmod,
1108 op1->fq_nmod, op2->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1109 }
1110 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1111 {
1112 nmod_poly_add_series(rop->nmod, op1->nmod, op2->nmod, n);
1113 }
1114 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1115 {
1116 fmpz_mod_poly_add_series(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod, n,
1117 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1118 }
1119 else
1120 {
1121 fq_poly_add_series(rop->fq, op1->fq, op2->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1122 }
1123 }
1124
1125 FQ_DEFAULT_POLY_INLINE void fq_default_poly_sub(fq_default_poly_t rop,
1126 const fq_default_poly_t op1, const fq_default_poly_t op2,
1127 const fq_default_ctx_t ctx)
1128 {
1129 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1130 {
1131 fq_zech_poly_sub(rop->fq_zech,
1132 op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1133 }
1134 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1135 {
1136 fq_nmod_poly_sub(rop->fq_nmod,
1137 op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1138 }
1139 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1140 {
1141 nmod_poly_sub(rop->nmod, op1->nmod, op2->nmod);
1142 }
1143 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1144 {
1145 fmpz_mod_poly_sub(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod,
1146 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1147 }
1148 else
1149 {
1150 fq_poly_sub(rop->fq, op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
1151 }
1152 }
1153
1154 FQ_DEFAULT_POLY_INLINE void fq_default_poly_sub_series(fq_default_poly_t rop,
1155 const fq_default_poly_t op1, const fq_default_poly_t op2,
1156 slong n, const fq_default_ctx_t ctx)
1157 {
1158 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1159 {
1160 fq_zech_poly_sub_series(rop->fq_zech,
1161 op1->fq_zech, op2->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1162 }
1163 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1164 {
1165 fq_nmod_poly_sub_series(rop->fq_nmod,
1166 op1->fq_nmod, op2->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1167 }
1168 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1169 {
1170 nmod_poly_sub_series(rop->nmod, op1->nmod, op2->nmod, n);
1171 }
1172 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1173 {
1174 fmpz_mod_poly_sub_series(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod, n,
1175 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1176 }
1177 else
1178 {
1179 fq_poly_sub_series(rop->fq, op1->fq, op2->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1180 }
1181 }
1182
1183 FQ_DEFAULT_POLY_INLINE void fq_default_poly_neg(fq_default_poly_t rop,
1184 const fq_default_poly_t op, const fq_default_ctx_t ctx)
1185 {
1186 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1187 {
1188 fq_zech_poly_neg(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1189 }
1190 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1191 {
1192 fq_nmod_poly_neg(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1193 }
1194 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1195 {
1196 nmod_poly_neg(rop->nmod, op->nmod);
1197 }
1198 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1199 {
1200 fmpz_mod_poly_neg(rop->fmpz_mod, op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1201 }
1202 else
1203 {
1204 fq_poly_neg(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
1205 }
1206 }
1207
1208
1209
1210 FQ_DEFAULT_POLY_INLINE
1211 void fq_default_poly_scalar_mul_fq_default(fq_default_poly_t rop,
1212 const fq_default_poly_t op, const fq_default_t x,
1213 const fq_default_ctx_t ctx)
1214 {
1215 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1216 {
1217 fq_zech_poly_scalar_mul_fq_zech(rop->fq_zech,
1218 op->fq_zech, x->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1219 }
1220 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1221 {
1222 fq_nmod_poly_scalar_mul_fq_nmod(rop->fq_nmod,
1223 op->fq_nmod, x->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1224 }
1225 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1226 {
1227 nmod_poly_scalar_mul_nmod(rop->nmod, op->nmod, x->nmod);
1228 }
1229 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1230 {
1231 fmpz_mod_poly_scalar_mul_fmpz(rop->fmpz_mod, op->fmpz_mod, x->fmpz_mod,
1232 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1233 }
1234 else
1235 {
1236 fq_poly_scalar_mul_fq(rop->fq, op->fq, x->fq, FQ_DEFAULT_CTX_FQ(ctx));
1237 }
1238 }
1239
1240 FQ_DEFAULT_POLY_INLINE
1241 void fq_default_poly_scalar_div_fq_default(fq_default_poly_t rop,
1242 const fq_default_poly_t op, const fq_default_t x,
1243 const fq_default_ctx_t ctx)
1244 {
1245 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1246 {
1247 fq_zech_poly_scalar_div_fq_zech(rop->fq_zech,
1248 op->fq_zech, x->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1249 }
1250 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1251 {
1252 fq_nmod_poly_scalar_div_fq_nmod(rop->fq_nmod,
1253 op->fq_nmod, x->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1254 }
1255 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1256 {
1257 nmod_poly_scalar_mul_nmod(rop->nmod, op->nmod,
1258 nmod_inv(x->nmod, FQ_DEFAULT_CTX_NMOD(ctx)));
1259 }
1260 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1261 {
1262 fmpz_t t;
1263 fmpz_init(t);
1264 fmpz_mod_inv(t, x->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1265 fmpz_mod_poly_scalar_mul_fmpz(rop->fmpz_mod, op->fmpz_mod, t,
1266 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1267 fmpz_clear(t);
1268 }
1269 else
1270 {
1271 fq_poly_scalar_div_fq(rop->fq, op->fq, x->fq, FQ_DEFAULT_CTX_FQ(ctx));
1272 }
1273 }
1274
1275 FQ_DEFAULT_POLY_INLINE
1276 void fq_default_poly_scalar_addmul_fq_default(fq_default_poly_t rop,
1277 const fq_default_poly_t op, const fq_default_t x,
1278 const fq_default_ctx_t ctx)
1279 {
1280 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1281 {
1282 fq_zech_poly_scalar_addmul_fq_zech(rop->fq_zech,
1283 op->fq_zech, x->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1284 }
1285 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1286 {
1287 fq_nmod_poly_scalar_addmul_fq_nmod(rop->fq_nmod,
1288 op->fq_nmod, x->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1289 }
1290 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1291 {
1292 nmod_poly_scalar_addmul_nmod(rop->nmod, op->nmod, x->nmod);
1293 }
1294 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1295 {
1296 fmpz_mod_poly_scalar_addmul_fmpz(rop->fmpz_mod, op->fmpz_mod,
1297 x->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1298 }
1299 else
1300 {
1301 fq_poly_scalar_addmul_fq(rop->fq, op->fq, x->fq, FQ_DEFAULT_CTX_FQ(ctx));
1302 }
1303 }
1304
1305 FQ_DEFAULT_POLY_INLINE
1306 void fq_default_poly_scalar_submul_fq_default(fq_default_poly_t rop,
1307 const fq_default_poly_t op, const fq_default_t x,
1308 const fq_default_ctx_t ctx)
1309 {
1310 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1311 {
1312 fq_zech_poly_scalar_submul_fq_zech(rop->fq_zech,
1313 op->fq_zech, x->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1314 }
1315 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1316 {
1317 fq_nmod_poly_scalar_submul_fq_nmod(rop->fq_nmod,
1318 op->fq_nmod, x->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1319 }
1320 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1321 {
1322 nmod_poly_scalar_addmul_nmod(rop->nmod, op->nmod,
1323 nmod_neg(x->nmod, FQ_DEFAULT_CTX_NMOD(ctx)));
1324 }
1325 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1326 {
1327 fmpz_t t;
1328 fmpz_init(t);
1329 fmpz_mod_neg(t, x->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1330 fmpz_mod_poly_scalar_addmul_fmpz(rop->fmpz_mod, op->fmpz_mod, t,
1331 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1332 fmpz_clear(t);
1333 }
1334 else
1335 {
1336 fq_poly_scalar_submul_fq(rop->fq, op->fq, x->fq, FQ_DEFAULT_CTX_FQ(ctx));
1337 }
1338 }
1339
1340
1341
1342 FQ_DEFAULT_POLY_INLINE void fq_default_poly_mul(fq_default_poly_t rop,
1343 const fq_default_poly_t op1, const fq_default_poly_t op2,
1344 const fq_default_ctx_t ctx)
1345 {
1346 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1347 {
1348 fq_zech_poly_mul(rop->fq_zech,
1349 op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1350 }
1351 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1352 {
1353 fq_nmod_poly_mul(rop->fq_nmod,
1354 op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1355 }
1356 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1357 {
1358 nmod_poly_mul(rop->nmod, op1->nmod, op2->nmod);
1359 }
1360 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1361 {
1362 fmpz_mod_poly_mul(rop->fmpz_mod, op1->fmpz_mod,
1363 op2->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1364 }
1365 else
1366 {
1367 fq_poly_mul(rop->fq, op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
1368 }
1369 }
1370
1371 FQ_DEFAULT_POLY_INLINE void fq_default_poly_mullow(fq_default_poly_t rop,
1372 const fq_default_poly_t op1, const fq_default_poly_t op2,
1373 slong n, const fq_default_ctx_t ctx)
1374 {
1375 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1376 {
1377 fq_zech_poly_mullow(rop->fq_zech,
1378 op1->fq_zech, op2->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1379 }
1380 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1381 {
1382 fq_nmod_poly_mullow(rop->fq_nmod,
1383 op1->fq_nmod, op2->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1384 }
1385 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1386 {
1387 nmod_poly_mullow(rop->nmod, op1->nmod, op2->nmod, n);
1388 }
1389 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1390 {
1391 fmpz_mod_poly_mullow(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod, n,
1392 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1393 }
1394 else
1395 {
1396 fq_poly_mullow(rop->fq, op1->fq, op2->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1397 }
1398 }
1399
1400 FQ_DEFAULT_POLY_INLINE void fq_default_poly_mulhigh(fq_default_poly_t rop,
1401 const fq_default_poly_t op1, const fq_default_poly_t op2,
1402 slong start, const fq_default_ctx_t ctx)
1403 {
1404 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1405 {
1406 fq_zech_poly_mulhigh(rop->fq_zech,
1407 op1->fq_zech, op2->fq_zech, start, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1408 }
1409 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1410 {
1411 fq_nmod_poly_mulhigh(rop->fq_nmod,
1412 op1->fq_nmod, op2->fq_nmod, start, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1413 }
1414 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1415 {
1416 nmod_poly_mulhigh(rop->nmod, op1->nmod, op2->nmod, start);
1417 }
1418 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1419 {
1420 fmpz_mod_poly_mulhigh(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod,
1421 start, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1422 }
1423 else
1424 {
1425 fq_poly_mulhigh(rop->fq, op1->fq, op2->fq, start, FQ_DEFAULT_CTX_FQ(ctx));
1426 }
1427 }
1428
1429 FQ_DEFAULT_POLY_INLINE void fq_default_poly_mulmod(fq_default_poly_t res,
1430 const fq_default_poly_t poly1, const fq_default_poly_t poly2,
1431 const fq_default_poly_t f, const fq_default_ctx_t ctx)
1432 {
1433 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1434 {
1435 fq_zech_poly_mulmod(res->fq_zech, poly1->fq_zech, poly2->fq_zech,
1436 f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1437 }
1438 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1439 {
1440 fq_nmod_poly_mulmod(res->fq_nmod, poly1->fq_nmod, poly2->fq_nmod,
1441 f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1442 }
1443 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1444 {
1445 nmod_poly_mulmod(res->nmod, poly1->nmod, poly2->nmod, f->nmod);
1446 }
1447 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1448 {
1449 fmpz_mod_poly_mulmod(res->fmpz_mod, poly1->fmpz_mod, poly2->fmpz_mod,
1450 f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1451 }
1452 else
1453 {
1454 fq_poly_mulmod(res->fq, poly1->fq, poly2->fq, f->fq, FQ_DEFAULT_CTX_FQ(ctx));
1455 }
1456 }
1457
1458
1459
1460 FQ_DEFAULT_POLY_INLINE void fq_default_poly_sqr(fq_default_poly_t rop,
1461 const fq_default_poly_t op, const fq_default_ctx_t ctx)
1462 {
1463 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1464 {
1465 fq_zech_poly_sqr(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1466 }
1467 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1468 {
1469 fq_nmod_poly_sqr(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1470 }
1471 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1472 {
1473 nmod_poly_mul(rop->nmod, op->nmod, op->nmod);
1474 }
1475 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1476 {
1477 fmpz_mod_poly_sqr(rop->fmpz_mod, op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1478 }
1479 else
1480 {
1481 fq_poly_sqr(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
1482 }
1483 }
1484
1485
1486
1487 FQ_DEFAULT_POLY_INLINE void fq_default_poly_pow(fq_default_poly_t rop,
1488 const fq_default_poly_t op, ulong e,
1489 const fq_default_ctx_t ctx)
1490 {
1491 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1492 {
1493 fq_zech_poly_pow(rop->fq_zech, op->fq_zech, e, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1494 }
1495 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1496 {
1497 fq_nmod_poly_pow(rop->fq_nmod, op->fq_nmod, e, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1498 }
1499 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1500 {
1501 nmod_poly_pow(rop->nmod, op->nmod, e);
1502 }
1503 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1504 {
1505 fmpz_mod_poly_pow(rop->fmpz_mod, op->fmpz_mod, e, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1506 }
1507 else
1508 {
1509 fq_poly_pow(rop->fq, op->fq, e, FQ_DEFAULT_CTX_FQ(ctx));
1510 }
1511 }
1512
1513 FQ_DEFAULT_POLY_INLINE
1514 void fq_default_poly_pow_trunc(fq_default_poly_t res,
1515 const fq_default_poly_t poly, ulong e,
1516 slong trunc, const fq_default_ctx_t ctx)
1517 {
1518 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1519 {
1520 fq_zech_poly_pow_trunc(res->fq_zech,
1521 poly->fq_zech, e, trunc, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1522 }
1523 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1524 {
1525 fq_nmod_poly_pow_trunc(res->fq_nmod,
1526 poly->fq_nmod, e, trunc, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1527 }
1528 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1529 {
1530 nmod_poly_pow_trunc(res->nmod, poly->nmod, e, trunc);
1531 }
1532 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1533 {
1534 fmpz_mod_poly_pow_trunc(res->fmpz_mod, poly->fmpz_mod, e, trunc,
1535 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1536 }
1537 else
1538 {
1539 fq_poly_pow_trunc(res->fq, poly->fq, e, trunc, FQ_DEFAULT_CTX_FQ(ctx));
1540 }
1541 }
1542
1543 FQ_DEFAULT_POLY_INLINE
1544 void fq_default_poly_powmod_fmpz_binexp(fq_default_poly_t res,
1545 const fq_default_poly_t poly, const fmpz_t e,
1546 const fq_default_poly_t f, const fq_default_ctx_t ctx)
1547 {
1548 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1549 {
1550 fq_zech_poly_powmod_fmpz_binexp(res->fq_zech,
1551 poly->fq_zech, e, f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1552 }
1553 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1554 {
1555 fq_nmod_poly_powmod_fmpz_binexp(res->fq_nmod,
1556 poly->fq_nmod, e, f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1557 }
1558 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1559 {
1560 nmod_poly_powmod_fmpz_binexp(res->nmod, poly->nmod, (fmpz*) e, f->nmod);
1561 }
1562 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1563 {
1564 fmpz_mod_poly_powmod_fmpz_binexp(res->fmpz_mod, poly->fmpz_mod, e,
1565 f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1566 }
1567 else
1568 {
1569 fq_poly_powmod_fmpz_binexp(res->fq, poly->fq, e, f->fq, FQ_DEFAULT_CTX_FQ(ctx));
1570 }
1571 }
1572
1573 FQ_DEFAULT_POLY_INLINE
1574 void fq_default_poly_powmod_ui_binexp(fq_default_poly_t res,
1575 const fq_default_poly_t poly, ulong e,
1576 const fq_default_poly_t f, const fq_default_ctx_t ctx)
1577 {
1578 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1579 {
1580 fq_zech_poly_powmod_ui_binexp(res->fq_zech,
1581 poly->fq_zech, e, f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1582 }
1583 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1584 {
1585 fq_nmod_poly_powmod_ui_binexp(res->fq_nmod,
1586 poly->fq_nmod, e, f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1587 }
1588 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1589 {
1590 nmod_poly_powmod_ui_binexp(res->nmod, poly->nmod, e, f->nmod);
1591 }
1592 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1593 {
1594 fmpz_mod_poly_powmod_ui_binexp(res->fmpz_mod, poly->fmpz_mod, e,
1595 f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1596 }
1597 else
1598 {
1599 fq_poly_powmod_ui_binexp(res->fq, poly->fq, e, f->fq, FQ_DEFAULT_CTX_FQ(ctx));
1600 }
1601 }
1602
1603
1604
1605 FQ_DEFAULT_POLY_INLINE
1606 void fq_default_poly_shift_left(fq_default_poly_t rop,
1607 const fq_default_poly_t op, slong n, const fq_default_ctx_t ctx)
1608 {
1609 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1610 {
1611 fq_zech_poly_shift_left(rop->fq_zech, op->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1612 }
1613 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1614 {
1615 fq_nmod_poly_shift_left(rop->fq_nmod, op->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1616 }
1617 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1618 {
1619 nmod_poly_shift_left(rop->nmod, op->nmod, n);
1620 }
1621 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1622 {
1623 fmpz_mod_poly_shift_left(rop->fmpz_mod, op->fmpz_mod, n,
1624 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1625 }
1626 else
1627 {
1628 fq_poly_shift_left(rop->fq, op->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1629 }
1630 }
1631
1632 FQ_DEFAULT_POLY_INLINE
1633 void fq_default_poly_shift_right(fq_default_poly_t rop,
1634 const fq_default_poly_t op, slong n, const fq_default_ctx_t ctx)
1635 {
1636 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1637 {
1638 fq_zech_poly_shift_right(rop->fq_zech, op->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1639 }
1640 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1641 {
1642 fq_nmod_poly_shift_right(rop->fq_nmod, op->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1643 }
1644 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1645 {
1646 nmod_poly_shift_right(rop->nmod, op->nmod, n);
1647 }
1648 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1649 {
1650 fmpz_mod_poly_shift_right(rop->fmpz_mod, op->fmpz_mod, n,
1651 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1652 }
1653 else
1654 {
1655 fq_poly_shift_right(rop->fq, op->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1656 }
1657 }
1658
1659
1660
1661 FQ_DEFAULT_POLY_INLINE
1662 slong fq_default_poly_hamming_weight(const fq_default_poly_t op,
1663 const fq_default_ctx_t ctx)
1664 {
1665 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1666 {
1667 return fq_zech_poly_hamming_weight(op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1668 }
1669 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1670 {
1671 return fq_nmod_poly_hamming_weight(op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1672 }
1673 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1674 {
1675 return nmod_poly_hamming_weight(op->nmod);
1676 }
1677 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1678 {
1679 return fmpz_mod_poly_hamming_weight(op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1680 }
1681 else
1682 {
1683 return fq_poly_hamming_weight(op->fq, FQ_DEFAULT_CTX_FQ(ctx));
1684 }
1685 }
1686
1687
1688
1689 FQ_DEFAULT_POLY_INLINE void fq_default_poly_gcd(fq_default_poly_t rop,
1690 const fq_default_poly_t op1, const fq_default_poly_t op2,
1691 const fq_default_ctx_t ctx)
1692 {
1693 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1694 {
1695 fq_zech_poly_gcd(rop->fq_zech,
1696 op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1697 }
1698 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1699 {
1700 fq_nmod_poly_gcd(rop->fq_nmod,
1701 op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1702 }
1703 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1704 {
1705 nmod_poly_gcd(rop->nmod, op1->nmod, op2->nmod);
1706 }
1707 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1708 {
1709 fmpz_mod_poly_gcd(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod,
1710 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1711 }
1712 else
1713 {
1714 fq_poly_gcd(rop->fq, op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
1715 }
1716 }
1717
1718 FQ_DEFAULT_POLY_INLINE void
1719 fq_default_poly_xgcd(fq_default_poly_t G,
1720 fq_default_poly_t S, fq_default_poly_t T,
1721 const fq_default_poly_t A, const fq_default_poly_t B,
1722 const fq_default_ctx_t ctx)
1723 {
1724 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1725 {
1726 fq_zech_poly_xgcd(G->fq_zech,
1727 S->fq_zech, T->fq_zech, A->fq_zech, B->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1728 }
1729 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1730 {
1731 fq_nmod_poly_xgcd(G->fq_nmod,
1732 S->fq_nmod, T->fq_nmod, A->fq_nmod, B->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1733 }
1734 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1735 {
1736 nmod_poly_xgcd(G->nmod, S->nmod, T->nmod, A->nmod, B->nmod);
1737 }
1738 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1739 {
1740 fmpz_mod_poly_xgcd(G->fmpz_mod, S->fmpz_mod, T->fmpz_mod, A->fmpz_mod,
1741 B->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1742 }
1743 else
1744 {
1745 fq_poly_xgcd(G->fq, S->fq, T->fq, A->fq, B->fq, FQ_DEFAULT_CTX_FQ(ctx));
1746 }
1747 }
1748
1749
1750
1751 FQ_DEFAULT_POLY_INLINE ulong fq_default_poly_remove(fq_default_poly_t f,
1752 const fq_default_poly_t g, const fq_default_ctx_t ctx)
1753 {
1754 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1755 {
1756 return fq_zech_poly_remove(f->fq_zech, g->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1757 }
1758 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1759 {
1760 return fq_nmod_poly_remove(f->fq_nmod, g->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1761 }
1762 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1763 {
1764 return nmod_poly_remove(f->nmod, g->nmod);
1765 }
1766 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1767 {
1768 return fmpz_mod_poly_remove(f->fmpz_mod, g->fmpz_mod,
1769 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1770 }
1771 else
1772 {
1773 return fq_poly_remove(f->fq, g->fq, FQ_DEFAULT_CTX_FQ(ctx));
1774 }
1775 }
1776
1777 FQ_DEFAULT_POLY_INLINE void
1778 fq_default_poly_divrem(fq_default_poly_t Q, fq_default_poly_t R,
1779 const fq_default_poly_t A, const fq_default_poly_t B,
1780 const fq_default_ctx_t ctx)
1781 {
1782 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1783 {
1784 fq_zech_poly_divrem(Q->fq_zech,
1785 R->fq_zech, A->fq_zech, B->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1786 }
1787 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1788 {
1789 fq_nmod_poly_divrem(Q->fq_nmod,
1790 R->fq_nmod, A->fq_nmod, B->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1791 }
1792 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1793 {
1794 nmod_poly_divrem(Q->nmod, R->nmod, A->nmod, B->nmod);
1795 }
1796 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1797 {
1798 fmpz_mod_poly_divrem(Q->fmpz_mod, R->fmpz_mod, A->fmpz_mod,
1799 B->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1800 }
1801 else
1802 {
1803 fq_poly_divrem(Q->fq, R->fq, A->fq, B->fq, FQ_DEFAULT_CTX_FQ(ctx));
1804 }
1805 }
1806
1807 FQ_DEFAULT_POLY_INLINE void
1808 fq_default_poly_rem(fq_default_poly_t R,
1809 const fq_default_poly_t A, const fq_default_poly_t B,
1810 const fq_default_ctx_t ctx)
1811 {
1812 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1813 {
1814 fq_zech_poly_rem(R->fq_zech, A->fq_zech, B->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1815 }
1816 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1817 {
1818 fq_nmod_poly_rem(R->fq_nmod, A->fq_nmod, B->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1819 }
1820 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1821 {
1822 nmod_poly_rem(R->nmod, A->nmod, B->nmod);
1823 }
1824 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1825 {
1826 fmpz_mod_poly_rem(R->fmpz_mod, A->fmpz_mod, B->fmpz_mod,
1827 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1828 }
1829 else
1830 {
1831 fq_poly_rem(R->fq, A->fq, B->fq, FQ_DEFAULT_CTX_FQ(ctx));
1832 }
1833 }
1834
1835 FQ_DEFAULT_POLY_INLINE void
1836 fq_default_poly_inv_series(fq_default_poly_t Qinv,
1837 const fq_default_poly_t Q, slong n,
1838 const fq_default_ctx_t ctx)
1839 {
1840 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1841 {
1842 fq_zech_poly_inv_series(Qinv->fq_zech, Q->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1843 }
1844 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1845 {
1846 fq_nmod_poly_inv_series(Qinv->fq_nmod, Q->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1847 }
1848 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1849 {
1850 nmod_poly_inv_series(Qinv->nmod, Q->nmod, n);
1851 }
1852 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1853 {
1854 fmpz_mod_poly_inv_series(Qinv->fmpz_mod, Q->fmpz_mod, n,
1855 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1856 }
1857 else
1858 {
1859 fq_poly_inv_series(Qinv->fq, Q->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1860 }
1861 }
1862
1863 FQ_DEFAULT_POLY_INLINE void fq_default_poly_div_series(fq_default_poly_t Q,
1864 const fq_default_poly_t A, const fq_default_poly_t B,
1865 slong n, const fq_default_ctx_t ctx)
1866 {
1867 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1868 {
1869 fq_zech_poly_div_series(Q->fq_zech,
1870 A->fq_zech, B->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1871 }
1872 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1873 {
1874 fq_nmod_poly_div_series(Q->fq_nmod,
1875 A->fq_nmod, B->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1876 }
1877 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1878 {
1879 nmod_poly_div_series(Q->nmod, A->nmod, B->nmod, n);
1880 }
1881 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1882 {
1883 fmpz_mod_poly_div_series(Q->fmpz_mod, A->fmpz_mod, B->fmpz_mod, n,
1884 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1885 }
1886 else
1887 {
1888 fq_poly_div_series(Q->fq, A->fq, B->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1889 }
1890 }
1891
1892
1893
1894 FQ_DEFAULT_POLY_INLINE int fq_default_poly_divides(fq_default_poly_t Q,
1895 const fq_default_poly_t A, const fq_default_poly_t B,
1896 const fq_default_ctx_t ctx)
1897 {
1898 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1899 {
1900 return fq_zech_poly_divides(Q->fq_zech,
1901 A->fq_zech, B->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1902 }
1903 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1904 {
1905 return fq_nmod_poly_divides(Q->fq_nmod,
1906 A->fq_nmod, B->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1907 }
1908 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1909 {
1910 return nmod_poly_divides(Q->nmod, A->nmod, B->nmod);
1911 }
1912 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1913 {
1914 return fmpz_mod_poly_divides(Q->fmpz_mod, A->fmpz_mod, B->fmpz_mod,
1915 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1916 }
1917 else
1918 {
1919 return fq_poly_divides(Q->fq, A->fq, B->fq, FQ_DEFAULT_CTX_FQ(ctx));
1920 }
1921 }
1922
1923
1924
1925 FQ_DEFAULT_POLY_INLINE
1926 void fq_default_poly_derivative(fq_default_poly_t rop,
1927 const fq_default_poly_t op, const fq_default_ctx_t ctx)
1928 {
1929 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1930 {
1931 fq_zech_poly_derivative(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1932 }
1933 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1934 {
1935 fq_nmod_poly_derivative(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1936 }
1937 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1938 {
1939 nmod_poly_derivative(rop->nmod, op->nmod);
1940 }
1941 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1942 {
1943 fmpz_mod_poly_derivative(rop->fmpz_mod, op->fmpz_mod,
1944 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1945 }
1946 else
1947 {
1948 fq_poly_derivative(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
1949 }
1950 }
1951
1952
1953
1954 FQ_DEFAULT_POLY_INLINE
1955 void fq_default_poly_invsqrt_series(fq_default_poly_t rop,
1956 const fq_default_poly_t op, slong n, fq_default_ctx_t ctx)
1957 {
1958 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1959 {
1960 fq_zech_poly_invsqrt_series(rop->fq_zech, op->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1961 }
1962 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1963 {
1964 fq_nmod_poly_invsqrt_series(rop->fq_nmod, op->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1965 }
1966 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1967 {
1968 nmod_poly_invsqrt_series(rop->nmod, op->nmod, n);
1969 }
1970 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1971 {
1972 fmpz_mod_poly_invsqrt_series(rop->fmpz_mod, op->fmpz_mod, n, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1973 }
1974 else
1975 {
1976 fq_poly_invsqrt_series(rop->fq, op->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
1977 }
1978 }
1979
1980 FQ_DEFAULT_POLY_INLINE
1981 void fq_default_poly_sqrt_series(fq_default_poly_t rop,
1982 const fq_default_poly_t op, slong n, fq_default_ctx_t ctx)
1983 {
1984 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
1985 {
1986 fq_zech_poly_sqrt_series(rop->fq_zech, op->fq_zech, n, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
1987 }
1988 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
1989 {
1990 fq_nmod_poly_sqrt_series(rop->fq_nmod, op->fq_nmod, n, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
1991 }
1992 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
1993 {
1994 nmod_poly_sqrt_series(rop->nmod, op->nmod, n);
1995 }
1996 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
1997 {
1998 fmpz_mod_poly_sqrt_series(rop->fmpz_mod, op->fmpz_mod, n, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
1999 }
2000 else
2001 {
2002 fq_poly_sqrt_series(rop->fq, op->fq, n, FQ_DEFAULT_CTX_FQ(ctx));
2003 }
2004 }
2005
2006 FQ_DEFAULT_POLY_INLINE
2007 int fq_default_poly_sqrt(fq_default_poly_t rop,
2008 const fq_default_poly_t op, fq_default_ctx_t ctx)
2009 {
2010 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2011 {
2012 return fq_zech_poly_sqrt(rop->fq_zech, op->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2013 }
2014 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2015 {
2016 return fq_nmod_poly_sqrt(rop->fq_nmod, op->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2017 }
2018 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2019 {
2020 return nmod_poly_sqrt(rop->nmod, op->nmod);
2021 }
2022 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2023 {
2024 return fmpz_mod_poly_sqrt(rop->fmpz_mod, op->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2025 }
2026 else
2027 {
2028 return fq_poly_sqrt(rop->fq, op->fq, FQ_DEFAULT_CTX_FQ(ctx));
2029 }
2030 }
2031
2032
2033
2034 FQ_DEFAULT_POLY_INLINE
2035 void fq_default_poly_evaluate_fq_default(fq_default_t res,
2036 const fq_default_poly_t f, const fq_default_t a,
2037 const fq_default_ctx_t ctx)
2038 {
2039 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2040 {
2041 fq_zech_poly_evaluate_fq_zech(res->fq_zech,
2042 f->fq_zech, a->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2043 }
2044 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2045 {
2046 fq_nmod_poly_evaluate_fq_nmod(res->fq_nmod,
2047 f->fq_nmod, a->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2048 }
2049 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2050 {
2051 res->nmod = nmod_poly_evaluate_nmod(f->nmod, a->nmod);
2052 }
2053 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2054 {
2055 fmpz_mod_poly_evaluate_fmpz(res->fmpz_mod, f->fmpz_mod, a->fmpz_mod,
2056 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2057 }
2058 else
2059 {
2060 fq_poly_evaluate_fq(res->fq, f->fq, a->fq, FQ_DEFAULT_CTX_FQ(ctx));
2061 }
2062 }
2063
2064
2065
2066 FQ_DEFAULT_POLY_INLINE
2067 void fq_default_poly_compose(fq_default_poly_t rop,
2068 const fq_default_poly_t op1, const fq_default_poly_t op2,
2069 const fq_default_ctx_t ctx)
2070 {
2071 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2072 {
2073 fq_zech_poly_compose(rop->fq_zech,
2074 op1->fq_zech, op2->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2075 }
2076 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2077 {
2078 fq_nmod_poly_compose(rop->fq_nmod,
2079 op1->fq_nmod, op2->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2080 }
2081 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2082 {
2083 nmod_poly_compose(rop->nmod, op1->nmod, op2->nmod);
2084 }
2085 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2086 {
2087 fmpz_mod_poly_compose(rop->fmpz_mod, op1->fmpz_mod, op2->fmpz_mod,
2088 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2089 }
2090 else
2091 {
2092 fq_poly_compose(rop->fq, op1->fq, op2->fq, FQ_DEFAULT_CTX_FQ(ctx));
2093 }
2094 }
2095
2096 FQ_DEFAULT_POLY_INLINE
2097 void fq_default_poly_compose_mod(fq_default_poly_t res,
2098 const fq_default_poly_t poly1, const fq_default_poly_t poly2,
2099 const fq_default_poly_t poly3, const fq_default_ctx_t ctx)
2100 {
2101 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2102 {
2103 fq_zech_poly_compose_mod(res->fq_zech,
2104 poly1->fq_zech, poly2->fq_zech, poly3->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2105 }
2106 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2107 {
2108 fq_nmod_poly_compose_mod(res->fq_nmod,
2109 poly1->fq_nmod, poly2->fq_nmod, poly3->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2110 }
2111 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2112 {
2113 nmod_poly_compose_mod(res->nmod, poly1->nmod, poly2->nmod, poly3->nmod);
2114 }
2115 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2116 {
2117 fmpz_mod_poly_compose_mod(res->fmpz_mod, poly1->fmpz_mod,
2118 poly2->fmpz_mod, poly3->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2119 }
2120 else
2121 {
2122 fq_poly_compose_mod(res->fq,
2123 poly1->fq, poly2->fq, poly3->fq, FQ_DEFAULT_CTX_FQ(ctx));
2124 }
2125 }
2126
2127
2128
2129 #ifdef FLINT_HAVE_FILE
2130 int fq_default_poly_fprint(FILE * file, const fq_default_poly_t poly, const fq_default_ctx_t ctx);
2131 int fq_default_poly_fprint_pretty(FILE * file, const fq_default_poly_t poly, const char *x, const fq_default_ctx_t ctx);
2132 #endif
2133
2134 int fq_default_poly_print(const fq_default_poly_t poly, const fq_default_ctx_t ctx);
2135 int fq_default_poly_print_pretty(const fq_default_poly_t poly, const char *x, const fq_default_ctx_t ctx);
2136
2137 FQ_DEFAULT_POLY_INLINE
2138 char * fq_default_poly_get_str_pretty(const fq_default_poly_t poly,
2139 const char *x, const fq_default_ctx_t ctx)
2140 {
2141 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2142 {
2143 return fq_zech_poly_get_str_pretty(poly->fq_zech, x, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2144 }
2145 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2146 {
2147 return fq_nmod_poly_get_str_pretty(poly->fq_nmod, x, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2148 }
2149 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2150 {
2151 return nmod_poly_get_str_pretty(poly->nmod, x);
2152 }
2153 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2154 {
2155 return fmpz_mod_poly_get_str_pretty(poly->fmpz_mod, x,
2156 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2157 }
2158 else
2159 {
2160 return fq_poly_get_str_pretty(poly->fq, x, FQ_DEFAULT_CTX_FQ(ctx));
2161 }
2162 }
2163
2164 FQ_DEFAULT_POLY_INLINE
2165 char * fq_default_poly_get_str(const fq_default_poly_t poly,
2166 const fq_default_ctx_t ctx)
2167 {
2168 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2169 {
2170 return fq_zech_poly_get_str(poly->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2171 }
2172 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2173 {
2174 return fq_nmod_poly_get_str(poly->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2175 }
2176 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2177 {
2178 return nmod_poly_get_str(poly->nmod);
2179 }
2180 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2181 {
2182 return fmpz_mod_poly_get_str(poly->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2183 }
2184 else
2185 {
2186 return fq_poly_get_str(poly->fq, FQ_DEFAULT_CTX_FQ(ctx));
2187 }
2188 }
2189
2190 #include "fq_default_mat.h"
2191
2192
2193
2194 FQ_DEFAULT_POLY_INLINE
2195 void fq_default_mat_charpoly(fq_default_poly_t p,
2196 const fq_default_mat_t M, const fq_default_ctx_t ctx)
2197 {
2198 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2199 {
2200 fq_zech_mat_charpoly(p->fq_zech, M->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2201 }
2202 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2203 {
2204 fq_nmod_mat_charpoly(p->fq_nmod, M->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2205 }
2206 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2207 {
2208 nmod_mat_charpoly(p->nmod, M->nmod);
2209 }
2210 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2211 {
2212 fmpz_mod_mat_charpoly(p->fmpz_mod, M->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2213 }
2214 else
2215 {
2216 fq_mat_charpoly(p->fq, M->fq, FQ_DEFAULT_CTX_FQ(ctx));
2217 }
2218 }
2219
2220
2221
2222 FQ_DEFAULT_POLY_INLINE
2223 void fq_default_mat_minpoly(fq_default_poly_t p,
2224 const fq_default_mat_t X, const fq_default_ctx_t ctx)
2225 {
2226 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
2227 {
2228 fq_zech_mat_minpoly(p->fq_zech, X->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
2229 }
2230 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
2231 {
2232 fq_nmod_mat_minpoly(p->fq_nmod, X->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
2233 }
2234 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
2235 {
2236 nmod_mat_minpoly(p->nmod, X->nmod);
2237 }
2238 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
2239 {
2240 fmpz_mod_mat_minpoly(p->fmpz_mod, X->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
2241 }
2242 else
2243 {
2244 fq_mat_minpoly(p->fq, X->fq, FQ_DEFAULT_CTX_FQ(ctx));
2245 }
2246 }
2247
2248 #ifdef __cplusplus
2249 }
2250 #endif
2251
2252 #endif