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