Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2020 Fredrik Johansson
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 FMPZ_MPOLY_Q_H
0013 #define FMPZ_MPOLY_Q_H
0014 
0015 #ifdef FMPZ_MPOLY_Q_INLINES_C
0016 #define FMPZ_MPOLY_Q_INLINE
0017 #else
0018 #define FMPZ_MPOLY_Q_INLINE static inline
0019 #endif
0020 
0021 #include "fmpz.h"
0022 #include "fmpz_vec.h"
0023 #include "fmpz_mpoly.h"
0024 #include "acb_types.h"
0025 
0026 #ifdef __cplusplus
0027 extern "C" {
0028 #endif
0029 
0030 #define fmpz_mpoly_q_numref(x) (&((x)->num))
0031 #define fmpz_mpoly_q_denref(x) (&((x)->den))
0032 
0033 /* Memory management */
0034 
0035 void fmpz_mpoly_q_init(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx);
0036 
0037 void fmpz_mpoly_q_clear(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx);
0038 
0039 /* Assignment */
0040 
0041 void fmpz_mpoly_q_swap(fmpz_mpoly_q_t x, fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0042 
0043 void fmpz_mpoly_q_set(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx);
0044 
0045 void fmpz_mpoly_q_set_fmpq(fmpz_mpoly_q_t res, const fmpq_t x, const fmpz_mpoly_ctx_t ctx);
0046 
0047 void fmpz_mpoly_q_set_fmpz(fmpz_mpoly_q_t res, const fmpz_t x, const fmpz_mpoly_ctx_t ctx);
0048 
0049 void fmpz_mpoly_q_set_si(fmpz_mpoly_q_t res, slong x, const fmpz_mpoly_ctx_t ctx);
0050 
0051 /* Canonicalisation */
0052 
0053 void fmpz_mpoly_q_canonicalise(fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx);
0054 
0055 int fmpz_mpoly_q_is_canonical(const fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx);
0056 
0057 /* Properties */
0058 
0059 FMPZ_MPOLY_Q_INLINE int
0060 fmpz_mpoly_q_is_zero(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
0061 {
0062     return fmpz_mpoly_is_zero(fmpz_mpoly_q_numref(x), ctx);
0063 }
0064 
0065 FMPZ_MPOLY_Q_INLINE int
0066 fmpz_mpoly_q_is_one(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
0067 {
0068     return fmpz_mpoly_is_one(fmpz_mpoly_q_numref(x), ctx) &&
0069            fmpz_mpoly_is_one(fmpz_mpoly_q_denref(x), ctx);
0070 }
0071 
0072 FMPZ_MPOLY_Q_INLINE int
0073 fmpz_mpoly_q_is_fmpz(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
0074 {
0075     return fmpz_mpoly_is_fmpz(fmpz_mpoly_q_numref(x), ctx) &&
0076            fmpz_mpoly_is_one(fmpz_mpoly_q_denref(x), ctx);
0077 }
0078 
0079 FMPZ_MPOLY_Q_INLINE int
0080 fmpz_mpoly_q_is_fmpq(const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
0081 {
0082     return fmpz_mpoly_is_fmpz(fmpz_mpoly_q_numref(x), ctx) &&
0083            fmpz_mpoly_is_fmpz(fmpz_mpoly_q_denref(x), ctx);
0084 }
0085 
0086 void fmpz_mpoly_q_used_vars(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx);
0087 void fmpz_mpoly_q_used_vars_num(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx);
0088 void fmpz_mpoly_q_used_vars_den(int * used, const fmpz_mpoly_q_t f, const fmpz_mpoly_ctx_t ctx);
0089 
0090 /* Special values */
0091 
0092 FMPZ_MPOLY_Q_INLINE void
0093 fmpz_mpoly_q_zero(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
0094 {
0095     fmpz_mpoly_zero(fmpz_mpoly_q_numref(res), ctx);
0096     fmpz_mpoly_one(fmpz_mpoly_q_denref(res), ctx);
0097 }
0098 
0099 FMPZ_MPOLY_Q_INLINE void
0100 fmpz_mpoly_q_one(fmpz_mpoly_q_t res, const fmpz_mpoly_ctx_t ctx)
0101 {
0102     fmpz_mpoly_one(fmpz_mpoly_q_numref(res), ctx);
0103     fmpz_mpoly_one(fmpz_mpoly_q_denref(res), ctx);
0104 }
0105 
0106 FMPZ_MPOLY_Q_INLINE void
0107 fmpz_mpoly_q_gen(fmpz_mpoly_q_t res, slong i, const fmpz_mpoly_ctx_t ctx)
0108 {
0109     fmpz_mpoly_gen(fmpz_mpoly_q_numref(res), i, ctx);
0110     fmpz_mpoly_one(fmpz_mpoly_q_denref(res), ctx);
0111 }
0112 
0113 /* Input and output */
0114 
0115 void fmpz_mpoly_q_print_pretty(const fmpz_mpoly_q_t f, const char ** x, const fmpz_mpoly_ctx_t ctx);
0116 char * fmpz_mpoly_q_get_str_pretty(const fmpz_mpoly_q_t f, const char ** vars, const fmpz_mpoly_ctx_t ctx);
0117 int fmpz_mpoly_q_set_str_pretty(fmpz_mpoly_q_t res, const char * s, const char ** vars, fmpz_mpoly_ctx_t ctx);
0118 
0119 /* Random generation */
0120 
0121 void fmpz_mpoly_q_randtest(fmpz_mpoly_q_t res, flint_rand_t state, slong length, ulong coeff_bits, slong exp_bound, const fmpz_mpoly_ctx_t ctx);
0122 
0123 /* Comparisons */
0124 
0125 int fmpz_mpoly_q_equal(const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0126 
0127 /* Arithmetic */
0128 
0129 void fmpz_mpoly_q_neg(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx);
0130 
0131 void fmpz_mpoly_q_add(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0132 void fmpz_mpoly_q_sub(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0133 void fmpz_mpoly_q_mul(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0134 void fmpz_mpoly_q_div(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_q_t y, const fmpz_mpoly_ctx_t ctx);
0135 
0136 void fmpz_mpoly_q_inv(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx);
0137 
0138 void
0139 _fmpz_mpoly_q_add(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0140             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0141             const fmpz_mpoly_t y_num, const fmpz_mpoly_t y_den,
0142             const fmpz_mpoly_ctx_t ctx);
0143 
0144 void
0145 _fmpz_mpoly_q_sub(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0146             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0147             const fmpz_mpoly_t y_num, const fmpz_mpoly_t y_den,
0148             const fmpz_mpoly_ctx_t ctx);
0149 
0150 void
0151 _fmpz_mpoly_q_mul(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0152             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0153             const fmpz_mpoly_t y_num, const fmpz_mpoly_t y_den,
0154             const fmpz_mpoly_ctx_t ctx);
0155 
0156 void
0157 _fmpz_mpoly_q_div(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0158             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0159             const fmpz_mpoly_t y_num, const fmpz_mpoly_t y_den,
0160             const fmpz_mpoly_ctx_t ctx);
0161 
0162 void
0163 _fmpz_mpoly_q_add_fmpq(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0164             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0165             const fmpz_t y_num, const fmpz_t y_den,
0166             const fmpz_mpoly_ctx_t ctx);
0167 
0168 void
0169 _fmpz_mpoly_q_sub_fmpq(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0170             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0171             const fmpz_t y_num, const fmpz_t y_den,
0172             const fmpz_mpoly_ctx_t ctx);
0173 
0174 void
0175 _fmpz_mpoly_q_mul_fmpq(fmpz_mpoly_t res_num, fmpz_mpoly_t res_den,
0176             const fmpz_mpoly_t x_num, const fmpz_mpoly_t x_den,
0177             const fmpz_t y_num, const fmpz_t y_den,
0178             const fmpz_mpoly_ctx_t ctx);
0179 
0180 void fmpz_mpoly_q_add_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx);
0181 void fmpz_mpoly_q_add_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx);
0182 
0183 void fmpz_mpoly_q_sub_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx);
0184 void fmpz_mpoly_q_sub_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx);
0185 
0186 void fmpz_mpoly_q_mul_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx);
0187 void fmpz_mpoly_q_mul_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx);
0188 
0189 void fmpz_mpoly_q_div_fmpz(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpz_t y, const fmpz_mpoly_ctx_t ctx);
0190 void fmpz_mpoly_q_div_fmpq(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, const fmpq_t y, const fmpz_mpoly_ctx_t ctx);
0191 
0192 FMPZ_MPOLY_Q_INLINE void
0193 fmpz_mpoly_q_add_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong c, const fmpz_mpoly_ctx_t ctx)
0194 {
0195     fmpz_t t;
0196     fmpz_init_set_si(t, c);
0197     fmpz_mpoly_q_add_fmpz(res, x, t, ctx);
0198     fmpz_clear(t);
0199 }
0200 
0201 FMPZ_MPOLY_Q_INLINE void
0202 fmpz_mpoly_q_sub_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong c, const fmpz_mpoly_ctx_t ctx)
0203 {
0204     fmpz_t t;
0205     fmpz_init_set_si(t, c);
0206     fmpz_mpoly_q_sub_fmpz(res, x, t, ctx);
0207     fmpz_clear(t);
0208 }
0209 
0210 FMPZ_MPOLY_Q_INLINE void
0211 fmpz_mpoly_q_mul_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong c, const fmpz_mpoly_ctx_t ctx)
0212 {
0213     fmpz_t t;
0214     fmpz_init_set_si(t, c);
0215     fmpz_mpoly_q_mul_fmpz(res, x, t, ctx);
0216     fmpz_clear(t);
0217 }
0218 
0219 FMPZ_MPOLY_Q_INLINE void
0220 fmpz_mpoly_q_div_si(fmpz_mpoly_q_t res, const fmpz_mpoly_q_t x, slong c, const fmpz_mpoly_ctx_t ctx)
0221 {
0222     fmpz_t t;
0223     fmpz_init_set_si(t, c);
0224     fmpz_mpoly_q_div_fmpz(res, x, t, ctx);
0225     fmpz_clear(t);
0226 }
0227 
0228 /* Polynomial helper functions */
0229 
0230 FMPZ_MPOLY_Q_INLINE void
0231 _fmpz_vec_content2(fmpz_t res, const fmpz * vec, slong len, const fmpz_t inp)
0232 {
0233     if (fmpz_is_pm1(inp))
0234     {
0235         fmpz_one(res);
0236     }
0237     else
0238     {
0239         slong i;
0240         fmpz_abs(res, inp);
0241         for (i = len - 1; i >= 0; i--)
0242         {
0243             fmpz_gcd(res, res, vec + i);
0244             if (fmpz_is_one(res))
0245                 break;
0246         }
0247     }
0248 }
0249 
0250 FMPZ_MPOLY_Q_INLINE void
0251 fmpz_mpoly_gcd_assert_successful(fmpz_mpoly_t res, const fmpz_mpoly_t x, const fmpz_mpoly_t y, const fmpz_mpoly_ctx_t ctx)
0252 {
0253     if (!fmpz_mpoly_gcd(res, x, y, ctx))
0254     {
0255         flint_throw(FLINT_ERROR, "fmpz_mpoly_gcd failed\n");
0256     }
0257 }
0258 
0259 FMPZ_MPOLY_Q_INLINE void
0260 _fmpz_mpoly_q_mpoly_divexact(fmpz_mpoly_t res, const fmpz_mpoly_t x, const fmpz_mpoly_t y, const fmpz_mpoly_ctx_t ctx)
0261 {
0262     if (fmpz_mpoly_is_fmpz(y, ctx))
0263         fmpz_mpoly_scalar_divexact_fmpz(res, x, y->coeffs, ctx);
0264     else
0265         fmpz_mpoly_div(res, x, y, ctx);
0266 }
0267 
0268 /* Content */
0269 
0270 FMPZ_MPOLY_Q_INLINE void
0271 _fmpz_mpoly_q_content(fmpz_t num, fmpz_t den, const fmpz_mpoly_t xnum, const fmpz_mpoly_t xden, const fmpz_mpoly_ctx_t ctx)
0272 {
0273     if (fmpz_mpoly_is_zero(xnum, ctx))
0274     {
0275         fmpz_one(num);
0276         fmpz_one(den);
0277     }
0278     else
0279     {
0280         _fmpz_vec_content(den, xden->coeffs, xden->length);
0281         _fmpz_vec_content(num, xnum->coeffs, xnum->length);
0282     }
0283 }
0284 
0285 FMPZ_MPOLY_Q_INLINE void
0286 fmpz_mpoly_q_content(fmpq_t res, const fmpz_mpoly_q_t x, const fmpz_mpoly_ctx_t ctx)
0287 {
0288     _fmpz_mpoly_q_content(fmpq_numref(res), fmpq_denref(res), fmpz_mpoly_q_numref(x), fmpz_mpoly_q_denref(x), ctx);
0289 }
0290 
0291 /* Evaluation */
0292 
0293 void fmpz_mpoly_q_evaluate_acb(acb_t res, const fmpz_mpoly_q_t f, acb_srcptr x, slong prec, const fmpz_mpoly_ctx_t ctx);
0294 
0295 #ifdef __cplusplus
0296 }
0297 #endif
0298 
0299 #endif