File indexing completed on 2026-11-07 10:15:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FMPZ_MOD_MPOLY_Q_H
0014 #define FMPZ_MOD_MPOLY_Q_H
0015
0016 #ifdef FMPZ_MOD_MPOLY_Q_INLINES_C
0017 #define FMPZ_MOD_MPOLY_Q_INLINE
0018 #else
0019 #define FMPZ_MOD_MPOLY_Q_INLINE static inline
0020 #endif
0021
0022 #include "fmpz.h"
0023 #include "fmpz_mod.h"
0024 #include "fmpz_vec.h"
0025 #include "fmpz_mod_mpoly.h"
0026 #include "acb_types.h"
0027
0028 #ifdef __cplusplus
0029 extern "C" {
0030 #endif
0031
0032 #define fmpz_mod_mpoly_q_numref(x) (&((x)->num))
0033 #define fmpz_mod_mpoly_q_denref(x) (&((x)->den))
0034
0035
0036
0037 void fmpz_mod_mpoly_q_init(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_ctx_t ctx);
0038
0039 void fmpz_mod_mpoly_q_clear(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_ctx_t ctx);
0040
0041
0042
0043 void fmpz_mod_mpoly_q_swap(fmpz_mod_mpoly_q_t x, fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0044
0045 void fmpz_mod_mpoly_q_set(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx);
0046
0047 int fmpz_mod_mpoly_q_set_fmpq(fmpz_mod_mpoly_q_t res, const fmpq_t x, const fmpz_mod_mpoly_ctx_t ctx);
0048
0049 void fmpz_mod_mpoly_q_set_fmpz(fmpz_mod_mpoly_q_t res, const fmpz_t x, const fmpz_mod_mpoly_ctx_t ctx);
0050
0051 void fmpz_mod_mpoly_q_set_si(fmpz_mod_mpoly_q_t res, slong x, const fmpz_mod_mpoly_ctx_t ctx);
0052
0053
0054
0055 void fmpz_mod_mpoly_q_canonicalise(fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx);
0056
0057 int fmpz_mod_mpoly_q_is_canonical(const fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_ctx_t ctx);
0058
0059
0060
0061 FMPZ_MOD_MPOLY_Q_INLINE int
0062 fmpz_mod_mpoly_q_is_zero(const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx)
0063 {
0064 return fmpz_mod_mpoly_is_zero(fmpz_mod_mpoly_q_numref(x), ctx);
0065 }
0066
0067 FMPZ_MOD_MPOLY_Q_INLINE int
0068 fmpz_mod_mpoly_q_is_one(const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx)
0069 {
0070 return fmpz_mod_mpoly_is_one(fmpz_mod_mpoly_q_numref(x), ctx) &&
0071 fmpz_mod_mpoly_is_one(fmpz_mod_mpoly_q_denref(x), ctx);
0072 }
0073
0074 FMPZ_MOD_MPOLY_Q_INLINE int
0075 fmpz_mod_mpoly_q_is_fmpz_mod(const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx)
0076 {
0077 return fmpz_mod_mpoly_is_fmpz(fmpz_mod_mpoly_q_numref(x), ctx) &&
0078 fmpz_mod_mpoly_is_one(fmpz_mod_mpoly_q_denref(x), ctx);
0079 }
0080
0081
0082
0083 FMPZ_MOD_MPOLY_Q_INLINE void
0084 fmpz_mod_mpoly_q_zero(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_ctx_t ctx)
0085 {
0086 fmpz_mod_mpoly_zero(fmpz_mod_mpoly_q_numref(res), ctx);
0087 fmpz_mod_mpoly_one(fmpz_mod_mpoly_q_denref(res), ctx);
0088 }
0089
0090 FMPZ_MOD_MPOLY_Q_INLINE void
0091 fmpz_mod_mpoly_q_one(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_ctx_t ctx)
0092 {
0093 fmpz_mod_mpoly_one(fmpz_mod_mpoly_q_numref(res), ctx);
0094 fmpz_mod_mpoly_one(fmpz_mod_mpoly_q_denref(res), ctx);
0095 }
0096
0097 FMPZ_MOD_MPOLY_Q_INLINE void
0098 fmpz_mod_mpoly_q_gen(fmpz_mod_mpoly_q_t res, slong i, const fmpz_mod_mpoly_ctx_t ctx)
0099 {
0100 fmpz_mod_mpoly_gen(fmpz_mod_mpoly_q_numref(res), i, ctx);
0101 fmpz_mod_mpoly_one(fmpz_mod_mpoly_q_denref(res), ctx);
0102 }
0103
0104
0105
0106 void fmpz_mod_mpoly_q_print_pretty(const fmpz_mod_mpoly_q_t f, const char ** x, const fmpz_mod_mpoly_ctx_t ctx);
0107 char * fmpz_mod_mpoly_q_get_str_pretty(const fmpz_mod_mpoly_q_t f, const char ** vars, const fmpz_mod_mpoly_ctx_t ctx);
0108 int fmpz_mod_mpoly_q_set_str_pretty(fmpz_mod_mpoly_q_t res, const char * s, const char ** vars, fmpz_mod_mpoly_ctx_t ctx);
0109
0110
0111
0112 void fmpz_mod_mpoly_q_randtest(fmpz_mod_mpoly_q_t res, flint_rand_t state, slong length, slong exp_bound, const fmpz_mod_mpoly_ctx_t ctx);
0113
0114
0115
0116 int fmpz_mod_mpoly_q_equal(const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0117
0118
0119
0120 void fmpz_mod_mpoly_q_neg(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx);
0121
0122 void fmpz_mod_mpoly_q_add(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0123 void fmpz_mod_mpoly_q_sub(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0124 void fmpz_mod_mpoly_q_mul(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0125 void fmpz_mod_mpoly_q_div(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_q_t y, const fmpz_mod_mpoly_ctx_t ctx);
0126
0127 void fmpz_mod_mpoly_q_inv(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_mod_mpoly_ctx_t ctx);
0128
0129 void
0130 _fmpz_mod_mpoly_q_add(fmpz_mod_mpoly_t res_num, fmpz_mod_mpoly_t res_den,
0131 const fmpz_mod_mpoly_t x_num, const fmpz_mod_mpoly_t x_den,
0132 const fmpz_mod_mpoly_t y_num, const fmpz_mod_mpoly_t y_den,
0133 const fmpz_mod_mpoly_ctx_t ctx);
0134
0135 void
0136 _fmpz_mod_mpoly_q_add_fmpz_mod(fmpz_mod_mpoly_t res_num, fmpz_mod_mpoly_t res_den,
0137 const fmpz_mod_mpoly_t x_num, const fmpz_mod_mpoly_t x_den,
0138 const fmpz_t y,
0139 const fmpz_mod_mpoly_ctx_t ctx);
0140
0141 void
0142 _fmpz_mod_mpoly_q_sub(fmpz_mod_mpoly_t res_num, fmpz_mod_mpoly_t res_den,
0143 const fmpz_mod_mpoly_t x_num, const fmpz_mod_mpoly_t x_den,
0144 const fmpz_mod_mpoly_t y_num, const fmpz_mod_mpoly_t y_den,
0145 const fmpz_mod_mpoly_ctx_t ctx);
0146
0147 void
0148 _fmpz_mod_mpoly_q_mul(fmpz_mod_mpoly_t res_num, fmpz_mod_mpoly_t res_den,
0149 const fmpz_mod_mpoly_t x_num, const fmpz_mod_mpoly_t x_den,
0150 const fmpz_mod_mpoly_t y_num, const fmpz_mod_mpoly_t y_den,
0151 const fmpz_mod_mpoly_ctx_t ctx);
0152
0153 void
0154 _fmpz_mod_mpoly_q_div(fmpz_mod_mpoly_t res_num, fmpz_mod_mpoly_t res_den,
0155 const fmpz_mod_mpoly_t x_num, const fmpz_mod_mpoly_t x_den,
0156 const fmpz_mod_mpoly_t y_num, const fmpz_mod_mpoly_t y_den,
0157 const fmpz_mod_mpoly_ctx_t ctx);
0158
0159 void fmpz_mod_mpoly_q_add_fmpz_mod(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0160 void fmpz_mod_mpoly_q_add_fmpz(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0161 int fmpz_mod_mpoly_q_add_fmpq(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpq_t y, const fmpz_mod_mpoly_ctx_t ctx);
0162
0163 void fmpz_mod_mpoly_q_sub_fmpz_mod(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0164 void fmpz_mod_mpoly_q_sub_fmpz(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0165 int fmpz_mod_mpoly_q_sub_fmpq(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpq_t y, const fmpz_mod_mpoly_ctx_t ctx);
0166
0167 void fmpz_mod_mpoly_q_mul_fmpz_mod(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0168 void fmpz_mod_mpoly_q_mul_fmpz(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0169 int fmpz_mod_mpoly_q_mul_fmpq(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpq_t y, const fmpz_mod_mpoly_ctx_t ctx);
0170
0171 int fmpz_mod_mpoly_q_div_fmpz(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpz_t y, const fmpz_mod_mpoly_ctx_t ctx);
0172 int fmpz_mod_mpoly_q_div_fmpq(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, const fmpq_t y, const fmpz_mod_mpoly_ctx_t ctx);
0173
0174 FMPZ_MOD_MPOLY_Q_INLINE void
0175 fmpz_mod_mpoly_q_add_si(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, slong c, const fmpz_mod_mpoly_ctx_t ctx)
0176 {
0177 fmpz_t t;
0178 fmpz_init_set_si(t, c);
0179 fmpz_mod_mpoly_q_add_fmpz(res, x, t, ctx);
0180 fmpz_clear(t);
0181 }
0182
0183 FMPZ_MOD_MPOLY_Q_INLINE void
0184 fmpz_mod_mpoly_q_sub_si(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, slong c, const fmpz_mod_mpoly_ctx_t ctx)
0185 {
0186 fmpz_t t;
0187 fmpz_init_set_si(t, c);
0188 fmpz_mod_mpoly_q_sub_fmpz(res, x, t, ctx);
0189 fmpz_clear(t);
0190 }
0191
0192 FMPZ_MOD_MPOLY_Q_INLINE void
0193 fmpz_mod_mpoly_q_mul_si(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, slong c, const fmpz_mod_mpoly_ctx_t ctx)
0194 {
0195 fmpz_t t;
0196 fmpz_init_set_si(t, c);
0197 fmpz_mod_mpoly_q_mul_fmpz(res, x, t, ctx);
0198 fmpz_clear(t);
0199 }
0200
0201 FMPZ_MOD_MPOLY_Q_INLINE int
0202 fmpz_mod_mpoly_q_div_si(fmpz_mod_mpoly_q_t res, const fmpz_mod_mpoly_q_t x, slong c, const fmpz_mod_mpoly_ctx_t ctx)
0203 {
0204 fmpz_t t;
0205 int invertible;
0206 fmpz_init_set_si(t, c);
0207 invertible = fmpz_mod_mpoly_q_div_fmpz(res, x, t, ctx);
0208 fmpz_clear(t);
0209 return invertible;
0210 }
0211
0212
0213
0214 FMPZ_MOD_MPOLY_Q_INLINE void
0215 fmpz_mod_mpoly_gcd_assert_successful(fmpz_mod_mpoly_t res, const fmpz_mod_mpoly_t x, const fmpz_mod_mpoly_t y, const fmpz_mod_mpoly_ctx_t ctx)
0216 {
0217 if (!fmpz_mod_mpoly_gcd(res, x, y, ctx))
0218 {
0219 flint_throw(FLINT_ERROR, "fmpz_mod_mpoly_gcd failed\n");
0220 }
0221 }
0222
0223 FMPZ_MOD_MPOLY_Q_INLINE void
0224 _fmpz_mod_mpoly_q_mpoly_divexact(fmpz_mod_mpoly_t res, const fmpz_mod_mpoly_t x, const fmpz_mod_mpoly_t y, const fmpz_mod_mpoly_ctx_t ctx)
0225 {
0226 fmpz_t g;
0227 fmpz_init(g);
0228
0229 if (fmpz_mod_mpoly_is_fmpz(y, ctx))
0230 {
0231 fmpz_mod_inv(g, y->coeffs, ctx->ffinfo);
0232 fmpz_mod_mpoly_scalar_mul_fmpz_mod_invertible(res, x, g, ctx);
0233 }
0234 else
0235 fmpz_mod_mpoly_div(res, x, y, ctx);
0236 fmpz_clear(g);
0237 }
0238
0239 #ifdef __cplusplus
0240 }
0241 #endif
0242
0243 #endif