File indexing completed on 2026-11-07 10:15:17
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef FMPZ_POLY_Q_H
0014 #define FMPZ_POLY_Q_H
0015
0016 #ifdef FMPZ_POLY_Q_INLINES_C
0017 #define FMPZ_POLY_Q_INLINE
0018 #else
0019 #define FMPZ_POLY_Q_INLINE static inline
0020 #endif
0021
0022 #include "fmpz_poly.h"
0023
0024 #ifdef __cplusplus
0025 extern "C" {
0026 #endif
0027
0028
0029
0030 #define fmpz_poly_q_numref(op) ((op)->num)
0031
0032 #define fmpz_poly_q_denref(op) ((op)->den)
0033
0034 void fmpz_poly_q_canonicalise(fmpz_poly_q_t rop);
0035
0036 int fmpz_poly_q_is_canonical(const fmpz_poly_q_t op);
0037
0038
0039
0040 void fmpz_poly_q_init(fmpz_poly_q_t rop);
0041
0042 void fmpz_poly_q_clear(fmpz_poly_q_t rop);
0043
0044
0045
0046 void fmpz_poly_q_randtest(fmpz_poly_q_t poly, flint_rand_t state,
0047 slong len1, flint_bitcnt_t bits1,
0048 slong len2, flint_bitcnt_t bits2);
0049
0050 void fmpz_poly_q_randtest_not_zero(fmpz_poly_q_t poly, flint_rand_t state,
0051 slong len1, flint_bitcnt_t bits1,
0052 slong len2, flint_bitcnt_t bits2);
0053
0054
0055
0056 void fmpz_poly_q_set(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0057
0058 void fmpz_poly_q_set_si(fmpz_poly_q_t rop, slong op);
0059
0060 void fmpz_poly_q_swap(fmpz_poly_q_t op1, fmpz_poly_q_t op2);
0061
0062 FMPZ_POLY_Q_INLINE
0063 void fmpz_poly_q_zero(fmpz_poly_q_t rop)
0064 {
0065 fmpz_poly_zero(rop->num);
0066 fmpz_poly_set_si(rop->den, 1);
0067 }
0068
0069 FMPZ_POLY_Q_INLINE
0070 void fmpz_poly_q_one(fmpz_poly_q_t rop)
0071 {
0072 fmpz_poly_set_si(rop->num, 1);
0073 fmpz_poly_set_si(rop->den, 1);
0074 }
0075
0076 FMPZ_POLY_Q_INLINE
0077 void fmpz_poly_q_neg(fmpz_poly_q_t rop, const fmpz_poly_q_t op)
0078 {
0079 fmpz_poly_neg(rop->num, op->num);
0080 fmpz_poly_set(rop->den, op->den);
0081 }
0082
0083 void fmpz_poly_q_inv(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0084
0085
0086
0087 FMPZ_POLY_Q_INLINE
0088 int fmpz_poly_q_is_zero(const fmpz_poly_q_t op)
0089 {
0090 return fmpz_poly_is_zero(op->num);
0091 }
0092
0093 FMPZ_POLY_Q_INLINE
0094 int fmpz_poly_q_is_one(const fmpz_poly_q_t op)
0095 {
0096 return fmpz_poly_is_one(op->num) && fmpz_poly_is_one(op->den);
0097 }
0098
0099 FMPZ_POLY_Q_INLINE
0100 int fmpz_poly_q_equal(const fmpz_poly_q_t op1, const fmpz_poly_q_t op2)
0101 {
0102 return fmpz_poly_equal(op1->num, op2->num) && fmpz_poly_equal(op1->den, op2->den);
0103 }
0104
0105
0106
0107 void fmpz_poly_q_add_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0108 void fmpz_poly_q_sub_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0109
0110 void fmpz_poly_q_add(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0111 void fmpz_poly_q_sub(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0112
0113 void fmpz_poly_q_addmul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0114 void fmpz_poly_q_submul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0115
0116
0117
0118 void fmpz_poly_q_scalar_mul_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x);
0119 void fmpz_poly_q_scalar_mul_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x);
0120 void fmpz_poly_q_scalar_mul_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x);
0121
0122 void fmpz_poly_q_scalar_div_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x);
0123 void fmpz_poly_q_scalar_div_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x);
0124 void fmpz_poly_q_scalar_div_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x);
0125
0126
0127
0128 void fmpz_poly_q_mul(fmpz_poly_q_t rop,
0129 const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0130
0131 void fmpz_poly_q_div(fmpz_poly_q_t rop,
0132 const fmpz_poly_q_t op1, const fmpz_poly_q_t op2);
0133
0134
0135
0136 void fmpz_poly_q_pow(fmpz_poly_q_t rop, const fmpz_poly_q_t op, ulong exp);
0137
0138
0139
0140 void fmpz_poly_q_derivative(fmpz_poly_q_t rop, const fmpz_poly_q_t op);
0141
0142
0143
0144 int fmpz_poly_q_evaluate_fmpq(fmpq_t rop, const fmpz_poly_q_t f, const fmpq_t a);
0145
0146
0147
0148 int fmpz_poly_q_set_str(fmpz_poly_q_t rop, const char *s);
0149
0150 char * fmpz_poly_q_get_str(const fmpz_poly_q_t op);
0151 char * fmpz_poly_q_get_str_pretty(const fmpz_poly_q_t op, const char *x);
0152
0153 int fmpz_poly_q_print(const fmpz_poly_q_t op);
0154 int fmpz_poly_q_print_pretty(const fmpz_poly_q_t op, const char *x);
0155
0156
0157
0158 #define fmpz_poly_q_scalar_mul_mpz _Pragma("GCC error \"'fmpz_poly_q_scalar_mul_mpz' is deprecated. Use 'fmpz_poly_q_scalar_mul_fmpz' instead.\"")
0159 #define fmpz_poly_q_scalar_mul_mpq _Pragma("GCC error \"'fmpz_poly_q_scalar_mul_mpq' is deprecated. Use 'fmpz_poly_q_scalar_mul_fmpq' instead.\"")
0160 #define fmpz_poly_q_scalar_div_mpz _Pragma("GCC error \"'fmpz_poly_q_scalar_div_mpz' is deprecated. Use 'fmpz_poly_q_scalar_div_fmpz' instead.\"")
0161 #define fmpz_poly_q_scalar_div_mpq _Pragma("GCC error \"'fmpz_poly_q_scalar_div_mpq' is deprecated. Use 'fmpz_poly_q_scalar_div_fmpq' instead.\"")
0162 #define fmpz_poly_q_evaluate _Pragma("GCC error \"'fmpz_poly_q_evaluate' is deprecated. Use 'fmpz_poly_q_evaluate_fmpq' instead.\"")
0163
0164 #ifdef __cplusplus
0165 }
0166 #endif
0167
0168 #endif