Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2020 Daniel Schultz
0003 
0004     This file is part of FLINT.
0005 
0006     FLINT is free software: you can redistribute it and/or modify it under
0007     the terms of the GNU Lesser General Public License (LGPL) as published
0008     by the Free Software Foundation; either version 3 of the License, or
0009     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
0010 */
0011 
0012 #ifndef NMOD_MPOLY_FACTOR_H
0013 #define NMOD_MPOLY_FACTOR_H
0014 
0015 #ifdef NMOD_MPOLY_FACTOR_INLINES_C
0016 #define NMOD_MPOLY_FACTOR_INLINE
0017 #else
0018 #define NMOD_MPOLY_FACTOR_INLINE static inline
0019 #endif
0020 
0021 #include "nmod_mpoly.h"
0022 
0023 #ifdef __cplusplus
0024  extern "C" {
0025 #endif
0026 
0027 
0028 void nmod_mpoly_get_bpoly(n_bpoly_t A, const nmod_mpoly_t B,
0029                            slong var0, slong var1, const nmod_mpoly_ctx_t ctx);
0030 
0031 void nmod_mpoly_set_bpoly(nmod_mpoly_t A, flint_bitcnt_t Abits,
0032         const n_bpoly_t B, slong var0, slong var1, const nmod_mpoly_ctx_t ctx);
0033 
0034 int n_bpoly_mod_factor_smprime(
0035     n_poly_t c,
0036     n_tpoly_t F,
0037     n_bpoly_t B,
0038     int allow_shift,
0039     nmod_t ctx);
0040 
0041 void n_bpoly_mod_factor_lgprime(
0042     n_poly_t c,
0043     n_tpoly_t F,
0044     n_bpoly_t B,
0045     nmod_t ctx);
0046 
0047 /*****************************************************************************/
0048 
0049 int nmod_mat_is_reduced(const nmod_mat_t N);
0050 
0051 void nmod_mat_init_nullspace_tr(nmod_mat_t X, nmod_mat_t tmp);
0052 
0053 /*****************************************************************************/
0054 
0055 NMOD_MPOLY_FACTOR_INLINE
0056 void nmod_mpoly_factor_init(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0057 {
0058     f->constant = 1;
0059     f->poly  = NULL;
0060     f->exp   = NULL;
0061     f->num   = 0;
0062     f->alloc = 0;
0063 }
0064 
0065 void nmod_mpoly_factor_init2(nmod_mpoly_factor_t f, slong alloc,
0066                                                    const nmod_mpoly_ctx_t ctx);
0067 
0068 void nmod_mpoly_factor_realloc(nmod_mpoly_factor_t f, slong alloc,
0069                                                    const nmod_mpoly_ctx_t ctx);
0070 
0071 void nmod_mpoly_factor_fit_length(nmod_mpoly_factor_t f, slong len,
0072                                                    const nmod_mpoly_ctx_t ctx);
0073 
0074 void nmod_mpoly_factor_clear(nmod_mpoly_factor_t f,
0075                                                    const nmod_mpoly_ctx_t ctx);
0076 
0077 NMOD_MPOLY_FACTOR_INLINE
0078 slong nmod_mpoly_factor_length(const nmod_mpoly_factor_t f,
0079                                                     const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0080 {
0081     return f->num;
0082 }
0083 
0084 NMOD_MPOLY_FACTOR_INLINE
0085 ulong nmod_mpoly_factor_get_constant_ui(const nmod_mpoly_factor_t f,
0086                                                     const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0087 {
0088     return f->constant;
0089 }
0090 
0091 NMOD_MPOLY_FACTOR_INLINE
0092 void nmod_mpoly_factor_get_base(nmod_mpoly_t p, const nmod_mpoly_factor_t f,
0093                                            slong i, const nmod_mpoly_ctx_t ctx)
0094 {
0095     FLINT_ASSERT(i < (ulong) f->num);
0096     nmod_mpoly_set(p, f->poly + i, ctx);
0097 }
0098 
0099 NMOD_MPOLY_FACTOR_INLINE
0100 void nmod_mpoly_factor_swap_base(nmod_mpoly_t p, nmod_mpoly_factor_t f,
0101                                            slong i, const nmod_mpoly_ctx_t ctx)
0102 {
0103     FLINT_ASSERT(i < (ulong) f->num);
0104     nmod_mpoly_swap(p, f->poly + i, ctx);
0105 }
0106 
0107 slong nmod_mpoly_factor_get_exp_si(nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t FLINT_UNUSED(ctx));
0108 
0109 void nmod_mpoly_factor_append_ui(nmod_mpoly_factor_t f,
0110                     const nmod_mpoly_t A, ulong e, const nmod_mpoly_ctx_t ctx);
0111 
0112 void nmod_mpoly_factor_append_fmpz(nmod_mpoly_factor_t f,
0113              const nmod_mpoly_t A, const fmpz_t e, const nmod_mpoly_ctx_t ctx);
0114 
0115 void nmod_mpoly_factor_set(nmod_mpoly_factor_t f,
0116                       const nmod_mpoly_factor_t g, const nmod_mpoly_ctx_t ctx);
0117 
0118 void nmod_mpoly_factor_print_pretty(const nmod_mpoly_factor_t f,
0119                                const char ** vars, const nmod_mpoly_ctx_t ctx);
0120 
0121 int nmod_mpoly_factor_content(nmod_mpoly_factor_t f,
0122                              const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx);
0123 
0124 int nmod_mpoly_factor_squarefree(nmod_mpoly_factor_t f,
0125                              const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx);
0126 
0127 int nmod_mpoly_factor_separable(nmod_mpoly_factor_t f,
0128                     const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, int sep);
0129 
0130 int nmod_mpoly_factor(nmod_mpoly_factor_t f, const nmod_mpoly_t A,
0131                                                    const nmod_mpoly_ctx_t ctx);
0132 
0133 void nmod_mpoly_factor_sort(nmod_mpoly_factor_t f,
0134                                                    const nmod_mpoly_ctx_t ctx);
0135 
0136 int nmod_mpoly_factor_cmp(
0137     const nmod_mpoly_factor_t A,
0138     const nmod_mpoly_factor_t B,
0139     const nmod_mpoly_ctx_t ctx);
0140 
0141 int nmod_mpoly_factor_expand(nmod_mpoly_t A,
0142                       const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx);
0143 
0144 NMOD_MPOLY_FACTOR_INLINE
0145 int nmod_mpoly_factor_matches(const nmod_mpoly_t a, const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx)
0146 {
0147     int matches;
0148     nmod_mpoly_t t;
0149     nmod_mpoly_init(t, ctx);
0150     nmod_mpoly_factor_expand(t, f, ctx);
0151     matches = nmod_mpoly_equal(t, a, ctx);
0152     nmod_mpoly_clear(t, ctx);
0153     return matches;
0154 }
0155 
0156 int nmod_mpoly_factor_fix_units(nmod_mpoly_factor_t f,
0157                                                    const nmod_mpoly_ctx_t ctx);
0158 
0159 NMOD_MPOLY_FACTOR_INLINE
0160 void nmod_mpoly_factor_swap(nmod_mpoly_factor_t f, nmod_mpoly_factor_t g,
0161                                                     const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0162 {
0163    nmod_mpoly_factor_struct t = *f;
0164    *f = *g;
0165    *g = t;
0166 }
0167 
0168 NMOD_MPOLY_FACTOR_INLINE
0169 void nmod_mpoly_factor_one(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0170 {
0171     f->constant = 1;
0172     f->num = 0;
0173 }
0174 
0175 void _nmod_mpoly_get_lead0(
0176     nmod_mpoly_t c,
0177     const nmod_mpoly_t A,
0178     const nmod_mpoly_ctx_t ctx);
0179 
0180 void _nmod_mpoly_set_lead0(
0181     nmod_mpoly_t A,
0182     const nmod_mpoly_t B,
0183     const nmod_mpoly_t c,
0184     const nmod_mpoly_ctx_t ctx);
0185 
0186 /* n_poly_vec ****************************************************************/
0187 
0188 slong _n_poly_vec_max_degree(const n_poly_struct * A, slong Alen);
0189 
0190 void _n_poly_vec_mul_nmod_intertible(n_poly_struct * A,
0191                                           slong Alen, ulong c, nmod_t ctx);
0192 
0193 void _n_poly_vec_mod_mul_poly(n_poly_struct * A, slong Alen,
0194                                            const n_poly_t g, const nmod_t ctx);
0195 
0196 void _n_poly_vec_mod_divexact_poly(n_poly_struct * A, slong Alen,
0197                                                  const n_poly_t g, nmod_t ctx);
0198 
0199 void _n_poly_vec_mod_content(n_poly_t g, const n_poly_struct * A,
0200                                                        slong Alen, nmod_t ctx);
0201 
0202 void _n_poly_vec_mod_remove_content(n_poly_t g, n_poly_struct * A,
0203                                                        slong Alen, nmod_t ctx);
0204 
0205 /* polyun ********************************************************************/
0206 
0207 void nmod_mpoly_get_polyu1n(n_polyun_t A, const nmod_mpoly_t B,
0208                           slong varx, slong vary, const nmod_mpoly_ctx_t ctx);
0209 
0210 void nmod_mpoly_set_polyu1n(nmod_mpoly_t B, const n_polyun_t A,
0211                           slong varx, slong vary, const nmod_mpoly_ctx_t ctx);
0212 
0213 /*****************************************************************************/
0214 
0215 typedef struct
0216 {
0217     nmod_mpoly_struct * coeffs;
0218     slong alloc;
0219     slong length;
0220 } nmod_mpolyv_struct;
0221 
0222 typedef nmod_mpolyv_struct nmod_mpolyv_t[1];
0223 
0224 NMOD_MPOLY_FACTOR_INLINE
0225 void nmod_mpolyv_init(nmod_mpolyv_t A, const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0226 {
0227     A->coeffs = NULL;
0228     A->alloc = 0;
0229     A->length = 0;
0230 }
0231 
0232 NMOD_MPOLY_FACTOR_INLINE
0233 void nmod_mpolyv_swap(nmod_mpolyv_t A, nmod_mpolyv_t B,
0234                                                     const nmod_mpoly_ctx_t FLINT_UNUSED(ctx))
0235 {
0236    nmod_mpolyv_struct t = *A;
0237    *A = *B;
0238    *B = t;
0239 }
0240 
0241 void nmod_mpolyv_clear(nmod_mpolyv_t A, const nmod_mpoly_ctx_t ctx);
0242 
0243 void nmod_mpolyv_print_pretty(const nmod_mpolyv_t poly,
0244                                   const char ** x, const nmod_mpoly_ctx_t ctx);
0245 
0246 void nmod_mpolyv_fit_length(nmod_mpolyv_t A, slong length,
0247                                                    const nmod_mpoly_ctx_t ctx);
0248 
0249 void nmod_mpolyv_set_coeff(nmod_mpolyv_t A, slong i,
0250                                    nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx);
0251 
0252 void nmod_mpoly_to_mpolyv(nmod_mpolyv_t A, const nmod_mpoly_t B,
0253                         const nmod_mpoly_t xalpha, const nmod_mpoly_ctx_t ctx);
0254 
0255 void nmod_mpoly_from_mpolyv(nmod_mpoly_t A, flint_bitcnt_t Abits,
0256                             const nmod_mpolyv_t B, const nmod_mpoly_t xalpha,
0257                                                    const nmod_mpoly_ctx_t ctx);
0258 
0259 int _nmod_mpoly_vec_content_mpoly(nmod_mpoly_t g,
0260           const nmod_mpoly_struct * A, slong Alen, const nmod_mpoly_ctx_t ctx);
0261 
0262 void _nmod_mpoly_vec_divexact_mpoly(nmod_mpoly_struct * A,
0263                  slong Alen, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx);
0264 
0265 void _nmod_mpoly_vec_mul_mpoly(nmod_mpoly_struct * A,
0266                  slong Alen, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx);
0267 
0268 /*****************************************************************************/
0269 
0270 int _nmod_mpoly_factor_separable(nmod_mpoly_factor_t f,
0271                     const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, int sep);
0272 
0273 int nmod_mpoly_factor_lcc_wang(nmod_mpoly_struct * lc_divs,
0274              const nmod_mpoly_factor_t lcAfac, const n_poly_t Auc,
0275              const n_bpoly_struct * Auf, slong r, const n_poly_struct * alpha,
0276                                                    const nmod_mpoly_ctx_t ctx);
0277 
0278 int nmod_mpoly_factor_irred_smprime_zassenhaus(nmod_mpolyv_t fac,
0279          const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0280 
0281 int nmod_mpoly_factor_irred_medprime_zassenhaus(nmod_mpolyv_t fac,
0282          const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0283 
0284 int nmod_mpoly_factor_irred_lgprime_zassenhaus(nmod_mpolyv_t fac,
0285          const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0286 
0287 int nmod_mpoly_factor_irred_smprime_wang(nmod_mpolyv_t fac,
0288        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0289        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0290 
0291 int nmod_mpoly_factor_irred_medprime_wang(nmod_mpolyv_t Af,
0292        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0293        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0294 
0295 int nmod_mpoly_factor_irred_lgprime_wang(nmod_mpolyv_t Af,
0296        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0297        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0298 
0299 int nmod_mpoly_factor_irred_smprime_zippel(nmod_mpolyv_t fac,
0300        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0301        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0302 
0303 int nmod_mpoly_factor_irred_medprime_zippel(nmod_mpolyv_t Af,
0304        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0305        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0306 
0307 int nmod_mpoly_factor_irred_lgprime_zippel(nmod_mpolyv_t Af,
0308        const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac,
0309        const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0310 
0311 /*****************************************************************************/
0312 
0313 void nmod_mpoly_compression_do(nmod_mpoly_t L,
0314                  const nmod_mpoly_ctx_t Lctx, ulong * Acoeffs, slong Alen,
0315                                                         mpoly_compression_t M);
0316 
0317 void nmod_mpoly_compression_undo(nmod_mpoly_t A,
0318              flint_bitcnt_t Abits, const nmod_mpoly_ctx_t Actx, nmod_mpoly_t L,
0319                            const nmod_mpoly_ctx_t Lctx, mpoly_compression_t M);
0320 
0321 /*****************************************************************************/
0322 
0323 int nmod_mpolyu_is_canonical(const nmod_mpolyu_t A,
0324                                                    const nmod_mpoly_ctx_t ctx);
0325 
0326 void nmod_mpolyu3_print_pretty(const nmod_mpolyu_t A,
0327                     const char * var0, const char * var1, const char * var2,
0328                                const char ** vars, const nmod_mpoly_ctx_t ctx);
0329 
0330 /*****************************************************************************/
0331 
0332 typedef struct {
0333     flint_bitcnt_t bits;
0334     slong w;
0335     slong r;
0336     n_poly_struct * inv_prod_dbetas;
0337     nmod_mpoly_struct * inv_prod_dbetas_mvar;
0338     n_poly_struct * dbetas;
0339     nmod_mpoly_struct * dbetas_mvar;
0340     nmod_mpoly_struct * prod_mbetas;
0341     nmod_mpolyv_struct * prod_mbetas_coeffs;
0342     nmod_mpoly_struct * mbetas;
0343     nmod_mpoly_struct * deltas;
0344     nmod_mpoly_struct * xalpha;
0345     nmod_mpoly_struct * q;
0346     nmod_mpoly_geobucket_struct * G;
0347     nmod_mpoly_struct * qt;
0348     nmod_mpoly_struct * newt;
0349     nmod_mpolyv_struct * delta_coeffs;
0350     nmod_mpoly_t T;
0351     nmod_mpoly_t Q;
0352     nmod_mpoly_t R;
0353 } nmod_mpoly_pfrac_struct;
0354 
0355 typedef nmod_mpoly_pfrac_struct nmod_mpoly_pfrac_t[1];
0356 
0357 
0358 int nmod_mpoly_pfrac_init(nmod_mpoly_pfrac_t Iv, flint_bitcnt_t bits,
0359                          slong l, slong r, const nmod_mpoly_struct * betas,
0360                           const ulong * alpha, const nmod_mpoly_ctx_t ctx);
0361 
0362 void nmod_mpoly_pfrac_clear(nmod_mpoly_pfrac_t Iv,
0363                                                    const nmod_mpoly_ctx_t ctx);
0364 
0365 int nmod_mpoly_pfrac(slong r, nmod_mpoly_t t, const slong * deg,
0366                              nmod_mpoly_pfrac_t Iv, const nmod_mpoly_ctx_t ctx);
0367 
0368 int nmod_mpoly_hlift(slong m, nmod_mpoly_struct * f, slong r,
0369             const ulong * alpha, const nmod_mpoly_t A, const slong * degs,
0370                                                    const nmod_mpoly_ctx_t ctx);
0371 
0372 int n_bpoly_mod_pfrac(slong r, n_bpoly_struct * C,
0373             slong * C_deg1_bound, n_bpoly_t A, n_bpoly_struct * B, nmod_t mod);
0374 
0375 int n_bpoly_mod_hlift2(n_bpoly_t A, n_bpoly_t B0, n_bpoly_t B1,
0376                               ulong alpha, slong degree_inner, nmod_t mod,
0377                                                       n_poly_bpoly_stack_t St);
0378 
0379 int n_bpoly_mod_hlift2_cubic(n_bpoly_t A, n_bpoly_t B0, n_bpoly_t B1,
0380                                ulong alpha, slong degree_inner, nmod_t ctx,
0381                                 nmod_eval_interp_t E, n_poly_bpoly_stack_t St);
0382 
0383 int n_bpoly_mod_hlift(slong r, n_bpoly_t A, n_bpoly_struct * B,
0384                               ulong alpha, slong degree_inner, nmod_t mod,
0385                                                       n_poly_bpoly_stack_t St);
0386 
0387 int n_bpoly_mod_hlift_cubic(slong r, n_bpoly_t A, n_bpoly_struct * B,
0388                                ulong alpha, slong degree_inner, nmod_t mod,
0389                                 nmod_eval_interp_t E, n_poly_bpoly_stack_t St);
0390 
0391 int n_polyu3_mod_hlift(slong r, n_polyun_struct * BB,  n_polyu_t A,
0392            n_polyu_struct * B, ulong beta, slong degree_inner, nmod_t ctx);
0393 
0394 int nmod_mpoly_hlift_zippel(slong m, nmod_mpoly_struct * B, slong r,
0395             const ulong * alpha, const nmod_mpoly_t A, const slong * degs,
0396                                const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0397 
0398 int nmod_mpoly_factor_algo(nmod_mpoly_factor_t f,
0399           const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, unsigned int algo);
0400 
0401 int nmod_mpoly_factor_zassenhaus(nmod_mpoly_factor_t f,
0402                              const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx);
0403 
0404 int nmod_mpoly_factor_wang(nmod_mpoly_factor_t f,
0405                              const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx);
0406 
0407 int nmod_mpoly_factor_zippel(nmod_mpoly_factor_t f,
0408                              const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx);
0409 
0410 int _nmod_mpoly_evaluate_rest_n_poly(n_poly_struct * E,
0411     slong * starts, slong * ends, slong * stops, ulong * es,
0412     const ulong * Acoeffs, const ulong * Aexps, slong Alen, slong var,
0413     const n_poly_struct * alphas, const slong * offsets, const slong * shifts,
0414                                  slong N, ulong mask, slong nvars, nmod_t ctx);
0415 
0416 void _nmod_mpoly_eval_rest_to_n_bpoly(n_bpoly_t E,
0417                       const nmod_mpoly_t A, const n_poly_struct * alphabetas,
0418                                                    const nmod_mpoly_ctx_t ctx);
0419 
0420 void _nmod_mpoly_set_n_bpoly_var1_zero(nmod_mpoly_t A,
0421                          flint_bitcnt_t Abits, const n_bpoly_t B, slong var,
0422                                                    const nmod_mpoly_ctx_t ctx);
0423 
0424 /* gcd ***********************************************************************/
0425 
0426 int nmod_mpolyl_gcdp_zippel_smprime(nmod_mpoly_t G, nmod_mpoly_t Abar,
0427                 nmod_mpoly_t Bbar, nmod_mpoly_t A, nmod_mpoly_t B, slong var,
0428                                const nmod_mpoly_ctx_t ctx, flint_rand_t state);
0429 
0430 int nmod_mpolyl_gcds_zippel(nmod_mpoly_t G, const ulong * Gmarks,
0431         slong Gmarkslen, nmod_mpoly_t A, nmod_mpoly_t B, slong *perm,
0432         slong l, slong var, const nmod_mpoly_ctx_t ctx,  flint_rand_t state,
0433                           slong * Gdegbound, n_poly_t Amarks, n_poly_t Bmarks);
0434 
0435 /* zip helpers ***************************************************************/
0436 
0437 void mpoly_monomial_evals_nmod(n_poly_t EH, const ulong * Aexps,
0438          slong Alen, flint_bitcnt_t Abits, n_poly_struct * alpha_caches,
0439          slong start, slong stop, const mpoly_ctx_t mctx, const nmod_t fpctx);
0440 
0441 void mpoly1_monomial_evals_nmod(n_polyun_t EH, const ulong * Aexps,
0442                 flint_bitcnt_t Abits, const ulong * Amarks, slong Amarkslen,
0443                 n_poly_struct * alpha_caches, slong m,  const mpoly_ctx_t mctx,
0444                                                            const nmod_t fpctx);
0445 
0446 void mpoly2_monomial_evals_nmod(n_polyun_t EH, const ulong * Aexps,
0447                 flint_bitcnt_t Abits, ulong * Amarks, slong Amarkslen,
0448                 n_poly_struct * alpha_caches, slong m, const mpoly_ctx_t mctx,
0449                                                            const nmod_t fpctx);
0450 
0451 void n_polyun_zip_start(n_polyun_t Z, n_polyun_t H, slong req_images);
0452 
0453 int n_polyu2n_add_zip_must_match(n_polyun_t Z, const n_bpoly_t A,
0454                                                              slong cur_length);
0455 
0456 int n_polyun_zip_solve(nmod_mpoly_t A, n_polyun_t Z, n_polyun_t H,
0457                                      n_polyun_t M, const nmod_mpoly_ctx_t ctx);
0458 
0459 #ifdef __cplusplus
0460 }
0461 #endif
0462 
0463 #endif