File indexing completed on 2026-11-07 10:15:11
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef FMPQ_MPOLY_H
0013 #define FMPQ_MPOLY_H
0014
0015 #ifdef FMPQ_MPOLY_INLINES_C
0016 #define FMPQ_MPOLY_INLINE
0017 #else
0018 #define FMPQ_MPOLY_INLINE static inline
0019 #endif
0020
0021 #include "fmpq_types.h"
0022 #include "fmpq.h"
0023 #include "fmpz_mpoly.h"
0024
0025 #ifdef __cplusplus
0026 extern "C" {
0027 #endif
0028
0029
0030
0031 FMPQ_MPOLY_INLINE
0032 void fmpq_mpoly_ctx_init(fmpq_mpoly_ctx_t ctx,
0033 slong nvars, const ordering_t ord)
0034 {
0035 fmpz_mpoly_ctx_init(ctx->zctx, nvars, ord);
0036 }
0037
0038 FMPQ_MPOLY_INLINE
0039 void fmpq_mpoly_ctx_init_rand(fmpq_mpoly_ctx_t ctx,
0040 flint_rand_t state, slong max_nvars)
0041 {
0042 fmpz_mpoly_ctx_init_rand(ctx->zctx, state, max_nvars);
0043 }
0044
0045 FMPQ_MPOLY_INLINE
0046 void fmpq_mpoly_ctx_clear(fmpq_mpoly_ctx_t ctx)
0047 {
0048 fmpz_mpoly_ctx_clear(ctx->zctx);
0049 }
0050
0051 FMPQ_MPOLY_INLINE
0052 slong fmpq_mpoly_ctx_nvars(const fmpq_mpoly_ctx_t ctx)
0053 {
0054 return ctx->zctx->minfo->nvars;
0055 }
0056
0057 FMPQ_MPOLY_INLINE
0058 ordering_t fmpq_mpoly_ctx_ord(const fmpq_mpoly_ctx_t ctx)
0059 {
0060 return ctx->zctx->minfo->ord;
0061 }
0062
0063
0064
0065 FMPQ_MPOLY_INLINE
0066 fmpq * fmpq_mpoly_content_ref(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0067 {
0068 return A->content;
0069 }
0070
0071 FMPQ_MPOLY_INLINE
0072 fmpz_mpoly_struct * fmpq_mpoly_zpoly_ref(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0073 {
0074 return A->zpoly;
0075 }
0076
0077 FMPQ_MPOLY_INLINE
0078 fmpz * fmpq_mpoly_zpoly_term_coeff_ref(fmpq_mpoly_t A, slong i, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0079 {
0080 FLINT_ASSERT(i < A->zpoly->length);
0081 return A->zpoly->coeffs + i;
0082 }
0083
0084
0085
0086
0087
0088
0089
0090
0091 typedef struct
0092 {
0093 fmpq_mpoly_struct * coeffs;
0094 fmpz * exps;
0095 slong alloc;
0096 slong length;
0097 } fmpq_mpoly_univar_struct;
0098
0099 typedef fmpq_mpoly_univar_struct fmpq_mpoly_univar_t[1];
0100
0101
0102
0103
0104 FMPQ_MPOLY_INLINE
0105 void fmpq_mpoly_init(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0106 {
0107 fmpq_init(A->content);
0108 fmpz_mpoly_init(A->zpoly, ctx->zctx);
0109 }
0110
0111 FMPQ_MPOLY_INLINE
0112 void fmpq_mpoly_init2(fmpq_mpoly_t A, slong alloc,
0113 const fmpq_mpoly_ctx_t ctx)
0114 {
0115 fmpq_init(A->content);
0116 fmpz_mpoly_init2(A->zpoly, alloc, ctx->zctx);
0117 }
0118
0119 FMPQ_MPOLY_INLINE
0120 void fmpq_mpoly_init3(fmpq_mpoly_t A, slong alloc, flint_bitcnt_t bits,
0121 const fmpq_mpoly_ctx_t ctx)
0122 {
0123 fmpq_init(A->content);
0124 fmpz_mpoly_init3(A->zpoly, alloc, bits, ctx->zctx);
0125 }
0126
0127
0128 FMPQ_MPOLY_INLINE
0129 void fmpq_mpoly_realloc(fmpq_mpoly_t A, slong alloc,
0130 const fmpq_mpoly_ctx_t ctx)
0131 {
0132 fmpz_mpoly_realloc(A->zpoly, alloc, ctx->zctx);
0133 }
0134
0135 FMPQ_MPOLY_INLINE
0136 void fmpq_mpoly_fit_length(fmpq_mpoly_t A, slong len,
0137 const fmpq_mpoly_ctx_t ctx)
0138 {
0139 fmpz_mpoly_fit_length(A->zpoly, len, ctx->zctx);
0140 }
0141
0142 FMPQ_MPOLY_INLINE
0143 void fmpq_mpoly_clear(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0144 {
0145 fmpz_mpoly_clear(A->zpoly, ctx->zctx);
0146 fmpq_clear(A->content);
0147 }
0148
0149 FMPQ_MPOLY_INLINE
0150 void fmpq_mpoly_fit_bits(fmpq_mpoly_t A,
0151 flint_bitcnt_t bits, const fmpq_mpoly_ctx_t ctx)
0152 {
0153 fmpz_mpoly_fit_bits(A->zpoly, bits, ctx->zctx);
0154 }
0155
0156
0157
0158
0159 int fmpq_mpoly_set_str_pretty(fmpq_mpoly_t A, const char * str,
0160 const char ** x, const fmpq_mpoly_ctx_t ctx);
0161
0162 char * fmpq_mpoly_get_str_pretty(const fmpq_mpoly_t A,
0163 const char ** x, const fmpq_mpoly_ctx_t ctx);
0164
0165 #ifdef FLINT_HAVE_FILE
0166 int fmpq_mpoly_fprint_pretty(FILE * file, const fmpq_mpoly_t A, const char ** x, const fmpq_mpoly_ctx_t ctx);
0167 #endif
0168
0169 int fmpq_mpoly_print_pretty(const fmpq_mpoly_t A, const char ** x, const fmpq_mpoly_ctx_t ctx);
0170
0171
0172
0173 FMPQ_MPOLY_INLINE
0174 void fmpq_mpoly_gen(fmpq_mpoly_t A, slong var, const fmpq_mpoly_ctx_t ctx)
0175 {
0176 fmpq_one(A->content);
0177 fmpz_mpoly_gen(A->zpoly, var, ctx->zctx);
0178 }
0179
0180 FMPQ_MPOLY_INLINE
0181 int fmpq_mpoly_is_gen(const fmpq_mpoly_t A,
0182 slong var, const fmpq_mpoly_ctx_t ctx)
0183 {
0184 return fmpq_is_one(A->content)
0185 && fmpz_mpoly_is_gen(A->zpoly, var, ctx->zctx);
0186 }
0187
0188 FMPQ_MPOLY_INLINE
0189 void fmpq_mpoly_set(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0190 const fmpq_mpoly_ctx_t ctx)
0191 {
0192 fmpq_set(A->content, B->content);
0193 fmpz_mpoly_set(A->zpoly, B->zpoly, ctx->zctx);
0194 }
0195
0196 FMPQ_MPOLY_INLINE
0197 int fmpq_mpoly_equal(const fmpq_mpoly_t A, const fmpq_mpoly_t B,
0198 const fmpq_mpoly_ctx_t ctx)
0199 {
0200 return fmpq_equal(A->content, B->content)
0201 && fmpz_mpoly_equal(A->zpoly, B->zpoly, ctx->zctx);
0202 }
0203
0204 FMPQ_MPOLY_INLINE
0205 void fmpq_mpoly_swap(fmpq_mpoly_t A,
0206 fmpq_mpoly_t B, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0207 {
0208 FLINT_SWAP(fmpq_mpoly_struct, *A, *B);
0209 }
0210
0211
0212
0213
0214 FMPQ_MPOLY_INLINE
0215 int fmpq_mpoly_is_fmpq(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0216 {
0217 return fmpz_mpoly_is_fmpz(A->zpoly, ctx->zctx);
0218 }
0219
0220 void fmpq_mpoly_get_fmpq(fmpq_t c, const fmpq_mpoly_t A,
0221 const fmpq_mpoly_ctx_t ctx);
0222
0223 void fmpq_mpoly_set_fmpq(fmpq_mpoly_t A,
0224 const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0225
0226 void fmpq_mpoly_set_fmpz(fmpq_mpoly_t A,
0227 const fmpz_t c, const fmpq_mpoly_ctx_t ctx);
0228
0229 void fmpq_mpoly_set_ui(fmpq_mpoly_t A,
0230 ulong c, const fmpq_mpoly_ctx_t ctx);
0231
0232 void fmpq_mpoly_set_si(fmpq_mpoly_t A,
0233 slong c, const fmpq_mpoly_ctx_t ctx);
0234
0235 FMPQ_MPOLY_INLINE
0236 void fmpq_mpoly_zero(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0237 {
0238 fmpq_zero(A->content);
0239 fmpz_mpoly_zero(A->zpoly, ctx->zctx);
0240 }
0241
0242 FMPQ_MPOLY_INLINE
0243 void fmpq_mpoly_one(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0244 {
0245 fmpq_one(A->content);
0246 fmpz_mpoly_one(A->zpoly, ctx->zctx);
0247 }
0248
0249 int fmpq_mpoly_equal_fmpq(const fmpq_mpoly_t A, const fmpq_t c,
0250 const fmpq_mpoly_ctx_t ctx);
0251
0252 int fmpq_mpoly_equal_fmpz(const fmpq_mpoly_t A, const fmpz_t c,
0253 const fmpq_mpoly_ctx_t ctx);
0254
0255 int fmpq_mpoly_equal_ui(const fmpq_mpoly_t A, ulong c,
0256 const fmpq_mpoly_ctx_t ctx);
0257
0258 int fmpq_mpoly_equal_si(const fmpq_mpoly_t A, slong c,
0259 const fmpq_mpoly_ctx_t ctx);
0260
0261 FMPQ_MPOLY_INLINE
0262 int fmpq_mpoly_is_zero(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0263 {
0264 return A->zpoly->length == WORD(0);
0265 }
0266
0267 FMPQ_MPOLY_INLINE
0268 int fmpq_mpoly_is_one(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0269 {
0270 return fmpq_is_one(A->content)
0271 && fmpz_mpoly_is_one(A->zpoly, ctx->zctx);
0272 }
0273
0274
0275
0276
0277 int fmpq_mpoly_degrees_fit_si(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0278
0279 void fmpq_mpoly_degrees_fmpz(fmpz ** degs, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0280 void fmpq_mpoly_degrees_si(slong * degs, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0281
0282 void fmpq_mpoly_degree_fmpz(fmpz_t deg, const fmpq_mpoly_t A, slong var, const fmpq_mpoly_ctx_t ctx);
0283 slong fmpq_mpoly_degree_si(const fmpq_mpoly_t A, slong var, const fmpq_mpoly_ctx_t ctx);
0284
0285 int fmpq_mpoly_total_degree_fits_si(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0286
0287 void fmpq_mpoly_total_degree_fmpz(fmpz_t tdeg, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0288 slong fmpq_mpoly_total_degree_si(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0289
0290 FMPQ_MPOLY_INLINE
0291 void fmpq_mpoly_used_vars(int * used, const fmpq_mpoly_t A,
0292 const fmpq_mpoly_ctx_t ctx)
0293 {
0294 fmpz_mpoly_used_vars(used, A->zpoly, ctx->zctx);
0295 }
0296
0297
0298
0299 FMPQ_MPOLY_INLINE
0300 void fmpq_mpoly_get_denominator(fmpz_t d, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0301 {
0302 fmpz_set(d, fmpq_denref(A->content));
0303 }
0304
0305 int fmpq_mpoly_is_monic(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx));
0306
0307 void fmpq_mpoly_get_coeff_fmpq_monomial(fmpq_t c,
0308 const fmpq_mpoly_t A, const fmpq_mpoly_t M,
0309 const fmpq_mpoly_ctx_t ctx);
0310
0311 void fmpq_mpoly_set_coeff_fmpq_monomial(fmpq_mpoly_t A,
0312 const fmpq_t c, const fmpq_mpoly_t M,
0313 const fmpq_mpoly_ctx_t ctx);
0314
0315 void _fmpq_mpoly_set_coeff_fmpq_fmpz(fmpq_mpoly_t A,
0316 const fmpq_t c, const fmpz * exp, const fmpq_mpoly_ctx_t ctx);
0317
0318 void fmpq_mpoly_set_coeff_fmpq_fmpz(fmpq_mpoly_t A,
0319 const fmpq_t c, fmpz * const * exp, const fmpq_mpoly_ctx_t ctx);
0320
0321 void fmpq_mpoly_set_coeff_fmpq_ui(fmpq_mpoly_t A,
0322 const fmpq_t c, const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0323
0324 void _fmpq_mpoly_get_coeff_fmpq_fmpz(fmpq_t c, const fmpq_mpoly_t A,
0325 const fmpz * exp, const fmpq_mpoly_ctx_t ctx);
0326
0327 void fmpq_mpoly_get_coeff_fmpq_fmpz(fmpq_t c, const fmpq_mpoly_t A,
0328 fmpz * const * exp, const fmpq_mpoly_ctx_t ctx);
0329
0330 void fmpq_mpoly_get_coeff_fmpq_ui(fmpq_t c, const fmpq_mpoly_t A,
0331 const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0332
0333 void fmpq_mpoly_get_coeff_vars_ui(fmpq_mpoly_t C,
0334 const fmpq_mpoly_t A, const slong * vars, const ulong * exps,
0335 slong length, const fmpq_mpoly_ctx_t ctx);
0336
0337
0338
0339 int fmpq_mpoly_is_fmpq_poly(const fmpq_mpoly_t A,
0340 slong var, const fmpq_mpoly_ctx_t ctx);
0341
0342 int fmpq_mpoly_get_fmpq_poly(fmpq_poly_t A, const fmpq_mpoly_t B,
0343 slong var, const fmpq_mpoly_ctx_t ctx);
0344
0345 void fmpq_mpoly_set_fmpq_poly(fmpq_mpoly_t A, const fmpq_poly_t B,
0346 slong var, const fmpq_mpoly_ctx_t ctx);
0347
0348
0349
0350 int fmpq_mpoly_cmp(const fmpq_mpoly_t A, const fmpq_mpoly_t B,
0351 const fmpq_mpoly_ctx_t ctx);
0352
0353
0354
0355
0356 int fmpq_mpoly_is_canonical(const fmpq_mpoly_t A,
0357 const fmpq_mpoly_ctx_t ctx);
0358
0359 FMPQ_MPOLY_INLINE
0360 slong fmpq_mpoly_length(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0361 {
0362 return A->zpoly->length;
0363 }
0364
0365 FMPQ_MPOLY_INLINE
0366 void fmpq_mpoly_resize(fmpq_mpoly_t A, slong new_length,
0367 const fmpq_mpoly_ctx_t ctx)
0368 {
0369 fmpz_mpoly_resize(A->zpoly, new_length, ctx->zctx);
0370 }
0371
0372 void fmpq_mpoly_get_term_coeff_fmpq(fmpq_t c, const fmpq_mpoly_t A,
0373 slong i, const fmpq_mpoly_ctx_t ctx);
0374
0375 void fmpq_mpoly_set_term_coeff_fmpq(fmpq_mpoly_t A,
0376 slong i, const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0377
0378 int fmpq_mpoly_term_exp_fits_ui(const fmpq_mpoly_t A, slong i, const fmpq_mpoly_ctx_t ctx);
0379 int fmpq_mpoly_term_exp_fits_si(const fmpq_mpoly_t A, slong i, const fmpq_mpoly_ctx_t ctx);
0380
0381 void fmpq_mpoly_get_term_exp_fmpz(fmpz ** exps, const fmpq_mpoly_t A,
0382 slong i, const fmpq_mpoly_ctx_t ctx);
0383
0384 void fmpq_mpoly_get_term_exp_ui(ulong * exps, const fmpq_mpoly_t A,
0385 slong i, const fmpq_mpoly_ctx_t ctx);
0386
0387 void fmpq_mpoly_get_term_exp_si(slong * exps, const fmpq_mpoly_t A,
0388 slong i, const fmpq_mpoly_ctx_t ctx);
0389
0390 ulong fmpq_mpoly_get_term_var_exp_ui(const fmpq_mpoly_t A,
0391 slong i, slong var, const fmpq_mpoly_ctx_t ctx);
0392
0393 slong fmpq_mpoly_get_term_var_exp_si(const fmpq_mpoly_t A,
0394 slong i, slong var, const fmpq_mpoly_ctx_t ctx);
0395
0396 FMPQ_MPOLY_INLINE
0397 void fmpq_mpoly_set_term_exp_fmpz(fmpq_mpoly_t A,
0398 slong i, fmpz * const * exps, const fmpq_mpoly_ctx_t ctx)
0399 {
0400 fmpz_mpoly_set_term_exp_fmpz(A->zpoly, i, exps, ctx->zctx);
0401 }
0402
0403 FMPQ_MPOLY_INLINE
0404 void fmpq_mpoly_set_term_exp_ui(fmpq_mpoly_t A,
0405 slong i, const ulong * exps, const fmpq_mpoly_ctx_t ctx)
0406 {
0407 fmpz_mpoly_set_term_exp_ui(A->zpoly, i, exps, ctx->zctx);
0408 }
0409
0410 void fmpq_mpoly_get_term(fmpq_mpoly_t M, const fmpq_mpoly_t A,
0411 slong i, const fmpq_mpoly_ctx_t ctx);
0412
0413 void fmpq_mpoly_get_term_monomial(fmpq_mpoly_t M, const fmpq_mpoly_t A,
0414 slong i, const fmpq_mpoly_ctx_t ctx);
0415
0416 void fmpq_mpoly_push_term_fmpq_fmpz(fmpq_mpoly_t A,
0417 const fmpq_t c, fmpz * const * exp, const fmpq_mpoly_ctx_t ctx);
0418
0419 void fmpq_mpoly_push_term_fmpq_ffmpz(fmpq_mpoly_t A, const fmpq_t c,
0420 const fmpz *exp, const fmpq_mpoly_ctx_t ctx);
0421
0422 void fmpq_mpoly_push_term_fmpz_fmpz(fmpq_mpoly_t A, const fmpz_t c,
0423 fmpz *const *exp,
0424 const fmpq_mpoly_ctx_t ctx);
0425
0426 void fmpq_mpoly_push_term_fmpz_ffmpz(fmpq_mpoly_t A, const fmpz_t c,
0427 const fmpz *exp,
0428 const fmpq_mpoly_ctx_t ctx);
0429
0430 void fmpq_mpoly_push_term_ui_fmpz(fmpq_mpoly_t A, ulong c, fmpz *const *exp,
0431 const fmpq_mpoly_ctx_t ctx);
0432
0433 void fmpq_mpoly_push_term_ui_ffmpz(fmpq_mpoly_t A, ulong c, const fmpz *exp,
0434 const fmpq_mpoly_ctx_t ctx);
0435
0436 void fmpq_mpoly_push_term_si_fmpz(fmpq_mpoly_t A, slong c, fmpz *const *exp,
0437 const fmpq_mpoly_ctx_t ctx);
0438
0439 void fmpq_mpoly_push_term_si_ffmpz(fmpq_mpoly_t A, slong c, const fmpz *exp,
0440 const fmpq_mpoly_ctx_t ctx);
0441
0442 void fmpq_mpoly_push_term_fmpq_ui(fmpq_mpoly_t A,
0443 const fmpq_t c, const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0444
0445 void fmpq_mpoly_push_term_fmpz_ui(fmpq_mpoly_t A,
0446 const fmpz_t c, const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0447
0448 void fmpq_mpoly_push_term_ui_ui(fmpq_mpoly_t A,
0449 ulong c, const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0450
0451 void fmpq_mpoly_push_term_si_ui(fmpq_mpoly_t A,
0452 slong c, const ulong * exp, const fmpq_mpoly_ctx_t ctx);
0453
0454 void fmpq_mpoly_reduce(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx);
0455
0456 void fmpq_mpoly_reduce_easy(fmpq_mpoly_t A, slong easy_length,
0457 const fmpq_mpoly_ctx_t ctx);
0458
0459 FMPQ_MPOLY_INLINE
0460 void fmpq_mpoly_sort_terms(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0461 {
0462 fmpz_mpoly_sort_terms(A->zpoly, ctx->zctx);
0463 }
0464
0465 FMPQ_MPOLY_INLINE
0466 void fmpq_mpoly_combine_like_terms(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0467 {
0468 fmpz_mpoly_combine_like_terms(A->zpoly, ctx->zctx);
0469 fmpq_mpoly_reduce(A, ctx);
0470 }
0471
0472 void fmpq_mpoly_reverse(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0473 const fmpq_mpoly_ctx_t ctx);
0474
0475 void fmpq_mpoly_assert_canonical(const fmpq_mpoly_t poly,
0476 const fmpq_mpoly_ctx_t ctx);
0477
0478 void _fmpq_mpoly_push_rescale(fmpq_mpoly_t A,
0479 fmpq_t C, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx));
0480
0481
0482
0483
0484 FMPQ_MPOLY_INLINE
0485 void fmpq_mpoly_randtest_bounds(fmpq_mpoly_t A, flint_rand_t state,
0486 slong length, flint_bitcnt_t coeff_bits, ulong * exp_bounds,
0487 const fmpq_mpoly_ctx_t ctx)
0488 {
0489 fmpz_mpoly_randtest_bounds(A->zpoly, state,
0490 length, coeff_bits, exp_bounds, ctx->zctx);
0491 fmpq_randtest_not_zero(A->content, state, coeff_bits + 1);
0492 fmpq_mpoly_reduce(A, ctx);
0493 }
0494
0495 FMPQ_MPOLY_INLINE
0496 void fmpq_mpoly_randtest_bound(fmpq_mpoly_t A, flint_rand_t state,
0497 slong length, flint_bitcnt_t coeff_bits, ulong exp_bound,
0498 const fmpq_mpoly_ctx_t ctx)
0499 {
0500 fmpz_mpoly_randtest_bound(A->zpoly, state,
0501 length, coeff_bits, exp_bound, ctx->zctx);
0502 fmpq_randtest_not_zero(A->content, state, coeff_bits + 1);
0503 fmpq_mpoly_reduce(A, ctx);
0504 }
0505
0506 FMPQ_MPOLY_INLINE
0507 void fmpq_mpoly_randtest_bits(fmpq_mpoly_t A, flint_rand_t state,
0508 slong length, flint_bitcnt_t coeff_bits, flint_bitcnt_t exp_bits,
0509 const fmpq_mpoly_ctx_t ctx)
0510 {
0511 fmpz_mpoly_randtest_bits(A->zpoly, state,
0512 length, coeff_bits, exp_bits, ctx->zctx);
0513 fmpq_randtest_not_zero(A->content, state, coeff_bits + 1);
0514 fmpq_mpoly_reduce(A, ctx);
0515 }
0516
0517
0518
0519
0520 void fmpq_mpoly_add_fmpq(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0521 const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0522
0523 void fmpq_mpoly_add_fmpz(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0524 const fmpz_t c, const fmpq_mpoly_ctx_t ctx);
0525
0526 void fmpq_mpoly_add_ui(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0527 ulong c, const fmpq_mpoly_ctx_t ctx);
0528
0529 void fmpq_mpoly_add_si(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0530 slong c, const fmpq_mpoly_ctx_t ctx);
0531
0532 void fmpq_mpoly_sub_fmpq(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0533 const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0534
0535 void fmpq_mpoly_sub_fmpz(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0536 const fmpz_t c, const fmpq_mpoly_ctx_t ctx);
0537
0538 void fmpq_mpoly_sub_ui(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0539 ulong c, const fmpq_mpoly_ctx_t ctx);
0540
0541 void fmpq_mpoly_sub_si(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0542 slong c, const fmpq_mpoly_ctx_t ctx);
0543
0544 void fmpq_mpoly_add(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0545 const fmpq_mpoly_t C, const fmpq_mpoly_ctx_t ctx);
0546
0547 void fmpq_mpoly_sub(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0548 const fmpq_mpoly_t C, const fmpq_mpoly_ctx_t ctx);
0549
0550
0551
0552
0553 FMPQ_MPOLY_INLINE
0554 void fmpq_mpoly_neg(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0555 const fmpq_mpoly_ctx_t ctx)
0556 {
0557 fmpq_neg(A->content, B->content);
0558 fmpz_mpoly_set(A->zpoly, B->zpoly, ctx->zctx);
0559 }
0560
0561 void fmpq_mpoly_scalar_mul_fmpq(fmpq_mpoly_t A,
0562 const fmpq_mpoly_t B, const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0563
0564 void fmpq_mpoly_scalar_mul_fmpz(fmpq_mpoly_t A,
0565 const fmpq_mpoly_t B, const fmpz_t c, const fmpq_mpoly_ctx_t ctx);
0566
0567 void fmpq_mpoly_scalar_mul_ui(fmpq_mpoly_t A,
0568 const fmpq_mpoly_t B, ulong c, const fmpq_mpoly_ctx_t ctx);
0569
0570 void fmpq_mpoly_scalar_mul_si(fmpq_mpoly_t A,
0571 const fmpq_mpoly_t B, slong c, const fmpq_mpoly_ctx_t ctx);
0572
0573 void fmpq_mpoly_scalar_div_fmpq(fmpq_mpoly_t A,
0574 const fmpq_mpoly_t B, const fmpq_t c, const fmpq_mpoly_ctx_t ctx);
0575
0576 void fmpq_mpoly_scalar_div_fmpz(fmpq_mpoly_t A,
0577 const fmpq_mpoly_t B, const fmpz_t c, const fmpq_mpoly_ctx_t ctx);
0578
0579 void fmpq_mpoly_scalar_div_ui(fmpq_mpoly_t A,
0580 const fmpq_mpoly_t B, ulong c, const fmpq_mpoly_ctx_t ctx);
0581
0582 void fmpq_mpoly_scalar_div_si(fmpq_mpoly_t A,
0583 const fmpq_mpoly_t B, slong c, const fmpq_mpoly_ctx_t ctx);
0584
0585 void fmpq_mpoly_make_monic(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0586 const fmpq_mpoly_ctx_t ctx);
0587
0588 void _fmpq_mpoly_make_monic_inplace(fmpq_mpoly_t A, const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx));
0589
0590
0591
0592
0593 void fmpq_mpoly_derivative(fmpq_mpoly_t A,
0594 const fmpq_mpoly_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0595
0596 void fmpq_mpoly_integral(fmpq_mpoly_t A,
0597 const fmpq_mpoly_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0598
0599
0600
0601
0602 int _fmpq_mpoly_rescale(fmpq_t Acontent, fmpz * Acoeff,
0603 const fmpq_mpoly_t B, const fmpq * scales, const fmpq_mpoly_ctx_t ctx);
0604
0605 int fmpq_mpoly_evaluate_all_fmpq(fmpq_t ev, const fmpq_mpoly_t A,
0606 fmpq * const * vals, const fmpq_mpoly_ctx_t ctx);
0607
0608 int fmpq_mpoly_evaluate_one_fmpq(fmpq_mpoly_t A,
0609 const fmpq_mpoly_t B, slong var, const fmpq_t val,
0610 const fmpq_mpoly_ctx_t ctx);
0611
0612 int fmpq_mpoly_compose_fmpq_poly(fmpq_poly_t A,
0613 const fmpq_mpoly_t B, fmpq_poly_struct * const * C,
0614 const fmpq_mpoly_ctx_t ctxB);
0615
0616 int fmpq_mpoly_compose_fmpq_mpoly(fmpq_mpoly_t A,
0617 const fmpq_mpoly_t B, fmpq_mpoly_struct * const * C,
0618 const fmpq_mpoly_ctx_t ctxB, const fmpq_mpoly_ctx_t ctxAC);
0619
0620 void fmpq_mpoly_compose_fmpq_mpoly_gen(fmpq_mpoly_t A,
0621 const fmpq_mpoly_t B, const slong * c,
0622 const fmpq_mpoly_ctx_t ctxB, const fmpq_mpoly_ctx_t ctxAC);
0623
0624
0625
0626
0627 void fmpq_mpoly_mul(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0628 const fmpq_mpoly_t C, const fmpq_mpoly_ctx_t ctx);
0629
0630
0631
0632 int fmpq_mpoly_pow_fmpz(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0633 const fmpz_t k, const fmpq_mpoly_ctx_t ctx);
0634
0635 int fmpq_mpoly_pow_ui(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0636 ulong k, const fmpq_mpoly_ctx_t ctx);
0637
0638
0639
0640 int fmpq_mpoly_divides(fmpq_mpoly_t poly1,
0641 const fmpq_mpoly_t poly2, const fmpq_mpoly_t poly3,
0642 const fmpq_mpoly_ctx_t ctx);
0643
0644 void fmpq_mpoly_div(fmpq_mpoly_t q,
0645 const fmpq_mpoly_t poly2, const fmpq_mpoly_t poly3,
0646 const fmpq_mpoly_ctx_t ctx);
0647
0648 void fmpq_mpoly_divrem(fmpq_mpoly_t q, fmpq_mpoly_t r,
0649 const fmpq_mpoly_t poly2, const fmpq_mpoly_t poly3,
0650 const fmpq_mpoly_ctx_t ctx);
0651
0652 void fmpq_mpoly_divrem_ideal(fmpq_mpoly_struct ** q, fmpq_mpoly_t r,
0653 const fmpq_mpoly_t poly2, fmpq_mpoly_struct * const * poly3, slong len,
0654 const fmpq_mpoly_ctx_t ctx);
0655
0656
0657
0658 int fmpq_mpoly_sqrt(fmpq_mpoly_t Q, const fmpq_mpoly_t A,
0659 const fmpq_mpoly_ctx_t ctx);
0660
0661 FMPQ_MPOLY_INLINE
0662 int fmpq_mpoly_is_square(const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx)
0663 {
0664 return fmpz_is_square(fmpq_numref(A->content)) &&
0665 fmpz_is_square(fmpq_denref(A->content)) &&
0666 fmpz_mpoly_is_square(A->zpoly, ctx->zctx);
0667 }
0668
0669
0670
0671 FMPQ_MPOLY_INLINE
0672 void fmpq_mpoly_content(fmpq_t g, const fmpq_mpoly_t A,
0673 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0674 {
0675 fmpq_abs(g, A->content);
0676 }
0677
0678 void fmpq_mpoly_term_content(fmpq_mpoly_t M, const fmpq_mpoly_t A,
0679 const fmpq_mpoly_ctx_t ctx);
0680
0681 int fmpq_mpoly_content_vars(fmpq_mpoly_t g, const fmpq_mpoly_t A,
0682 slong * vars, slong vars_length, const fmpq_mpoly_ctx_t ctx);
0683
0684 int fmpq_mpoly_gcd(fmpq_mpoly_t G, const fmpq_mpoly_t A,
0685 const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0686
0687 void fmpq_mpoly_inflate(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0688 const fmpz * shift, const fmpz * stride, const fmpq_mpoly_ctx_t ctx);
0689
0690 int fmpq_mpoly_gcd_cofactors(fmpq_mpoly_t G, fmpq_mpoly_t Abar,
0691 fmpq_mpoly_t Bbar, const fmpq_mpoly_t A, const fmpq_mpoly_t B,
0692 const fmpq_mpoly_ctx_t ctx);
0693
0694 int fmpq_mpoly_gcd_hensel(fmpq_mpoly_t G,
0695 const fmpq_mpoly_t A, const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0696
0697 int fmpq_mpoly_gcd_brown(fmpq_mpoly_t G,
0698 const fmpq_mpoly_t A, const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0699
0700 int fmpq_mpoly_gcd_subresultant(fmpq_mpoly_t G,
0701 const fmpq_mpoly_t A, const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0702
0703 int fmpq_mpoly_gcd_zippel(fmpq_mpoly_t G,
0704 const fmpq_mpoly_t A, const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0705
0706 int fmpq_mpoly_gcd_zippel2(fmpq_mpoly_t G,
0707 const fmpq_mpoly_t A, const fmpq_mpoly_t B, const fmpq_mpoly_ctx_t ctx);
0708
0709 int fmpq_mpoly_resultant(fmpq_mpoly_t R, const fmpq_mpoly_t A,
0710 const fmpq_mpoly_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0711
0712 int fmpq_mpoly_discriminant(fmpq_mpoly_t R, const fmpq_mpoly_t A,
0713 slong var, const fmpq_mpoly_ctx_t ctx);
0714
0715
0716
0717
0718
0719
0720
0721 void mpoly_void_ring_init_fmpq_mpoly_ctx(mpoly_void_ring_t R,
0722 const fmpq_mpoly_ctx_t ctx);
0723
0724 int fmpq_mpoly_repack_bits(fmpq_mpoly_t A, const fmpq_mpoly_t B,
0725 flint_bitcnt_t Abits, const fmpq_mpoly_ctx_t ctx);
0726
0727
0728
0729 void fmpq_mpoly_univar_init(fmpq_mpoly_univar_t A,
0730 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx));
0731
0732 void fmpq_mpoly_univar_clear(fmpq_mpoly_univar_t A,
0733 const fmpq_mpoly_ctx_t ctx);
0734
0735 void fmpq_mpoly_univar_fit_length(fmpq_mpoly_univar_t A,
0736 slong length, const fmpq_mpoly_ctx_t ctx);
0737
0738 void fmpq_mpoly_univar_print_pretty(const fmpq_mpoly_univar_t A,
0739 const char ** x, const fmpq_mpoly_ctx_t ctx);
0740
0741 void fmpq_mpoly_univar_assert_canonical(fmpq_mpoly_univar_t A,
0742 const fmpq_mpoly_ctx_t ctx);
0743
0744 void fmpq_mpoly_to_univar(fmpq_mpoly_univar_t A,
0745 const fmpq_mpoly_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0746
0747 void fmpq_mpoly_from_univar_bits(fmpq_mpoly_t A, flint_bitcnt_t Abits,
0748 const fmpq_mpoly_univar_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0749
0750 void fmpq_mpoly_from_univar(fmpq_mpoly_t A,
0751 const fmpq_mpoly_univar_t B, slong var, const fmpq_mpoly_ctx_t ctx);
0752
0753 FMPQ_MPOLY_INLINE
0754 void fmpq_mpoly_univar_swap(fmpq_mpoly_univar_t A, fmpq_mpoly_univar_t B,
0755 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0756 {
0757 FLINT_SWAP(fmpq_mpoly_univar_struct, *A, *B);
0758 }
0759
0760 FMPQ_MPOLY_INLINE
0761 int fmpq_mpoly_univar_degree_fits_si(const fmpq_mpoly_univar_t A,
0762 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0763 {
0764 return A->length == 0 || fmpz_fits_si(A->exps + 0);
0765 }
0766
0767 FMPQ_MPOLY_INLINE
0768 slong fmpq_mpoly_univar_length(const fmpq_mpoly_univar_t A,
0769 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0770 {
0771 return A->length;
0772 }
0773
0774 FMPQ_MPOLY_INLINE
0775 slong fmpq_mpoly_univar_get_term_exp_si(fmpq_mpoly_univar_t A, slong i,
0776 const fmpq_mpoly_ctx_t FLINT_UNUSED(ctx))
0777 {
0778 FLINT_ASSERT((ulong)i < (ulong)A->length);
0779 return fmpz_get_si(A->exps + i);
0780 }
0781
0782 FMPQ_MPOLY_INLINE
0783 void fmpq_mpoly_univar_get_term_coeff(fmpq_mpoly_t c,
0784 const fmpq_mpoly_univar_t A, slong i, const fmpq_mpoly_ctx_t ctx)
0785 {
0786 FLINT_ASSERT((ulong)i < (ulong)A->length);
0787 fmpq_mpoly_set(c, A->coeffs + i, ctx);
0788 }
0789
0790 FMPQ_MPOLY_INLINE
0791 void fmpq_mpoly_univar_swap_term_coeff(fmpq_mpoly_t c,
0792 fmpq_mpoly_univar_t A, slong i, const fmpq_mpoly_ctx_t ctx)
0793 {
0794 FLINT_ASSERT((ulong)i < (ulong)A->length);
0795 fmpq_mpoly_swap(c, A->coeffs + i, ctx);
0796 }
0797
0798
0799
0800
0801
0802
0803
0804
0805 void fmpq_mpoly_remainder_test(const fmpq_mpoly_t r, const fmpq_mpoly_t g, const fmpq_mpoly_ctx_t ctx);
0806
0807 #ifdef __cplusplus
0808 }
0809 #endif
0810
0811 #endif