File indexing completed on 2026-11-07 10:15:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef CA_VEC_H
0013 #define CA_VEC_H
0014
0015 #ifdef CA_VEC_INLINES_C
0016 #define CA_VEC_INLINE
0017 #else
0018 #define CA_VEC_INLINE static inline
0019 #endif
0020
0021 #include "ca.h"
0022
0023 #ifdef __cplusplus
0024 extern "C" {
0025 #endif
0026
0027
0028
0029 #define ca_vec_entry(vec, i) ((vec)->entries + (i))
0030
0031 CA_VEC_INLINE ca_ptr
0032 ca_vec_entry_ptr(ca_vec_t vec, slong i)
0033 {
0034 return ca_vec_entry(vec, i);
0035 }
0036
0037
0038
0039 ca_ptr _ca_vec_init(slong len, ca_ctx_t ctx);
0040 void ca_vec_init(ca_vec_t vec, slong len, ca_ctx_t ctx);
0041
0042 void _ca_vec_clear(ca_ptr vec, slong len, ca_ctx_t ctx);
0043 void ca_vec_clear(ca_vec_t vec, ca_ctx_t ctx);
0044
0045 void _ca_vec_swap(ca_ptr vec1, ca_ptr vec2, slong len, ca_ctx_t ctx);
0046
0047 CA_VEC_INLINE void
0048 ca_vec_swap(ca_vec_t vec1, ca_vec_t vec2, ca_ctx_t FLINT_UNUSED(ctx))
0049 {
0050 FLINT_SWAP(ca_vec_struct, *vec1, *vec2);
0051 }
0052
0053
0054
0055 CA_VEC_INLINE
0056 slong ca_vec_length(const ca_vec_t vec, ca_ctx_t FLINT_UNUSED(ctx))
0057 {
0058 return vec->length;
0059 }
0060
0061 void _ca_vec_fit_length(ca_vec_t vec, slong len, ca_ctx_t ctx);
0062 void ca_vec_set_length(ca_vec_t vec, slong len, ca_ctx_t ctx);
0063
0064
0065
0066 void _ca_vec_set(ca_ptr res, ca_srcptr src, slong len, ca_ctx_t ctx);
0067 void ca_vec_set(ca_vec_t res, const ca_vec_t src, ca_ctx_t ctx);
0068
0069
0070
0071 void _ca_vec_zero(ca_ptr res, slong len, ca_ctx_t ctx);
0072 void ca_vec_zero(ca_vec_t res, slong len, ca_ctx_t ctx);
0073
0074 CA_VEC_INLINE
0075 void _ca_vec_unknown(ca_ptr vec, slong len, ca_ctx_t ctx)
0076 {
0077 slong i;
0078 for (i = 0; i < len; i++)
0079 ca_unknown(vec + i, ctx);
0080 }
0081
0082 CA_VEC_INLINE
0083 void _ca_vec_undefined(ca_ptr vec, slong len, ca_ctx_t ctx)
0084 {
0085 slong i;
0086 for (i = 0; i < len; i++)
0087 ca_undefined(vec + i, ctx);
0088 }
0089
0090
0091
0092 void ca_vec_print(const ca_vec_t vec, ca_ctx_t ctx);
0093 void ca_vec_printn(const ca_vec_t vec, slong digits, ca_ctx_t ctx);
0094
0095
0096
0097 CA_VEC_INLINE void
0098 ca_vec_append(ca_vec_t vec, const ca_t f, ca_ctx_t ctx)
0099 {
0100 _ca_vec_fit_length(vec, vec->length + 1, ctx);
0101 ca_set(vec->entries + vec->length, f, ctx);
0102 vec->length++;
0103 }
0104
0105
0106
0107 void _ca_vec_neg(ca_ptr res, ca_srcptr src, slong len, ca_ctx_t ctx);
0108 void ca_vec_neg(ca_vec_t res, const ca_vec_t src, ca_ctx_t ctx);
0109
0110 void _ca_vec_add(ca_ptr res, ca_srcptr vec1, ca_srcptr vec2, slong len, ca_ctx_t ctx);
0111 void _ca_vec_sub(ca_ptr res, ca_srcptr vec1, ca_srcptr vec2, slong len, ca_ctx_t ctx);
0112 void _ca_vec_scalar_mul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx);
0113 void _ca_vec_scalar_div_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx);
0114 void _ca_vec_scalar_addmul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx);
0115 void _ca_vec_scalar_submul_ca(ca_ptr res, ca_srcptr src, slong len, const ca_t c, ca_ctx_t ctx);
0116
0117
0118
0119 truth_t _ca_vec_check_is_zero(ca_srcptr vec, slong len, ca_ctx_t ctx);
0120
0121
0122
0123 CA_VEC_INLINE int
0124 _ca_vec_is_fmpq_vec(ca_srcptr vec, slong len, ca_ctx_t ctx)
0125 {
0126 slong i;
0127 for (i = 0; i < len; i++)
0128 if (!CA_IS_QQ(vec + i, ctx))
0129 return 0;
0130 return 1;
0131 }
0132
0133 CA_VEC_INLINE int
0134 _ca_vec_fmpq_vec_is_fmpz_vec(ca_srcptr vec, slong len, ca_ctx_t FLINT_UNUSED(ctx))
0135 {
0136 slong i;
0137 for (i = 0; i < len; i++)
0138 if (!fmpz_is_one(CA_FMPQ_DENREF(vec + i)))
0139 return 0;
0140 return 1;
0141 }
0142
0143 CA_VEC_INLINE void
0144 _ca_vec_fmpq_vec_get_fmpz_vec_den(fmpz * c, fmpz_t den, ca_srcptr vec, slong len, ca_ctx_t ctx)
0145 {
0146 slong i;
0147
0148 fmpz_one(den);
0149
0150 if (_ca_vec_fmpq_vec_is_fmpz_vec(vec, len, ctx))
0151 {
0152 for (i = 0; i < len; i++)
0153 fmpz_set(c + i, CA_FMPQ_NUMREF(vec + i));
0154 }
0155 else
0156 {
0157 for (i = 0; i < len; i++)
0158 fmpz_lcm(den, den, CA_FMPQ_DENREF(vec + i));
0159
0160 for (i = 0; i < len; i++)
0161 {
0162 fmpz_divexact(c + i, den, CA_FMPQ_DENREF(vec + i));
0163 fmpz_mul(c + i, c + i, CA_FMPQ_NUMREF(vec + i));
0164 }
0165 }
0166 }
0167
0168 CA_VEC_INLINE void
0169 _ca_vec_set_fmpz_vec_div_fmpz(ca_ptr res, const fmpz * v, const fmpz_t den, slong len, ca_ctx_t ctx)
0170 {
0171 slong i;
0172
0173 if (fmpz_is_one(den))
0174 {
0175 for (i = 0; i < len; i++)
0176 ca_set_fmpz(res + i, v + i, ctx);
0177 }
0178 else
0179 {
0180 for (i = 0; i < len; i++)
0181 {
0182 ca_set_fmpz(res + i, v + i, ctx);
0183 ca_div_fmpz(res + i, res + i, den, ctx);
0184 }
0185 }
0186 }
0187
0188 #ifdef __cplusplus
0189 }
0190 #endif
0191
0192 #endif