File indexing completed on 2026-11-07 10:15:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef CA_POLY_H
0013 #define CA_POLY_H
0014
0015 #ifdef CA_POLY_INLINES_C
0016 #define CA_POLY_INLINE
0017 #else
0018 #define CA_POLY_INLINE static inline
0019 #endif
0020
0021 #include "ca_vec.h"
0022
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026
0027
0028
0029
0030 CA_POLY_INLINE ca_ptr
0031 ca_poly_coeff_ptr(ca_poly_t poly, slong i)
0032 {
0033 return poly->coeffs + i;
0034 }
0035
0036
0037
0038 typedef struct
0039 {
0040 ca_poly_struct * entries;
0041 slong length;
0042 slong alloc;
0043 }
0044 ca_poly_vec_struct;
0045
0046 typedef ca_poly_vec_struct ca_poly_vec_t[1];
0047
0048
0049
0050 void ca_poly_init(ca_poly_t poly, ca_ctx_t ctx);
0051 void ca_poly_init2(ca_poly_t poly, slong len, ca_ctx_t ctx);
0052 void ca_poly_clear(ca_poly_t poly, ca_ctx_t ctx);
0053 void ca_poly_fit_length(ca_poly_t poly, slong len, ca_ctx_t ctx);
0054 void _ca_poly_set_length(ca_poly_t poly, slong len, ca_ctx_t ctx);
0055 void _ca_poly_normalise(ca_poly_t poly, ca_ctx_t ctx);
0056
0057 CA_POLY_INLINE void
0058 ca_poly_swap(ca_poly_t poly1, ca_poly_t poly2, ca_ctx_t FLINT_UNUSED(ctx))
0059 {
0060 FLINT_SWAP(ca_poly_struct, *poly1, *poly2);
0061 }
0062
0063
0064
0065 void ca_poly_set_ca(ca_poly_t poly, const ca_t x, ca_ctx_t ctx);
0066 void ca_poly_set_si(ca_poly_t poly, slong x, ca_ctx_t ctx);
0067
0068 CA_POLY_INLINE void
0069 ca_poly_zero(ca_poly_t poly, ca_ctx_t ctx)
0070 {
0071 _ca_poly_set_length(poly, 0, ctx);
0072 }
0073
0074 CA_POLY_INLINE void
0075 ca_poly_x(ca_poly_t poly, ca_ctx_t ctx)
0076 {
0077 ca_poly_fit_length(poly, 2, ctx);
0078 ca_zero(poly->coeffs, ctx);
0079 ca_one(poly->coeffs + 1, ctx);
0080 _ca_poly_set_length(poly, 2, ctx);
0081 }
0082
0083 CA_POLY_INLINE void
0084 ca_poly_one(ca_poly_t poly, ca_ctx_t ctx)
0085 {
0086 ca_poly_set_si(poly, 1, ctx);
0087 }
0088
0089 void ca_poly_set(ca_poly_t res, const ca_poly_t src, ca_ctx_t ctx);
0090 void ca_poly_set_fmpz_poly(ca_poly_t res, const fmpz_poly_t src, ca_ctx_t ctx);
0091 void ca_poly_set_fmpq_poly(ca_poly_t res, const fmpq_poly_t src, ca_ctx_t ctx);
0092
0093 void ca_poly_transfer(ca_poly_t res, ca_ctx_t res_ctx, const ca_poly_t src, ca_ctx_t src_ctx);
0094
0095 void ca_poly_set_coeff_ca(ca_poly_t poly, slong n, const ca_t x, ca_ctx_t ctx);
0096
0097
0098
0099 void ca_poly_get_fexpr(fexpr_t res, const ca_poly_t A, ulong flags, ca_ctx_t ctx);
0100
0101
0102
0103 void ca_poly_randtest(ca_poly_t poly, flint_rand_t state, slong len, slong depth, slong bits, ca_ctx_t ctx);
0104 void ca_poly_randtest_rational(ca_poly_t poly, flint_rand_t state, slong len, slong bits, ca_ctx_t ctx);
0105
0106
0107
0108 void ca_poly_print(const ca_poly_t poly, ca_ctx_t ctx);
0109 void ca_poly_printn(const ca_poly_t poly, slong digits, ca_ctx_t ctx);
0110
0111
0112
0113 int ca_poly_is_proper(const ca_poly_t poly, ca_ctx_t ctx);
0114 int ca_poly_make_monic(ca_poly_t res, const ca_poly_t poly, ca_ctx_t ctx);
0115
0116 void _ca_poly_reverse(ca_ptr res, ca_srcptr poly, slong len, slong n, ca_ctx_t ctx);
0117 void ca_poly_reverse(ca_poly_t res, const ca_poly_t poly, slong n, ca_ctx_t ctx);
0118
0119
0120
0121 truth_t _ca_poly_check_equal(ca_srcptr poly1, slong len1, ca_srcptr poly2, slong len2, ca_ctx_t ctx);
0122 truth_t ca_poly_check_equal(const ca_poly_t poly1, const ca_poly_t poly2, ca_ctx_t ctx);
0123
0124 truth_t ca_poly_check_is_zero(const ca_poly_t poly, ca_ctx_t ctx);
0125 truth_t ca_poly_check_is_one(const ca_poly_t poly, ca_ctx_t ctx);
0126
0127
0128
0129 void _ca_poly_shift_left(ca_ptr res, ca_srcptr poly, slong len, slong n, ca_ctx_t ctx);
0130 void ca_poly_shift_left(ca_poly_t res, const ca_poly_t poly, slong n, ca_ctx_t ctx);
0131
0132 void _ca_poly_shift_right(ca_ptr res, ca_srcptr poly, slong len, slong n, ca_ctx_t ctx);
0133 void ca_poly_shift_right(ca_poly_t res, const ca_poly_t poly, slong n, ca_ctx_t ctx);
0134
0135 void ca_poly_neg(ca_poly_t res, const ca_poly_t src, ca_ctx_t ctx);
0136
0137 void _ca_poly_add(ca_ptr res, ca_srcptr poly1, slong len1, ca_srcptr poly2, slong len2, ca_ctx_t ctx);
0138 void ca_poly_add(ca_poly_t res, const ca_poly_t poly1, const ca_poly_t poly2, ca_ctx_t ctx);
0139
0140 void _ca_poly_sub(ca_ptr res, ca_srcptr poly1, slong len1, ca_srcptr poly2, slong len2, ca_ctx_t ctx);
0141 void ca_poly_sub(ca_poly_t res, const ca_poly_t poly1, const ca_poly_t poly2, ca_ctx_t ctx);
0142
0143 void _ca_poly_mul(ca_ptr C, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, ca_ctx_t ctx);
0144 void ca_poly_mul(ca_poly_t res, const ca_poly_t poly1, const ca_poly_t poly2, ca_ctx_t ctx);
0145
0146 CA_POLY_INLINE void
0147 ca_poly_mul_ca(ca_poly_t res, const ca_poly_t poly, const ca_t c, ca_ctx_t ctx)
0148 {
0149 ca_poly_fit_length(res, poly->length, ctx);
0150 _ca_vec_scalar_mul_ca(res->coeffs, poly->coeffs, poly->length, c, ctx);
0151 _ca_poly_set_length(res, poly->length, ctx);
0152 _ca_poly_normalise(res, ctx);
0153 }
0154
0155 CA_POLY_INLINE void
0156 ca_poly_div_ca(ca_poly_t res, const ca_poly_t poly, const ca_t c, ca_ctx_t ctx)
0157 {
0158 ca_poly_fit_length(res, poly->length, ctx);
0159 _ca_vec_scalar_div_ca(res->coeffs, poly->coeffs, poly->length, c, ctx);
0160 _ca_poly_set_length(res, poly->length, ctx);
0161 _ca_poly_normalise(res, ctx);
0162 }
0163
0164
0165 CA_POLY_INLINE void
0166 ca_poly_div_fmpz(ca_poly_t res, const ca_poly_t poly, const fmpz_t c, ca_ctx_t ctx)
0167 {
0168 ca_t t;
0169 ca_init(t, ctx);
0170 ca_set_fmpz(t, c, ctx);
0171 ca_poly_div_ca(res, poly, t, ctx);
0172 ca_clear(t, ctx);
0173 }
0174
0175 void _ca_poly_mullow_same_nf(ca_ptr C, ca_srcptr A, slong Alen, ca_srcptr B, slong Blen, slong len, ca_field_t K, ca_ctx_t ctx);
0176
0177 void _ca_poly_mullow(ca_ptr C, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, slong n, ca_ctx_t ctx);
0178 void ca_poly_mullow(ca_poly_t res, const ca_poly_t poly1, const ca_poly_t poly2, slong n, ca_ctx_t ctx);
0179
0180 void _ca_poly_divrem_basecase(ca_ptr Q, ca_ptr R, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, const ca_t invB, ca_ctx_t ctx);
0181 int ca_poly_divrem_basecase(ca_poly_t Q, ca_poly_t R, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0182
0183 void _ca_poly_divrem(ca_ptr Q, ca_ptr R, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, const ca_t invB, ca_ctx_t ctx);
0184 int ca_poly_divrem(ca_poly_t Q, ca_poly_t R, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0185
0186 int ca_poly_div(ca_poly_t Q, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0187 int ca_poly_rem(ca_poly_t R, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0188
0189 void _ca_poly_pow_ui_trunc(ca_ptr res, ca_srcptr f, slong flen, ulong exp, slong len, ca_ctx_t ctx);
0190 void ca_poly_pow_ui_trunc(ca_poly_t res, const ca_poly_t poly, ulong exp, slong len, ca_ctx_t ctx);
0191
0192 void _ca_poly_pow_ui(ca_ptr res, ca_srcptr f, slong flen, ulong exp, ca_ctx_t ctx);
0193 void ca_poly_pow_ui(ca_poly_t res, const ca_poly_t poly, ulong exp, ca_ctx_t ctx);
0194
0195
0196
0197 void _ca_poly_evaluate_horner(ca_t res, ca_srcptr f, slong len, const ca_t x, ca_ctx_t ctx);
0198 void ca_poly_evaluate_horner(ca_t res, const ca_poly_t f, const ca_t a, ca_ctx_t ctx);
0199
0200 void _ca_poly_evaluate(ca_t res, ca_srcptr f, slong len, const ca_t x, ca_ctx_t ctx);
0201 void ca_poly_evaluate(ca_t res, const ca_poly_t f, const ca_t a, ca_ctx_t ctx);
0202
0203 void _ca_poly_compose(ca_ptr res, ca_srcptr poly1, slong len1, ca_srcptr poly2, slong len2, ca_ctx_t ctx);
0204 void ca_poly_compose(ca_poly_t res, const ca_poly_t poly1, const ca_poly_t poly2, ca_ctx_t ctx);
0205
0206
0207
0208
0209 void _ca_poly_derivative(ca_ptr res, ca_srcptr poly, slong len, ca_ctx_t ctx);
0210 void ca_poly_derivative(ca_poly_t res, const ca_poly_t poly, ca_ctx_t ctx);
0211
0212 void _ca_poly_integral(ca_ptr res, ca_srcptr poly, slong len, ca_ctx_t ctx);
0213 void ca_poly_integral(ca_poly_t res, const ca_poly_t poly, ca_ctx_t ctx);
0214
0215
0216
0217 slong _ca_poly_gcd_euclidean(ca_ptr G, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, ca_ctx_t ctx);
0218 int ca_poly_gcd_euclidean(ca_poly_t G, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0219
0220 slong _ca_poly_gcd(ca_ptr G, ca_srcptr A, slong lenA, ca_srcptr B, slong lenB, ca_ctx_t ctx);
0221 int ca_poly_gcd(ca_poly_t G, const ca_poly_t A, const ca_poly_t B, ca_ctx_t ctx);
0222
0223
0224
0225 void _ca_poly_inv_series(ca_ptr res, ca_srcptr f, slong flen, slong len, ca_ctx_t ctx);
0226 void ca_poly_inv_series(ca_poly_t res, const ca_poly_t f, slong len, ca_ctx_t ctx);
0227
0228 void _ca_poly_div_series(ca_ptr res, ca_srcptr f, slong flen, ca_srcptr g, slong glen, slong len, ca_ctx_t ctx);
0229 void ca_poly_div_series(ca_poly_t res, const ca_poly_t f, const ca_poly_t g, slong len, ca_ctx_t ctx);
0230
0231
0232
0233 void _ca_poly_exp_series(ca_ptr res, ca_srcptr f, slong flen, slong len, ca_ctx_t ctx);
0234 void ca_poly_exp_series(ca_poly_t res, const ca_poly_t f, slong len, ca_ctx_t ctx);
0235
0236 void _ca_poly_log_series(ca_ptr res, ca_srcptr f, slong flen, slong len, ca_ctx_t ctx);
0237 void ca_poly_log_series(ca_poly_t res, const ca_poly_t f, slong len, ca_ctx_t ctx);
0238
0239
0240
0241 ca_poly_struct * _ca_poly_vec_init(slong len, ca_ctx_t ctx);
0242 void ca_poly_vec_init(ca_poly_vec_t res, slong len, ca_ctx_t ctx);
0243
0244 void _ca_poly_vec_fit_length(ca_poly_vec_t vec, slong len, ca_ctx_t ctx);
0245 void ca_poly_vec_set_length(ca_poly_vec_t vec, slong len, ca_ctx_t ctx);
0246
0247 void _ca_poly_vec_clear(ca_poly_struct * v, slong len, ca_ctx_t ctx);
0248 void ca_poly_vec_clear(ca_poly_vec_t vec, ca_ctx_t ctx);
0249
0250 void ca_poly_vec_append(ca_poly_vec_t vec, const ca_poly_t f, ca_ctx_t ctx);
0251
0252
0253
0254 int ca_poly_factor_squarefree(ca_t c, ca_poly_vec_t fac, ulong * exp, const ca_poly_t F, ca_ctx_t ctx);
0255 int ca_poly_squarefree_part(ca_poly_t res, const ca_poly_t poly, ca_ctx_t ctx);
0256
0257 void _ca_poly_set_roots(ca_ptr poly, ca_srcptr roots, const ulong * exp, slong len, ca_ctx_t ctx);
0258 void ca_poly_set_roots(ca_poly_t poly, ca_vec_t roots, const ulong * exp, ca_ctx_t ctx);
0259
0260 int _ca_poly_roots(ca_ptr roots, ca_srcptr poly, slong len, ca_ctx_t ctx);
0261 int ca_poly_roots(ca_vec_t roots, ulong * exp, const ca_poly_t poly, ca_ctx_t ctx);
0262
0263
0264 #ifdef __cplusplus
0265 }
0266 #endif
0267
0268 #endif