Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2018 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 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 /* Context object ************************************************************/
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 /* Polynomials over Q ********************************************************/
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 /* Internal type definitions *************************************************/
0086 
0087 /*
0088     fmpq_mpoly_univar_t
0089     sparse univariates with multivariate coefficients
0090 */
0091 typedef struct
0092 {
0093    fmpq_mpoly_struct * coeffs; /* multivariate coefficients */
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 /*  Memory management ********************************************************/
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 /* Input/output **************************************************************/
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 /*  Basic manipulation *******************************************************/
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 /* Constants *****************************************************************/
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 /* Degrees *******************************************************************/
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 /* Coefficients **************************************************************/
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 /* conversion ****************************************************************/
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 /* comparison ****************************************************************/
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 /* container operations ******************************************************/
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 /* Random generation *********************************************************/
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 /* Basic arithmetic **********************************************************/
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 /* Scalar operations *********************************************************/
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 /* Differentiation/Integration ***********************************************/
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 /* Evaluation ****************************************************************/
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 /* Multiplication ************************************************************/
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 /* Powering ******************************************************************/
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 /* Division ******************************************************************/
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 /* Square root ***************************************************************/
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 /* GCD ***********************************************************************/
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    Internal functions (guaranteed to change without notice)
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 /* Univariates ***************************************************************/
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    Internal consistency checks
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