arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/spqlios/lib/spqlios/arithmetic/vec_znx_arithmetic_private.h
spqlios/lib/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 mul_fft
 37  REIM_FFTVEC_MUL_PRECOMP* mul_fft;
 38  // pre-computation for reim_from_znx6
 39  REIM_FROM_ZNX64_PRECOMP* p_conv;
 40  // pre-computation for reim_tp_znx6
 41  REIM_TO_ZNX64_PRECOMP* p_reim_to_znx;
 42  // pre-computation for reim_fft
 43  REIM_IFFT_PRECOMP* p_ifft;
 44  // pre-computation for reim_fftvec_addmul
 45  REIM_FFTVEC_ADDMUL_PRECOMP* p_addmul;
 46};
 47
 48struct q120_module_info_t {
 49  // pre-computation for q120b to q120b ntt
 50  q120_ntt_precomp* p_ntt;
 51  // pre-computation for q120b to q120b intt
 52  q120_ntt_precomp* p_intt;
 53};
 54
 55// TODO add function types here
 56typedef typeof(vec_znx_zero) VEC_ZNX_ZERO_F;
 57typedef typeof(vec_znx_copy) VEC_ZNX_COPY_F;
 58typedef typeof(vec_znx_negate) VEC_ZNX_NEGATE_F;
 59typedef typeof(vec_znx_add) VEC_ZNX_ADD_F;
 60typedef typeof(vec_znx_dft) VEC_ZNX_DFT_F;
 61typedef typeof(vec_znx_idft) VEC_ZNX_IDFT_F;
 62typedef typeof(vec_znx_idft_tmp_bytes) VEC_ZNX_IDFT_TMP_BYTES_F;
 63typedef typeof(vec_znx_idft_tmp_a) VEC_ZNX_IDFT_TMP_A_F;
 64typedef typeof(vec_znx_sub) VEC_ZNX_SUB_F;
 65typedef typeof(vec_znx_rotate) VEC_ZNX_ROTATE_F;
 66typedef typeof(vec_znx_automorphism) VEC_ZNX_AUTOMORPHISM_F;
 67typedef typeof(vec_znx_normalize_base2k) VEC_ZNX_NORMALIZE_BASE2K_F;
 68typedef typeof(vec_znx_normalize_base2k_tmp_bytes) VEC_ZNX_NORMALIZE_BASE2K_TMP_BYTES_F;
 69typedef typeof(vec_znx_big_normalize_base2k) VEC_ZNX_BIG_NORMALIZE_BASE2K_F;
 70typedef typeof(vec_znx_big_normalize_base2k_tmp_bytes) VEC_ZNX_BIG_NORMALIZE_BASE2K_TMP_BYTES_F;
 71typedef typeof(vec_znx_big_range_normalize_base2k) VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_F;
 72typedef typeof(vec_znx_big_range_normalize_base2k_tmp_bytes) VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_TMP_BYTES_F;
 73typedef typeof(vec_znx_big_add) VEC_ZNX_BIG_ADD_F;
 74typedef typeof(vec_znx_big_add_small) VEC_ZNX_BIG_ADD_SMALL_F;
 75typedef typeof(vec_znx_big_add_small2) VEC_ZNX_BIG_ADD_SMALL2_F;
 76typedef typeof(vec_znx_big_sub) VEC_ZNX_BIG_SUB_F;
 77typedef typeof(vec_znx_big_sub_small_a) VEC_ZNX_BIG_SUB_SMALL_A_F;
 78typedef typeof(vec_znx_big_sub_small_b) VEC_ZNX_BIG_SUB_SMALL_B_F;
 79typedef typeof(vec_znx_big_sub_small2) VEC_ZNX_BIG_SUB_SMALL2_F;
 80typedef typeof(vec_znx_big_rotate) VEC_ZNX_BIG_ROTATE_F;
 81typedef typeof(vec_znx_big_automorphism) VEC_ZNX_BIG_AUTOMORPHISM_F;
 82typedef typeof(svp_prepare) SVP_PREPARE;
 83typedef typeof(svp_apply_dft) SVP_APPLY_DFT_F;
 84typedef typeof(znx_small_single_product) ZNX_SMALL_SINGLE_PRODUCT_F;
 85typedef typeof(znx_small_single_product_tmp_bytes) ZNX_SMALL_SINGLE_PRODUCT_TMP_BYTES_F;
 86typedef typeof(vmp_prepare_contiguous) VMP_PREPARE_CONTIGUOUS_F;
 87typedef typeof(vmp_prepare_contiguous_tmp_bytes) VMP_PREPARE_CONTIGUOUS_TMP_BYTES_F;
 88typedef typeof(vmp_apply_dft) VMP_APPLY_DFT_F;
 89typedef typeof(vmp_apply_dft_tmp_bytes) VMP_APPLY_DFT_TMP_BYTES_F;
 90typedef typeof(vmp_apply_dft_to_dft) VMP_APPLY_DFT_TO_DFT_F;
 91typedef typeof(vmp_apply_dft_to_dft_tmp_bytes) VMP_APPLY_DFT_TO_DFT_TMP_BYTES_F;
 92typedef typeof(bytes_of_vec_znx_dft) BYTES_OF_VEC_ZNX_DFT_F;
 93typedef typeof(bytes_of_vec_znx_big) BYTES_OF_VEC_ZNX_BIG_F;
 94typedef typeof(bytes_of_svp_ppol) BYTES_OF_SVP_PPOL_F;
 95typedef typeof(bytes_of_vmp_pmat) BYTES_OF_VMP_PMAT_F;
 96
 97struct module_virtual_functions_t {
 98  // TODO add functions here
 99  VEC_ZNX_ZERO_F* vec_znx_zero;
100  VEC_ZNX_COPY_F* vec_znx_copy;
101  VEC_ZNX_NEGATE_F* vec_znx_negate;
102  VEC_ZNX_ADD_F* vec_znx_add;
103  VEC_ZNX_DFT_F* vec_znx_dft;
104  VEC_ZNX_IDFT_F* vec_znx_idft;
105  VEC_ZNX_IDFT_TMP_BYTES_F* vec_znx_idft_tmp_bytes;
106  VEC_ZNX_IDFT_TMP_A_F* vec_znx_idft_tmp_a;
107  VEC_ZNX_SUB_F* vec_znx_sub;
108  VEC_ZNX_ROTATE_F* vec_znx_rotate;
109  VEC_ZNX_AUTOMORPHISM_F* vec_znx_automorphism;
110  VEC_ZNX_NORMALIZE_BASE2K_F* vec_znx_normalize_base2k;
111  VEC_ZNX_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_normalize_base2k_tmp_bytes;
112  VEC_ZNX_BIG_NORMALIZE_BASE2K_F* vec_znx_big_normalize_base2k;
113  VEC_ZNX_BIG_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_big_normalize_base2k_tmp_bytes;
114  VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_F* vec_znx_big_range_normalize_base2k;
115  VEC_ZNX_BIG_RANGE_NORMALIZE_BASE2K_TMP_BYTES_F* vec_znx_big_range_normalize_base2k_tmp_bytes;
116  VEC_ZNX_BIG_ADD_F* vec_znx_big_add;
117  VEC_ZNX_BIG_ADD_SMALL_F* vec_znx_big_add_small;
118  VEC_ZNX_BIG_ADD_SMALL2_F* vec_znx_big_add_small2;
119  VEC_ZNX_BIG_SUB_F* vec_znx_big_sub;
120  VEC_ZNX_BIG_SUB_SMALL_A_F* vec_znx_big_sub_small_a;
121  VEC_ZNX_BIG_SUB_SMALL_B_F* vec_znx_big_sub_small_b;
122  VEC_ZNX_BIG_SUB_SMALL2_F* vec_znx_big_sub_small2;
123  VEC_ZNX_BIG_ROTATE_F* vec_znx_big_rotate;
124  VEC_ZNX_BIG_AUTOMORPHISM_F* vec_znx_big_automorphism;
125  SVP_PREPARE* svp_prepare;
126  SVP_APPLY_DFT_F* svp_apply_dft;
127  ZNX_SMALL_SINGLE_PRODUCT_F* znx_small_single_product;
128  ZNX_SMALL_SINGLE_PRODUCT_TMP_BYTES_F* znx_small_single_product_tmp_bytes;
129  VMP_PREPARE_CONTIGUOUS_F* vmp_prepare_contiguous;
130  VMP_PREPARE_CONTIGUOUS_TMP_BYTES_F* vmp_prepare_contiguous_tmp_bytes;
131  VMP_APPLY_DFT_F* vmp_apply_dft;
132  VMP_APPLY_DFT_TMP_BYTES_F* vmp_apply_dft_tmp_bytes;
133  VMP_APPLY_DFT_TO_DFT_F* vmp_apply_dft_to_dft;
134  VMP_APPLY_DFT_TO_DFT_TMP_BYTES_F* vmp_apply_dft_to_dft_tmp_bytes;
135  BYTES_OF_VEC_ZNX_DFT_F* bytes_of_vec_znx_dft;
136  BYTES_OF_VEC_ZNX_BIG_F* bytes_of_vec_znx_big;
137  BYTES_OF_SVP_PPOL_F* bytes_of_svp_ppol;
138  BYTES_OF_VMP_PMAT_F* bytes_of_vmp_pmat;
139};
140
141union backend_module_info_t {
142  struct fft64_module_info_t fft64;
143  struct q120_module_info_t q120;
144};
145
146struct module_info_t {
147  // generic parameters
148  MODULE_TYPE module_type;
149  uint64_t nn;
150  uint64_t m;
151  // backend_dependent functions
152  union backend_module_info_t mod;
153  // virtual functions
154  struct module_virtual_functions_t func;
155};
156
157EXPORT uint64_t fft64_bytes_of_vec_znx_dft(const MODULE* module,  // N
158                                           uint64_t size);
159
160EXPORT uint64_t fft64_bytes_of_vec_znx_big(const MODULE* module,  // N
161                                           uint64_t size);
162
163EXPORT uint64_t fft64_bytes_of_svp_ppol(const MODULE* module);  // N
164
165EXPORT uint64_t fft64_bytes_of_vmp_pmat(const MODULE* module,  // N
166                                        uint64_t nrows, uint64_t ncols);
167
168EXPORT void vec_znx_zero_ref(const MODULE* module,                             // N
169                             int64_t* res, uint64_t res_size, uint64_t res_sl  // res
170);
171
172EXPORT void vec_znx_copy_ref(const MODULE* precomp,                             // N
173                             int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
174                             const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
175);
176
177EXPORT void vec_znx_negate_ref(const MODULE* module,                              // N
178                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
179                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
180);
181
182EXPORT void vec_znx_negate_avx(const MODULE* module,                              // N
183                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
184                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
185);
186
187EXPORT void vec_znx_add_ref(const MODULE* module,                              // N
188                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
189                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
190                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
191);
192EXPORT void vec_znx_add_avx(const MODULE* module,                              // N
193                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
194                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
195                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
196);
197
198EXPORT void vec_znx_sub_ref(const MODULE* precomp,                             // 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                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
202);
203
204EXPORT void vec_znx_sub_avx(const MODULE* module,                              // N
205                            int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
206                            const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
207                            const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
208);
209
210EXPORT void vec_znx_normalize_base2k_ref(const MODULE* module,                              // N
211                                         uint64_t log2_base2k,                              // output base 2^K
212                                         int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
213                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // inp
214                                         uint8_t* tmp_space                                 // scratch space
215);
216
217EXPORT uint64_t vec_znx_normalize_base2k_tmp_bytes_ref(const MODULE* module  // N
218);
219
220EXPORT void vec_znx_rotate_ref(const MODULE* module,                              // N
221                               const int64_t p,                                   // rotation value
222                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
223                               const int64_t* a, uint64_t a_size, uint64_t a_sl   // a
224);
225
226EXPORT void vec_znx_automorphism_ref(const MODULE* module,                              // N
227                                     const int64_t p,                                   // X->X^p
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   // a
230);
231
232EXPORT void vmp_prepare_ref(const MODULE* precomp,                              // N
233                            VMP_PMAT* pmat,                                     // output
234                            const int64_t* mat, uint64_t nrows, uint64_t ncols  // a
235);
236
237EXPORT void vmp_apply_dft_ref(const MODULE* precomp,                                // N
238                              VEC_ZNX_DFT* res, uint64_t res_size,                  // res
239                              const int64_t* a, uint64_t a_size, uint64_t a_sl,     // a
240                              const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols  // prep matrix
241);
242
243EXPORT void vec_dft_zero_ref(const MODULE* precomp,               // N
244                             VEC_ZNX_DFT* res, uint64_t res_size  // res
245);
246
247EXPORT void vec_dft_add_ref(const MODULE* precomp,                  // N
248                            VEC_ZNX_DFT* res, uint64_t res_size,    // res
249                            const VEC_ZNX_DFT* a, uint64_t a_size,  // a
250                            const VEC_ZNX_DFT* b, uint64_t b_size   // b
251);
252
253EXPORT void vec_dft_sub_ref(const MODULE* precomp,                  // N
254                            VEC_ZNX_DFT* res, uint64_t res_size,    // res
255                            const VEC_ZNX_DFT* a, uint64_t a_size,  // a
256                            const VEC_ZNX_DFT* b, uint64_t b_size   // b
257);
258
259EXPORT void vec_dft_ref(const MODULE* precomp,                            // 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);
263
264EXPORT void vec_idft_ref(const MODULE* precomp,                // N
265                         VEC_ZNX_BIG* res, uint64_t res_size,  // res
266                         const VEC_ZNX_DFT* a_dft, uint64_t a_size);
267
268EXPORT void vec_znx_big_normalize_ref(const MODULE* precomp,                             // N
269                                      uint64_t k,                                        // base-2^k
270                                      int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
271                                      const VEC_ZNX_BIG* a, uint64_t a_size              // a
272);
273
274/** @brief apply a svp product, result = ppol * a, presented in DFT space  */
275EXPORT void fft64_svp_apply_dft_ref(const MODULE* module,                             // N
276                                    const VEC_ZNX_DFT* res, uint64_t res_size,        // output
277                                    const SVP_PPOL* ppol,                             // prepared pol
278                                    const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
279);
280
281/** @brief sets res = k-normalize(a) -- output in int64 coeffs space */
282EXPORT void fft64_vec_znx_big_normalize_base2k(const MODULE* module,                              // N
283                                               uint64_t k,                                        // base-2^k
284                                               int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
285                                               const VEC_ZNX_BIG* a, uint64_t a_size,             // a
286                                               uint8_t* tmp_space                                 // temp space
287);
288
289/** @brief returns the minimal byte length of scratch space for vec_znx_big_normalize_base2k */
290EXPORT uint64_t fft64_vec_znx_big_normalize_base2k_tmp_bytes(const MODULE* module  // N
291
292);
293
294/** @brief sets res = k-normalize(a.subrange) -- output in int64 coeffs space */
295EXPORT void fft64_vec_znx_big_range_normalize_base2k(const MODULE* module,                              // N
296                                                     uint64_t log2_base2k,                              // base-2^k
297                                                     int64_t* res, uint64_t res_size, uint64_t res_sl,  // res
298                                                     const VEC_ZNX_BIG* a, uint64_t a_range_begin,      // a
299                                                     uint64_t a_range_xend, uint64_t a_range_step,      // range
300                                                     uint8_t* tmp_space                                 // temp space
301);
302
303/** @brief returns the minimal byte length of scratch space for vec_znx_big_range_normalize_base2k */
304EXPORT uint64_t fft64_vec_znx_big_range_normalize_base2k_tmp_bytes(const MODULE* module  // N
305);
306
307EXPORT void fft64_vec_znx_dft(const MODULE* module,                             // N
308                              VEC_ZNX_DFT* res, uint64_t res_size,              // res
309                              const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
310);
311
312EXPORT void fft64_vec_znx_idft(const MODULE* module,                       // N
313                               VEC_ZNX_BIG* res, uint64_t res_size,        // res
314                               const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
315                               uint8_t* tmp                                // scratch space
316);
317
318EXPORT uint64_t fft64_vec_znx_idft_tmp_bytes(const MODULE* module);
319
320EXPORT void fft64_vec_znx_idft_tmp_a(const MODULE* module,                 // N
321                                     VEC_ZNX_BIG* res, uint64_t res_size,  // res
322                                     VEC_ZNX_DFT* a_dft, uint64_t a_size   // a is overwritten
323);
324
325EXPORT void ntt120_vec_znx_dft_avx(const MODULE* module,                             // N
326                                   VEC_ZNX_DFT* res, uint64_t res_size,              // res
327                                   const int64_t* a, uint64_t a_size, uint64_t a_sl  // a
328);
329
330/**   */
331EXPORT void ntt120_vec_znx_idft_avx(const MODULE* module,                       // N
332                                    VEC_ZNX_BIG* res, uint64_t res_size,        // res
333                                    const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
334                                    uint8_t* tmp                                // scratch space
335);
336
337EXPORT uint64_t ntt120_vec_znx_idft_tmp_bytes_avx(const MODULE* module);
338
339EXPORT void ntt120_vec_znx_idft_tmp_a_avx(const MODULE* module,                 // N
340                                          VEC_ZNX_BIG* res, uint64_t res_size,  // res
341                                          VEC_ZNX_DFT* a_dft, uint64_t a_size   // a is overwritten
342);
343
344// big additions/subtractions
345
346/** @brief sets res = a+b */
347EXPORT void fft64_vec_znx_big_add(const MODULE* module,                   // N
348                                  VEC_ZNX_BIG* res, uint64_t res_size,    // res
349                                  const VEC_ZNX_BIG* a, uint64_t a_size,  // a
350                                  const VEC_ZNX_BIG* b, uint64_t b_size   // b
351);
352/** @brief sets res = a+b */
353EXPORT void fft64_vec_znx_big_add_small(const MODULE* module,                             // N
354                                        VEC_ZNX_BIG* res, uint64_t res_size,              // res
355                                        const VEC_ZNX_BIG* a, uint64_t a_size,            // a
356                                        const int64_t* b, uint64_t b_size, uint64_t b_sl  // b
357);
358EXPORT void fft64_vec_znx_big_add_small2(const MODULE* module,                              // N
359                                         VEC_ZNX_BIG* res, uint64_t res_size,               // res
360                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
361                                         const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
362);
363
364/** @brief sets res = a-b */
365EXPORT void fft64_vec_znx_big_sub(const MODULE* module,                   // N
366                                  VEC_ZNX_BIG* res, uint64_t res_size,    // res
367                                  const VEC_ZNX_BIG* a, uint64_t a_size,  // a
368                                  const VEC_ZNX_BIG* b, uint64_t b_size   // b
369);
370EXPORT void fft64_vec_znx_big_sub_small_b(const MODULE* module,                             // N
371                                          VEC_ZNX_BIG* res, uint64_t res_size,              // res
372                                          const VEC_ZNX_BIG* a, uint64_t a_size,            // a
373                                          const int64_t* b, uint64_t b_size, uint64_t b_sl  // b
374);
375EXPORT void fft64_vec_znx_big_sub_small_a(const MODULE* module,                              // N
376                                          VEC_ZNX_BIG* res, uint64_t res_size,               // res
377                                          const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
378                                          const VEC_ZNX_BIG* b, uint64_t b_size              // b
379);
380EXPORT void fft64_vec_znx_big_sub_small2(const MODULE* module,                              // N
381                                         VEC_ZNX_BIG* res, uint64_t res_size,               // res
382                                         const int64_t* a, uint64_t a_size, uint64_t a_sl,  // a
383                                         const int64_t* b, uint64_t b_size, uint64_t b_sl   // b
384);
385
386/** @brief sets res = a . X^p */
387EXPORT void fft64_vec_znx_big_rotate(const MODULE* module,                  // N
388                                     int64_t p,                             // rotation value
389                                     VEC_ZNX_BIG* res, uint64_t res_size,   // res
390                                     const VEC_ZNX_BIG* a, uint64_t a_size  // a
391);
392
393/** @brief sets res = a(X^p) */
394EXPORT void fft64_vec_znx_big_automorphism(const MODULE* module,                  // N
395                                           int64_t p,                             // X-X^p
396                                           VEC_ZNX_BIG* res, uint64_t res_size,   // res
397                                           const VEC_ZNX_BIG* a, uint64_t a_size  // a
398);
399
400/** @brief prepares a svp polynomial  */
401EXPORT void fft64_svp_prepare_ref(const MODULE* module,  // N
402                                  SVP_PPOL* ppol,        // output
403                                  const int64_t* pol     // a
404);
405
406/** @brief res = a * b : small integer polynomial product  */
407EXPORT void fft64_znx_small_single_product(const MODULE* module,  // N
408                                           int64_t* res,          // output
409                                           const int64_t* a,      // a
410                                           const int64_t* b,      // b
411                                           uint8_t* tmp);
412
413/** @brief tmp bytes required for znx_small_single_product  */
414EXPORT uint64_t fft64_znx_small_single_product_tmp_bytes(const MODULE* module);
415
416/** @brief prepares a vmp matrix (contiguous row-major version) */
417EXPORT void fft64_vmp_prepare_contiguous_ref(const MODULE* module,                                // N
418                                             VMP_PMAT* pmat,                                      // output
419                                             const int64_t* mat, uint64_t nrows, uint64_t ncols,  // a
420                                             uint8_t* tmp_space                                   // scratch space
421);
422
423/** @brief prepares a vmp matrix (contiguous row-major version) */
424EXPORT void fft64_vmp_prepare_contiguous_avx(const MODULE* module,                                // N
425                                             VMP_PMAT* pmat,                                      // output
426                                             const int64_t* mat, uint64_t nrows, uint64_t ncols,  // a
427                                             uint8_t* tmp_space                                   // scratch space
428);
429
430/** @brief minimal scratch space byte-size required for the vmp_prepare function */
431EXPORT uint64_t fft64_vmp_prepare_contiguous_tmp_bytes(const MODULE* module,  // N
432                                                       uint64_t nrows, uint64_t ncols);
433
434/** @brief applies a vmp product (result in DFT space) */
435EXPORT void fft64_vmp_apply_dft_ref(const MODULE* module,                                  // N
436                                    VEC_ZNX_DFT* res, uint64_t res_size,                   // res
437                                    const int64_t* a, uint64_t a_size, uint64_t a_sl,      // a
438                                    const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,  // prep matrix
439                                    uint8_t* tmp_space                                     // scratch space
440);
441
442/** @brief applies a vmp product (result in DFT space) */
443EXPORT void fft64_vmp_apply_dft_avx(const MODULE* module,                                  // N
444                                    VEC_ZNX_DFT* res, uint64_t res_size,                   // res
445                                    const int64_t* a, uint64_t a_size, uint64_t a_sl,      // a
446                                    const VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols,  // prep matrix
447                                    uint8_t* tmp_space                                     // scratch space
448);
449
450/** @brief this inner function could be very handy */
451EXPORT void fft64_vmp_apply_dft_to_dft_ref(const MODULE* module,                       // N
452                                           VEC_ZNX_DFT* res, const uint64_t res_size,  // res
453                                           const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
454                                           const VMP_PMAT* pmat, const uint64_t nrows,
455                                           const uint64_t ncols,  // prep matrix
456                                           uint8_t* tmp_space     // scratch space (a_size*sizeof(reim4) bytes)
457);
458
459/** @brief this inner function could be very handy */
460EXPORT void fft64_vmp_apply_dft_to_dft_avx(const MODULE* module,                       // N
461                                           VEC_ZNX_DFT* res, const uint64_t res_size,  // res
462                                           const VEC_ZNX_DFT* a_dft, uint64_t a_size,  // a
463                                           const VMP_PMAT* pmat, const uint64_t nrows,
464                                           const uint64_t ncols,  // prep matrix
465                                           uint8_t* tmp_space     // scratch space (a_size*sizeof(reim4) bytes)
466);
467
468/** @brief minimal size of the tmp_space */
469EXPORT uint64_t fft64_vmp_apply_dft_tmp_bytes(const MODULE* module,           // N
470                                              uint64_t res_size,              // res
471                                              uint64_t a_size,                // a
472                                              uint64_t nrows, uint64_t ncols  // prep matrix
473);
474
475/** @brief minimal size of the tmp_space */
476EXPORT uint64_t fft64_vmp_apply_dft_to_dft_tmp_bytes(const MODULE* module,           // N
477                                                     uint64_t res_size,              // res
478                                                     uint64_t a_size,                // a
479                                                     uint64_t nrows, uint64_t ncols  // prep matrix
480);
481#endif  // SPQLIOS_VEC_ZNX_ARITHMETIC_PRIVATE_H