Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /*
0002     Copyright (C) 2010 William Hart
0003     Copyright (C) 2010 Sebastian Pancratz
0004 
0005     This file is part of FLINT.
0006 
0007     FLINT is free software: you can redistribute it and/or modify it under
0008     the terms of the GNU Lesser General Public License (LGPL) as published
0009     by the Free Software Foundation; either version 3 of the License, or
0010     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
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 /* makes assignment to vec */
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 /*  Memory management  *******************************************************/
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 /* Resizable vector objects */
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 /*  Randomisation  ***********************************************************/
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 /*  Norms  *******************************************************************/
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 /*  Input and output  ********************************************************/
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 /*  Conversions  *************************************************************/
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 /*  Assignment and basic manipulation  ***************************************/
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 /*  Comparison  **************************************************************/
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 /* Sorting  ******************************************************************/
0158 
0159 void _fmpz_vec_sort(fmpz * vec, slong len);
0160 
0161 /*  Addition  ****************************************************************/
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 /*  Scalar multiplication and division  **************************************/
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 /*  Vector sum and product  **************************************************/
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 /*  Reduction mod p **********************************************************/
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 /*  Gaussian content  ********************************************************/
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 /*  Dot product  *************************************************************/
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