Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2021 William Hart
0003     Copyright (C) 2021 Daniel Schultz
0004 
0005     This file is part of FLINT.
0006 
0007     FLINT is free software: you can redistribute it and/or modify it under
0008     the terms of the GNU Lesser General Public License (LGPL) as published
0009     by the Free Software Foundation; either version 3 of the License, or
0010     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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 /*  Type definitions *********************************************************/
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