Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2016-2017 William Hart
0003     Copyright (C) 2017-2020 Daniel Schultz
0004 
0005     This file is part of FLINT.
0006 
0007     FLINT is free software: you can redistribute it and/or modify it under
0008     the terms of the GNU Lesser General Public License (LGPL) as published
0009     by the Free Software Foundation; either version 3 of the License, or
0010     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
0011 */
0012 
0013 #ifndef FMPZ_MPOLY_H
0014 #define FMPZ_MPOLY_H
0015 
0016 #ifdef FMPZ_MPOLY_INLINES_C
0017 #define FMPZ_MPOLY_INLINE
0018 #else
0019 #define FMPZ_MPOLY_INLINE static inline
0020 #endif
0021 
0022 #include "longlong.h"
0023 #include "acb_types.h"
0024 #include "mpoly_types.h"
0025 
0026 #ifdef __cplusplus
0027 extern "C" {
0028 #endif
0029 
0030 FMPZ_MPOLY_INLINE
0031 fmpz * fmpz_mpoly_term_coeff_ref(fmpz_mpoly_t A, slong i,
0032                                                     const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0033 {
0034     FLINT_ASSERT(i < A->length);
0035     return A->coeffs + i;
0036 }
0037 
0038 FMPZ_MPOLY_INLINE fmpz * fmpz_mpoly_leadcoeff(const fmpz_mpoly_t A)
0039 {
0040     FLINT_ASSERT(A->length > 0);
0041     return A->coeffs + 0;
0042 }
0043 
0044 /* Internal type definitions *************************************************/
0045 
0046 /*
0047     fmpz_mpoly_univar_t
0048     sparse univariates with multivariate coefficients
0049 */
0050 typedef struct
0051 {
0052    fmpz_mpoly_struct * coeffs; /* multivariate coefficients */
0053    fmpz * exps;
0054    slong alloc;
0055    slong length;
0056 } fmpz_mpoly_univar_struct;
0057 
0058 typedef fmpz_mpoly_univar_struct fmpz_mpoly_univar_t[1];
0059 
0060 /*
0061     fmpz_mpolyd_t
0062     A dense mpoly is stored as a flat array of coefficients.
0063     Suppose deg_bounds = {r0, r1, r2}. The coefficient of the monomial with
0064     exponents {e0, e1, e2} is stored at the coefficient of index
0065         e2 + r2*(e1 + r1*(e0 + r0*0))
0066 */
0067 typedef struct
0068 {
0069     slong nvars;
0070     slong degb_alloc;
0071     slong * deg_bounds;
0072     slong length;           /* usage is inconsistent currently */
0073     slong coeff_alloc;
0074     fmpz * coeffs;
0075 } fmpz_mpolyd_struct;
0076 
0077 typedef fmpz_mpolyd_struct fmpz_mpolyd_t[1];
0078 
0079 /* Context object ************************************************************/
0080 
0081 void fmpz_mpoly_ctx_init(fmpz_mpoly_ctx_t ctx,
0082                                             slong nvars, const ordering_t ord);
0083 
0084 void fmpz_mpoly_ctx_init_rand(fmpz_mpoly_ctx_t mctx, flint_rand_t state, slong max_nvars);
0085 
0086 
0087 void fmpz_mpoly_ctx_clear(fmpz_mpoly_ctx_t ctx);
0088 
0089 FMPZ_MPOLY_INLINE
0090 slong fmpz_mpoly_ctx_nvars(const fmpz_mpoly_ctx_t ctx)
0091 {
0092     return ctx->minfo->nvars;
0093 }
0094 
0095 FMPZ_MPOLY_INLINE
0096 ordering_t fmpz_mpoly_ctx_ord(const fmpz_mpoly_ctx_t ctx)
0097 {
0098     return ctx->minfo->ord;
0099 }
0100 
0101 
0102 /*  Memory management ********************************************************/
0103 
0104 void fmpz_mpoly_init(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0105 
0106 void fmpz_mpoly_init2(fmpz_mpoly_t A, slong alloc, const fmpz_mpoly_ctx_t ctx);
0107 
0108 void fmpz_mpoly_init3(fmpz_mpoly_t A, slong alloc, flint_bitcnt_t bits,
0109                                                    const fmpz_mpoly_ctx_t ctx);
0110 
0111 void _fmpz_mpoly_realloc(fmpz ** Acoeff, ulong ** Aexp,
0112                                            slong * Aalloc, slong len, slong N);
0113 
0114 void fmpz_mpoly_realloc(fmpz_mpoly_t A, slong alloc,
0115                                                    const fmpz_mpoly_ctx_t ctx);
0116 
0117 void _fmpz_mpoly_fit_length(fmpz ** Acoeff,
0118                             ulong ** Aexp, slong * Aalloc, slong len, slong N);
0119 
0120 void fmpz_mpoly_fit_length(fmpz_mpoly_t A, slong len,
0121                                                    const fmpz_mpoly_ctx_t ctx);
0122 
0123 void fmpz_mpoly_fit_length_reset_bits(fmpz_mpoly_t A, slong len,
0124                               flint_bitcnt_t bits, const fmpz_mpoly_ctx_t ctx);
0125 
0126 void fmpz_mpoly_clear(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0127 
0128 void _fmpz_mpoly_set_length(fmpz_mpoly_t A, slong newlen, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0129 
0130 void fmpz_mpoly_truncate(fmpz_mpoly_t A, slong newlen, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0131 
0132 void fmpz_mpoly_fit_bits(fmpz_mpoly_t A,
0133                                   flint_bitcnt_t bits, const fmpz_mpoly_ctx_t ctx);
0134 
0135 /* Input/output **************************************************************/
0136 
0137 int fmpz_mpoly_set_str_pretty(fmpz_mpoly_t A, const char * str,
0138                                   const char ** x, const fmpz_mpoly_ctx_t ctx);
0139 
0140 char * _fmpz_mpoly_get_str_pretty(const fmpz * poly,
0141                           const ulong * exps, slong len, const char ** x,
0142                                            slong bits, const mpoly_ctx_t mctx);
0143 
0144 char * fmpz_mpoly_get_str_pretty(const fmpz_mpoly_t A,
0145                                   const char ** x, const fmpz_mpoly_ctx_t ctx);
0146 
0147 #ifdef FLINT_HAVE_FILE
0148 int _fmpz_mpoly_fprint_pretty(FILE * file, const fmpz * poly, const ulong * exps, slong len, const char ** x_in, flint_bitcnt_t bits, const mpoly_ctx_t mctx);
0149 int fmpz_mpoly_fprint_pretty(FILE * file, const fmpz_mpoly_t A, const char ** x, const fmpz_mpoly_ctx_t ctx);
0150 #endif
0151 
0152 int _fmpz_mpoly_print_pretty(const fmpz * poly, const ulong * exps, slong len, const char ** x, slong bits, const mpoly_ctx_t mctx);
0153 int fmpz_mpoly_print_pretty(const fmpz_mpoly_t A, const char ** x, const fmpz_mpoly_ctx_t ctx);
0154 
0155 /*  Basic manipulation *******************************************************/
0156 
0157 void fmpz_mpoly_gen(fmpz_mpoly_t poly, slong i, const fmpz_mpoly_ctx_t ctx);
0158 
0159 int fmpz_mpoly_is_gen(const fmpz_mpoly_t poly, slong k, const fmpz_mpoly_ctx_t ctx);
0160 
0161 void _fmpz_mpoly_set(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong n, slong N);
0162 void fmpz_mpoly_set(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0163 
0164 int _fmpz_mpoly_equal(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong n, slong N);
0165 int fmpz_mpoly_equal(const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0166 
0167 FMPZ_MPOLY_INLINE
0168 void fmpz_mpoly_swap(fmpz_mpoly_t A, fmpz_mpoly_t B, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0169 {
0170     FLINT_SWAP(fmpz_mpoly_struct, *A, *B);
0171 }
0172 
0173 FMPZ_MPOLY_INLINE
0174 int _fmpz_mpoly_fits_small(const fmpz * poly, slong len)
0175 {
0176    slong i;
0177    for (i = 0; i < len; i++)
0178    {
0179       if (COEFF_IS_MPZ(poly[i]))
0180          return 0;
0181    }
0182    return 1;
0183 }
0184 
0185 slong fmpz_mpoly_max_bits(const fmpz_mpoly_t A);
0186 
0187 /* Constants *****************************************************************/
0188 
0189 int fmpz_mpoly_is_fmpz(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0190 
0191 void fmpz_mpoly_get_fmpz(fmpz_t c, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0192 
0193 void fmpz_mpoly_set_si(fmpz_mpoly_t A, slong c, const fmpz_mpoly_ctx_t ctx);
0194 void fmpz_mpoly_set_ui(fmpz_mpoly_t A, ulong c, const fmpz_mpoly_ctx_t ctx);
0195 void fmpz_mpoly_set_fmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0196 
0197 FMPZ_MPOLY_INLINE
0198 void fmpz_mpoly_zero(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx)
0199 {
0200    _fmpz_mpoly_set_length(A, 0, ctx);
0201 }
0202 
0203 FMPZ_MPOLY_INLINE
0204 void fmpz_mpoly_one(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx)
0205 {
0206     fmpz_mpoly_set_ui(A, UWORD(1), ctx);
0207 }
0208 
0209 int fmpz_mpoly_equal_si(const fmpz_mpoly_t A, slong c, const fmpz_mpoly_ctx_t ctx);
0210 int fmpz_mpoly_equal_ui(const fmpz_mpoly_t A, ulong c, const fmpz_mpoly_ctx_t ctx);
0211 int fmpz_mpoly_equal_fmpz(const fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0212 
0213 FMPZ_MPOLY_INLINE
0214 int fmpz_mpoly_is_zero(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0215 {
0216    return A->length == 0;
0217 }
0218 
0219 FMPZ_MPOLY_INLINE
0220 int fmpz_mpoly_is_one(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx)
0221 {
0222    return fmpz_mpoly_equal_ui(A, UWORD(1), ctx);
0223 }
0224 
0225 
0226 /* Degrees *******************************************************************/
0227 
0228 int fmpz_mpoly_degrees_fit_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0229 
0230 void fmpz_mpoly_degrees_fmpz(fmpz ** degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0231 void fmpz_mpoly_degrees_si(slong * degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0232 
0233 void fmpz_mpoly_degree_fmpz(fmpz_t deg, const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx);
0234 slong fmpz_mpoly_degree_si(const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx);
0235 
0236 int fmpz_mpoly_total_degree_fits_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0237 
0238 void fmpz_mpoly_total_degree_fmpz(fmpz_t td, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0239 slong fmpz_mpoly_total_degree_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0240 
0241 void fmpz_mpoly_used_vars(int * used, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0242 
0243 /* Coefficients **************************************************************/
0244 
0245 slong fmpz_mpoly_get_coeff_si_fmpz(const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0246 ulong fmpz_mpoly_get_coeff_ui_fmpz(const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0247 void fmpz_mpoly_get_coeff_fmpz_fmpz(fmpz_t c, const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0248 
0249 slong fmpz_mpoly_get_coeff_si_ui(const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0250 ulong fmpz_mpoly_get_coeff_ui_ui(const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0251 void fmpz_mpoly_get_coeff_fmpz_ui(fmpz_t c, const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0252 
0253 void fmpz_mpoly_get_coeff_fmpz_monomial(fmpz_t c, const fmpz_mpoly_t A, const fmpz_mpoly_t M, const fmpz_mpoly_ctx_t ctx);
0254 
0255 void fmpz_mpoly_set_coeff_si_ui(fmpz_mpoly_t A, const slong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0256 void fmpz_mpoly_set_coeff_ui_ui(fmpz_mpoly_t A, const ulong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0257 void fmpz_mpoly_set_coeff_fmpz_ui(fmpz_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0258 
0259 void fmpz_mpoly_set_coeff_si_fmpz(fmpz_mpoly_t A, const slong c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0260 void fmpz_mpoly_set_coeff_ui_fmpz(fmpz_mpoly_t A, const ulong c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0261 void _fmpz_mpoly_set_coeff_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz * exp, const fmpz_mpoly_ctx_t ctx);
0262 void fmpz_mpoly_set_coeff_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0263 
0264 void fmpz_mpoly_set_coeff_fmpz_monomial(fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_t M, const fmpz_mpoly_ctx_t ctx);
0265 
0266 void fmpz_mpoly_get_coeff_vars_ui(fmpz_mpoly_t C, const fmpz_mpoly_t A, const slong * vars, const ulong * exps, slong length, const fmpz_mpoly_ctx_t ctx);
0267 
0268 /* conversion ****************************************************************/
0269 
0270 int fmpz_mpoly_is_fmpz_poly(const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx);
0271 
0272 int fmpz_mpoly_get_fmpz_poly(fmpz_poly_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0273 
0274 void _fmpz_mpoly_set_fmpz_poly(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz * Bcoeffs, slong Blen, slong var, const fmpz_mpoly_ctx_t ctx);
0275 void fmpz_mpoly_set_fmpz_poly(fmpz_mpoly_t A, const fmpz_poly_t B, slong v, const fmpz_mpoly_ctx_t ctx);
0276 
0277 void _fmpz_mpoly_set_fmpz_poly_one_var(fmpz_mpoly_t A, flint_bitcnt_t Aminbits, fmpz * Acoeffs, slong Adeg, const fmpz_mpoly_ctx_t ctx);
0278 
0279 void fmpz_mpoly_set_gen_fmpz_poly(fmpz_mpoly_t res, slong var, const fmpz_poly_t pol, const fmpz_mpoly_ctx_t ctx);
0280 
0281 /* comparison ****************************************************************/
0282 
0283 int fmpz_mpoly_cmp(const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0284 
0285 /* container operations ******************************************************/
0286 
0287 int fmpz_mpoly_is_canonical(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0288 
0289 FMPZ_MPOLY_INLINE
0290 slong fmpz_mpoly_length(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0291 {
0292     return A->length;
0293 }
0294 
0295 void fmpz_mpoly_resize(fmpz_mpoly_t A, slong new_length, const fmpz_mpoly_ctx_t ctx);
0296 
0297 void fmpz_mpoly_get_term_coeff_fmpz(fmpz_t c, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0298 ulong fmpz_mpoly_get_term_coeff_ui(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0299 slong fmpz_mpoly_get_term_coeff_si(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0300 
0301 void fmpz_mpoly_set_term_coeff_fmpz(fmpz_mpoly_t A, slong i, const fmpz_t c, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0302 void fmpz_mpoly_set_term_coeff_ui(fmpz_mpoly_t A, slong i, ulong c, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0303 void fmpz_mpoly_set_term_coeff_si(fmpz_mpoly_t A, slong i, slong c, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0304 
0305 int fmpz_mpoly_term_exp_fits_ui(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0306 int fmpz_mpoly_term_exp_fits_si(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0307 
0308 void fmpz_mpoly_get_term_exp_si(slong * exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0309 void fmpz_mpoly_get_term_exp_ui(ulong * exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0310 void fmpz_mpoly_get_term_exp_fmpz(fmpz ** exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0311 
0312 slong fmpz_mpoly_get_term_var_exp_si(const fmpz_mpoly_t A, slong i, slong var, const fmpz_mpoly_ctx_t ctx);
0313 ulong fmpz_mpoly_get_term_var_exp_ui(const fmpz_mpoly_t A, slong i, slong var, const fmpz_mpoly_ctx_t ctx);
0314 
0315 void fmpz_mpoly_get_term(fmpz_mpoly_t M, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0316 
0317 void fmpz_mpoly_get_term_monomial(fmpz_mpoly_t M, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx);
0318 
0319 void fmpz_mpoly_set_term_exp_ui(fmpz_mpoly_t A, slong i, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0320 void fmpz_mpoly_set_term_exp_fmpz(fmpz_mpoly_t A, slong i, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0321 
0322 void fmpz_mpoly_push_term_si_ui(fmpz_mpoly_t A, slong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0323 void fmpz_mpoly_push_term_si_fmpz(fmpz_mpoly_t A, slong c, fmpz *const *exp, const fmpz_mpoly_ctx_t ctx);
0324 void fmpz_mpoly_push_term_si_ffmpz(fmpz_mpoly_t A, slong c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx);
0325 
0326 void fmpz_mpoly_push_term_ui_ui(fmpz_mpoly_t A, ulong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0327 void fmpz_mpoly_push_term_ui_fmpz(fmpz_mpoly_t A, ulong c, fmpz *const *exp, const fmpz_mpoly_ctx_t ctx);
0328 void fmpz_mpoly_push_term_ui_ffmpz(fmpz_mpoly_t A, ulong c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx);
0329 
0330 void fmpz_mpoly_push_term_fmpz_ui(fmpz_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0331 void fmpz_mpoly_push_term_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0332 void fmpz_mpoly_push_term_fmpz_ffmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx);
0333 
0334 void _fmpz_mpoly_push_exp_ui(fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx);
0335 void _fmpz_mpoly_push_exp_ffmpz(fmpz_mpoly_t A, const fmpz * exp, const fmpz_mpoly_ctx_t ctx);
0336 void _fmpz_mpoly_push_exp_pfmpz(fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx);
0337 
0338 void fmpz_mpoly_combine_like_terms(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0339 
0340 void fmpz_mpoly_reverse(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0341 
0342 void fmpz_mpoly_sort_terms(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0343 
0344 void _fmpz_mpoly_radix_sort1(fmpz_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask);
0345 void _fmpz_mpoly_radix_sort(fmpz_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask);
0346 
0347 void fmpz_mpoly_assert_canonical(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0348 
0349 /* Random generation *********************************************************/
0350 
0351 void fmpz_mpoly_randtest_bound(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, ulong exp_bound, const fmpz_mpoly_ctx_t ctx);
0352 void fmpz_mpoly_randtest_bounds(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, ulong * exp_bounds, const fmpz_mpoly_ctx_t ctx);
0353 
0354 void fmpz_mpoly_randtest_bits(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, flint_bitcnt_t exp_bits, const fmpz_mpoly_ctx_t ctx);
0355 
0356 /* Addition/Subtraction ******************************************************/
0357 
0358 void fmpz_mpoly_add_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx);
0359 void fmpz_mpoly_add_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx);
0360 void fmpz_mpoly_add_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0361 slong _fmpz_mpoly_add(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong len2, const fmpz * poly3, const ulong * exps3, slong len3, slong N, const ulong * cmpmask);
0362 void fmpz_mpoly_add(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0363 
0364 void fmpz_mpoly_sub_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx);
0365 void fmpz_mpoly_sub_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx);
0366 void fmpz_mpoly_sub_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0367 slong _fmpz_mpoly_sub(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong len2, const fmpz * poly3, const ulong * exps3, slong len3, slong N, const ulong * cmpmask);
0368 void fmpz_mpoly_sub(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0369 
0370 /* Scalar operations *********************************************************/
0371 
0372 void fmpz_mpoly_neg(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0373 
0374 void fmpz_mpoly_scalar_mul_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx);
0375 void fmpz_mpoly_scalar_mul_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx);
0376 void fmpz_mpoly_scalar_mul_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0377 
0378 void fmpz_mpoly_scalar_fmma(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_t D, const fmpz_t e, const fmpz_mpoly_ctx_t ctx);
0379 
0380 void fmpz_mpoly_scalar_divexact_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx);
0381 void fmpz_mpoly_scalar_divexact_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx);
0382 void fmpz_mpoly_scalar_divexact_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0383 
0384 int fmpz_mpoly_scalar_divides_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx);
0385 int fmpz_mpoly_scalar_divides_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx);
0386 int fmpz_mpoly_scalar_divides_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx);
0387 
0388 /* Differentiation/Integration ***********************************************/
0389 
0390 void fmpz_mpoly_derivative(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0391 
0392 void fmpz_mpoly_integral(fmpz_mpoly_t A, fmpz_t scale, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0393 
0394 /* Evaluation ****************************************************************/
0395 
0396 int _fmpz_pow_ui_is_not_feasible(flint_bitcnt_t bbits, ulong e);
0397 int _fmpz_pow_fmpz_is_not_feasible(flint_bitcnt_t bbits, const fmpz_t e);
0398 
0399 int fmpz_mpoly_evaluate_all_fmpz(fmpz_t ev, const fmpz_mpoly_t A, fmpz * const * vals, const fmpz_mpoly_ctx_t ctx);
0400 ulong fmpz_mpoly_evaluate_all_nmod(const fmpz_mpoly_t A, const ulong * alphas, const fmpz_mpoly_ctx_t ctx, nmod_t fpctx);
0401 void fmpz_mpoly_evaluate_all_fmpz_mod(fmpz_t ev, const fmpz_mpoly_t A, const fmpz * alphas, const fmpz_mpoly_ctx_t ctx, const fmpz_mod_ctx_t fpctx);
0402 
0403 void fmpz_mpoly_evaluate_acb(acb_t res, const fmpz_mpoly_t pol, acb_srcptr x, slong prec, const fmpz_mpoly_ctx_t ctx);
0404 
0405 int fmpz_mpoly_evaluate_one_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong var, const fmpz_t val, const fmpz_mpoly_ctx_t ctx);
0406 
0407 int fmpz_mpoly_compose_fmpz_poly(fmpz_poly_t A, const fmpz_mpoly_t B, fmpz_poly_struct * const * C, const fmpz_mpoly_ctx_t ctxB);
0408 
0409 void _fmpz_mpoly_compose_mat(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mat_t M, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC);
0410 
0411 int fmpz_mpoly_compose_fmpz_mpoly_geobucket(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC);
0412 int fmpz_mpoly_compose_fmpz_mpoly_horner(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC);
0413 int fmpz_mpoly_compose_fmpz_mpoly(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC);
0414 
0415 void fmpz_mpoly_compose_fmpz_mpoly_gen(fmpz_mpoly_t A, const fmpz_mpoly_t B, const slong * c, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC);
0416 
0417 /* Multiplication ************************************************************/
0418 
0419 void fmpz_mpoly_mul(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0420 
0421 void fmpz_mpoly_mul_monomial(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0422 
0423 void _fmpz_mpoly_mul_johnson_maxfields(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx);
0424 slong _fmpz_mpoly_mul_johnson(fmpz ** poly1, ulong ** exp1, slong * alloc, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask);
0425 void fmpz_mpoly_mul_johnson(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0426 
0427 void _fmpz_mpoly_mul_heap_threaded_pool_maxfields(fmpz_mpoly_t A,
0428            const fmpz_mpoly_t B, fmpz * maxBfields,
0429            const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx,
0430                         const thread_pool_handle * handles, slong num_handles);
0431 void fmpz_mpoly_mul_heap_threaded(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0432 
0433 int fmpz_mpoly_mul_array(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0434 int fmpz_mpoly_mul_array_threaded(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0435 
0436 int _fmpz_mpoly_mul_dense(fmpz_mpoly_t P, const fmpz_mpoly_t A, fmpz * maxAfields, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_ctx_t ctx);
0437 int fmpz_mpoly_mul_dense(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx);
0438 
0439 int _fmpz_mpoly_mul_array_DEG(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx);
0440 int _fmpz_mpoly_mul_array_LEX(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx);
0441 
0442 int _fmpz_mpoly_mul_array_threaded_pool_DEG(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles);
0443 int _fmpz_mpoly_mul_array_threaded_pool_LEX(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles);
0444 
0445 /* Powering ******************************************************************/
0446 
0447 int fmpz_mpoly_pow_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong k, const fmpz_mpoly_ctx_t ctx);
0448 int fmpz_mpoly_pow_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t k, const fmpz_mpoly_ctx_t ctx);
0449 
0450 /* Division ******************************************************************/
0451 
0452 int fmpz_mpoly_divides(fmpz_mpoly_t Q,
0453        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0454 
0455 int fmpz_mpoly_divides_monagan_pearce(fmpz_mpoly_t Q,
0456        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0457 
0458 #if FLINT_KNOW_STRONG_ORDER
0459 #define fmpz_mpoly_divides_heap_threaded fmpz_mpoly_divides_heap_threaded
0460 int fmpz_mpoly_divides_heap_threaded(fmpz_mpoly_t Q,
0461        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0462 
0463 #define _fmpz_mpoly_divides_heap_threaded_pool _fmpz_mpoly_divides_heap_threaded_pool
0464 int _fmpz_mpoly_divides_heap_threaded_pool(fmpz_mpoly_t Q,
0465        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx,
0466                         const thread_pool_handle * handles, slong num_handles);
0467 #endif
0468 
0469 slong _fmpz_mpoly_divides_array(fmpz ** poly1, ulong ** exp1,
0470         slong * alloc, const fmpz * poly2, const ulong * exp2, slong len2,
0471         const fmpz * poly3, const ulong * exp3, slong len3,
0472         slong * mults, slong num, slong bits);
0473 
0474 int fmpz_mpoly_divides_array(fmpz_mpoly_t poly1,
0475         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0476         const fmpz_mpoly_ctx_t ctx);
0477 
0478 int mpoly_divides_select_exps(fmpz_mpoly_t S, fmpz_mpoly_ctx_t zctx,
0479         slong nworkers, ulong * Aexp, slong Alen,
0480         ulong * Bexp, slong Blen, flint_bitcnt_t bits);
0481 
0482 slong _fmpz_mpoly_divides_monagan_pearce(fmpz ** poly1,
0483         ulong ** exp1, slong * alloc, const fmpz * poly2,
0484         const ulong * exp2, slong len2, const fmpz * poly3,
0485         const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N,
0486         const ulong * cmpmask);
0487 
0488 void fmpz_mpoly_divrem(fmpz_mpoly_t Q, fmpz_mpoly_t R,
0489        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0490 
0491 void fmpz_mpoly_quasidivrem(fmpz_t scale, fmpz_mpoly_t Q,
0492         fmpz_mpoly_t R, const fmpz_mpoly_t A, const fmpz_mpoly_t B,
0493         const fmpz_mpoly_ctx_t ctx);
0494 
0495 void fmpz_mpoly_div(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0496 
0497 void fmpz_mpoly_quasidiv(fmpz_t scale, fmpz_mpoly_t Q,
0498        const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0499 
0500 void fmpz_mpoly_divrem_ideal(fmpz_mpoly_struct ** Q,
0501         fmpz_mpoly_t R, const fmpz_mpoly_t A, fmpz_mpoly_struct * const * B,
0502         slong len, const fmpz_mpoly_ctx_t ctx);
0503 
0504 void fmpz_mpoly_quasidivrem_ideal(fmpz_t scale,
0505      fmpz_mpoly_struct ** Q, fmpz_mpoly_t R, const fmpz_mpoly_t A,
0506          fmpz_mpoly_struct * const * B, slong len, const fmpz_mpoly_ctx_t ctx);
0507 
0508 FMPZ_MPOLY_INLINE
0509 void fmpz_mpoly_divexact(fmpz_mpoly_t Q, const fmpz_mpoly_t A,
0510                              const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx)
0511 {
0512     if (fmpz_mpoly_divides(Q, A, B, ctx))
0513         return;
0514 
0515     flint_throw(FLINT_ERROR, "fmpz_mpoly_divexact: nonexact division");
0516 }
0517 
0518 slong _fmpz_mpoly_div_monagan_pearce(fmpz ** polyq,
0519            ulong ** expq, slong * allocq, const fmpz * poly2,
0520    const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3,
0521                        slong len3, slong bits, slong N, const ulong * cmpmask);
0522 
0523 void fmpz_mpoly_div_monagan_pearce(fmpz_mpoly_t q,
0524         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0525         const fmpz_mpoly_ctx_t ctx);
0526 
0527 slong _fmpz_mpoly_divrem_monagan_pearce(slong * lenr,
0528         fmpz ** polyq, ulong ** expq, slong * allocq, fmpz ** polyr,
0529         ulong ** expr, slong * allocr, const fmpz * poly2,
0530         const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3,
0531         slong len3, slong bits, slong N, const ulong * cmpmask);
0532 
0533 void fmpz_mpoly_divrem_monagan_pearce(fmpz_mpoly_t q, fmpz_mpoly_t r,
0534         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0535         const fmpz_mpoly_ctx_t ctx);
0536 
0537 slong _fmpz_mpoly_divrem_array(slong * lenr,
0538         fmpz ** polyq, ulong ** expq, slong * allocq,
0539         fmpz ** polyr, ulong ** expr, slong * allocr,
0540         const fmpz * poly2, const ulong * exp2, slong len2,
0541         const fmpz * poly3, const ulong * exp3, slong len3, slong * mults,
0542         slong num, slong bits);
0543 
0544 int fmpz_mpoly_divrem_array(fmpz_mpoly_t q, fmpz_mpoly_t r,
0545         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0546         const fmpz_mpoly_ctx_t ctx);
0547 
0548 void fmpz_mpoly_quasidivrem_heap(fmpz_t scale,
0549         fmpz_mpoly_t q, fmpz_mpoly_t r,
0550         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0551         const fmpz_mpoly_ctx_t ctx);
0552 
0553 void fmpz_mpoly_quasidiv_heap(fmpz_t scale, fmpz_mpoly_t q,
0554         const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3,
0555         const fmpz_mpoly_ctx_t ctx);
0556 
0557 slong
0558 _fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** polyq,
0559         fmpz ** polyr, ulong ** expr, slong * allocr, const fmpz * poly2,
0560         const ulong * exp2, slong len2, fmpz_mpoly_struct * const * poly3,
0561         ulong * const * exp3, slong len, slong N, slong bits,
0562         const fmpz_mpoly_ctx_t ctx, const ulong * cmpmask);
0563 
0564 void
0565 fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** q, fmpz_mpoly_t r,
0566         const fmpz_mpoly_t poly2, fmpz_mpoly_struct * const * poly3, slong len,
0567         const fmpz_mpoly_ctx_t ctx);
0568 
0569 void
0570 fmpz_mpoly_quasidivrem_ideal_heap(fmpz_t scale,
0571         fmpz_mpoly_struct ** q, fmpz_mpoly_t r,
0572         const fmpz_mpoly_t poly2, fmpz_mpoly_struct * const * poly3,
0573         slong len, const fmpz_mpoly_ctx_t ctx);
0574 
0575 /* Square root ***************************************************************/
0576 
0577 slong _fmpz_mpoly_sqrt_heap(fmpz ** polyq, ulong ** expq, slong * allocq, const fmpz * poly2, const ulong * exp2, slong len2, flint_bitcnt_t bits, const mpoly_ctx_t mctx, int check);
0578 int fmpz_mpoly_sqrt_heap(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx, int check);
0579 
0580 FMPZ_MPOLY_INLINE
0581 int fmpz_mpoly_sqrt(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx)
0582 {
0583     return fmpz_mpoly_sqrt_heap(q, poly2, ctx, 1);
0584 }
0585 
0586 FMPZ_MPOLY_INLINE
0587 int fmpz_mpoly_is_square(const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx)
0588 {
0589     int res;
0590     fmpz_mpoly_t q;
0591     fmpz_mpoly_init(q, ctx);
0592     res = fmpz_mpoly_sqrt_heap(q, poly2, ctx, 1);
0593     fmpz_mpoly_clear(q, ctx);
0594     return res;
0595 }
0596 
0597 /* GCD ***********************************************************************/
0598 
0599 void fmpz_mpoly_term_content(fmpz_mpoly_t M, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0600 
0601 void fmpz_mpoly_primitive_part(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx);
0602 
0603 int fmpz_mpoly_content_vars(fmpz_mpoly_t g, const fmpz_mpoly_t A, slong * vars, slong vars_length, const fmpz_mpoly_ctx_t ctx);
0604 
0605 void fmpz_mpoly_deflation(fmpz * shift, fmpz * stride, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx);
0606 
0607 void fmpz_mpoly_deflate(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mpoly_ctx_t ctx);
0608 void fmpz_mpoly_inflate(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mpoly_ctx_t ctx);
0609 
0610 int fmpz_mpoly_gcd_cofactors(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0611 
0612 int fmpz_mpoly_gcd_hensel(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0613 int fmpz_mpoly_gcd_brown(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0614 int fmpz_mpoly_gcd_subresultant(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0615 int fmpz_mpoly_gcd_zippel(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0616 int fmpz_mpoly_gcd_zippel2(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0617 int fmpz_mpoly_gcd(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx);
0618 
0619 /* Univariates ***************************************************************/
0620 
0621 void fmpz_mpoly_univar_init(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0622 void fmpz_mpoly_univar_clear(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx);
0623 
0624 void fmpz_mpoly_univar_fit_length(fmpz_mpoly_univar_t A, slong length, const fmpz_mpoly_ctx_t ctx);
0625 
0626 void fmpz_mpoly_univar_print_pretty(const fmpz_mpoly_univar_t A, const char ** x, const fmpz_mpoly_ctx_t ctx);
0627 
0628 void fmpz_mpoly_univar_assert_canonical(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx);
0629 
0630 FMPZ_MPOLY_INLINE
0631 void fmpz_mpoly_univar_zero(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0632 {
0633     A->length = 0;
0634 }
0635 
0636 void fmpz_mpoly_univar_set_coeff_ui(fmpz_mpoly_univar_t A,
0637                     ulong e, const fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx);
0638 
0639 void fmpz_mpoly_to_univar(fmpz_mpoly_univar_t A,
0640                   const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0641 
0642 void _fmpz_mpoly_from_univar(fmpz_mpoly_t A, flint_bitcnt_t Abits,
0643            const fmpz_mpoly_univar_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0644 
0645 void fmpz_mpoly_from_univar(fmpz_mpoly_t A,
0646            const fmpz_mpoly_univar_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0647 
0648 FMPZ_MPOLY_INLINE
0649 void fmpz_mpoly_univar_swap(fmpz_mpoly_univar_t A, fmpz_mpoly_univar_t B,
0650                                                     const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0651 {
0652     FLINT_SWAP(fmpz_mpoly_univar_struct, *A, *B);
0653 }
0654 
0655 int fmpz_mpoly_univar_degree_fits_si(const fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0656 
0657 FMPZ_MPOLY_INLINE
0658 slong fmpz_mpoly_univar_length(const fmpz_mpoly_univar_t A,
0659                                                     const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx))
0660 {
0661     return A->length;
0662 }
0663 
0664 slong fmpz_mpoly_univar_get_term_exp_si(fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0665 
0666 FMPZ_MPOLY_INLINE
0667 void fmpz_mpoly_univar_get_term_coeff(fmpz_mpoly_t c,
0668               const fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx)
0669 {
0670     FLINT_ASSERT((ulong)i < (ulong)A->length);
0671     fmpz_mpoly_set(c, A->coeffs + i, ctx);
0672 }
0673 
0674 FMPZ_MPOLY_INLINE
0675 void fmpz_mpoly_univar_swap_term_coeff(fmpz_mpoly_t c,
0676                     fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx)
0677 {
0678     FLINT_ASSERT((ulong)i < (ulong)A->length);
0679     fmpz_mpoly_swap(c, A->coeffs + i, ctx);
0680 }
0681 
0682 int fmpz_mpoly_univar_pseudo_gcd(fmpz_mpoly_univar_t gx,
0683                 const fmpz_mpoly_univar_t ax, const fmpz_mpoly_univar_t bx,
0684                                                    const fmpz_mpoly_ctx_t ctx);
0685 
0686 int fmpz_mpoly_univar_resultant(fmpz_mpoly_t d,
0687                 const fmpz_mpoly_univar_t ax, const fmpz_mpoly_univar_t bx,
0688                                                    const fmpz_mpoly_ctx_t ctx);
0689 
0690 int fmpz_mpoly_univar_discriminant(fmpz_mpoly_t d,
0691                      const fmpz_mpoly_univar_t fx, const fmpz_mpoly_ctx_t ctx);
0692 
0693 int fmpz_mpoly_resultant(fmpz_mpoly_t R, const fmpz_mpoly_t A,
0694                   const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx);
0695 
0696 int fmpz_mpoly_discriminant(fmpz_mpoly_t R, const fmpz_mpoly_t A,
0697                                         slong var, const fmpz_mpoly_ctx_t ctx);
0698 
0699 /* Special polynomials */
0700 
0701 void fmpz_mpoly_symmetric_gens(fmpz_mpoly_t res, ulong k, slong * vars, slong n, const fmpz_mpoly_ctx_t ctx);
0702 void fmpz_mpoly_symmetric(fmpz_mpoly_t res, ulong k, const fmpz_mpoly_ctx_t ctx);
0703 
0704 /* Vectors of multivariate polynomials */
0705 
0706 typedef struct
0707 {
0708     fmpz_mpoly_struct * p;
0709     slong alloc;
0710     slong length;
0711 }
0712 fmpz_mpoly_vec_struct;
0713 
0714 typedef fmpz_mpoly_vec_struct fmpz_mpoly_vec_t[1];
0715 
0716 #define fmpz_mpoly_vec_entry(vec, i) ((vec)->p + (i))
0717 
0718 void fmpz_mpoly_vec_init(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx);
0719 void fmpz_mpoly_vec_print(const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx);
0720 void fmpz_mpoly_vec_swap(fmpz_mpoly_vec_t x, fmpz_mpoly_vec_t y, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0721 void fmpz_mpoly_vec_fit_length(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx);
0722 void fmpz_mpoly_vec_clear(fmpz_mpoly_vec_t vec, const fmpz_mpoly_ctx_t ctx);
0723 void fmpz_mpoly_vec_set(fmpz_mpoly_vec_t dest, const fmpz_mpoly_vec_t src, const fmpz_mpoly_ctx_t ctx);
0724 void fmpz_mpoly_vec_append(fmpz_mpoly_vec_t vec, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx);
0725 slong fmpz_mpoly_vec_insert_unique(fmpz_mpoly_vec_t vec, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx);
0726 void fmpz_mpoly_vec_set_length(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx);
0727 void fmpz_mpoly_vec_randtest_not_zero(fmpz_mpoly_vec_t vec, flint_rand_t state, slong len, slong poly_len, slong bits, ulong exp_bound, fmpz_mpoly_ctx_t ctx);
0728 
0729 /* Ideals and Groenber bases */
0730 
0731 void fmpz_mpoly_spoly(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx);
0732 void fmpz_mpoly_vec_set_primitive_unique(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx);
0733 void fmpz_mpoly_reduction_primitive_part(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_vec_t Iv, const fmpz_mpoly_ctx_t ctx);
0734 int fmpz_mpoly_vec_is_groebner(const fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx);
0735 void fmpz_mpoly_buchberger_naive(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx);
0736 int fmpz_mpoly_buchberger_naive_with_limits(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F,
0737     slong ideal_len_limit, slong poly_len_limit, slong poly_bits_limit, const fmpz_mpoly_ctx_t ctx);
0738 void fmpz_mpoly_vec_autoreduction(fmpz_mpoly_vec_t H, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx);
0739 void fmpz_mpoly_vec_autoreduction_groebner(fmpz_mpoly_vec_t H, const fmpz_mpoly_vec_t G, const fmpz_mpoly_ctx_t ctx);
0740 int fmpz_mpoly_vec_is_autoreduced(const fmpz_mpoly_vec_t G, const fmpz_mpoly_ctx_t ctx);
0741 
0742 /******************************************************************************
0743 
0744    Internal functions (guaranteed to change without notice)
0745 
0746 ******************************************************************************/
0747 
0748 void mpoly_void_ring_init_fmpz_mpoly_ctx(mpoly_void_ring_t R, const fmpz_mpoly_ctx_t ctx);
0749 
0750 void fmpz_mpoly_pow_fps(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong k, const fmpz_mpoly_ctx_t ctx);
0751 
0752 void fmpz_mpolyl_lead_coeff(fmpz_mpoly_t c, const fmpz_mpoly_t A, slong num_vars, const fmpz_mpoly_ctx_t ctx);
0753 
0754 int fmpz_mpolyl_content(fmpz_mpoly_t g, const fmpz_mpoly_t A, slong num_vars, const fmpz_mpoly_ctx_t ctx);
0755 
0756 void _fmpz_mpoly_to_fmpz_poly_deflate(fmpz_poly_t A, const fmpz_mpoly_t B, slong var, const ulong * Bshift, const ulong * Bstride, const fmpz_mpoly_ctx_t ctx);
0757 void fmpz_mpoly_to_fmpz_poly(fmpz_poly_t poly1, slong * poly1_shift, const fmpz_mpoly_t poly2, slong var, const fmpz_mpoly_ctx_t ctx);
0758 void _fmpz_mpoly_from_fmpz_poly_inflate(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_poly_t B, slong var, const ulong * Ashift, const ulong * Astride, const fmpz_mpoly_ctx_t ctx);
0759 void fmpz_mpoly_from_fmpz_poly(fmpz_mpoly_t poly1, const fmpz_poly_t poly2, slong shift2, slong var, const fmpz_mpoly_ctx_t ctx);
0760 
0761 int fmpz_mpoly_repack_bits(fmpz_mpoly_t A, const fmpz_mpoly_t B, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx);
0762 int fmpz_mpoly_repack_bits_inplace(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx);
0763 
0764 typedef struct _fmpz_mpoly_stripe_struct
0765 {
0766     char * big_mem;
0767     slong big_mem_alloc;
0768     slong N;
0769     flint_bitcnt_t bits;
0770     const ulong * cmpmask;
0771     slong * startidx;
0772     slong * endidx;
0773     ulong * emin;
0774     ulong * emax;
0775     flint_bitcnt_t coeff_bits;
0776     int upperclosed;
0777     int flint_small;
0778 } fmpz_mpoly_stripe_struct;
0779 
0780 typedef fmpz_mpoly_stripe_struct fmpz_mpoly_stripe_t[1];
0781 
0782 /* mpolyd ********************************************************************/
0783 
0784 typedef struct
0785 {
0786     slong nvars;
0787     slong * perm;
0788 } fmpz_mpolyd_ctx_struct;
0789 
0790 typedef fmpz_mpolyd_ctx_struct fmpz_mpolyd_ctx_t[1];
0791 
0792 void fmpz_mpolyd_init(fmpz_mpolyd_t poly, slong nvars);
0793 
0794 void fmpz_mpolyd_fit_length(fmpz_mpolyd_t poly, slong len);
0795 
0796 void fmpz_mpolyd_clear(fmpz_mpolyd_t poly);
0797 
0798 /*****************************************************************************/
0799 
0800 typedef struct {
0801     fmpz * powers;
0802     slong length;
0803     slong alloc;
0804     fmpz_t tmp;
0805 } fmpz_pow_cache_t[1];
0806 
0807 void fmpz_pow_cache_init(fmpz_pow_cache_t T, const fmpz_t val);
0808 
0809 void fmpz_pow_cache_clear(fmpz_pow_cache_t T);
0810 
0811 int fmpz_pow_cache_mulpow_ui(fmpz_t a, const fmpz_t b, ulong k, fmpz_pow_cache_t T);
0812 int fmpz_pow_cache_mulpow_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t k, fmpz_pow_cache_t T);
0813 
0814 /*****************************************************************************/
0815 
0816 void fmpz_mpoly_to_mpoly_perm_deflate_threaded_pool(
0817         fmpz_mpoly_t A, const fmpz_mpoly_ctx_t lctx,
0818         const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx,
0819         const slong * perm, const ulong * shift, const ulong * stride,
0820         const thread_pool_handle * handles, slong num_handles);
0821 
0822 void fmpz_mpoly_from_mpoly_perm_inflate(
0823         fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx,
0824         const fmpz_mpoly_t B,  const fmpz_mpoly_ctx_t lctx,
0825         const slong * perm, const ulong * shift, const ulong * stride);
0826 
0827 void fmpz_mpoly_height(fmpz_t max, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0828 void fmpz_mpoly_heights(fmpz_t max, fmpz_t sum, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t FLINT_UNUSED(ctx));
0829 
0830 /* geobuckets ****************************************************************/
0831 
0832 typedef struct fmpz_mpoly_geobucket
0833 {
0834     fmpz_mpoly_struct polys[FLINT_BITS/2];
0835     fmpz_mpoly_struct temps[FLINT_BITS/2];
0836     slong length;
0837 } fmpz_mpoly_geobucket_struct;
0838 
0839 typedef fmpz_mpoly_geobucket_struct fmpz_mpoly_geobucket_t[1];
0840 
0841 void fmpz_mpoly_geobucket_init(fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx);
0842 void fmpz_mpoly_geobucket_clear(fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx);
0843 
0844 void fmpz_mpoly_geobucket_empty(fmpz_mpoly_t p, fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx);
0845 
0846 void fmpz_mpoly_geobucket_fit_length(fmpz_mpoly_geobucket_t B, slong i, const fmpz_mpoly_ctx_t ctx);
0847 
0848 void fmpz_mpoly_geobucket_set(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx);
0849 
0850 void fmpz_mpoly_geobucket_add(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx);
0851 void fmpz_mpoly_geobucket_sub(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx);
0852 
0853 /* Helpers for array methods *************************************************/
0854 
0855 void _fmpz_mpoly_mul_array_chunked_DEG(fmpz_mpoly_t P, const fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong degb, const fmpz_mpoly_ctx_t ctx);
0856 void _fmpz_mpoly_mul_array_chunked_LEX(fmpz_mpoly_t P, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const ulong * mults, const fmpz_mpoly_ctx_t ctx);
0857 
0858 void _fmpz_mpoly_addmul_array1_slong1(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0859 void _fmpz_mpoly_addmul_array1_slong2(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0860 void _fmpz_mpoly_addmul_array1_slong(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0861 
0862 void _fmpz_mpoly_addmul_array1_fmpz(fmpz * poly1, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3);
0863 
0864 void _fmpz_mpoly_submul_array1_slong1(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0865 void _fmpz_mpoly_submul_array1_slong2(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0866 void _fmpz_mpoly_submul_array1_slong(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3);
0867 
0868 void _fmpz_mpoly_submul_array1_fmpz(fmpz * poly1, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3);
0869 
0870 void _fmpz_mpoly_submul_array1_slong2_1(ulong * poly1, slong d, const ulong exp2, const slong * poly3, const ulong * exp3, slong len3);
0871 void _fmpz_mpoly_submul_array1_slong_1(ulong * poly1, slong d, const ulong exp2, const slong * poly3, const ulong * exp3, slong len3);
0872 
0873 void _fmpz_mpoly_submul_array1_fmpz_1(fmpz * poly1, const fmpz_t d, ulong exp2, const fmpz * poly3, const ulong * exp3, slong len3);
0874 
0875 slong fmpz_mpoly_append_array_sm1_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top);
0876 slong fmpz_mpoly_append_array_sm2_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top);
0877 slong fmpz_mpoly_append_array_sm3_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top);
0878 
0879 slong fmpz_mpoly_append_array_fmpz_LEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, const ulong * mults, slong num, slong array_size, slong top);
0880 
0881 slong fmpz_mpoly_append_array_sm1_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0882 slong fmpz_mpoly_append_array_sm2_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0883 slong fmpz_mpoly_append_array_sm3_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0884 
0885 slong fmpz_mpoly_append_array_fmpz_DEGLEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, slong top, slong nvars, slong degb);
0886 
0887 slong fmpz_mpoly_append_array_sm1_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0888 slong fmpz_mpoly_append_array_sm2_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0889 slong fmpz_mpoly_append_array_sm3_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb);
0890 slong fmpz_mpoly_append_array_fmpz_DEGREVLEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, slong top, slong nvars, slong degb);
0891 
0892 slong _fmpz_mpoly_from_ulong_array1(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k);
0893 slong _fmpz_mpoly_from_ulong_array2(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k);
0894 slong _fmpz_mpoly_from_ulong_array(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k);
0895 
0896 slong _fmpz_mpoly_from_fmpz_array(fmpz ** poly1, ulong ** exp1, slong * alloc, fmpz * poly2, const slong * mults, slong num, slong bits, slong k);
0897 
0898 void _fmpz_mpoly_to_ulong_array1(ulong * p, const fmpz * coeffs, const ulong * exps, slong len);
0899 void _fmpz_mpoly_to_ulong_array2(ulong * p, const fmpz * coeffs, const ulong * exps, slong len);
0900 void _fmpz_mpoly_to_ulong_array(ulong * p, const fmpz * coeffs, const ulong * exps, slong len);
0901 
0902 void _fmpz_mpoly_to_fmpz_array(fmpz * p, const fmpz * coeffs, const ulong * exps, slong len);
0903 
0904 /* Misc arithmetic - has nothing to do with mpoly, should be moved out *******/
0905 
0906 void _fmpz_mpoly_add_uiuiui_fmpz(ulong * c, const fmpz_t d);
0907 void _fmpz_mpoly_sub_uiuiui_fmpz(ulong * c, const fmpz_t d);
0908 
0909 FMPZ_MPOLY_INLINE
0910 void _fmpz_mpoly_submul_uiuiui_fmpz(ulong * c, slong d1, slong d2)
0911 {
0912     ulong p[2], p2;
0913     smul_ppmm(p[1], p[0], d1, d2);
0914     p2 = FLINT_SIGN_EXT(p[1]);
0915     sub_dddmmmsss(c[2], c[1], c[0], c[2], c[1], c[0], p2, p[1], p[0]);
0916 }
0917 
0918 FMPZ_MPOLY_INLINE
0919 void _fmpz_mpoly_addmul_uiuiui_fmpz(ulong * c, slong d1, slong d2)
0920 {
0921     ulong p[2], p2;
0922     smul_ppmm(p[1], p[0], d1, d2);
0923     p2 = FLINT_SIGN_EXT(p[1]);
0924     add_sssaaaaaa(c[2], c[1], c[0], c[2], c[1], c[0], p2, p[1], p[0]);
0925 }
0926 
0927 /******************************************************************************
0928 
0929    Internal consistency checks
0930 
0931 ******************************************************************************/
0932 
0933 void fmpz_mpoly_remainder_test(const fmpz_mpoly_t r, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx);
0934 void fmpz_mpoly_remainder_strongtest(const fmpz_mpoly_t r, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx);
0935 
0936 #ifdef __cplusplus
0937 }
0938 #endif
0939 
0940 #endif