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