Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2020 Fredrik Johansson
0003 
0004     This file is part of FLINT.
0005 
0006     FLINT is free software: you can redistribute it and/or modify it under
0007     the terms of the GNU Lesser General Public License (LGPL) as published
0008     by the Free Software Foundation; either version 3 of the License, or
0009     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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 /* Vector object */
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 /* Memory management */
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 /* Length */
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 /* Assignment */
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 /* Special vectors */
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 /* Input and output */
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 /* List operations */
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 /* Arithmetic */
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 /* Comparisons and predicates */
0118 
0119 truth_t _ca_vec_check_is_zero(ca_srcptr vec, slong len, ca_ctx_t ctx);
0120 
0121 /* Internal representation */
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);       /* todo: optimize */
0183             ca_div_fmpz(res + i, res + i, den, ctx);
0184         }
0185     }
0186 }
0187 
0188 #ifdef __cplusplus
0189 }
0190 #endif
0191 
0192 #endif