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