File indexing completed on 2026-11-07 10:15:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FQ_DEFAULT_POLY_FACTOR_H
0014 #define FQ_DEFAULT_POLY_FACTOR_H
0015
0016 #ifdef FQ_DEFAULT_POLY_FACTOR_INLINES_C
0017 #define FQ_DEFAULT_POLY_FACTOR_INLINE
0018 #else
0019 #define FQ_DEFAULT_POLY_FACTOR_INLINE static inline
0020 #endif
0021
0022 #include "nmod_poly_factor.h"
0023 #include "fmpz_mod_poly_factor.h"
0024 #include "fq_poly_factor.h"
0025 #include "fq_nmod_poly_factor.h"
0026 #include "fq_zech_poly_factor.h"
0027 #include "fq_default_poly.h"
0028
0029 #ifdef __cplusplus
0030 extern "C" {
0031 #endif
0032
0033
0034
0035 typedef union fq_default_poly_factor_struct
0036 {
0037 fq_poly_factor_t fq;
0038 fq_nmod_poly_factor_t fq_nmod;
0039 fq_zech_poly_factor_t fq_zech;
0040 nmod_poly_factor_t nmod;
0041 fmpz_mod_poly_factor_t fmpz_mod;
0042 } fq_default_poly_factor_struct;
0043
0044 typedef fq_default_poly_factor_struct fq_default_poly_factor_t[1];
0045
0046
0047 FQ_DEFAULT_POLY_FACTOR_INLINE
0048 void fq_default_poly_factor_init(fq_default_poly_factor_t fac,
0049 const fq_default_ctx_t ctx)
0050 {
0051 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0052 {
0053 fq_zech_poly_factor_init(fac->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_factor_init(fac->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0058 }
0059 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0060 {
0061 nmod_poly_factor_init(fac->nmod);
0062 }
0063 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0064 {
0065 fmpz_mod_poly_factor_init(fac->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0066 }
0067 else
0068 {
0069 fq_poly_factor_init(fac->fq, FQ_DEFAULT_CTX_FQ(ctx));
0070 }
0071 }
0072
0073 FQ_DEFAULT_POLY_FACTOR_INLINE
0074 void fq_default_poly_factor_clear(fq_default_poly_factor_t fac,
0075 const fq_default_ctx_t ctx)
0076 {
0077 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0078 {
0079 fq_zech_poly_factor_clear(fac->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0080 }
0081 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0082 {
0083 fq_nmod_poly_factor_clear(fac->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0084 }
0085 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0086 {
0087 nmod_poly_factor_clear(fac->nmod);
0088 }
0089 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0090 {
0091 fmpz_mod_poly_factor_clear(fac->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0092 }
0093 else
0094 {
0095 fq_poly_factor_clear(fac->fq, FQ_DEFAULT_CTX_FQ(ctx));
0096 }
0097 }
0098
0099 FQ_DEFAULT_POLY_FACTOR_INLINE
0100 void fq_default_poly_factor_realloc(fq_default_poly_factor_t fac,
0101 slong alloc, const fq_default_ctx_t ctx)
0102 {
0103 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0104 {
0105 fq_zech_poly_factor_realloc(fac->fq_zech, alloc, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0106 }
0107 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0108 {
0109 fq_nmod_poly_factor_realloc(fac->fq_nmod, alloc, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0110 }
0111 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0112 {
0113 nmod_poly_factor_realloc(fac->nmod, alloc);
0114 }
0115 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0116 {
0117 fmpz_mod_poly_factor_realloc(fac->fmpz_mod, alloc, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0118 }
0119 else
0120 {
0121 fq_poly_factor_realloc(fac->fq, alloc, FQ_DEFAULT_CTX_FQ(ctx));
0122 }
0123 }
0124
0125 FQ_DEFAULT_POLY_FACTOR_INLINE
0126 void fq_default_poly_factor_fit_length(fq_default_poly_factor_t fac,
0127 slong len, const fq_default_ctx_t ctx)
0128 {
0129 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0130 {
0131 fq_zech_poly_factor_fit_length(fac->fq_zech, len, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0132 }
0133 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0134 {
0135 fq_nmod_poly_factor_fit_length(fac->fq_nmod, len, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0136 }
0137 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0138 {
0139 nmod_poly_factor_fit_length(fac->nmod, len);
0140 }
0141 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0142 {
0143 fmpz_mod_poly_factor_fit_length(fac->fmpz_mod, len, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0144 }
0145 else
0146 {
0147 fq_poly_factor_fit_length(fac->fq, len, FQ_DEFAULT_CTX_FQ(ctx));
0148 }
0149 }
0150
0151 FQ_DEFAULT_POLY_FACTOR_INLINE
0152 slong fq_default_poly_factor_length(fq_default_poly_factor_t fac,
0153 const fq_default_ctx_t ctx)
0154 {
0155 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0156 {
0157 return fac->fq_zech->num;
0158 }
0159 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0160 {
0161 return fac->fq_nmod->num;
0162 }
0163 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0164 {
0165 return fac->nmod->num;
0166 }
0167 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0168 {
0169 return fac->fmpz_mod->num;
0170 }
0171 else
0172 {
0173 return fac->fq->num;
0174 }
0175 }
0176
0177 FQ_DEFAULT_POLY_FACTOR_INLINE
0178 slong fq_default_poly_factor_exp(fq_default_poly_factor_t fac, slong i,
0179 const fq_default_ctx_t ctx)
0180 {
0181 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0182 {
0183 return fac->fq_zech->exp[i];
0184 }
0185 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0186 {
0187 return fac->fq_nmod->exp[i];
0188 }
0189 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0190 {
0191 return fac->nmod->exp[i];
0192 }
0193 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0194 {
0195 return fac->fmpz_mod->exp[i];
0196 }
0197 else
0198 {
0199 return fac->fq->exp[i];
0200 }
0201 }
0202
0203 FQ_DEFAULT_POLY_FACTOR_INLINE
0204 void fq_default_poly_factor_set(fq_default_poly_factor_t res,
0205 const fq_default_poly_factor_t fac, const fq_default_ctx_t ctx)
0206 {
0207 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0208 {
0209 fq_zech_poly_factor_set(res->fq_zech, fac->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0210 }
0211 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0212 {
0213 fq_nmod_poly_factor_set(res->fq_nmod, fac->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0214 }
0215 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0216 {
0217 nmod_poly_factor_set(res->nmod, fac->nmod);
0218 }
0219 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0220 {
0221 fmpz_mod_poly_factor_set(res->fmpz_mod, fac->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0222 }
0223 else
0224 {
0225 fq_poly_factor_set(res->fq, fac->fq, FQ_DEFAULT_CTX_FQ(ctx));
0226 }
0227 }
0228
0229 FQ_DEFAULT_POLY_FACTOR_INLINE
0230 void fq_default_poly_factor_insert(fq_default_poly_factor_t fac,
0231 const fq_default_poly_t poly, slong exp, const fq_default_ctx_t ctx)
0232 {
0233 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0234 {
0235 fq_zech_poly_factor_insert(fac->fq_zech,
0236 poly->fq_zech, exp, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0237 }
0238 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0239 {
0240 fq_nmod_poly_factor_insert(fac->fq_nmod,
0241 poly->fq_nmod, exp, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0242 }
0243 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0244 {
0245 nmod_poly_factor_insert(fac->nmod, poly->nmod, exp);
0246 }
0247 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0248 {
0249 fmpz_mod_poly_factor_insert(fac->fmpz_mod,
0250 poly->fmpz_mod, exp, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0251 }
0252 else
0253 {
0254 fq_poly_factor_insert(fac->fq, poly->fq, exp, FQ_DEFAULT_CTX_FQ(ctx));
0255 }
0256 }
0257
0258 FQ_DEFAULT_POLY_FACTOR_INLINE
0259 void fq_default_poly_factor_get_poly(fq_default_poly_t poly,
0260 const fq_default_poly_factor_t fac, slong i, const fq_default_ctx_t ctx)
0261 {
0262 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0263 {
0264 fq_zech_poly_factor_get_poly(poly->fq_zech,
0265 fac->fq_zech, i, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0266 }
0267 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0268 {
0269 fq_nmod_poly_factor_get_poly(poly->fq_nmod,
0270 fac->fq_nmod, i, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0271 }
0272 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0273 {
0274 nmod_poly_factor_get_poly(poly->nmod, fac->nmod, i);
0275 }
0276 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0277 {
0278 fmpz_mod_poly_factor_get_poly(poly->fmpz_mod,
0279 fac->fmpz_mod, i, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0280 }
0281 else
0282 {
0283 fq_poly_factor_get_poly(poly->fq, fac->fq, i, FQ_DEFAULT_CTX_FQ(ctx));
0284 }
0285 }
0286
0287 FQ_DEFAULT_POLY_FACTOR_INLINE
0288 void fq_default_poly_factor_print(const fq_default_poly_factor_t fac,
0289 const fq_default_ctx_t ctx)
0290 {
0291 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0292 {
0293 fq_zech_poly_factor_print(fac->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0294 }
0295 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0296 {
0297 fq_nmod_poly_factor_print(fac->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0298 }
0299 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0300 {
0301 nmod_poly_factor_print(fac->nmod);
0302 }
0303 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0304 {
0305 fmpz_mod_poly_factor_print(fac->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0306 }
0307 else
0308 {
0309 fq_poly_factor_print(fac->fq, FQ_DEFAULT_CTX_FQ(ctx));
0310 }
0311 }
0312
0313 FQ_DEFAULT_POLY_FACTOR_INLINE
0314 void fq_default_poly_factor_print_pretty(const fq_default_poly_factor_t fac,
0315 const char * var, const fq_default_ctx_t ctx)
0316 {
0317 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0318 {
0319 fq_zech_poly_factor_print_pretty(fac->fq_zech, var, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0320 }
0321 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0322 {
0323 fq_nmod_poly_factor_print_pretty(fac->fq_nmod, var, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0324 }
0325 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0326 {
0327 nmod_poly_factor_print_pretty(fac->nmod, var);
0328 }
0329 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0330 {
0331 fmpz_mod_poly_factor_print_pretty(fac->fmpz_mod, var,
0332 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0333 }
0334 else
0335 {
0336 fq_poly_factor_print_pretty(fac->fq, var, FQ_DEFAULT_CTX_FQ(ctx));
0337 }
0338 }
0339
0340 FQ_DEFAULT_POLY_FACTOR_INLINE
0341 void fq_default_poly_factor_concat(fq_default_poly_factor_t res,
0342 const fq_default_poly_factor_t fac, const fq_default_ctx_t ctx)
0343 {
0344 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0345 {
0346 fq_zech_poly_factor_concat(res->fq_zech, fac->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0347 }
0348 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0349 {
0350 fq_nmod_poly_factor_concat(res->fq_nmod, fac->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0351 }
0352 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0353 {
0354 nmod_poly_factor_concat(res->nmod, fac->nmod);
0355 }
0356 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0357 {
0358 fmpz_mod_poly_factor_concat(res->fmpz_mod, fac->fmpz_mod,
0359 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0360 }
0361 else
0362 {
0363 fq_poly_factor_concat(res->fq, fac->fq, FQ_DEFAULT_CTX_FQ(ctx));
0364 }
0365 }
0366
0367 FQ_DEFAULT_POLY_FACTOR_INLINE
0368 void fq_default_poly_factor_pow(fq_default_poly_factor_t fac,
0369 slong exp, const fq_default_ctx_t ctx)
0370 {
0371 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0372 {
0373 fq_zech_poly_factor_pow(fac->fq_zech, exp, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0374 }
0375 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0376 {
0377 fq_nmod_poly_factor_pow(fac->fq_nmod, exp, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0378 }
0379 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0380 {
0381 nmod_poly_factor_pow(fac->nmod, exp);
0382 }
0383 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0384 {
0385 fmpz_mod_poly_factor_pow(fac->fmpz_mod, exp, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0386 }
0387 else
0388 {
0389 fq_poly_factor_pow(fac->fq, exp, FQ_DEFAULT_CTX_FQ(ctx));
0390 }
0391 }
0392
0393 FQ_DEFAULT_POLY_FACTOR_INLINE
0394 int fq_default_poly_is_squarefree(const fq_default_poly_t f,
0395 const fq_default_ctx_t ctx)
0396 {
0397 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0398 {
0399 return fq_zech_poly_is_squarefree(f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0400 }
0401 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0402 {
0403 return fq_nmod_poly_is_squarefree(f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0404 }
0405 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0406 {
0407 return nmod_poly_is_squarefree(f->nmod);
0408 }
0409 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0410 {
0411 return fmpz_mod_poly_is_squarefree(f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0412 }
0413 else
0414 {
0415 return fq_poly_is_squarefree(f->fq, FQ_DEFAULT_CTX_FQ(ctx));
0416 }
0417 }
0418
0419 FQ_DEFAULT_POLY_FACTOR_INLINE
0420 void fq_default_poly_factor_squarefree(fq_default_poly_factor_t res,
0421 const fq_default_poly_t f, const fq_default_ctx_t ctx)
0422 {
0423 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0424 {
0425 fq_zech_poly_factor_squarefree(res->fq_zech,
0426 f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0427 }
0428 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0429 {
0430 fq_nmod_poly_factor_squarefree(res->fq_nmod,
0431 f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0432 }
0433 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0434 {
0435 nmod_poly_factor_squarefree(res->nmod, f->nmod);
0436 }
0437 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0438 {
0439 fmpz_mod_poly_factor_squarefree(res->fmpz_mod, f->fmpz_mod,
0440 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0441 }
0442 else
0443 {
0444 fq_poly_factor_squarefree(res->fq, f->fq, FQ_DEFAULT_CTX_FQ(ctx));
0445 }
0446 }
0447
0448 FQ_DEFAULT_POLY_FACTOR_INLINE
0449 int fq_default_poly_is_irreducible(const fq_default_poly_t f,
0450 const fq_default_ctx_t ctx)
0451 {
0452 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0453 {
0454 return fq_zech_poly_is_irreducible(f->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0455 }
0456 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0457 {
0458 return fq_nmod_poly_is_irreducible(f->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0459 }
0460 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0461 {
0462 return nmod_poly_is_irreducible(f->nmod);
0463 }
0464 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0465 {
0466 return fmpz_mod_poly_is_irreducible(f->fmpz_mod, FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0467 }
0468 else
0469 {
0470 return fq_poly_is_irreducible(f->fq, FQ_DEFAULT_CTX_FQ(ctx));
0471 }
0472 }
0473
0474 FQ_DEFAULT_POLY_FACTOR_INLINE
0475 void fq_default_poly_factor_distinct_deg(fq_default_poly_factor_t res,
0476 const fq_default_poly_t poly, slong * const * degs,
0477 const fq_default_ctx_t ctx)
0478 {
0479 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0480 {
0481 fq_zech_poly_factor_distinct_deg(res->fq_zech,
0482 poly->fq_zech, degs, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0483 }
0484 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0485 {
0486 fq_nmod_poly_factor_distinct_deg(res->fq_nmod,
0487 poly->fq_nmod, degs, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0488 }
0489 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0490 {
0491 nmod_poly_factor_distinct_deg(res->nmod, poly->nmod, degs);
0492 }
0493 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0494 {
0495 fmpz_mod_poly_factor_distinct_deg(res->fmpz_mod, poly->fmpz_mod, degs,
0496 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0497 }
0498 else
0499 {
0500 fq_poly_factor_distinct_deg(res->fq, poly->fq, degs, FQ_DEFAULT_CTX_FQ(ctx));
0501 }
0502 }
0503
0504 FQ_DEFAULT_POLY_FACTOR_INLINE
0505 void fq_default_poly_factor_equal_deg(fq_default_poly_factor_t factors,
0506 const fq_default_poly_t pol, slong d, const fq_default_ctx_t ctx)
0507 {
0508 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0509 {
0510 fq_zech_poly_factor_equal_deg(factors->fq_zech,
0511 pol->fq_zech, d, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0512 }
0513 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0514 {
0515 fq_nmod_poly_factor_equal_deg(factors->fq_nmod,
0516 pol->fq_nmod, d, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0517 }
0518 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0519 {
0520 nmod_poly_factor_equal_deg(factors->nmod, pol->nmod, d);
0521 }
0522 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0523 {
0524 fmpz_mod_poly_factor_equal_deg(factors->fmpz_mod, pol->fmpz_mod, d,
0525 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0526 }
0527 else
0528 {
0529 fq_poly_factor_equal_deg(factors->fq, pol->fq, d, FQ_DEFAULT_CTX_FQ(ctx));
0530 }
0531 }
0532
0533 FQ_DEFAULT_POLY_FACTOR_INLINE
0534 void fq_default_poly_factor(fq_default_poly_factor_t result,
0535 fq_default_t leading_coeff, const fq_default_poly_t input,
0536 const fq_default_ctx_t ctx)
0537 {
0538 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0539 {
0540 fq_zech_poly_factor(result->fq_zech,
0541 leading_coeff->fq_zech, input->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0542 }
0543 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0544 {
0545 fq_nmod_poly_factor(result->fq_nmod,
0546 leading_coeff->fq_nmod, input->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0547 }
0548 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0549 {
0550 leading_coeff->nmod = nmod_poly_factor(result->nmod, input->nmod);
0551 }
0552 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0553 {
0554 fmpz_mod_poly_factor(result->fmpz_mod, input->fmpz_mod,
0555 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0556 if (input->fmpz_mod->length < 1)
0557 fmpz_zero(leading_coeff->fmpz_mod);
0558 else
0559 fmpz_set(leading_coeff->fmpz_mod, input->fmpz_mod->coeffs +
0560 input->fmpz_mod->length - 1);
0561 }
0562 else
0563 {
0564 fq_poly_factor(result->fq, leading_coeff->fq, input->fq, FQ_DEFAULT_CTX_FQ(ctx));
0565 }
0566 }
0567
0568 FQ_DEFAULT_POLY_FACTOR_INLINE
0569 void fq_default_poly_factor_split_single(fq_default_poly_t linfactor,
0570 const fq_default_poly_t input, const fq_default_ctx_t ctx)
0571 {
0572 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0573 {
0574 fq_zech_poly_factor_split_single(linfactor->fq_zech,
0575 input->fq_zech, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0576 }
0577 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0578 {
0579 fq_nmod_poly_factor_split_single(linfactor->fq_nmod,
0580 input->fq_nmod, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0581 }
0582 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0583 {
0584 flint_throw(FLINT_ERROR, "operation not implemented");
0585 }
0586 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0587 {
0588 flint_throw(FLINT_ERROR, "operation not implemented");
0589 }
0590 else
0591 {
0592 fq_poly_factor_split_single(linfactor->fq, input->fq, FQ_DEFAULT_CTX_FQ(ctx));
0593 }
0594 }
0595
0596 FQ_DEFAULT_POLY_FACTOR_INLINE
0597 void fq_default_poly_roots(fq_default_poly_factor_t r,
0598 const fq_default_poly_t f, int with_multiplicity,
0599 const fq_default_ctx_t ctx)
0600 {
0601 if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_ZECH)
0602 {
0603 fq_zech_poly_roots(r->fq_zech,
0604 f->fq_zech, with_multiplicity, FQ_DEFAULT_CTX_FQ_ZECH(ctx));
0605 }
0606 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FQ_NMOD)
0607 {
0608 fq_nmod_poly_roots(r->fq_nmod,
0609 f->fq_nmod, with_multiplicity, FQ_DEFAULT_CTX_FQ_NMOD(ctx));
0610 }
0611 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_NMOD)
0612 {
0613 nmod_poly_roots(r->nmod, f->nmod, with_multiplicity);
0614 }
0615 else if (_FQ_DEFAULT_TYPE(ctx) == _FQ_DEFAULT_FMPZ_MOD)
0616 {
0617 fmpz_mod_poly_roots(r->fmpz_mod, f->fmpz_mod, with_multiplicity,
0618 FQ_DEFAULT_CTX_FMPZ_MOD(ctx));
0619 }
0620 else
0621 {
0622 fq_poly_roots(r->fq, f->fq, with_multiplicity, FQ_DEFAULT_CTX_FQ(ctx));
0623 }
0624 }
0625
0626 #ifdef __cplusplus
0627 }
0628 #endif
0629
0630 #endif