arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_znx_arithmetic_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_znx_arithmetic_private.hRaw
  1#ifndef SPQLIOS_VEC_ZNX_ARITHMETIC_PRIVATE_H
  2#define SPQLIOS_VEC_ZNX_ARITHMETIC_PRIVATE_H
  3
  4#include "../commons_private.h"
  5#include "../q120/q120_ntt.h"
  6#include "vec_znx_arithmetic.h"
  7
  8/**
  9 * Layouts families:
 10 *
 11 * fft64:
 12 *   K: <= 20, N: <= 65536, ell: <= 200
 13 *   vec<ZnX> normalized: represented by int64
 14 *   vec<ZnX> large: represented by int64 (expect <=52 bits)
 15 *   vec<ZnX> DFT: represented by double (reim_fft space)
 16 *   On AVX2 inftastructure, PMAT, LCNV, RCNV use a special reim4_fft space
 17 *
 18 * ntt120:
 19 *   K: <= 50, N: <= 65536, ell: <= 80
 20 *   vec<ZnX> normalized: represented by int64
 21 *   vec<ZnX> large: represented by int128 (expect <=120 bits)
 22 *   vec<ZnX> DFT: represented by int64x4 (ntt120 space)
 23 *   On AVX2 inftastructure, PMAT, LCNV, RCNV use a special ntt120 space
 24 *
 25 * ntt104:
 26 *   K: <= 40, N: <= 65536, ell: <= 80
 27 *   vec<ZnX> normalized: represented by int64
 28 *   vec<ZnX> large: represented by int128 (expect <=120 bits)
 29 *   vec<ZnX> DFT: represented by int64x4 (ntt120 space)
 30 *   On AVX512 inftastructure, PMAT, LCNV, RCNV use a special ntt104 space
 31 */
 32
 33struct fft64_module_info_t {
 34  // pre-computation for reim_fft
 35  REIM_FFT_PRECOMP* p_fft;
 36  // pre-computation for add_fft
 37  REIM_FFTVEC_ADD_PRECOMP* add_fft;
 38  // pre-computation for add_fft
 39  REIM_FFTVEC_SUB_PRECOMP* sub_fft;
 40  // pre-computation for mul_fft
 41  REIM_FFTVEC_MUL_PRECOMP* mul_fft;
 42  // pre-computation for reim_from_znx6
 43  REIM_FROM_ZNX64_PRECOMP* p_conv;
 44  // pre-computation for reim_tp_znx6
 45  REIM_TO_ZNX64_PRECOMP* p_reim_to_znx;
 46  // pre-computation for reim_fft
 47  REIM_IFFT_PRECOMP* p_ifft;
 48  // pre-computation for reim_fftvec_addmul
 49  REIM_FFTVEC_ADDMUL_PRECOMP* p_addmul;
 50};
 51
 52struct q120_module_info_t {
 53  // pre-computation for q120b to q120b ntt
 54  q120_ntt_precomp* p_ntt;
 55  // pre-computation for q120b to q120b intt
 56  q120_ntt_precomp* p_intt;
 57};
 58
 59// TODO add function types here
 60typedef typeof(vec_znx_zero) VEC_ZNX_ZERO_F;
 61typedef typeof(vec_znx_copy) VEC_ZNX_COPY_F;
 62typedef typeof(vec_znx_negate) VEC_ZNX_NEGATE_F;
 63typedef typeof(vec_znx_add) VEC_ZNX_ADD_F;
 64typedef typeof(vec_znx_dft) VEC_ZNX_DFT_F;
 65typedef typeof(vec_dft_add) VEC_DFT_ADD_F;
 66typedef typeof(vec_dft_sub) VEC_DFT_SUB_F;
 67typedef typeof(vec_znx_idft) VEC_ZNX_IDFT_F;
 68typedef typeof(vec_znx_idft_tmp_bytes) VEC_ZNX_IDFT_TMP_BYTES_F;
 69typedef typeof(vec_znx_idft_tmp_a) VEC_ZNX_IDFT_TMP_A_F;
 70typedef typeof(vec_znx_sub) VEC_ZNX_SUB_F;
 71typedef typeof(vec_znx_rotate) VEC_ZNX_ROTATE_F;
 72typedef typeof(vec_znx_mul_xp_minus_one) VEC_ZNX_MUL_XP_MINUS_ONE_F;
 73typedef typeof(vec_znx_automorphism) VEC_ZNX_AUTOMORPHISM_F;
 74typedef typeof(vec_znx_normalize_base2k) VEC_ZNX_NORMALIZE_BASE2K_F;
 75typedef typeof(vec_znx_normalize_base2k_tmp_bytes) VEC_ZNX_NORMALIZE_BASE2K_TMP_BYTES_F;
 76typedef typeof(vec_znx_big_normalize_base2k) VEC_ZNX_BIG_NORMALIZE_BASE2K_F;
 77typedef typeof(vec_znx_big_normalize_base2k_tmp_bytes) VEC_ZNX_BIG_NORMALIZE_BASE2K_TMP_BYTES_F;
 78typedef typeof(vec_znx_big_range_normalize_base2k) VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_F;
 79typedef typeof(vec_znx_big_range_normalize_base2k_tmp_bytes) VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_TMP_BYTES_F;
 80typedef typeof(vec_znx_big_add) VEC_ZNX_BIG_ADD_F;
 81typedef typeof(vec_znx_big_add_small) VEC_ZNX_BIG_ADD_SMALL_F;
 82typedef typeof(vec_znx_big_add_small2) VEC_ZNX_BIG_ADD_SMALL2_F;
 83typedef typeof(vec_znx_big_sub) VEC_ZNX_BIG_SUB_F;
 84typedef typeof(vec_znx_big_sub_small_a) VEC_ZNX_BIG_SUB_SMALL_A_F;
 85typedef typeof(vec_znx_big_sub_small_b) VEC_ZNX_BIG_SUB_SMALL_B_F;
 86typedef typeof(vec_znx_big_sub_small2) VEC_ZNX_BIG_SUB_SMALL2_F;
 87typedef typeof(vec_znx_big_rotate) VEC_ZNX_BIG_ROTATE_F;
 88typedef typeof(vec_znx_big_automorphism) VEC_ZNX_BIG_AUTOMORPHISM_F;
 89typedef typeof(svp_prepare) SVP_PREPARE;
 90typedef typeof(svp_apply_dft) SVP_APPLY_DFT_F;
 91typedef typeof(svp_apply_dft_to_dft) SVP_APPLY_DFT_TO_DFT_F;
 92typedef typeof(znx_small_single_product) ZNX_SMALL_SINGLE_PRODUCT_F;
 93typedef typeof(znx_small_single_product_tmp_bytes) ZNX_SMALL_SINGLE_PRODUCT_TMP_BYTES_F;
 94typedef typeof(vmp_prepare_contiguous) VMP_PREPARE_CONTIGUOUS_F;
 95typedef typeof(vmp_prepare_tmp_bytes) VMP_PREPARE_TMP_BYTES_F;
 96typedef typeof(vmp_apply_dft) VMP_APPLY_DFT_F;
 97typedef typeof(vmp_apply_dft_add) VMP_APPLY_DFT_ADD_F;
 98typedef typeof(vmp_apply_dft_tmp_bytes) VMP_APPLY_DFT_TMP_BYTES_F;
 99typedef typeof(vmp_apply_dft_to_dft) VMP_APPLY_DFT_TO_DFT_F;
100typedef typeof(vmp_apply_dft_to_dft_add) VMP_APPLY_DFT_TO_DFT_ADD_F;
101typedef typeof(vmp_apply_dft_to_dft_tmp_bytes) VMP_APPLY_DFT_TO_DFT_TMP_BYTES_F;
102typedef typeof(bytes_of_vec_znx_dft) BYTES_OF_VEC_ZNX_DFT_F;
103typedef typeof(bytes_of_vec_znx_big) BYTES_OF_VEC_ZNX_BIG_F;
104typedef typeof(bytes_of_svp_ppol) BYTES_OF_SVP_PPOL_F;
105typedef typeof(bytes_of_vmp_pmat) BYTES_OF_VMP_PMAT_F;
106
107struct module_virtual_functions_t {
108  // TODO add functions here
109  VEC_ZNX_ZERO_F* vec_znx_zero;
110  VEC_ZNX_COPY_F* vec_znx_copy;
111  VEC_ZNX_NEGATE_F* vec_znx_negate;
112  VEC_ZNX_ADD_F* vec_znx_add;
113  VEC_ZNX_DFT_F* vec_znx_dft;
114  VEC_DFT_ADD_F* vec_dft_add;
115  VEC_DFT_SUB_F* vec_dft_sub;
116  VEC_ZNX_IDFT_F* vec_znx_idft;
117  VEC_ZNX_IDFT_TMP_BYTES_F* vec_znx_idft_tmp_bytes;
118  VEC_ZNX_IDFT_TMP_A_F* vec_znx_idft_tmp_a;
119  VEC_ZNX_SUB_F* vec_znx_sub;
120  VEC_ZNX_ROTATE_F* vec_znx_rotate;
121  VEC_ZNX_MUL_XP_MINUS_ONE_F* vec_znx_mul_xp_minus_one;
122  VEC_ZNX_AUTOMORPHISM_F* vec_znx_automorphism;
123  VEC_ZNX_NORMALIZE_BASE2K_F* vec_znx_normalize_base2k;
124  VEC_ZNX_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_normalize_base2k_tmp_bytes;
125  VEC_ZNX_BIG_NORMALIZE_BASE2K_F* vec_znx_big_normalize_base2k;
126  VEC_ZNX_BIG_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_big_normalize_base2k_tmp_bytes;
127  VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_F* vec_znx_big_range_normalize_base2k;
128  VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_big_range_normalize_base2k_tmp_bytes;
129  VEC_ZNX_BIG_ADD_F* vec_znx_big_add;
130  VEC_ZNX_BIG_ADD_SMALL_F* vec_znx_big_add_small;
131  VEC_ZNX_BIG_ADD_SMALL2_F* vec_znx_big_add_small2;
132  VEC_ZNX_BIG_SUB_F* vec_znx_big_sub;
133  VEC_ZNX_BIG_SUB_SMALL_A_F* vec_znx_big_sub_small_a;
134  VEC_ZNX_BIG_SUB_SMALL_B_F* vec_znx_big_sub_small_b;
135  VEC_ZNX_BIG_SUB_SMALL2_F* vec_znx_big_sub_small2;
136  VEC_ZNX_BIG_ROTATE_F* vec_znx_big_rotate;
137  VEC_ZNX_BIG_AUTOMORPHISM_F* vec_znx_big_automorphism;
138  SVP_PREPARE* svp_prepare;
139  SVP_APPLY_DFT_F* svp_apply_dft;
140  SVP_APPLY_DFT_TO_DFT_F* svp_apply_dft_to_dft;
141  ZNX_SMALL_SINGLE_PRODUCT_F* znx_small_single_product;
142  ZNX_SMALL_SINGLE_PRODUCT_TMP_BYTES_F* znx_small_single_product_tmp_bytes;
143  VMP_PREPARE_CONTIGUOUS_F* vmp_prepare_contiguous;
144  VMP_PREPARE_TMP_BYTES_F* vmp_prepare_tmp_bytes;
145  VMP_APPLY_DFT_F* vmp_apply_dft;
146  VMP_APPLY_DFT_ADD_F* vmp_apply_dft_add;
147  VMP_APPLY_DFT_TMP_BYTES_F* vmp_apply_dft_tmp_bytes;
148  VMP_APPLY_DFT_TO_DFT_F* vmp_apply_dft_to_dft;
149  VMP_APPLY_DFT_TO_DFT_ADD_F* vmp_apply_dft_to_dft_add;
150  VMP_APPLY_DFT_TO_DFT_TMP_BYTES_F* vmp_apply_dft_to_dft_tmp_bytes;
151  BYTES_OF_VEC_ZNX_DFT_F* bytes_of_vec_znx_dft;
152  BYTES_OF_VEC_ZNX_BIG_F* bytes_of_vec_znx_big;
153  BYTES_OF_SVP_PPOL_F* bytes_of_svp_ppol;
154  BYTES_OF_VMP_PMAT_F* bytes_of_vmp_pmat;
155};
156
157union backend_module_info_t {
158  struct fft64_module_info_t fft64;
159  struct q120_module_info_t q120;
160};
161
162struct module_info_t {
163  // generic parameters
164  MODULE_TYPE module_type;
165  uint64_t nn;
166  uint64_t m;
167  // backend_dependent functions
168  union backend_module_info_t mod;
169  // virtual functions
170  struct module_virtual_functions_t func;
171};
172
173EXPORT uint64_t fft64_bytes_of_vec_znx_dft(const MODULE* module,  // N
174                                           uint64_t size);
175
176EXPORT uint64_t fft64_bytes_of_vec_znx_big(const MODULE* module,  // N
177                                           uint64_t size);
178
179EXPORT uint64_t fft64_bytes_of_svp_ppol(const MODULE* module);  // N
180
181EXPORT uint64_t fft64_bytes_of_vmp_pmat(const MODULE* module,  // N
182                                        uint64_t nrows, uint64_t ncols);
183
184EXPORT void vec_znx_zero_ref(const MODULE* module,                             // N
185                             int64_t* res, uint64_t res_size, uint64_t res_sl  // res
186);
187
188EXPORT void vec_znx_copy_ref(const MODULE* module,                             // N
189                             int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
190                             const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
191);
192
193EXPORT void vec_znx_negate_ref(const MODULE* module,                              // N
194                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
195                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
196);
197
198EXPORT void vec_znx_negate_avx(const MODULE* module,                              // N
199                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
200                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
201);
202
203EXPORT void vec_znx_add_ref(const MODULE* module,                              // N
204                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
205                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
206                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
207);
208EXPORT void vec_znx_add_avx(const MODULE* module,                              // N
209                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
210                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
211                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
212);
213
214EXPORT void vec_znx_sub_ref(const MODULE* module,                             // N
215                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
216                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
217                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
218);
219
220EXPORT void vec_znx_sub_avx(const MODULE* module,                              // N
221                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
222                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
223                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
224);
225
226EXPORT void vec_znx_normalize_base2k_ref(const MODULE* module, uint64_t nn,                              // N
227                                         uint64_t log2_base2k,                              // output base 2^K
228                                         int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
229                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // inp
230                                         uint8_t* tmp_space                                 // scratch space
231);
232
233EXPORT uint64_t vec_znx_normalize_base2k_tmp_bytes_ref(const MODULE* module, uint64_t nn  // N
234);
235
236EXPORT void vec_znx_rotate_ref(const MODULE* module,                              // N
237                               const int64_t p,                                   // rotation value
238                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
239                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
240);
241
242EXPORT void vec_znx_mul_xp_minus_one_ref(const MODULE* module,                              // N
243                               const int64_t p,                                   // rotation value
244                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
245                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
246);
247
248EXPORT void vec_znx_automorphism_ref(const MODULE* module,                              // N
249                                     const int64_t p,                                   // X->X^p
250                                     int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
251                                     const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
252);
253
254EXPORT void vmp_prepare_ref(const MODULE* module,                              // N
255                            VMP_PMAT* pmat,                                     // output
256                            const int64_t* mat, uint64_t nrows, uint64_t ncols  // a
257);
258
259EXPORT void vmp_apply_dft_ref(const MODULE* module,                                // N
260                              VEC_ZNX_DFT* res, uint64_t res_size,                  // res
261                              const int64_t* a, uint64_t a_size, uint64_t a_sl,     // a
262                              const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols  // prep matrix
263);
264
265EXPORT void vec_dft_zero_ref(const MODULE* module,               // N
266                             VEC_ZNX_DFT* res, uint64_t res_size  // res
267);
268
269EXPORT void vec_dft_add_ref(const MODULE* module,                  // N
270                            VEC_ZNX_DFT* res, uint64_t res_size,    // res
271                            const VEC_ZNX_DFT* a, uint64_t a_size,  // a
272                            const VEC_ZNX_DFT* b, uint64_t b_size   // b
273);
274
275EXPORT void vec_dft_sub_ref(const MODULE* module,                  // N
276                            VEC_ZNX_DFT* res, uint64_t res_size,    // res
277                            const VEC_ZNX_DFT* a, uint64_t a_size,  // a
278                            const VEC_ZNX_DFT* b, uint64_t b_size   // b
279);
280
281EXPORT void vec_dft_ref(const MODULE* module,                            // N
282                        VEC_ZNX_DFT* res, uint64_t res_size,              // res
283                        const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
284);
285
286EXPORT void vec_idft_ref(const MODULE* module,                // N
287                         VEC_ZNX_BIG* res, uint64_t res_size,  // res
288                         const VEC_ZNX_DFT* a_dft, uint64_t a_size);
289
290EXPORT void vec_znx_big_normalize_ref(const MODULE* module,                              // MODULE  
291                                      uint64_t nn,                                       // N
292                                      uint64_t k,                                        // base-2^k
293                                      int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
294                                      const VEC_ZNX_BIG* a, uint64_t a_size              // a
295);
296
297/** @brief apply a svp product, result = ppol * a, presented in DFT space  */
298EXPORT void fft64_svp_apply_dft_ref(const MODULE* module,                             // N
299                                    const VEC_ZNX_DFT* res, uint64_t res_size,        // output
300                                    const SVP_PPOL* ppol,                             // prepared pol
301                                    const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
302);
303
304/** @brief apply a svp product, result = ppol * a, presented in DFT space  */
305EXPORT void fft64_svp_apply_dft_to_dft_ref(const MODULE* module,  // N
306                                           const VEC_ZNX_DFT* res, uint64_t res_size,
307                                           uint64_t res_cols,     // output
308                                           const SVP_PPOL* ppol,  // prepared pol
309                                           const VEC_ZNX_DFT* a, uint64_t a_size,
310                                           uint64_t a_cols  // a
311);
312
313/** @brief sets res = k-normalize(a) -- output in int64 coeffs space */
314EXPORT void fft64_vec_znx_big_normalize_base2k(const MODULE* module,                              // MODULE
315                                               uint64_t nn,                                       // N
316                                               uint64_t k,                                        // base-2^k
317                                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
318                                               const VEC_ZNX_BIG* a, uint64_t a_size,             // a
319                                               uint8_t* tmp_space                                 // temp space
320);
321
322/** @brief returns the minimal byte length of scratch space for vec_znx_big_normalize_base2k */
323EXPORT uint64_t fft64_vec_znx_big_normalize_base2k_tmp_bytes(const MODULE* module, uint64_t nn  // N
324
325);
326
327/** @brief sets res = k-normalize(a.subrange) -- output in int64 coeffs space */
328EXPORT void fft64_vec_znx_big_range_normalize_base2k(const MODULE* module,                              // MODULE
329                                                     uint64_t nn,
330                                                     uint64_t log2_base2k,                              // base-2^k
331                                                     int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
332                                                     const VEC_ZNX_BIG* a, uint64_t a_range_begin,      // a
333                                                     uint64_t a_range_xend, uint64_t a_range_step,      // range
334                                                     uint8_t* tmp_space                                 // temp space
335);
336
337/** @brief returns the minimal byte length of scratch space for vec_znx_big_range_normalize_base2k */
338EXPORT uint64_t fft64_vec_znx_big_range_normalize_base2k_tmp_bytes(const MODULE* module, uint64_t nn  // N
339);
340
341EXPORT void fft64_vec_znx_dft(const MODULE* module,                             // N
342                              VEC_ZNX_DFT* res, uint64_t res_size,              // res
343                              const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
344);
345
346EXPORT void fft64_vec_dft_add(const MODULE* module,                   // N
347                              VEC_ZNX_DFT* res, uint64_t res_size,    // res
348                              const VEC_ZNX_DFT* a, uint64_t a_size,  // a
349                              const VEC_ZNX_DFT* b, uint64_t b_size   // b
350);
351
352EXPORT void fft64_vec_dft_sub(const MODULE* module,                   // N
353                              VEC_ZNX_DFT* res, uint64_t res_size,    // res
354                              const VEC_ZNX_DFT* a, uint64_t a_size,  // a
355                              const VEC_ZNX_DFT* b, uint64_t b_size   // b
356);
357
358EXPORT void fft64_vec_znx_idft(const MODULE* module,                       // N
359                               VEC_ZNX_BIG* res, uint64_t res_size,        // res
360                               const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
361                               uint8_t* tmp                                // scratch space
362);
363
364EXPORT uint64_t fft64_vec_znx_idft_tmp_bytes(const MODULE* module, uint64_t nn);
365
366EXPORT void fft64_vec_znx_idft_tmp_a(const MODULE* module,                 // N
367                                     VEC_ZNX_BIG* res, uint64_t res_size,  // res
368                                     VEC_ZNX_DFT* a_dft, uint64_t a_size   // a is overwritten
369);
370
371EXPORT void ntt120_vec_znx_dft_avx(const MODULE* module,                             // N
372                                   VEC_ZNX_DFT* res, uint64_t res_size,              // res
373                                   const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
374);
375
376/**   */
377EXPORT void ntt120_vec_znx_idft_avx(const MODULE* module,                       // N
378                                    VEC_ZNX_BIG* res, uint64_t res_size,        // res
379                                    const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
380                                    uint8_t* tmp                                // scratch space
381);
382
383EXPORT uint64_t ntt120_vec_znx_idft_tmp_bytes_avx(const MODULE* module, uint64_t nn);
384
385EXPORT void ntt120_vec_znx_idft_tmp_a_avx(const MODULE* module,                 // N
386                                          VEC_ZNX_BIG* res, uint64_t res_size,  // res
387                                          VEC_ZNX_DFT* a_dft, uint64_t a_size   // a is overwritten
388);
389
390// big additions/subtractions
391
392/** @brief sets res = a+b */
393EXPORT void fft64_vec_znx_big_add(const MODULE* module,                   // N
394                                  VEC_ZNX_BIG* res, uint64_t res_size,    // res
395                                  const VEC_ZNX_BIG* a, uint64_t a_size,  // a
396                                  const VEC_ZNX_BIG* b, uint64_t b_size   // b
397);
398/** @brief sets res = a+b */
399EXPORT void fft64_vec_znx_big_add_small(const MODULE* module,                             // N
400                                        VEC_ZNX_BIG* res, uint64_t res_size,              // res
401                                        const VEC_ZNX_BIG* a, uint64_t a_size,            // a
402                                        const int64_t* b, uint64_t b_size, uint64_t b_sl  // b
403);
404EXPORT void fft64_vec_znx_big_add_small2(const MODULE* module,                              // N
405                                         VEC_ZNX_BIG* res, uint64_t res_size,               // res
406                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
407                                         const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
408);
409
410/** @brief sets res = a-b */
411EXPORT void fft64_vec_znx_big_sub(const MODULE* module,                   // N
412                                  VEC_ZNX_BIG* res, uint64_t res_size,    // res
413                                  const VEC_ZNX_BIG* a, uint64_t a_size,  // a
414                                  const VEC_ZNX_BIG* b, uint64_t b_size   // b
415);
416EXPORT void fft64_vec_znx_big_sub_small_b(const MODULE* module,                             // N
417                                          VEC_ZNX_BIG* res, uint64_t res_size,              // res
418                                          const VEC_ZNX_BIG* a, uint64_t a_size,            // a
419                                          const int64_t* b, uint64_t b_size, uint64_t b_sl  // b
420);
421EXPORT void fft64_vec_znx_big_sub_small_a(const MODULE* module,                              // N
422                                          VEC_ZNX_BIG* res, uint64_t res_size,               // res
423                                          const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
424                                          const VEC_ZNX_BIG* b, uint64_t b_size              // b
425);
426EXPORT void fft64_vec_znx_big_sub_small2(const MODULE* module,                              // N
427                                         VEC_ZNX_BIG* res, uint64_t res_size,               // res
428                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
429                                         const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
430);
431
432/** @brief sets res = a . X^p */
433EXPORT void fft64_vec_znx_big_rotate(const MODULE* module,                  // N
434                                     int64_t p,                             // rotation value
435                                     VEC_ZNX_BIG* res, uint64_t res_size,   // res
436                                     const VEC_ZNX_BIG* a, uint64_t a_size  // a
437);
438
439/** @brief sets res = a(X^p) */
440EXPORT void fft64_vec_znx_big_automorphism(const MODULE* module,                  // N
441                                           int64_t p,                             // X-X^p
442                                           VEC_ZNX_BIG* res, uint64_t res_size,   // res
443                                           const VEC_ZNX_BIG* a, uint64_t a_size  // a
444);
445
446/** @brief prepares a svp polynomial  */
447EXPORT void fft64_svp_prepare_ref(const MODULE* module,  // N
448                                  SVP_PPOL* ppol,        // output
449                                  const int64_t* pol     // a
450);
451
452/** @brief res = a * b : small integer polynomial product  */
453EXPORT void fft64_znx_small_single_product(const MODULE* module,  // N
454                                           int64_t* res,          // output
455                                           const int64_t* a,      // a
456                                           const int64_t* b,      // b
457                                           uint8_t* tmp);
458
459/** @brief tmp bytes required for znx_small_single_product  */
460EXPORT uint64_t fft64_znx_small_single_product_tmp_bytes(const MODULE* module, uint64_t nn);
461
462/** @brief prepares a vmp matrix (contiguous row-major version) */
463EXPORT void fft64_vmp_prepare_contiguous_ref(const MODULE* module,                                // N
464                                             VMP_PMAT* pmat,                                      // output
465                                             const int64_t* mat, uint64_t nrows, uint64_t ncols,  // a
466                                             uint8_t* tmp_space                                   // scratch space
467);
468
469/** @brief prepares a vmp matrix (contiguous row-major version) */
470EXPORT void fft64_vmp_prepare_contiguous_avx(const MODULE* module,                                // N
471                                             VMP_PMAT* pmat,                                      // output
472                                             const int64_t* mat, uint64_t nrows, uint64_t ncols,  // a
473                                             uint8_t* tmp_space                                   // scratch space
474);
475
476/** @brief minimal scratch space byte-size required for the vmp_prepare function */
477EXPORT uint64_t fft64_vmp_prepare_tmp_bytes(const MODULE* module, uint64_t nn,  // N
478                                            uint64_t nrows, uint64_t ncols);
479
480/** @brief applies a vmp product (result in DFT space) and adds to res inplace */
481EXPORT void fft64_vmp_apply_dft_add_ref(const MODULE* module,                              // N
482                                        VEC_ZNX_DFT* res, uint64_t res_size,               // res
483                                        const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
484                                        const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,
485                                        uint64_t pmat_scale,  // prep matrix
486                                        uint8_t* tmp_space    // scratch space
487);
488
489/** @brief applies a vmp product (result in DFT space) */
490EXPORT void fft64_vmp_apply_dft_ref(const MODULE* module,                                  // N
491                                    VEC_ZNX_DFT* res, uint64_t res_size,                   // res
492                                    const int64_t* a, uint64_t a_size, uint64_t a_sl,      // a
493                                    const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,  // prep matrix
494                                    uint8_t* tmp_space                                     // scratch space
495);
496
497/** @brief applies a vmp product (result in DFT space) */
498EXPORT void fft64_vmp_apply_dft_avx(const MODULE* module,                                  // N
499                                    VEC_ZNX_DFT* res, uint64_t res_size,                   // res
500                                    const int64_t* a, uint64_t a_size, uint64_t a_sl,      // a
501                                    const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,  // prep matrix
502                                    uint8_t* tmp_space                                     // scratch space
503);
504
505/** @brief applies a vmp product (result in DFT space) and adds to res inplace*/
506EXPORT void fft64_vmp_apply_dft_add_avx(const MODULE* module,                              // N
507                                        VEC_ZNX_DFT* res, uint64_t res_size,               // res
508                                        const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
509                                        const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,
510                                        uint64_t pmat_scale,  // prep matrix
511                                        uint8_t* tmp_space    // scratch space
512);
513
514/** @brief this inner function could be very handy */
515EXPORT void fft64_vmp_apply_dft_to_dft_ref(const MODULE* module,                       // N
516                                           VEC_ZNX_DFT* res, const uint64_t res_size,  // res
517                                           const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
518                                           const VMP_PMAT* pmat, const uint64_t nrows,
519                                           const uint64_t ncols,  // prep matrix
520                                           uint8_t* tmp_space     // scratch space (a_size*sizeof(reim4) bytes)
521);
522
523/** @brief applies rmp product and adds to res inplace */
524EXPORT void fft64_vmp_apply_dft_to_dft_add_ref(const MODULE* module,                       // N
525                                               VEC_ZNX_DFT* res, const uint64_t res_size,  // res
526                                               const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
527                                               const VMP_PMAT* pmat, const uint64_t nrows, const uint64_t ncols,
528                                               uint64_t pmat_scale,  // prep matrix
529                                               uint8_t* tmp_space    // scratch space (a_size*sizeof(reim4) bytes)
530);
531
532/** @brief this inner function could be very handy */
533EXPORT void fft64_vmp_apply_dft_to_dft_avx(const MODULE* module,                       // N
534                                           VEC_ZNX_DFT* res, const uint64_t res_size,  // res
535                                           const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
536                                           const VMP_PMAT* pmat, const uint64_t nrows,
537                                           const uint64_t ncols,  // prep matrix
538                                           uint8_t* tmp_space     // scratch space (a_size*sizeof(reim4) bytes)
539);
540
541/** @brief applies rmp product and adds to res inplace */
542EXPORT void fft64_vmp_apply_dft_to_dft_add_avx(const MODULE* module,                       // N
543                                               VEC_ZNX_DFT* res, const uint64_t res_size,  // res
544                                               const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
545                                               const VMP_PMAT* pmat, const uint64_t nrows, const uint64_t ncols,
546                                               uint64_t pmat_scale,  // prep matrix
547                                               uint8_t* tmp_space    // scratch space (a_size*sizeof(reim4) bytes)
548);
549
550/** @brief minimal size of the tmp_space */
551EXPORT uint64_t fft64_vmp_apply_dft_tmp_bytes(const MODULE* module, uint64_t nn,           // N
552                                              uint64_t res_size,              // res
553                                              uint64_t a_size,                // a
554                                              uint64_t nrows, uint64_t ncols  // prep matrix
555);
556
557/** @brief minimal size of the tmp_space */
558EXPORT uint64_t fft64_vmp_apply_dft_to_dft_tmp_bytes(const MODULE* module, uint64_t nn,           // N
559                                                     uint64_t res_size,              // res
560                                                     uint64_t a_size,                // a
561                                                     uint64_t nrows, uint64_t ncols  // prep matrix
562);
563#endif  // SPQLIOS_VEC_ZNX_ARITHMETIC_PRIVATE_H