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_VEC_H
0014 #define FMPZ_VEC_H
0015
0016 #ifdef FMPZ_VEC_INLINES_C
0017 #define FMPZ_VEC_INLINE
0018 #else
0019 #define FMPZ_VEC_INLINE static inline
0020 #endif
0021
0022 #include "fmpz_types.h"
0023
0024 #ifdef __cplusplus
0025 extern "C" {
0026 #endif
0027
0028 #define FMPZ_VEC_NORM(vec, i) \
0029 do \
0030 while ((i) && vec[(i) - 1] == WORD(0)) \
0031 (i)--; \
0032 while (0)
0033
0034 #define FMPZ_VEC_SWAP(vec1, len1, vec2, len2) \
0035 do { \
0036 FLINT_SWAP(fmpz *, vec1, vec2); \
0037 FLINT_SWAP(slong, len1, len2); \
0038 } while (0)
0039
0040
0041 #define FMPZ_VEC_TMP_INIT(vec, len) \
0042 do { \
0043 fmpz * __vres; \
0044 slong __vi; \
0045 vec = __vres = TMP_ARRAY_ALLOC(len, fmpz); \
0046 for (__vi = (len); __vi > 0; __vi--) \
0047 fmpz_init(__vres + __vi - 1); \
0048 } while (0)
0049
0050 #define FMPZ_VEC_TMP_CLEAR(vec, len) \
0051 do { \
0052 fmpz * __vres = (vec); \
0053 slong __vi; \
0054 for (__vi = (len); __vi > 0; __vi--) \
0055 fmpz_clear(__vres + __vi - 1); \
0056 } while (0)
0057
0058
0059
0060 FMPZ_VEC_INLINE fmpz * _fmpz_vec_init(slong len)
0061 {
0062 return (fmpz *) flint_calloc(len, sizeof(fmpz));
0063 }
0064
0065 void _fmpz_vec_clear(fmpz * vec, slong len);
0066
0067
0068
0069 void fmpz_vec_init(fmpz_vec_t vec, slong len);
0070 void fmpz_vec_clear(fmpz_vec_t vec);
0071 void fmpz_vec_set(fmpz_vec_t res, const fmpz_vec_t src);
0072 void fmpz_vec_fit_length(fmpz_vec_t vec, slong len);
0073 void fmpz_vec_set_length(fmpz_vec_t vec, slong len);
0074 void fmpz_vec_append(fmpz_vec_t vec, const fmpz_t f);
0075 void fmpz_vec_append_ui(fmpz_vec_t vec, ulong f);
0076
0077 FMPZ_VEC_INLINE slong
0078 fmpz_vec_length(const fmpz_vec_t vec)
0079 {
0080 return vec->length;
0081 }
0082
0083 FMPZ_VEC_INLINE fmpz *
0084 fmpz_vec_entry_ptr(fmpz_vec_t vec, slong i)
0085 {
0086 return vec->entries + i;
0087 }
0088
0089 FMPZ_VEC_INLINE const fmpz *
0090 fmpz_vec_entry_srcptr(const fmpz_vec_t vec, slong i)
0091 {
0092 return vec->entries + i;
0093 }
0094
0095
0096
0097 void _fmpz_vec_randtest(fmpz * f, flint_rand_t state, slong len, flint_bitcnt_t bits);
0098 void _fmpz_vec_randtest_unsigned(fmpz * f, flint_rand_t state, slong len, flint_bitcnt_t bits);
0099
0100
0101
0102 slong _fmpz_vec_max_bits(const fmpz * vec, slong len);
0103 slong _fmpz_vec_max_bits_ref(const fmpz * vec, slong len);
0104
0105 void _fmpz_vec_sum_max_bits(slong * sumabs, slong * maxabs, const fmpz * coeffs, slong length);
0106
0107 slong _fmpz_vec_max_limbs(const fmpz * vec, slong len);
0108
0109 void _fmpz_vec_height(fmpz_t height, const fmpz * vec, slong len);
0110
0111 slong _fmpz_vec_height_index(const fmpz * vec, slong len);
0112
0113
0114
0115 #ifdef FLINT_HAVE_FILE
0116 int _fmpz_vec_fprint(FILE * file, const fmpz * vec, slong len);
0117
0118 int _fmpz_vec_fread(FILE * file, fmpz ** vec, slong * len);
0119 #endif
0120
0121 int _fmpz_vec_print(const fmpz * vec, slong len);
0122
0123 int _fmpz_vec_read(fmpz ** vec, slong * len);
0124
0125
0126
0127 void _fmpz_vec_get_nmod_vec(nn_ptr res, const fmpz * poly, slong len, nmod_t mod);
0128 void _fmpz_vec_set_nmod_vec(fmpz * res, nn_srcptr poly, slong len, nmod_t mod);
0129
0130 void _fmpz_vec_get_fft(ulong ** coeffs_f, const fmpz * coeffs_m, slong l, slong length);
0131 void _fmpz_vec_set_fft(fmpz * coeffs_m, slong length, const nn_ptr * coeffs_f, slong limbs, slong sign);
0132
0133 slong _fmpz_vec_get_d_vec_2exp(double * appv, const fmpz * vec, slong len);
0134
0135
0136
0137 void _fmpz_vec_set(fmpz * vec1, const fmpz * vec2, slong len2);
0138
0139 void _fmpz_vec_swap(fmpz * vec1, fmpz * vec2, slong len2);
0140
0141 void _fmpz_vec_zero(fmpz * vec, slong len);
0142
0143 void _fmpz_vec_scalar_abs(fmpz * vec1, const fmpz * vec2, slong len2);
0144
0145
0146
0147 int _fmpz_vec_equal(const fmpz * vec1, const fmpz * vec2, slong len);
0148
0149 int _fmpz_vec_is_zero(const fmpz * vec, slong len);
0150
0151 void _fmpz_vec_min(fmpz * vec1, const fmpz * vec2, const fmpz * vec3, slong len);
0152 void _fmpz_vec_max(fmpz * vec1, const fmpz * vec2, const fmpz * vec3, slong len);
0153
0154 void _fmpz_vec_min_inplace(fmpz * vec1, const fmpz * vec2, slong len);
0155 void _fmpz_vec_max_inplace(fmpz * vec1, const fmpz * vec2, slong len);
0156
0157
0158
0159 void _fmpz_vec_sort(fmpz * vec, slong len);
0160
0161
0162
0163 void _fmpz_vec_add(fmpz * res, const fmpz * vec1, const fmpz * vec2, slong len2);
0164 void _fmpz_vec_sub(fmpz * res, const fmpz * vec1, const fmpz * vec2, slong len2);
0165
0166 void _fmpz_vec_neg(fmpz * vec1, const fmpz * vec2, slong len2);
0167
0168
0169
0170 void _fmpz_vec_scalar_mul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0171 void _fmpz_vec_scalar_mul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c);
0172 void _fmpz_vec_scalar_mul_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x);
0173 void _fmpz_vec_scalar_mul_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp);
0174
0175 void _fmpz_vec_scalar_divexact_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0176 void _fmpz_vec_scalar_divexact_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c);
0177 void _fmpz_vec_scalar_divexact_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x);
0178
0179 void _fmpz_vec_scalar_fdiv_q_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0180 void _fmpz_vec_scalar_fdiv_q_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c);
0181 void _fmpz_vec_scalar_fdiv_q_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t c);
0182 void _fmpz_vec_scalar_fdiv_q_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp);
0183
0184 void _fmpz_vec_scalar_fdiv_r_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp);
0185
0186 void _fmpz_vec_scalar_tdiv_q_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0187 void _fmpz_vec_scalar_tdiv_q_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c);
0188 void _fmpz_vec_scalar_tdiv_q_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t c);
0189 void _fmpz_vec_scalar_tdiv_q_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp);
0190
0191 void _fmpz_vec_scalar_addmul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0192 void _fmpz_vec_scalar_addmul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c);
0193 void _fmpz_vec_scalar_addmul_fmpz(fmpz * poly1, const fmpz * poly2, slong len2, const fmpz_t x);
0194 void _fmpz_vec_scalar_addmul_si_2exp(fmpz * vec1, const fmpz * vec2, slong len2, slong c, ulong exp);
0195
0196 void _fmpz_vec_scalar_submul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c);
0197 void _fmpz_vec_scalar_submul_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x);
0198 void _fmpz_vec_scalar_submul_si_2exp(fmpz * vec1, const fmpz * vec2, slong len2, slong c, ulong exp);
0199
0200
0201
0202 void _fmpz_vec_sum(fmpz_t res, const fmpz * vec, slong len);
0203
0204 void _fmpz_vec_prod(fmpz_t res, const fmpz * vec, slong len);
0205
0206 void _fmpz_ui_vec_prod(fmpz_t res, nn_srcptr vec, slong len);
0207
0208
0209
0210 void _fmpz_vec_scalar_mod_fmpz(fmpz *res, const fmpz *vec, slong len, const fmpz_t p);
0211 void _fmpz_vec_scalar_smod_fmpz(fmpz *res, const fmpz *vec, slong len, const fmpz_t p);
0212
0213 void _fmpz_vec_multi_CRT_ui(fmpz * res, nn_srcptr * residues, slong len, nn_srcptr primes, slong num_primes, int sign);
0214
0215
0216
0217 void _fmpz_vec_content(fmpz_t res, const fmpz * vec, slong len);
0218 void _fmpz_vec_content_chained(fmpz_t res, const fmpz * vec, slong len, const fmpz_t inp);
0219
0220 void _fmpz_vec_lcm(fmpz_t res, const fmpz * vec, slong len);
0221
0222
0223
0224 void _fmpz_vec_dot_general_naive(fmpz_t res, const fmpz_t initial, int subtract,
0225 const fmpz * a, const fmpz * b, int reverse, slong len);
0226 void _fmpz_vec_dot_general(fmpz_t res, const fmpz_t initial, int subtract,
0227 const fmpz * a, const fmpz * b, int reverse, slong len);
0228
0229 FMPZ_VEC_INLINE
0230 void _fmpz_vec_dot(fmpz_t res, const fmpz * vec1, const fmpz * vec2, slong len2)
0231 {
0232 _fmpz_vec_dot_general(res, NULL, 0, vec1, vec2, 0, len2);
0233 }
0234
0235 #ifdef __cplusplus
0236 }
0237 #endif
0238
0239 #endif