File indexing completed on 2026-11-07 10:15:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
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
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
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
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
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