Back to home page

EIC code displayed by LXR

 
 

    


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

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_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 /*  Type definitions *********************************************************/
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 /*  Memory management ********************************************************/
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 /*  Polynomial parameters  ***************************************************/
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 /*  Randomisation  ***********************************************************/
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 /*  Assignment and basic manipulation  ***************************************/
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 /*  Getting and setting coefficients  ****************************************/
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 /*  Comparison  **************************************************************/
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 /*  Addition and subtraction  ************************************************/
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 /*  Scalar multiplication and division  **************************************/
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 /*  Multiplication  **********************************************************/
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 /* Squaring ******************************************************************/
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 /*  Powering  ****************************************************************/
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 /*  Shifting  ****************************************************************/
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 /*  Norms  *******************************************************************/
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 /*  Greatest common divisor  *************************************************/
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 /*  Euclidean division  ******************************************************/
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 /*  Divisibility testing  ****************************************************/
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 /*  Derivative  **************************************************************/
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 /* Square root ***************************************************************/
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 /*  Evaluation  **************************************************************/
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 /*  Composition  *************************************************************/
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 /*  Input and output  ********************************************************/
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 /* Characteristic polynomial *************************************************/
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 /* Minimal polynomial ********************************************************/
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