Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2020 Fredrik Johansson
0003     Copyright (C) 2025 Andrii Yanovets
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_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 /* Memory management */
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 /* Assignment */
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 /* Canonicalisation */
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 /* Properties */
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 /* Special values */
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 /* Input and output */
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 /* Random generation */
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 /* Comparisons */
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 /* Arithmetic */
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 /* Polynomial helper functions */
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