28 #if defined(__clang__) && __clang__> 3 && MPHELL_USE_OPTIMISATION == 1
29 #define PRAGMA_UNROLL _Pragma("clang loop unroll(full)")
30 #elif defined(__GNUC__) && __GNUC__> 7 && MPHELL_USE_OPTIMISATION == 1
31 #define PRAGMA_UNROLL _Pragma("GCC unroll n")
44 #define TEMPLATE_amns_elt_add_declare(sl) \
45 void amns_elt_add##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS); \
47 TEMPLATE_amns_elt_add_declare(2)
48 TEMPLATE_amns_elt_add_declare(3)
49 TEMPLATE_amns_elt_add_declare(4)
50 TEMPLATE_amns_elt_add_declare(5)
51 TEMPLATE_amns_elt_add_declare(6)
52 TEMPLATE_amns_elt_add_declare(7)
53 TEMPLATE_amns_elt_add_declare(8)
54 TEMPLATE_amns_elt_add_declare(9)
55 TEMPLATE_amns_elt_add_declare(10)
56 TEMPLATE_amns_elt_add_declare(11)
57 TEMPLATE_amns_elt_add_declare(12)
58 TEMPLATE_amns_elt_add_declare(13)
59 TEMPLATE_amns_elt_add_declare(14)
60 TEMPLATE_amns_elt_add_declare(15)
61 TEMPLATE_amns_elt_add_declare(16)
62 TEMPLATE_amns_elt_add_declare(17)
63 TEMPLATE_amns_elt_add_declare(18)
64 TEMPLATE_amns_elt_add_declare(19)
65 TEMPLATE_amns_elt_add_declare(20)
66 TEMPLATE_amns_elt_add_declare(21)
67 TEMPLATE_amns_elt_add_declare(22)
68 TEMPLATE_amns_elt_add_declare(23)
69 TEMPLATE_amns_elt_add_declare(24)
70 TEMPLATE_amns_elt_add_declare(25)
72 #undef TEMPLATE_amns_elt_add_declare
76 #define TEMPLATE_amns_elt_sub_declare(sl) \
77 void amns_elt_sub##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS); \
79 TEMPLATE_amns_elt_sub_declare(2)
80 TEMPLATE_amns_elt_sub_declare(3)
81 TEMPLATE_amns_elt_sub_declare(4)
82 TEMPLATE_amns_elt_sub_declare(5)
83 TEMPLATE_amns_elt_sub_declare(6)
84 TEMPLATE_amns_elt_sub_declare(7)
85 TEMPLATE_amns_elt_sub_declare(8)
86 TEMPLATE_amns_elt_sub_declare(9)
87 TEMPLATE_amns_elt_sub_declare(10)
88 TEMPLATE_amns_elt_sub_declare(11)
89 TEMPLATE_amns_elt_sub_declare(12)
90 TEMPLATE_amns_elt_sub_declare(13)
91 TEMPLATE_amns_elt_sub_declare(14)
92 TEMPLATE_amns_elt_sub_declare(15)
93 TEMPLATE_amns_elt_sub_declare(16)
94 TEMPLATE_amns_elt_sub_declare(17)
95 TEMPLATE_amns_elt_sub_declare(18)
96 TEMPLATE_amns_elt_sub_declare(19)
97 TEMPLATE_amns_elt_sub_declare(20)
98 TEMPLATE_amns_elt_sub_declare(21)
99 TEMPLATE_amns_elt_sub_declare(22)
100 TEMPLATE_amns_elt_sub_declare(23)
101 TEMPLATE_amns_elt_sub_declare(24)
102 TEMPLATE_amns_elt_sub_declare(25)
104 #undef TEMPLATE_amns_elt_sub_declare
108 #define TEMPLATE_amns_elt_neg_declare(sl) \
109 void amns_elt_neg##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS); \
111 TEMPLATE_amns_elt_neg_declare(2)
112 TEMPLATE_amns_elt_neg_declare(3)
113 TEMPLATE_amns_elt_neg_declare(4)
114 TEMPLATE_amns_elt_neg_declare(5)
115 TEMPLATE_amns_elt_neg_declare(6)
116 TEMPLATE_amns_elt_neg_declare(7)
117 TEMPLATE_amns_elt_neg_declare(8)
118 TEMPLATE_amns_elt_neg_declare(9)
119 TEMPLATE_amns_elt_neg_declare(10)
120 TEMPLATE_amns_elt_neg_declare(11)
121 TEMPLATE_amns_elt_neg_declare(12)
122 TEMPLATE_amns_elt_neg_declare(13)
123 TEMPLATE_amns_elt_neg_declare(14)
124 TEMPLATE_amns_elt_neg_declare(15)
125 TEMPLATE_amns_elt_neg_declare(16)
126 TEMPLATE_amns_elt_neg_declare(17)
127 TEMPLATE_amns_elt_neg_declare(18)
128 TEMPLATE_amns_elt_neg_declare(19)
129 TEMPLATE_amns_elt_neg_declare(20)
130 TEMPLATE_amns_elt_neg_declare(21)
131 TEMPLATE_amns_elt_neg_declare(22)
132 TEMPLATE_amns_elt_neg_declare(23)
133 TEMPLATE_amns_elt_neg_declare(24)
134 TEMPLATE_amns_elt_neg_declare(25)
136 #undef TEMPLATE_amns_elt_neg_declare
140 #define TEMPLATE_amns_elt_mul_declare(sl) \
141 void amns_elt_mul##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS); \
143 TEMPLATE_amns_elt_mul_declare(2)
144 TEMPLATE_amns_elt_mul_declare(3)
145 TEMPLATE_amns_elt_mul_declare(4)
146 TEMPLATE_amns_elt_mul_declare(5)
147 TEMPLATE_amns_elt_mul_declare(6)
148 TEMPLATE_amns_elt_mul_declare(7)
149 TEMPLATE_amns_elt_mul_declare(8)
150 TEMPLATE_amns_elt_mul_declare(9)
151 TEMPLATE_amns_elt_mul_declare(10)
152 TEMPLATE_amns_elt_mul_declare(11)
153 TEMPLATE_amns_elt_mul_declare(12)
154 TEMPLATE_amns_elt_mul_declare(13)
155 TEMPLATE_amns_elt_mul_declare(14)
156 TEMPLATE_amns_elt_mul_declare(15)
157 TEMPLATE_amns_elt_mul_declare(16)
158 TEMPLATE_amns_elt_mul_declare(17)
159 TEMPLATE_amns_elt_mul_declare(18)
160 TEMPLATE_amns_elt_mul_declare(19)
161 TEMPLATE_amns_elt_mul_declare(20)
162 TEMPLATE_amns_elt_mul_declare(21)
163 TEMPLATE_amns_elt_mul_declare(22)
164 TEMPLATE_amns_elt_mul_declare(23)
165 TEMPLATE_amns_elt_mul_declare(24)
166 TEMPLATE_amns_elt_mul_declare(25)
168 #undef TEMPLATE_amns_elt_mul_declare
170 #define TEMPLATE_amns_elt_mul_shift_p_declare(sl) \
171 void amns_elt_mul_shift_p##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS); \
173 TEMPLATE_amns_elt_mul_shift_p_declare(2)
174 TEMPLATE_amns_elt_mul_shift_p_declare(3)
175 TEMPLATE_amns_elt_mul_shift_p_declare(4)
176 TEMPLATE_amns_elt_mul_shift_p_declare(5)
177 TEMPLATE_amns_elt_mul_shift_p_declare(6)
178 TEMPLATE_amns_elt_mul_shift_p_declare(7)
179 TEMPLATE_amns_elt_mul_shift_p_declare(8)
180 TEMPLATE_amns_elt_mul_shift_p_declare(9)
181 TEMPLATE_amns_elt_mul_shift_p_declare(10)
182 TEMPLATE_amns_elt_mul_shift_p_declare(11)
183 TEMPLATE_amns_elt_mul_shift_p_declare(12)
184 TEMPLATE_amns_elt_mul_shift_p_declare(13)
185 TEMPLATE_amns_elt_mul_shift_p_declare(14)
186 TEMPLATE_amns_elt_mul_shift_p_declare(15)
187 TEMPLATE_amns_elt_mul_shift_p_declare(16)
188 TEMPLATE_amns_elt_mul_shift_p_declare(17)
189 TEMPLATE_amns_elt_mul_shift_p_declare(18)
190 TEMPLATE_amns_elt_mul_shift_p_declare(19)
191 TEMPLATE_amns_elt_mul_shift_p_declare(20)
192 TEMPLATE_amns_elt_mul_shift_p_declare(21)
193 TEMPLATE_amns_elt_mul_shift_p_declare(22)
194 TEMPLATE_amns_elt_mul_shift_p_declare(23)
195 TEMPLATE_amns_elt_mul_shift_p_declare(24)
196 TEMPLATE_amns_elt_mul_shift_p_declare(25)
198 #undef TEMPLATE_amns_elt_mul_shift_p_declare
200 #define TEMPLATE_amns_elt_mul_shift_n_declare(sl) \
201 void amns_elt_mul_shift_n##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS); \
203 TEMPLATE_amns_elt_mul_shift_n_declare(2)
204 TEMPLATE_amns_elt_mul_shift_n_declare(3)
205 TEMPLATE_amns_elt_mul_shift_n_declare(4)
206 TEMPLATE_amns_elt_mul_shift_n_declare(5)
207 TEMPLATE_amns_elt_mul_shift_n_declare(6)
208 TEMPLATE_amns_elt_mul_shift_n_declare(7)
209 TEMPLATE_amns_elt_mul_shift_n_declare(8)
210 TEMPLATE_amns_elt_mul_shift_n_declare(9)
211 TEMPLATE_amns_elt_mul_shift_n_declare(10)
212 TEMPLATE_amns_elt_mul_shift_n_declare(11)
213 TEMPLATE_amns_elt_mul_shift_n_declare(12)
214 TEMPLATE_amns_elt_mul_shift_n_declare(13)
215 TEMPLATE_amns_elt_mul_shift_n_declare(14)
216 TEMPLATE_amns_elt_mul_shift_n_declare(15)
217 TEMPLATE_amns_elt_mul_shift_n_declare(16)
218 TEMPLATE_amns_elt_mul_shift_n_declare(17)
219 TEMPLATE_amns_elt_mul_shift_n_declare(18)
220 TEMPLATE_amns_elt_mul_shift_n_declare(19)
221 TEMPLATE_amns_elt_mul_shift_n_declare(20)
222 TEMPLATE_amns_elt_mul_shift_n_declare(21)
223 TEMPLATE_amns_elt_mul_shift_n_declare(22)
224 TEMPLATE_amns_elt_mul_shift_n_declare(23)
225 TEMPLATE_amns_elt_mul_shift_n_declare(24)
226 TEMPLATE_amns_elt_mul_shift_n_declare(25)
228 #undef TEMPLATE_amns_elt_mul_shift_n_declare
232 #define TEMPLATE_amns_elt_sqr_declare(sl) \
233 void amns_elt_sqr##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS); \
235 TEMPLATE_amns_elt_sqr_declare(2)
236 TEMPLATE_amns_elt_sqr_declare(3)
237 TEMPLATE_amns_elt_sqr_declare(4)
238 TEMPLATE_amns_elt_sqr_declare(5)
239 TEMPLATE_amns_elt_sqr_declare(6)
240 TEMPLATE_amns_elt_sqr_declare(7)
241 TEMPLATE_amns_elt_sqr_declare(8)
242 TEMPLATE_amns_elt_sqr_declare(9)
243 TEMPLATE_amns_elt_sqr_declare(10)
244 TEMPLATE_amns_elt_sqr_declare(11)
245 TEMPLATE_amns_elt_sqr_declare(12)
246 TEMPLATE_amns_elt_sqr_declare(13)
247 TEMPLATE_amns_elt_sqr_declare(14)
248 TEMPLATE_amns_elt_sqr_declare(15)
249 TEMPLATE_amns_elt_sqr_declare(16)
250 TEMPLATE_amns_elt_sqr_declare(17)
251 TEMPLATE_amns_elt_sqr_declare(18)
252 TEMPLATE_amns_elt_sqr_declare(19)
253 TEMPLATE_amns_elt_sqr_declare(20)
254 TEMPLATE_amns_elt_sqr_declare(21)
255 TEMPLATE_amns_elt_sqr_declare(22)
256 TEMPLATE_amns_elt_sqr_declare(23)
257 TEMPLATE_amns_elt_sqr_declare(24)
258 TEMPLATE_amns_elt_sqr_declare(25)
260 #undef TEMPLATE_amns_elt_sqr_declare
262 #define TEMPLATE_amns_elt_sqr_shift_p_declare(sl) \
263 void amns_elt_sqr_shift_p##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS); \
265 TEMPLATE_amns_elt_sqr_shift_p_declare(2)
266 TEMPLATE_amns_elt_sqr_shift_p_declare(3)
267 TEMPLATE_amns_elt_sqr_shift_p_declare(4)
268 TEMPLATE_amns_elt_sqr_shift_p_declare(5)
269 TEMPLATE_amns_elt_sqr_shift_p_declare(6)
270 TEMPLATE_amns_elt_sqr_shift_p_declare(7)
271 TEMPLATE_amns_elt_sqr_shift_p_declare(8)
272 TEMPLATE_amns_elt_sqr_shift_p_declare(9)
273 TEMPLATE_amns_elt_sqr_shift_p_declare(10)
274 TEMPLATE_amns_elt_sqr_shift_p_declare(11)
275 TEMPLATE_amns_elt_sqr_shift_p_declare(12)
276 TEMPLATE_amns_elt_sqr_shift_p_declare(13)
277 TEMPLATE_amns_elt_sqr_shift_p_declare(14)
278 TEMPLATE_amns_elt_sqr_shift_p_declare(15)
279 TEMPLATE_amns_elt_sqr_shift_p_declare(16)
280 TEMPLATE_amns_elt_sqr_shift_p_declare(17)
281 TEMPLATE_amns_elt_sqr_shift_p_declare(18)
282 TEMPLATE_amns_elt_sqr_shift_p_declare(19)
283 TEMPLATE_amns_elt_sqr_shift_p_declare(20)
284 TEMPLATE_amns_elt_sqr_shift_p_declare(21)
285 TEMPLATE_amns_elt_sqr_shift_p_declare(22)
286 TEMPLATE_amns_elt_sqr_shift_p_declare(23)
287 TEMPLATE_amns_elt_sqr_shift_p_declare(24)
288 TEMPLATE_amns_elt_sqr_shift_p_declare(25)
290 #undef TEMPLATE_amns_elt_sqr_shift_p_declare
292 #define TEMPLATE_amns_elt_sqr_shift_n_declare(sl) \
293 void amns_elt_sqr_shift_n##sl (amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS); \
295 TEMPLATE_amns_elt_sqr_shift_n_declare(2)
296 TEMPLATE_amns_elt_sqr_shift_n_declare(3)
297 TEMPLATE_amns_elt_sqr_shift_n_declare(4)
298 TEMPLATE_amns_elt_sqr_shift_n_declare(5)
299 TEMPLATE_amns_elt_sqr_shift_n_declare(6)
300 TEMPLATE_amns_elt_sqr_shift_n_declare(7)
301 TEMPLATE_amns_elt_sqr_shift_n_declare(8)
302 TEMPLATE_amns_elt_sqr_shift_n_declare(9)
303 TEMPLATE_amns_elt_sqr_shift_n_declare(10)
304 TEMPLATE_amns_elt_sqr_shift_n_declare(11)
305 TEMPLATE_amns_elt_sqr_shift_n_declare(12)
306 TEMPLATE_amns_elt_sqr_shift_n_declare(13)
307 TEMPLATE_amns_elt_sqr_shift_n_declare(14)
308 TEMPLATE_amns_elt_sqr_shift_n_declare(15)
309 TEMPLATE_amns_elt_sqr_shift_n_declare(16)
310 TEMPLATE_amns_elt_sqr_shift_n_declare(17)
311 TEMPLATE_amns_elt_sqr_shift_n_declare(18)
312 TEMPLATE_amns_elt_sqr_shift_n_declare(19)
313 TEMPLATE_amns_elt_sqr_shift_n_declare(20)
314 TEMPLATE_amns_elt_sqr_shift_n_declare(21)
315 TEMPLATE_amns_elt_sqr_shift_n_declare(22)
316 TEMPLATE_amns_elt_sqr_shift_n_declare(23)
317 TEMPLATE_amns_elt_sqr_shift_n_declare(24)
318 TEMPLATE_amns_elt_sqr_shift_n_declare(25)
320 #undef TEMPLATE_amns_elt_sqr_shift_n_declare
324 #define TEMPLATE_amns_internal_red_declare(sl) \
325 void amns_internal_red##sl(amns_elt_ptr S, amns_llong * V, amns_srcptr AMNS); \
327 TEMPLATE_amns_internal_red_declare(2)
328 TEMPLATE_amns_internal_red_declare(3)
329 TEMPLATE_amns_internal_red_declare(4)
330 TEMPLATE_amns_internal_red_declare(5)
331 TEMPLATE_amns_internal_red_declare(6)
332 TEMPLATE_amns_internal_red_declare(7)
333 TEMPLATE_amns_internal_red_declare(8)
334 TEMPLATE_amns_internal_red_declare(9)
335 TEMPLATE_amns_internal_red_declare(10)
336 TEMPLATE_amns_internal_red_declare(11)
337 TEMPLATE_amns_internal_red_declare(12)
338 TEMPLATE_amns_internal_red_declare(13)
339 TEMPLATE_amns_internal_red_declare(14)
340 TEMPLATE_amns_internal_red_declare(15)
341 TEMPLATE_amns_internal_red_declare(16)
342 TEMPLATE_amns_internal_red_declare(17)
343 TEMPLATE_amns_internal_red_declare(18)
344 TEMPLATE_amns_internal_red_declare(19)
345 TEMPLATE_amns_internal_red_declare(20)
346 TEMPLATE_amns_internal_red_declare(21)
347 TEMPLATE_amns_internal_red_declare(22)
348 TEMPLATE_amns_internal_red_declare(23)
349 TEMPLATE_amns_internal_red_declare(24)
350 TEMPLATE_amns_internal_red_declare(25)
352 #undef TEMPLATE_amns_internal_red_declare
356 #define TEMPLATE_amns_elt_is_reduced_declare(sl) \
357 static inline bool amns_elt_is_reduced##sl (amns_elt_srcptr a, amns_srcptr AMNS); \
359 TEMPLATE_amns_elt_is_reduced_declare(2)
360 TEMPLATE_amns_elt_is_reduced_declare(3)
361 TEMPLATE_amns_elt_is_reduced_declare(4)
362 TEMPLATE_amns_elt_is_reduced_declare(5)
363 TEMPLATE_amns_elt_is_reduced_declare(6)
364 TEMPLATE_amns_elt_is_reduced_declare(7)
365 TEMPLATE_amns_elt_is_reduced_declare(8)
366 TEMPLATE_amns_elt_is_reduced_declare(9)
367 TEMPLATE_amns_elt_is_reduced_declare(10)
368 TEMPLATE_amns_elt_is_reduced_declare(11)
369 TEMPLATE_amns_elt_is_reduced_declare(12)
370 TEMPLATE_amns_elt_is_reduced_declare(13)
371 TEMPLATE_amns_elt_is_reduced_declare(14)
372 TEMPLATE_amns_elt_is_reduced_declare(15)
373 TEMPLATE_amns_elt_is_reduced_declare(16)
374 TEMPLATE_amns_elt_is_reduced_declare(17)
375 TEMPLATE_amns_elt_is_reduced_declare(18)
376 TEMPLATE_amns_elt_is_reduced_declare(19)
377 TEMPLATE_amns_elt_is_reduced_declare(20)
378 TEMPLATE_amns_elt_is_reduced_declare(21)
379 TEMPLATE_amns_elt_is_reduced_declare(22)
380 TEMPLATE_amns_elt_is_reduced_declare(23)
381 TEMPLATE_amns_elt_is_reduced_declare(24)
382 TEMPLATE_amns_elt_is_reduced_declare(25)
384 #undef TEMPLATE_amns_elt_is_reduced_declare
423 (*AMNS)->gi = (number *)malloc(n*
sizeof(number));
431 for(i=0; i<POOL_SIZE_AMNS; i++)
435 #if MPHELL_USE_MULTITHREADING == 1
437 for(i=0; i<POOL_SIZE_AMNS; i++)
447 uint8_t n = (*AMNS)->n;
450 for(i=0; i<POOL_SIZE_AMNS; i++)
454 #if MPHELL_USE_MULTITHREADING == 1
456 for(i=0; i<POOL_SIZE_AMNS; i++)
487 free((*AMNS)->Mtiprime);
512 #if MPHELL_USE_AMNS_32 == 1
526 #if MPHELL_USE_AMNS_32 == 1
537 for(i=0; i<size-1; i++)
554 for(i=0; i<size-1; i++)
580 printf(
"p_size = %u\n", AMNS->
p_size);
581 printf(
"n = %u\n", AMNS->
n);
582 printf(
"rho used = %u\n", AMNS->
rho);
587 printf(
"lambda_bits = %u\n", AMNS->
lambda_bit);
588 printf(
"k = %u\n", AMNS->
k);
590 printf(
"gamma_size = %u\n\n", AMNS->
gamma_size);
594 for(j=0; j<AMNS->
n; j++)
600 for(j=0; j<AMNS->
n; j++)
606 #if MPHELL_USE_DEBUG == 1
608 for(j=0; j<AMNS->
n; j++)
614 for(j=0; j<AMNS->
n; j++)
616 printf(
"gi[%u] = ", j);
number_print(AMNS->
gi[j], 10); printf(
"\n");
624 #if MPHELL_USE_DEBUG == 1
625 printf(
"Statistics: \n");
626 printf(
"nb_add = %d \n", AMNS->nb_add);
627 printf(
"nb_sub = %d \n", AMNS->nb_sub);
628 printf(
"nb_mul = %d \n", AMNS->nb_mul);
629 printf(
"nb_add_red = %d \n", AMNS->nb_add_red);
630 printf(
"nb_sub_red = %d \n", AMNS->nb_sub_red);
631 printf(
"nb_mul_red = %d \n", AMNS->nb_mul_red);
647 const uint8_t n = AMNS->
n;
661 return floor(log(m)/log(2))+1;
673 const uint8_t n = AMNS->
n;
700 const uint8_t n = AMNS->
n;
720 T[i]=(amns_llong)Q[0]*AMNS->
Mti[i][0];
723 T[i]+=(amns_llong)Q[j]*AMNS->
Mti[i][j];
726 S[i]=(T[i]+V[i])>>AMNS_WORD_SIZE;
742 AMNS->amns_internal_red(S, V, AMNS);
745 #define TEMPLATE_amns_internal_red(sl) \
747 amns_internal_red##sl(amns_elt_ptr S, amns_llong * V, amns_srcptr AMNS) \
750 const uint8_t n = sl; \
759 Q[i]=((amns_block)V[0])*AMNS->Mtiprime[i][0]; \
763 Q[i]+=((amns_block)V[j])*AMNS->Mtiprime[i][j]; \
773 T[i]=(amns_llong)Q[0]*AMNS->Mti[i][0]; \
777 T[i]+=(amns_llong)Q[j]*AMNS->Mti[i][j]; \
780 S[i]=(T[i]+V[i])>>AMNS_WORD_SIZE; \
782 MPHELL_ASSERT(amns_calculate_max_coeff(S, AMNS) < AMNS->max_digit, "amns_internal_red, ||dst||_infiny >= max_digit\n"); \
785 TEMPLATE_amns_internal_red(2)
786 TEMPLATE_amns_internal_red(3)
787 TEMPLATE_amns_internal_red(4)
788 TEMPLATE_amns_internal_red(5)
789 TEMPLATE_amns_internal_red(6)
790 TEMPLATE_amns_internal_red(7)
791 TEMPLATE_amns_internal_red(8)
792 TEMPLATE_amns_internal_red(9)
793 TEMPLATE_amns_internal_red(10)
794 TEMPLATE_amns_internal_red(11)
795 TEMPLATE_amns_internal_red(12)
796 TEMPLATE_amns_internal_red(13)
797 TEMPLATE_amns_internal_red(14)
798 TEMPLATE_amns_internal_red(15)
799 TEMPLATE_amns_internal_red(16)
800 TEMPLATE_amns_internal_red(17)
801 TEMPLATE_amns_internal_red(18)
802 TEMPLATE_amns_internal_red(19)
803 TEMPLATE_amns_internal_red(20)
804 TEMPLATE_amns_internal_red(21)
805 TEMPLATE_amns_internal_red(22)
806 TEMPLATE_amns_internal_red(23)
807 TEMPLATE_amns_internal_red(24)
808 TEMPLATE_amns_internal_red(25)
810 #undef TEMPLATE_amns_internal_red
813 #if MPHELL_USE_AMNS_32 == 0
817 amns_llong tmp_zero[10];
819 tmp_q[0] = (uint64_t)V[0] + ((((uint64_t)V[9] << 53)));
820 tmp_q[1] = ((uint64_t)V[0] << 52) + (uint64_t)V[1];
821 tmp_q[2] = ((uint64_t)V[1] << 52) + (uint64_t)V[2];
822 tmp_q[3] = ((uint64_t)V[2] << 52) + (uint64_t)V[3];
823 tmp_q[4] = ((uint64_t)V[3] << 52) + (uint64_t)V[4];
824 tmp_q[5] = ((uint64_t)V[4] << 52) + (uint64_t)V[5];
825 tmp_q[6] = ((uint64_t)V[5] << 52) + (uint64_t)V[6];
826 tmp_q[7] = ((uint64_t)V[6] << 52) + (uint64_t)V[7];
827 tmp_q[8] = ((uint64_t)V[7] << 52) + (uint64_t)V[8];
828 tmp_q[9] = ((uint64_t)V[8] << 52) + (uint64_t)V[9];
830 tmp_zero[0] = -(amns_llong)tmp_q[0] + ((((amns_llong)tmp_q[9] << 53)));
831 tmp_zero[1] = ((amns_llong)tmp_q[0] << 52) - (amns_llong)tmp_q[1];
832 tmp_zero[2] = ((amns_llong)tmp_q[1] << 52) - (amns_llong)tmp_q[2];
833 tmp_zero[3] = ((amns_llong)tmp_q[2] << 52) - (amns_llong)tmp_q[3];
834 tmp_zero[4] = ((amns_llong)tmp_q[3] << 52) - (amns_llong)tmp_q[4];
835 tmp_zero[5] = ((amns_llong)tmp_q[4] << 52) - (amns_llong)tmp_q[5];
836 tmp_zero[6] = ((amns_llong)tmp_q[5] << 52) - (amns_llong)tmp_q[6];
837 tmp_zero[7] = ((amns_llong)tmp_q[6] << 52) - (amns_llong)tmp_q[7];
838 tmp_zero[8] = ((amns_llong)tmp_q[7] << 52) - (amns_llong)tmp_q[8];
839 tmp_zero[9] = ((amns_llong)tmp_q[8] << 52) - (amns_llong)tmp_q[9];
841 S[0] = (V[0] + tmp_zero[0]) >> 64;
842 S[1] = (V[1] + tmp_zero[1]) >> 64;
843 S[2] = (V[2] + tmp_zero[2]) >> 64;
844 S[3] = (V[3] + tmp_zero[3]) >> 64;
845 S[4] = (V[4] + tmp_zero[4]) >> 64;
846 S[5] = (V[5] + tmp_zero[5]) >> 64;
847 S[6] = (V[6] + tmp_zero[6]) >> 64;
848 S[7] = (V[7] + tmp_zero[7]) >> 64;
849 S[8] = (V[8] + tmp_zero[8]) >> 64;
850 S[9] = (V[9] + tmp_zero[9]) >> 64;
856 amns_llong tmp_zero[10];
858 tmp_q[0] = (uint32_t)V[0] + ((((uint32_t)V[7] << 24)));
859 tmp_q[1] = (uint32_t)V[1] + ((((uint32_t)V[8] << 24)));
860 tmp_q[2] = (uint32_t)V[2] + ((((uint32_t)V[9] << 24)));
861 tmp_q[3] = (uint32_t)V[3] + ((((uint32_t)V[10] << 24)));
862 tmp_q[4] = (uint32_t)V[4] + ((((uint32_t)V[11] << 24)));
863 tmp_q[5] = (uint32_t)V[5] + ((((uint32_t)V[12] << 24)));
864 tmp_q[6] = (uint32_t)V[6] + ((((uint32_t)V[13] << 24)));
865 tmp_q[7] = (uint32_t)V[7] + ((((uint32_t)V[14] << 24)));
866 tmp_q[8] = (uint32_t)V[8] + ((((uint32_t)V[15] << 24)));
867 tmp_q[9] = (uint32_t)V[9] + ((((uint32_t)V[16] << 24)));
868 tmp_q[10] = (uint32_t)V[10] + ((((uint32_t)V[17] << 24)));
869 tmp_q[11] = (uint32_t)V[11] + ((((uint32_t)V[18] << 24)));
870 tmp_q[12] = (uint32_t)V[12] + ((((uint32_t)V[19] << 24)));
871 tmp_q[13] = (uint32_t)V[13] + ((((uint32_t)V[20] << 24)));
872 tmp_q[14] = (uint32_t)V[14] + ((((uint32_t)V[21] << 24)));
873 tmp_q[15] = ((uint32_t)V[0] << 23) + (uint32_t)V[15];
874 tmp_q[16] = ((uint32_t)V[1] << 23) + (uint32_t)V[16];
875 tmp_q[17] = ((uint32_t)V[2] << 23) + (uint32_t)V[17];
876 tmp_q[18] = ((uint32_t)V[3] << 23) + (uint32_t)V[18];
877 tmp_q[19] = ((uint32_t)V[4] << 23) + (uint32_t)V[19];
878 tmp_q[20] = ((uint32_t)V[5] << 23) + (uint32_t)V[20];
879 tmp_q[21] = ((uint32_t)V[6] << 23) + (uint32_t)V[21];
882 tmp_zero[0] = -(amns_llong)tmp_q[0] + ((((amns_llong)tmp_q[7] << 24)));
883 tmp_zero[1] = -(amns_llong)tmp_q[1] + ((((amns_llong)tmp_q[8] << 24)));
884 tmp_zero[2] = -(amns_llong)tmp_q[2] + ((((amns_llong)tmp_q[9] << 24)));
885 tmp_zero[3] = -(amns_llong)tmp_q[3] + ((((amns_llong)tmp_q[10] << 24)));
886 tmp_zero[4] = -(amns_llong)tmp_q[4] + ((((amns_llong)tmp_q[11] << 24)));
887 tmp_zero[5] = -(amns_llong)tmp_q[5] + ((((amns_llong)tmp_q[12] << 24)));
888 tmp_zero[6] = -(amns_llong)tmp_q[6] + ((((amns_llong)tmp_q[13] << 24)));
889 tmp_zero[7] = -(amns_llong)tmp_q[7] + ((((amns_llong)tmp_q[14] << 24)));
890 tmp_zero[8] = -(amns_llong)tmp_q[8] + ((((amns_llong)tmp_q[15] << 24)));
891 tmp_zero[9] = -(amns_llong)tmp_q[9] + ((((amns_llong)tmp_q[16] << 24)));
892 tmp_zero[10] = -(amns_llong)tmp_q[10] + ((((amns_llong)tmp_q[17] << 24)));
893 tmp_zero[11] = -(amns_llong)tmp_q[11] + ((((amns_llong)tmp_q[18] << 24)));
894 tmp_zero[12] = -(amns_llong)tmp_q[12] + ((((amns_llong)tmp_q[19] << 24)));
895 tmp_zero[13] = -(amns_llong)tmp_q[13] + ((((amns_llong)tmp_q[20] << 24)));
896 tmp_zero[14] = -(amns_llong)tmp_q[14] + ((((amns_llong)tmp_q[21] << 24)));
897 tmp_zero[15] = ((amns_llong)tmp_q[0] << 23) - (amns_llong)tmp_q[15];
898 tmp_zero[16] = ((amns_llong)tmp_q[1] << 23) - (amns_llong)tmp_q[16];
899 tmp_zero[17] = ((amns_llong)tmp_q[2] << 23) - (amns_llong)tmp_q[17];
900 tmp_zero[18] = ((amns_llong)tmp_q[3] << 23) - (amns_llong)tmp_q[18];
901 tmp_zero[19] = ((amns_llong)tmp_q[4] << 23) - (amns_llong)tmp_q[19];
902 tmp_zero[20] = ((amns_llong)tmp_q[5] << 23) - (amns_llong)tmp_q[20];
903 tmp_zero[21] = ((amns_llong)tmp_q[6] << 23) - (amns_llong)tmp_q[21];
906 S[0] = (V[0] + tmp_zero[0]) >> 32;
907 S[1] = (V[1] + tmp_zero[1]) >> 32;
908 S[2] = (V[2] + tmp_zero[2]) >> 32;
909 S[3] = (V[3] + tmp_zero[3]) >> 32;
910 S[4] = (V[4] + tmp_zero[4]) >> 32;
911 S[5] = (V[5] + tmp_zero[5]) >> 32;
912 S[6] = (V[6] + tmp_zero[6]) >> 32;
913 S[7] = (V[7] + tmp_zero[7]) >> 32;
914 S[8] = (V[8] + tmp_zero[8]) >> 32;
915 S[9] = (V[9] + tmp_zero[9]) >> 32;
916 S[10] = (V[10] + tmp_zero[10]) >> 32;
917 S[11] = (V[11] + tmp_zero[11]) >> 32;
918 S[12] = (V[12] + tmp_zero[12]) >> 32;
919 S[13] = (V[13] + tmp_zero[13]) >> 32;
920 S[14] = (V[14] + tmp_zero[14]) >> 32;
921 S[15] = (V[15] + tmp_zero[15]) >> 32;
922 S[16] = (V[16] + tmp_zero[16]) >> 32;
923 S[17] = (V[17] + tmp_zero[17]) >> 32;
924 S[18] = (V[18] + tmp_zero[18]) >> 32;
925 S[19] = (V[19] + tmp_zero[19]) >> 32;
926 S[20] = (V[20] + tmp_zero[20]) >> 32;
927 S[21] = (V[21] + tmp_zero[21]) >> 32;
937 #if MPHELL_USE_AMNS_32 == 0
938 AMNS->amns_internal_red=&internal_reduction_nist521_64;
940 AMNS->amns_internal_red=&internal_reduction_nist521_32;
954 const uint8_t n = AMNS->
n;
961 tmp[i] = (amns_llong) dst[i];
985 const uint8_t n = AMNS->
n;
998 p1[i] = (amns_llong) P1[i];
1007 for(i = 1; i<n-1; i++)
1022 const uint8_t n = AMNS->
n;
1024 for(i = 0; i < 2; i++)
1028 for(i = 2; i < n; i++)
1042 const uint8_t n = AMNS->
n;
1055 Mi[i][j]=M[n+j-i] * AMNS->
lambda;
1064 AMNS->
Mti[i][j]=Mi[j][i];
1077 const uint8_t n = AMNS->
n;
1086 Miprime[i][j]=Mprime[j-i];
1090 Miprime[i][j]=Mprime[n+j-i] * AMNS->
lambda;
1099 AMNS->
Mtiprime[i][j]=Miprime[j][i];
1114 const uint8_t n = AMNS->
n;
1127 #define TEMPLATE_amns_elt_is_reduced(sl) \
1128 static inline bool \
1129 amns_elt_is_reduced##sl(amns_elt_srcptr a, amns_srcptr AMNS) \
1131 const uint8_t n = sl; \
1134 for(i=0; i<n; i++) \
1136 if((a[i] >= AMNS->max_digit_delta) || (a[i] <= AMNS->min_digit_delta)) \
1144 TEMPLATE_amns_elt_is_reduced(2)
1145 TEMPLATE_amns_elt_is_reduced(3)
1146 TEMPLATE_amns_elt_is_reduced(4)
1147 TEMPLATE_amns_elt_is_reduced(5)
1148 TEMPLATE_amns_elt_is_reduced(6)
1149 TEMPLATE_amns_elt_is_reduced(7)
1150 TEMPLATE_amns_elt_is_reduced(8)
1151 TEMPLATE_amns_elt_is_reduced(9)
1152 TEMPLATE_amns_elt_is_reduced(10)
1153 TEMPLATE_amns_elt_is_reduced(11)
1154 TEMPLATE_amns_elt_is_reduced(12)
1155 TEMPLATE_amns_elt_is_reduced(13)
1156 TEMPLATE_amns_elt_is_reduced(14)
1157 TEMPLATE_amns_elt_is_reduced(15)
1158 TEMPLATE_amns_elt_is_reduced(16)
1159 TEMPLATE_amns_elt_is_reduced(17)
1160 TEMPLATE_amns_elt_is_reduced(18)
1161 TEMPLATE_amns_elt_is_reduced(19)
1162 TEMPLATE_amns_elt_is_reduced(20)
1163 TEMPLATE_amns_elt_is_reduced(21)
1164 TEMPLATE_amns_elt_is_reduced(22)
1165 TEMPLATE_amns_elt_is_reduced(23)
1166 TEMPLATE_amns_elt_is_reduced(24)
1167 TEMPLATE_amns_elt_is_reduced(25)
1169 #undef TEMPLATE_amns_elt_is_reduced
1173 return AMNS->amns_elt_is_reduced(a, AMNS);
1185 const uint8_t n = AMNS->
n;
1205 char str1[strlen(str)+1];
1207 char delim[] =
", ";
1208 char * token = strtok(str1, delim);
1210 while(token != NULL)
1212 #if MPHELL_USE_AMNS_32 == 1
1213 x[i++] = atoi(token);
1215 x[i++] = atoll(token);
1217 token = strtok(NULL, delim);
1230 char str1[strlen(str)+1];
1232 char delim[] =
", ";
1233 char * token = strtok(str1, delim);
1235 while(token != NULL)
1237 x[i++] = strtoul(token, NULL, 10);
1238 token = strtok(NULL, delim);
1244 char str1[strlen(str)];
1245 strcpy(str1, str+1);
1247 char delim1[] =
",";
1248 char delim2[] =
"]";
1251 uint8_t n, rho, nb_add_max;
1254 token = strtok(str2, delim1);
1255 str2+=strlen(token)+2;
1256 nb_add_max = atoi(token);
1258 token = strtok(str2, delim1);
1259 str2+=strlen(token)+2;
1264 amns_ulong Mprime[n];
1274 token = strtok(str2, delim2);
1275 str2+=strlen(token)+2;
1279 token = strtok(str2, delim1);
1280 str2+=strlen(token)+2;
1283 token = strtok(str2, delim1);
1284 str2+=strlen(token)+2;
1288 token = strtok(str2, delim2);
1289 str2+=strlen(token)+2;
1293 token = strtok(str2, delim2);
1294 str2+=strlen(token)+2;
1298 token = strtok(str2, delim2);
1299 str2+=strlen(token)+2;
1303 token = strtok(str2, delim2);
1304 str2+=strlen(token)+2;
1307 amns_init(*AMNS, E, P0, P1, M, Mprime, p, gamma, rho, nb_add_max);
1321 return x - (x >> 1);
1330 AMNS->
max_amns_block = ((amns_ullong)1<<(
sizeof(amns_llong)*8-1))-1;
1337 for (i=0; i<AMNS->
n+1; i++)
1345 for (i=AMNS->
n-1; i >= 0; i--)
1356 AMNS->
k = (AMNS->
n-1)-AMNS->
k;
1380 AMNS->amns_elt_add=&amns_elt_add2;
1381 AMNS->amns_elt_sub=&amns_elt_sub2;
1382 AMNS->amns_elt_neg=&amns_elt_neg2;
1387 AMNS->amns_elt_mul=&amns_elt_mul_shift_p2;
1388 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p2;
1392 AMNS->amns_elt_mul=&amns_elt_mul_shift_n2;
1393 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n2;
1398 AMNS->amns_elt_mul=&amns_elt_mul2;
1399 AMNS->amns_elt_sqr=&amns_elt_sqr2;
1401 AMNS->amns_internal_red=&amns_internal_red2;
1402 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced2;
1405 AMNS->amns_elt_add=&amns_elt_add3;
1406 AMNS->amns_elt_sub=&amns_elt_sub3;
1407 AMNS->amns_elt_neg=&amns_elt_neg3;
1412 AMNS->amns_elt_mul=&amns_elt_mul_shift_p3;
1413 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p3;
1417 AMNS->amns_elt_mul=&amns_elt_mul_shift_n3;
1418 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n3;
1423 AMNS->amns_elt_mul=&amns_elt_mul3;
1424 AMNS->amns_elt_sqr=&amns_elt_sqr3;
1426 AMNS->amns_internal_red=&amns_internal_red3;
1427 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced3;
1430 AMNS->amns_elt_add=&amns_elt_add4;
1431 AMNS->amns_elt_sub=&amns_elt_sub4;
1432 AMNS->amns_elt_neg=&amns_elt_neg4;
1437 AMNS->amns_elt_mul=&amns_elt_mul_shift_p4;
1438 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p4;
1442 AMNS->amns_elt_mul=&amns_elt_mul_shift_n4;
1443 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n4;
1448 AMNS->amns_elt_mul=&amns_elt_mul4;
1449 AMNS->amns_elt_sqr=&amns_elt_sqr4;
1451 AMNS->amns_internal_red=&amns_internal_red4;
1452 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced4;
1455 AMNS->amns_elt_add=&amns_elt_add5;
1456 AMNS->amns_elt_sub=&amns_elt_sub5;
1457 AMNS->amns_elt_neg=&amns_elt_neg5;
1462 AMNS->amns_elt_mul=&amns_elt_mul_shift_p5;
1463 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p5;
1467 AMNS->amns_elt_mul=&amns_elt_mul_shift_n5;
1468 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n5;
1473 AMNS->amns_elt_mul=&amns_elt_mul5;
1474 AMNS->amns_elt_sqr=&amns_elt_sqr5;
1476 AMNS->amns_internal_red=&amns_internal_red5;
1477 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced5;
1480 AMNS->amns_elt_add=&amns_elt_add6;
1481 AMNS->amns_elt_sub=&amns_elt_sub6;
1482 AMNS->amns_elt_neg=&amns_elt_neg6;
1487 AMNS->amns_elt_mul=&amns_elt_mul_shift_p6;
1488 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p6;
1492 AMNS->amns_elt_mul=&amns_elt_mul_shift_n6;
1493 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n6;
1498 AMNS->amns_elt_mul=&amns_elt_mul6;
1499 AMNS->amns_elt_sqr=&amns_elt_sqr6;
1501 AMNS->amns_internal_red=&amns_internal_red6;
1502 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced6;
1505 AMNS->amns_elt_add=&amns_elt_add7;
1506 AMNS->amns_elt_sub=&amns_elt_sub7;
1507 AMNS->amns_elt_neg=&amns_elt_neg7;
1512 AMNS->amns_elt_mul=&amns_elt_mul_shift_p7;
1513 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p7;
1517 AMNS->amns_elt_mul=&amns_elt_mul_shift_n7;
1518 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n7;
1523 AMNS->amns_elt_mul=&amns_elt_mul7;
1524 AMNS->amns_elt_sqr=&amns_elt_sqr7;
1526 AMNS->amns_internal_red=&amns_internal_red7;
1527 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced7;
1530 AMNS->amns_elt_add=&amns_elt_add8;
1531 AMNS->amns_elt_sub=&amns_elt_sub8;
1532 AMNS->amns_elt_neg=&amns_elt_neg8;
1537 AMNS->amns_elt_mul=&amns_elt_mul_shift_p8;
1538 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p8;
1542 AMNS->amns_elt_mul=&amns_elt_mul_shift_n8;
1543 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n8;
1548 AMNS->amns_elt_mul=&amns_elt_mul8;
1549 AMNS->amns_elt_sqr=&amns_elt_sqr8;
1551 AMNS->amns_internal_red=&amns_internal_red8;
1552 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced8;
1555 AMNS->amns_elt_add=&amns_elt_add9;
1556 AMNS->amns_elt_sub=&amns_elt_sub9;
1557 AMNS->amns_elt_neg=&amns_elt_neg9;
1562 AMNS->amns_elt_mul=&amns_elt_mul_shift_p9;
1563 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p9;
1567 AMNS->amns_elt_mul=&amns_elt_mul_shift_n9;
1568 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n9;
1573 AMNS->amns_elt_mul=&amns_elt_mul9;
1574 AMNS->amns_elt_sqr=&amns_elt_sqr9;
1576 AMNS->amns_internal_red=&amns_internal_red9;
1577 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced9;
1580 AMNS->amns_elt_add=&amns_elt_add10;
1581 AMNS->amns_elt_sub=&amns_elt_sub10;
1582 AMNS->amns_elt_neg=&amns_elt_neg10;
1587 AMNS->amns_elt_mul=&amns_elt_mul_shift_p10;
1588 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p10;
1592 AMNS->amns_elt_mul=&amns_elt_mul_shift_n10;
1593 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n10;
1598 AMNS->amns_elt_mul=&amns_elt_mul10;
1599 AMNS->amns_elt_sqr=&amns_elt_sqr10;
1601 AMNS->amns_internal_red=&amns_internal_red10;
1602 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced10;
1605 AMNS->amns_elt_add=&amns_elt_add11;
1606 AMNS->amns_elt_sub=&amns_elt_sub11;
1607 AMNS->amns_elt_neg=&amns_elt_neg11;
1612 AMNS->amns_elt_mul=&amns_elt_mul_shift_p11;
1613 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p11;
1617 AMNS->amns_elt_mul=&amns_elt_mul_shift_n11;
1618 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n11;
1623 AMNS->amns_elt_mul=&amns_elt_mul11;
1624 AMNS->amns_elt_sqr=&amns_elt_sqr11;
1626 AMNS->amns_internal_red=&amns_internal_red11;
1627 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced11;
1630 AMNS->amns_elt_add=&amns_elt_add12;
1631 AMNS->amns_elt_sub=&amns_elt_sub12;
1632 AMNS->amns_elt_neg=&amns_elt_neg12;
1637 AMNS->amns_elt_mul=&amns_elt_mul_shift_p12;
1638 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p12;
1642 AMNS->amns_elt_mul=&amns_elt_mul_shift_n12;
1643 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n12;
1648 AMNS->amns_elt_mul=&amns_elt_mul12;
1649 AMNS->amns_elt_sqr=&amns_elt_sqr12;
1651 AMNS->amns_internal_red=&amns_internal_red12;
1652 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced12;
1655 AMNS->amns_elt_add=&amns_elt_add13;
1656 AMNS->amns_elt_sub=&amns_elt_sub13;
1657 AMNS->amns_elt_neg=&amns_elt_neg13;
1662 AMNS->amns_elt_mul=&amns_elt_mul_shift_p13;
1663 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p13;
1667 AMNS->amns_elt_mul=&amns_elt_mul_shift_n13;
1668 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n13;
1673 AMNS->amns_elt_mul=&amns_elt_mul13;
1674 AMNS->amns_elt_sqr=&amns_elt_sqr13;
1676 AMNS->amns_internal_red=&amns_internal_red13;
1677 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced13;
1680 AMNS->amns_elt_add=&amns_elt_add14;
1681 AMNS->amns_elt_sub=&amns_elt_sub14;
1682 AMNS->amns_elt_neg=&amns_elt_neg14;
1687 AMNS->amns_elt_mul=&amns_elt_mul_shift_p14;
1688 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p14;
1692 AMNS->amns_elt_mul=&amns_elt_mul_shift_n14;
1693 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n14;
1698 AMNS->amns_elt_mul=&amns_elt_mul14;
1699 AMNS->amns_elt_sqr=&amns_elt_sqr14;
1701 AMNS->amns_internal_red=&amns_internal_red14;
1702 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced14;
1705 AMNS->amns_elt_add=&amns_elt_add15;
1706 AMNS->amns_elt_sub=&amns_elt_sub15;
1707 AMNS->amns_elt_neg=&amns_elt_neg15;
1712 AMNS->amns_elt_mul=&amns_elt_mul_shift_p15;
1713 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p15;
1717 AMNS->amns_elt_mul=&amns_elt_mul_shift_n15;
1718 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n15;
1723 AMNS->amns_elt_mul=&amns_elt_mul15;
1724 AMNS->amns_elt_sqr=&amns_elt_sqr15;
1726 AMNS->amns_internal_red=&amns_internal_red15;
1727 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced15;
1730 AMNS->amns_elt_add=&amns_elt_add16;
1731 AMNS->amns_elt_sub=&amns_elt_sub16;
1732 AMNS->amns_elt_neg=&amns_elt_neg16;
1737 AMNS->amns_elt_mul=&amns_elt_mul_shift_p16;
1738 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p16;
1742 AMNS->amns_elt_mul=&amns_elt_mul_shift_n16;
1743 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n16;
1748 AMNS->amns_elt_mul=&amns_elt_mul16;
1749 AMNS->amns_elt_sqr=&amns_elt_sqr16;
1751 AMNS->amns_internal_red=&amns_internal_red16;
1752 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced16;
1755 AMNS->amns_elt_add=&amns_elt_add17;
1756 AMNS->amns_elt_sub=&amns_elt_sub17;
1757 AMNS->amns_elt_neg=&amns_elt_neg17;
1762 AMNS->amns_elt_mul=&amns_elt_mul_shift_p17;
1763 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p17;
1767 AMNS->amns_elt_mul=&amns_elt_mul_shift_n17;
1768 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n17;
1773 AMNS->amns_elt_mul=&amns_elt_mul17;
1774 AMNS->amns_elt_sqr=&amns_elt_sqr17;
1776 AMNS->amns_internal_red=&amns_internal_red17;
1777 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced17;
1780 AMNS->amns_elt_add=&amns_elt_add18;
1781 AMNS->amns_elt_sub=&amns_elt_sub18;
1782 AMNS->amns_elt_neg=&amns_elt_neg18;
1787 AMNS->amns_elt_mul=&amns_elt_mul_shift_p18;
1788 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p18;
1792 AMNS->amns_elt_mul=&amns_elt_mul_shift_n18;
1793 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n18;
1798 AMNS->amns_elt_mul=&amns_elt_mul18;
1799 AMNS->amns_elt_sqr=&amns_elt_sqr18;
1801 AMNS->amns_internal_red=&amns_internal_red18;
1802 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced18;
1805 AMNS->amns_elt_add=&amns_elt_add19;
1806 AMNS->amns_elt_sub=&amns_elt_sub19;
1807 AMNS->amns_elt_neg=&amns_elt_neg19;
1812 AMNS->amns_elt_mul=&amns_elt_mul_shift_p19;
1813 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p19;
1817 AMNS->amns_elt_mul=&amns_elt_mul_shift_n19;
1818 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n19;
1823 AMNS->amns_elt_mul=&amns_elt_mul19;
1824 AMNS->amns_elt_sqr=&amns_elt_sqr19;
1826 AMNS->amns_internal_red=&amns_internal_red19;
1827 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced19;
1830 AMNS->amns_elt_add=&amns_elt_add20;
1831 AMNS->amns_elt_sub=&amns_elt_sub20;
1832 AMNS->amns_elt_neg=&amns_elt_neg20;
1837 AMNS->amns_elt_mul=&amns_elt_mul_shift_p20;
1838 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p20;
1842 AMNS->amns_elt_mul=&amns_elt_mul_shift_n20;
1843 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n20;
1848 AMNS->amns_elt_mul=&amns_elt_mul20;
1849 AMNS->amns_elt_sqr=&amns_elt_sqr20;
1851 AMNS->amns_internal_red=&amns_internal_red20;
1852 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced20;
1855 AMNS->amns_elt_add=&amns_elt_add21;
1856 AMNS->amns_elt_sub=&amns_elt_sub21;
1857 AMNS->amns_elt_neg=&amns_elt_neg21;
1862 AMNS->amns_elt_mul=&amns_elt_mul_shift_p21;
1863 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p21;
1867 AMNS->amns_elt_mul=&amns_elt_mul_shift_n21;
1868 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n21;
1873 AMNS->amns_elt_mul=&amns_elt_mul21;
1874 AMNS->amns_elt_sqr=&amns_elt_sqr21;
1876 AMNS->amns_internal_red=&amns_internal_red21;
1877 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced21;
1880 AMNS->amns_elt_add=&amns_elt_add22;
1881 AMNS->amns_elt_sub=&amns_elt_sub22;
1882 AMNS->amns_elt_neg=&amns_elt_neg22;
1887 AMNS->amns_elt_mul=&amns_elt_mul_shift_p22;
1888 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p22;
1892 AMNS->amns_elt_mul=&amns_elt_mul_shift_n22;
1893 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n22;
1898 AMNS->amns_elt_mul=&amns_elt_mul22;
1899 AMNS->amns_elt_sqr=&amns_elt_sqr22;
1901 AMNS->amns_internal_red=&amns_internal_red22;
1902 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced22;
1905 AMNS->amns_elt_add=&amns_elt_add23;
1906 AMNS->amns_elt_sub=&amns_elt_sub23;
1907 AMNS->amns_elt_neg=&amns_elt_neg23;
1912 AMNS->amns_elt_mul=&amns_elt_mul_shift_p23;
1913 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p23;
1917 AMNS->amns_elt_mul=&amns_elt_mul_shift_n23;
1918 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n23;
1923 AMNS->amns_elt_mul=&amns_elt_mul23;
1924 AMNS->amns_elt_sqr=&amns_elt_sqr23;
1926 AMNS->amns_internal_red=&amns_internal_red23;
1927 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced23;
1930 AMNS->amns_elt_add=&amns_elt_add24;
1931 AMNS->amns_elt_sub=&amns_elt_sub24;
1932 AMNS->amns_elt_neg=&amns_elt_neg24;
1937 AMNS->amns_elt_mul=&amns_elt_mul_shift_p24;
1938 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p24;
1942 AMNS->amns_elt_mul=&amns_elt_mul_shift_n24;
1943 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n24;
1948 AMNS->amns_elt_mul=&amns_elt_mul24;
1949 AMNS->amns_elt_sqr=&amns_elt_sqr24;
1951 AMNS->amns_internal_red=&amns_internal_red24;
1952 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced24;
1955 AMNS->amns_elt_add=&amns_elt_add25;
1956 AMNS->amns_elt_sub=&amns_elt_sub25;
1957 AMNS->amns_elt_neg=&amns_elt_neg25;
1962 AMNS->amns_elt_mul=&amns_elt_mul_shift_p25;
1963 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_p25;
1967 AMNS->amns_elt_mul=&amns_elt_mul_shift_n25;
1968 AMNS->amns_elt_sqr=&amns_elt_sqr_shift_n25;
1973 AMNS->amns_elt_mul=&amns_elt_mul25;
1974 AMNS->amns_elt_sqr=&amns_elt_sqr25;
1976 AMNS->amns_internal_red=&amns_internal_red25;
1977 AMNS->amns_elt_is_reduced=&amns_elt_is_reduced25;
1980 printf(
"Set up a default for templates ptr\n");
1982 AMNS->amns_elt_sub=&amns_elt_sub_generic;
1983 AMNS->amns_elt_neg=&amns_elt_neg_generic;
1984 AMNS->amns_elt_mul=&amns_elt_mul_generic;
2029 #if MPHELL_USE_DEBUG == 1
2041 #if MPHELL_USE_DEBUG == 1
2058 for(i=0; i<size; i++)
2060 #if MPHELL_USE_AMNS_32 == 1
2061 s = sprintf(ptr,
"%d\t", x[i]);
2063 s = sprintf(ptr,
"%ld\t", x[i]);
2072 char str1[strlen(str)+1];
2074 char delim[] =
"\t";
2075 char * token = strtok(str1, delim);
2077 while(token != NULL)
2079 #if MPHELL_USE_AMNS_32 == 1
2080 x[i++] = atoi(token);
2082 x[i++] = atoll(token);
2084 token = strtok(NULL, delim);
2091 char str1[strlen(str)+1];
2093 char delim[] =
"\t";
2094 char * token = strtok(str1, delim);
2096 while(token != NULL)
2098 x[i++] = strtoul(token, NULL, 10);
2099 token = strtok(NULL, delim);
2105 const uint8_t n = AMNS->
n;
2126 const uint8_t n = AMNS->
n;
2131 dst[i]=(amns_llong)a[i]*b;
2145 const uint8_t n = AMNS->
n;
2156 const uint8_t n = AMNS->
n;
2162 memset(v, 0, n*
sizeof(amns_llong));
2166 memset(res, 0, n*
sizeof(block));
2170 block d = 1UL << AMNS->
rho;
2178 for(i=0; i < n; i++)
2191 const uint8_t n = AMNS->
n;
2195 memset(v, 0, n*
sizeof(amns_llong));
2199 memset(res, 0, n*
sizeof(block));
2203 block d = 1UL << AMNS->
rho;
2214 for(i=0; i < n; i++)
2225 const uint8_t n = AMNS->
n;
2235 v[i] = (amns_llong) a[i];
2312 const uint8_t n = AMNS->
n;
2331 #if MPHELL_USE_DEBUG == 1
2335 const uint8_t n = AMNS->
n;
2345 if(!amns_elt_is_reduced(dst, AMNS))
2347 #if MPHELL_USE_DEBUG == 1
2356 AMNS->amns_elt_add(dst, a, b, AMNS);
2359 #define TEMPLATE_amns_elt_add(sl) \
2361 amns_elt_add##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS) \
2364 const uint8_t n = sl; \
2368 for(i=0; i<n; i++) \
2375 if(!amns_elt_is_reduced(dst, AMNS)) \
2377 amns_internal_red_exact(dst, AMNS); \
2381 TEMPLATE_amns_elt_add(2)
2382 TEMPLATE_amns_elt_add(3)
2383 TEMPLATE_amns_elt_add(4)
2384 TEMPLATE_amns_elt_add(5)
2385 TEMPLATE_amns_elt_add(6)
2386 TEMPLATE_amns_elt_add(7)
2387 TEMPLATE_amns_elt_add(8)
2388 TEMPLATE_amns_elt_add(9)
2389 TEMPLATE_amns_elt_add(10)
2390 TEMPLATE_amns_elt_add(11)
2391 TEMPLATE_amns_elt_add(12)
2392 TEMPLATE_amns_elt_add(13)
2393 TEMPLATE_amns_elt_add(14)
2394 TEMPLATE_amns_elt_add(15)
2395 TEMPLATE_amns_elt_add(16)
2396 TEMPLATE_amns_elt_add(17)
2397 TEMPLATE_amns_elt_add(18)
2398 TEMPLATE_amns_elt_add(19)
2399 TEMPLATE_amns_elt_add(20)
2400 TEMPLATE_amns_elt_add(21)
2401 TEMPLATE_amns_elt_add(22)
2402 TEMPLATE_amns_elt_add(23)
2403 TEMPLATE_amns_elt_add(24)
2404 TEMPLATE_amns_elt_add(25)
2406 #undef TEMPLATE_amns_elt_add
2418 const uint8_t n = AMNS->
n;
2429 AMNS->amns_elt_neg(dst, a, AMNS);
2432 #define TEMPLATE_amns_elt_neg(sl) \
2434 amns_elt_neg##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS) \
2437 const uint8_t n = sl; \
2441 for(i=0; i<n; i++) \
2447 TEMPLATE_amns_elt_neg(2)
2448 TEMPLATE_amns_elt_neg(3)
2449 TEMPLATE_amns_elt_neg(4)
2450 TEMPLATE_amns_elt_neg(5)
2451 TEMPLATE_amns_elt_neg(6)
2452 TEMPLATE_amns_elt_neg(7)
2453 TEMPLATE_amns_elt_neg(8)
2454 TEMPLATE_amns_elt_neg(9)
2455 TEMPLATE_amns_elt_neg(10)
2456 TEMPLATE_amns_elt_neg(11)
2457 TEMPLATE_amns_elt_neg(12)
2458 TEMPLATE_amns_elt_neg(13)
2459 TEMPLATE_amns_elt_neg(14)
2460 TEMPLATE_amns_elt_neg(15)
2461 TEMPLATE_amns_elt_neg(16)
2462 TEMPLATE_amns_elt_neg(17)
2463 TEMPLATE_amns_elt_neg(18)
2464 TEMPLATE_amns_elt_neg(19)
2465 TEMPLATE_amns_elt_neg(20)
2466 TEMPLATE_amns_elt_neg(21)
2467 TEMPLATE_amns_elt_neg(22)
2468 TEMPLATE_amns_elt_neg(23)
2469 TEMPLATE_amns_elt_neg(24)
2470 TEMPLATE_amns_elt_neg(25)
2472 #undef TEMPLATE_amns_elt_neg
2484 #if MPHELL_USE_DEBUG == 1
2488 const uint8_t n = AMNS->
n;
2498 if(!amns_elt_is_reduced(dst, AMNS))
2500 #if MPHELL_USE_DEBUG == 1
2509 AMNS->amns_elt_sub(dst, a, b, AMNS);
2512 #define TEMPLATE_amns_elt_sub(sl) \
2514 amns_elt_sub##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS) \
2517 const uint8_t n = sl; \
2521 for(i=0; i<n; i++) \
2528 if(!amns_elt_is_reduced(dst, AMNS)) \
2530 amns_internal_red_exact(dst, AMNS); \
2534 TEMPLATE_amns_elt_sub(2)
2535 TEMPLATE_amns_elt_sub(3)
2536 TEMPLATE_amns_elt_sub(4)
2537 TEMPLATE_amns_elt_sub(5)
2538 TEMPLATE_amns_elt_sub(6)
2539 TEMPLATE_amns_elt_sub(7)
2540 TEMPLATE_amns_elt_sub(8)
2541 TEMPLATE_amns_elt_sub(9)
2542 TEMPLATE_amns_elt_sub(10)
2543 TEMPLATE_amns_elt_sub(11)
2544 TEMPLATE_amns_elt_sub(12)
2545 TEMPLATE_amns_elt_sub(13)
2546 TEMPLATE_amns_elt_sub(14)
2547 TEMPLATE_amns_elt_sub(15)
2548 TEMPLATE_amns_elt_sub(16)
2549 TEMPLATE_amns_elt_sub(17)
2550 TEMPLATE_amns_elt_sub(18)
2551 TEMPLATE_amns_elt_sub(19)
2552 TEMPLATE_amns_elt_sub(20)
2553 TEMPLATE_amns_elt_sub(21)
2554 TEMPLATE_amns_elt_sub(22)
2555 TEMPLATE_amns_elt_sub(23)
2556 TEMPLATE_amns_elt_sub(24)
2557 TEMPLATE_amns_elt_sub(25)
2560 #undef TEMPLATE_amns_elt_sub
2572 #if MPHELL_USE_DEBUG == 1
2575 const uint8_t n = AMNS->
n;
2586 for(i=0; i<n-1; i++)
2588 tm[i]=((amns_llong)a[i+1]*b[n-1]);
2589 for (j=i+2; j<n; j++)
2591 tm[i]+=((amns_llong)a[j]*b[(n+i)-j]);
2594 for (j=0; j<=i; j++)
2596 tm[i]+=(amns_llong)a[j]*b[i-j];
2599 tm[n-1]=(amns_llong)a[0]*b[n-1];
2602 tm[n-1]+=(amns_llong)a[j]*b[(n-1)-j];
2607 for(i=0; i<n-1; i++)
2609 tm[i]=((amns_llong)a[i+1]*b[n-1]);
2610 for (j=i+2; j<n; j++)
2612 tm[i]+=((amns_llong)a[j]*b[(n+i)-j]);
2615 for (j=0; j<=i; j++)
2617 tm[i]+=(amns_llong)a[j]*b[i-j];
2620 tm[n-1]=(amns_llong)a[0]*b[n-1];
2623 tm[n-1]+=(amns_llong)a[j]*b[(n-1)-j];
2629 #if MPHELL_USE_DEBUG == 1
2636 #define TEMPLATE_amns_elt_mul(sl) \
2638 amns_elt_mul##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS) \
2640 const uint8_t n = sl; \
2644 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
2645 MPHELL_ASSERT(amns_calculate_max_coeff(b, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(b) > rho_max\n"); \
2650 for(i=0; i<n-1; i++) \
2652 tm[i]=((amns_llong)a[i+1]*b[n-1]); \
2654 for (j=i+2; j<n; j++) \
2656 tm[i]+=((amns_llong)a[j]*b[(n+i)-j]); \
2658 tm[i] *= AMNS->lambda; \
2660 for (j=0; j<=i; j++) \
2662 tm[i]+=(amns_llong)a[j]*b[i-j]; \
2665 tm[n-1]=(amns_llong)a[0]*b[n-1]; \
2667 for (j=1; j<n; j++) \
2669 tm[n-1]+=(amns_llong)a[j]*b[(n-1)-j]; \
2674 amns_internal_red(dst, tm, AMNS); \
2677 TEMPLATE_amns_elt_mul(2)
2678 TEMPLATE_amns_elt_mul(3)
2679 TEMPLATE_amns_elt_mul(4)
2680 TEMPLATE_amns_elt_mul(5)
2681 TEMPLATE_amns_elt_mul(6)
2682 TEMPLATE_amns_elt_mul(7)
2683 TEMPLATE_amns_elt_mul(8)
2684 TEMPLATE_amns_elt_mul(9)
2685 TEMPLATE_amns_elt_mul(10)
2686 TEMPLATE_amns_elt_mul(11)
2687 TEMPLATE_amns_elt_mul(12)
2688 TEMPLATE_amns_elt_mul(13)
2689 TEMPLATE_amns_elt_mul(14)
2690 TEMPLATE_amns_elt_mul(15)
2691 TEMPLATE_amns_elt_mul(16)
2692 TEMPLATE_amns_elt_mul(17)
2693 TEMPLATE_amns_elt_mul(18)
2694 TEMPLATE_amns_elt_mul(19)
2695 TEMPLATE_amns_elt_mul(20)
2696 TEMPLATE_amns_elt_mul(21)
2697 TEMPLATE_amns_elt_mul(22)
2698 TEMPLATE_amns_elt_mul(23)
2699 TEMPLATE_amns_elt_mul(24)
2700 TEMPLATE_amns_elt_mul(25)
2702 #undef TEMPLATE_amns_elt_mul
2704 #define TEMPLATE_amns_elt_mul_shift_p(sl) \
2706 amns_elt_mul_shift_p##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS) \
2708 const uint8_t n = sl; \
2712 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
2713 MPHELL_ASSERT(amns_calculate_max_coeff(b, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(b) > rho_max\n"); \
2718 for(i=0; i<n-1; i++) \
2720 tm[i]=((amns_llong)a[i+1]*b[n-1]); \
2722 for (j=i+2; j<n; j++) \
2724 tm[i]+=((amns_llong)a[j]*b[(n+i)-j]); \
2728 for (j=0; j<=i; j++) \
2730 tm[i]+=(amns_llong)a[j]*b[i-j]; \
2733 tm[n-1]=(amns_llong)a[0]*b[n-1]; \
2735 for (j=1; j<n; j++) \
2737 tm[n-1]+=(amns_llong)a[j]*b[(n-1)-j]; \
2742 amns_internal_red(dst, tm, AMNS); \
2745 TEMPLATE_amns_elt_mul_shift_p(2)
2746 TEMPLATE_amns_elt_mul_shift_p(3)
2747 TEMPLATE_amns_elt_mul_shift_p(4)
2748 TEMPLATE_amns_elt_mul_shift_p(5)
2749 TEMPLATE_amns_elt_mul_shift_p(6)
2750 TEMPLATE_amns_elt_mul_shift_p(7)
2751 TEMPLATE_amns_elt_mul_shift_p(8)
2752 TEMPLATE_amns_elt_mul_shift_p(9)
2753 TEMPLATE_amns_elt_mul_shift_p(10)
2754 TEMPLATE_amns_elt_mul_shift_p(11)
2755 TEMPLATE_amns_elt_mul_shift_p(12)
2756 TEMPLATE_amns_elt_mul_shift_p(13)
2757 TEMPLATE_amns_elt_mul_shift_p(14)
2758 TEMPLATE_amns_elt_mul_shift_p(15)
2759 TEMPLATE_amns_elt_mul_shift_p(16)
2760 TEMPLATE_amns_elt_mul_shift_p(17)
2761 TEMPLATE_amns_elt_mul_shift_p(18)
2762 TEMPLATE_amns_elt_mul_shift_p(19)
2763 TEMPLATE_amns_elt_mul_shift_p(20)
2764 TEMPLATE_amns_elt_mul_shift_p(21)
2765 TEMPLATE_amns_elt_mul_shift_p(22)
2766 TEMPLATE_amns_elt_mul_shift_p(23)
2767 TEMPLATE_amns_elt_mul_shift_p(24)
2768 TEMPLATE_amns_elt_mul_shift_p(25)
2770 #undef TEMPLATE_amns_elt_mul_shift_p
2772 #define TEMPLATE_amns_elt_mul_shift_n(sl) \
2774 amns_elt_mul_shift_n##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS) \
2776 const uint8_t n = sl; \
2780 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
2781 MPHELL_ASSERT(amns_calculate_max_coeff(b, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(b) > rho_max\n"); \
2786 for(i=0; i<n-1; i++) \
2788 tm[i]=-((amns_llong)a[i+1]*b[n-1]); \
2790 for (j=i+2; j<n; j++) \
2792 tm[i]-=((amns_llong)a[j]*b[(n+i)-j]); \
2796 for (j=0; j<=i; j++) \
2798 tm[i]+=(amns_llong)a[j]*b[i-j]; \
2801 tm[n-1]=(amns_llong)a[0]*b[n-1]; \
2803 for (j=1; j<n; j++) \
2805 tm[n-1]+=(amns_llong)a[j]*b[(n-1)-j]; \
2810 amns_internal_red(dst, tm, AMNS); \
2813 TEMPLATE_amns_elt_mul_shift_n(2)
2814 TEMPLATE_amns_elt_mul_shift_n(3)
2815 TEMPLATE_amns_elt_mul_shift_n(4)
2816 TEMPLATE_amns_elt_mul_shift_n(5)
2817 TEMPLATE_amns_elt_mul_shift_n(6)
2818 TEMPLATE_amns_elt_mul_shift_n(7)
2819 TEMPLATE_amns_elt_mul_shift_n(8)
2820 TEMPLATE_amns_elt_mul_shift_n(9)
2821 TEMPLATE_amns_elt_mul_shift_n(10)
2822 TEMPLATE_amns_elt_mul_shift_n(11)
2823 TEMPLATE_amns_elt_mul_shift_n(12)
2824 TEMPLATE_amns_elt_mul_shift_n(13)
2825 TEMPLATE_amns_elt_mul_shift_n(14)
2826 TEMPLATE_amns_elt_mul_shift_n(15)
2827 TEMPLATE_amns_elt_mul_shift_n(16)
2828 TEMPLATE_amns_elt_mul_shift_n(17)
2829 TEMPLATE_amns_elt_mul_shift_n(18)
2830 TEMPLATE_amns_elt_mul_shift_n(19)
2831 TEMPLATE_amns_elt_mul_shift_n(20)
2832 TEMPLATE_amns_elt_mul_shift_n(21)
2833 TEMPLATE_amns_elt_mul_shift_n(22)
2834 TEMPLATE_amns_elt_mul_shift_n(23)
2835 TEMPLATE_amns_elt_mul_shift_n(24)
2836 TEMPLATE_amns_elt_mul_shift_n(25)
2838 #undef TEMPLATE_amns_elt_mul_shift_n
2842 AMNS->amns_elt_mul(dst, a, b, AMNS);
2854 #if MPHELL_USE_DEBUG == 1
2857 const uint8_t n = AMNS->
n;
2867 for(i=0; i<n-2; i++)
2869 tm[i]=((amns_llong)a[i+1]*a[n-1])<<1;
2870 for (j=i+2; j<(n+i+1)/2; j++)
2872 tm[i]+=(((amns_llong)a[j]*a[(n+i)-j]))<<1;
2874 if((i & 1) == (n & 1))
2877 tm[i]+=((amns_llong)a[(n+i)/2]*a[(n+i)/2]);
2883 tm[i]+=((amns_llong)a[i/2]*a[i/2]);
2885 for (j=0; j<(i+1)/2; j++)
2887 tm[i]+=((amns_llong)a[j]*a[i-j])<<1;
2890 tm[n-2]=((amns_llong)a[n-1]*a[n-1]);
2895 tm[n-2]+=((amns_llong)a[(n-2)/2]*a[(n-2)/2]);
2897 for (j=0; j<(n-1)/2; j++)
2899 tm[n-2]+=((amns_llong)a[j]*a[(n-2)-j])<<1;
2902 tm[n-1]=((amns_llong)a[0]*a[n-1])<<1;
2903 for (j=1; j<n/2; j++)
2905 tm[n-1]+=((amns_llong)a[j]*a[(n-1)-j])<<1;
2910 tm[n-1]+=((amns_llong)a[(n-1)/2]*a[(n-1)/2]);
2915 for(i=0; i<n-2; i++)
2917 tm[i]=((amns_llong)a[i+1]*a[n-1])<<1;
2918 for (j=i+2; j<(n+i+1)/2; j++)
2920 tm[i]+=(((amns_llong)a[j]*a[(n+i)-j]))<<1;
2922 if((i & 1) == (n & 1))
2925 tm[i]+=((amns_llong)a[(n+i)/2]*a[(n+i)/2]);
2931 tm[i]+=((amns_llong)a[i/2]*a[i/2]);
2933 for (j=0; j<(i+1)/2; j++)
2935 tm[i]+=((amns_llong)a[j]*a[i-j])<<1;
2938 tm[n-2]=((amns_llong)a[n-1]*a[n-1]);
2943 tm[n-2]+=((amns_llong)a[(n-2)/2]*a[(n-2)/2]);
2945 for (j=0; j<(n-1)/2; j++)
2947 tm[n-2]+=((amns_llong)a[j]*a[(n-2)-j])<<1;
2950 tm[n-1]=((amns_llong)a[0]*a[n-1])<<1;
2951 for (j=1; j<n/2; j++)
2953 tm[n-1]+=((amns_llong)a[j]*a[(n-1)-j])<<1;
2958 tm[n-1]+=((amns_llong)a[(n-1)/2]*a[(n-1)/2]);
2964 #if MPHELL_USE_DEBUG == 1
2971 #define TEMPLATE_amns_elt_sqr(sl) \
2973 amns_elt_sqr##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS) \
2975 const uint8_t n = sl; \
2979 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
2983 for(i=0; i<n-2; i++) \
2985 tm[i]=((amns_llong)a[i+1]*a[n-1])<<1; \
2987 for (j=i+2; j<(n+i+1)/2; j++) \
2989 tm[i]+=(((amns_llong)a[j]*a[(n+i)-j]))<<1; \
2991 if((i & 1) == (n & 1)) \
2994 tm[i]+=((amns_llong)a[(n+i)/2]*a[(n+i)/2]); \
2996 tm[i] *= AMNS->lambda; \
3000 tm[i]+=((amns_llong)a[i/2]*a[i/2]); \
3003 for (j=0; j<(i+1)/2; j++) \
3005 tm[i]+=((amns_llong)a[j]*a[i-j])<<1; \
3008 tm[n-2]=((amns_llong)a[n-1]*a[n-1]); \
3009 tm[n-2] *= AMNS->lambda; \
3013 tm[n-2]+=((amns_llong)a[(n-2)/2]*a[(n-2)/2]); \
3016 for (j=0; j<(n-1)/2; j++) \
3018 tm[n-2]+=((amns_llong)a[j]*a[(n-2)-j])<<1; \
3021 tm[n-1]=((amns_llong)a[0]*a[n-1])<<1; \
3023 for (j=1; j<n/2; j++) \
3025 tm[n-1]+=((amns_llong)a[j]*a[(n-1)-j])<<1; \
3030 tm[n-1]+=((amns_llong)a[(n-1)/2]*a[(n-1)/2]); \
3035 amns_internal_red(dst, tm, AMNS); \
3038 TEMPLATE_amns_elt_sqr(2)
3039 TEMPLATE_amns_elt_sqr(3)
3040 TEMPLATE_amns_elt_sqr(4)
3041 TEMPLATE_amns_elt_sqr(5)
3042 TEMPLATE_amns_elt_sqr(6)
3043 TEMPLATE_amns_elt_sqr(7)
3044 TEMPLATE_amns_elt_sqr(8)
3045 TEMPLATE_amns_elt_sqr(9)
3046 TEMPLATE_amns_elt_sqr(10)
3047 TEMPLATE_amns_elt_sqr(11)
3048 TEMPLATE_amns_elt_sqr(12)
3049 TEMPLATE_amns_elt_sqr(13)
3050 TEMPLATE_amns_elt_sqr(14)
3051 TEMPLATE_amns_elt_sqr(15)
3052 TEMPLATE_amns_elt_sqr(16)
3053 TEMPLATE_amns_elt_sqr(17)
3054 TEMPLATE_amns_elt_sqr(18)
3055 TEMPLATE_amns_elt_sqr(19)
3056 TEMPLATE_amns_elt_sqr(20)
3057 TEMPLATE_amns_elt_sqr(21)
3058 TEMPLATE_amns_elt_sqr(22)
3059 TEMPLATE_amns_elt_sqr(23)
3060 TEMPLATE_amns_elt_sqr(24)
3061 TEMPLATE_amns_elt_sqr(25)
3063 #undef TEMPLATE_amns_elt_sqr
3065 #define TEMPLATE_amns_elt_sqr_shift_p(sl) \
3067 amns_elt_sqr_shift_p##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS) \
3069 const uint8_t n = sl; \
3073 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
3077 for(i=0; i<n-2; i++) \
3079 tm[i]=((amns_llong)a[i+1]*a[n-1])<<1; \
3081 for (j=i+2; j<(n+i+1)/2; j++) \
3083 tm[i]+=(((amns_llong)a[j]*a[(n+i)-j]))<<1; \
3085 if((i & 1) == (n & 1)) \
3088 tm[i]+=((amns_llong)a[(n+i)/2]*a[(n+i)/2]); \
3094 tm[i]+=((amns_llong)a[i/2]*a[i/2]); \
3097 for (j=0; j<(i+1)/2; j++) \
3099 tm[i]+=((amns_llong)a[j]*a[i-j])<<1; \
3102 tm[n-2]=((amns_llong)a[n-1]*a[n-1]); \
3107 tm[n-2]+=((amns_llong)a[(n-2)/2]*a[(n-2)/2]); \
3110 for (j=0; j<(n-1)/2; j++) \
3112 tm[n-2]+=((amns_llong)a[j]*a[(n-2)-j])<<1; \
3115 tm[n-1]=((amns_llong)a[0]*a[n-1])<<1; \
3117 for (j=1; j<n/2; j++) \
3119 tm[n-1]+=((amns_llong)a[j]*a[(n-1)-j])<<1; \
3124 tm[n-1]+=((amns_llong)a[(n-1)/2]*a[(n-1)/2]); \
3129 amns_internal_red(dst, tm, AMNS); \
3132 TEMPLATE_amns_elt_sqr_shift_p(2)
3133 TEMPLATE_amns_elt_sqr_shift_p(3)
3134 TEMPLATE_amns_elt_sqr_shift_p(4)
3135 TEMPLATE_amns_elt_sqr_shift_p(5)
3136 TEMPLATE_amns_elt_sqr_shift_p(6)
3137 TEMPLATE_amns_elt_sqr_shift_p(7)
3138 TEMPLATE_amns_elt_sqr_shift_p(8)
3139 TEMPLATE_amns_elt_sqr_shift_p(9)
3140 TEMPLATE_amns_elt_sqr_shift_p(10)
3141 TEMPLATE_amns_elt_sqr_shift_p(11)
3142 TEMPLATE_amns_elt_sqr_shift_p(12)
3143 TEMPLATE_amns_elt_sqr_shift_p(13)
3144 TEMPLATE_amns_elt_sqr_shift_p(14)
3145 TEMPLATE_amns_elt_sqr_shift_p(15)
3146 TEMPLATE_amns_elt_sqr_shift_p(16)
3147 TEMPLATE_amns_elt_sqr_shift_p(17)
3148 TEMPLATE_amns_elt_sqr_shift_p(18)
3149 TEMPLATE_amns_elt_sqr_shift_p(19)
3150 TEMPLATE_amns_elt_sqr_shift_p(20)
3151 TEMPLATE_amns_elt_sqr_shift_p(21)
3152 TEMPLATE_amns_elt_sqr_shift_p(22)
3153 TEMPLATE_amns_elt_sqr_shift_p(23)
3154 TEMPLATE_amns_elt_sqr_shift_p(24)
3155 TEMPLATE_amns_elt_sqr_shift_p(25)
3157 #undef TEMPLATE_amns_elt_sqr_shift_p
3159 #define TEMPLATE_amns_elt_sqr_shift_n(sl) \
3161 amns_elt_sqr_shift_n##sl(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS) \
3163 const uint8_t n = sl; \
3167 MPHELL_ASSERT(amns_calculate_max_coeff(a, AMNS) < AMNS->max_digit_delta, "amns_elt_mul, internal reduction problem, max_coef(a) > rho_max\n"); \
3171 for(i=0; i<n-2; i++) \
3173 tm[i]=-((amns_llong)a[i+1]*a[n-1])<<1; \
3175 for (j=i+2; j<(n+i+1)/2; j++) \
3177 tm[i]-=(((amns_llong)a[j]*a[(n+i)-j]))<<1; \
3179 if((i & 1) == (n & 1)) \
3182 tm[i]-=((amns_llong)a[(n+i)/2]*a[(n+i)/2]); \
3188 tm[i]+=((amns_llong)a[i/2]*a[i/2]); \
3191 for (j=0; j<(i+1)/2; j++) \
3193 tm[i]+=((amns_llong)a[j]*a[i-j])<<1; \
3196 tm[n-2]=((amns_llong)a[n-1]*a[n-1]); \
3201 tm[n-2]+=((amns_llong)a[(n-2)/2]*a[(n-2)/2]); \
3204 for (j=0; j<(n-1)/2; j++) \
3206 tm[n-2]+=((amns_llong)a[j]*a[(n-2)-j])<<1; \
3209 tm[n-1]=((amns_llong)a[0]*a[n-1])<<1; \
3211 for (j=1; j<n/2; j++) \
3213 tm[n-1]+=((amns_llong)a[j]*a[(n-1)-j])<<1; \
3218 tm[n-1]+=((amns_llong)a[(n-1)/2]*a[(n-1)/2]); \
3223 amns_internal_red(dst, tm, AMNS); \
3226 TEMPLATE_amns_elt_sqr_shift_n(2)
3227 TEMPLATE_amns_elt_sqr_shift_n(3)
3228 TEMPLATE_amns_elt_sqr_shift_n(4)
3229 TEMPLATE_amns_elt_sqr_shift_n(5)
3230 TEMPLATE_amns_elt_sqr_shift_n(6)
3231 TEMPLATE_amns_elt_sqr_shift_n(7)
3232 TEMPLATE_amns_elt_sqr_shift_n(8)
3233 TEMPLATE_amns_elt_sqr_shift_n(9)
3234 TEMPLATE_amns_elt_sqr_shift_n(10)
3235 TEMPLATE_amns_elt_sqr_shift_n(11)
3236 TEMPLATE_amns_elt_sqr_shift_n(12)
3237 TEMPLATE_amns_elt_sqr_shift_n(13)
3238 TEMPLATE_amns_elt_sqr_shift_n(14)
3239 TEMPLATE_amns_elt_sqr_shift_n(15)
3240 TEMPLATE_amns_elt_sqr_shift_n(16)
3241 TEMPLATE_amns_elt_sqr_shift_n(17)
3242 TEMPLATE_amns_elt_sqr_shift_n(18)
3243 TEMPLATE_amns_elt_sqr_shift_n(19)
3244 TEMPLATE_amns_elt_sqr_shift_n(20)
3245 TEMPLATE_amns_elt_sqr_shift_n(21)
3246 TEMPLATE_amns_elt_sqr_shift_n(22)
3247 TEMPLATE_amns_elt_sqr_shift_n(23)
3248 TEMPLATE_amns_elt_sqr_shift_n(24)
3249 TEMPLATE_amns_elt_sqr_shift_n(25)
3251 #undef TEMPLATE_amns_elt_sqr_shift_n
3256 AMNS->amns_elt_sqr(dst, a, AMNS);
void amns_free(amns_ptr *AMNS)
Free the amns system.
void amns_elt_sqr_generic(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Set dst to a^2, using a generic code not optimised.
void amns_calcule_Ti(amns_ptr AMNS, const amns_block *P0, const amns_block *P1)
Compute the polynomials (amns elements) Ti such that Ti(gamma) = 2^(rho.i) * phi^2....
void amns_init(amns_ptr AMNS, const amns_block *E, const amns_block *P0, const amns_block *P1, const amns_block *M, const amns_ulong *Mprime, number_srcptr p, number gamma, uint8_t rho, uint8_t nb_add_max)
Initialise the amns system.
void amns_elt_read_sep(amns_block *x, char *str)
Parser to read a signed AMNS vector.
void amns_init_stat(amns_ptr AMNS)
Initialise again the AMNS statistics.
void amns_print_AMNS(amns_srcptr AMNS)
Print the AMNS system.
void amns_calcule_gi(amns_ptr AMNS)
Compute the number gi such that gi = gamma^i mod p. Used for AMNS to binary conversion.
void amns_elt_read_sep_ul(amns_ulong *x, char *str)
Parser to read a unsigned AMNS vector.
void amns_elt_sub(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a - b.
void amns_print_elt(amns_elt_srcptr x, amns_srcptr AMNS)
Print the AMNS element x.
int8_t amns_elt_cmp_ui(amns_elt_srcptr src1, block src2, amns_srcptr AMNS)
Compare src1 and src2.
void amns_print_bloc_ul(amns_ulong b)
Print an amns ulong (uint64_t or uint32_t)
uint8_t previous_power_2(uint8_t x)
Round to the previous power of 2.
void amns_elt_read_ul(amns_ulong *x, char *str)
Read a ulong polynomial from a string.
amns_block amns_calculate_max_coeff(amns_elt_srcptr a, amns_srcptr AMNS)
Calculate (||a||_infty)
void amns_print_elt_ul(const amns_ulong *x, amns_srcptr AMNS)
Print an amns ulong vector.
void amns_elt_set_zero(amns_elt_ptr dst, amns_srcptr AMNS)
Set dst to 0.
static bool amns_elt_is_reduced_generic(amns_elt_srcptr a, amns_srcptr AMNS)
Test if the coefficient a_i of a are all such that |a_i|<2^rho.
void amns_calcule_Miprime(amns_ptr AMNS, const amns_block *Mprime)
Compute the Mtiprime used by the internal reduction.
void amns_elt_add_generic(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a + b, using a generic code not optimised.
void amns_elt_add(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a + b.
void amns_mul_scalar_llong(amns_llong *dst, amns_elt_srcptr a, amns_ulong b, amns_srcptr AMNS)
Multiply the llong polynomial a by the scalar b.
void amns_add_llong(amns_llong *dst, amns_llong *a, amns_llong *b, amns_srcptr AMNS)
Add the llong polynomials a and b.
void amns_internal_red_exact(amns_elt_ptr dst, amns_srcptr AMNS)
Set dst such that dst(gamma) == R(gamma) et |coeffs(dst)| < 2^rho, use after addition when the coeffi...
uint8_t amns_calculate_max_coeff_size(amns_elt_srcptr a, amns_srcptr AMNS)
Calculate log2(||a||_infty)
void amns_internal_red_generic(amns_elt_ptr S, amns_llong *V, amns_srcptr AMNS)
Internal reduction using Montgomery method, not optimised because the compiler cannot guess the loop ...
void amns_elt_neg(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Set dst to -a.
void amns_elt_alloc(amns_elt *dst, amns_srcptr AMNS)
Allocate the amns (polynomial of degree less than n) element according to the degree of E.
void amns_elt_copy(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Copy a into dst.
bool amns_elt_isequal(amns_elt_srcptr src1, amns_elt_srcptr src2, amns_srcptr AMNS)
Test if src1 == src2, if true OK, if false, must be tested on binary !!!
int8_t amns_elt_cmp(amns_elt_srcptr src1, amns_elt_srcptr src2, amns_srcptr AMNS)
Compare src1 and src2.
void binary_ui_to_amns(block a, amns_elt_ptr dst, amns_srcptr AMNS)
Convert a small number into its AMNS representation.
void binary_to_amns(number_srcptr a, amns_elt_ptr dst, amns_srcptr AMNS)
Convert a number into its AMNS representation.
void amns_print_elt_raw(const amns_block *x, uint8_t size)
Print the AMNS element x.
bool amns_elt_is_zero(amns_elt_srcptr src, amns_srcptr AMNS)
Test if src is zero.
void amns_print_stat(amns_srcptr AMNS)
Print the AMNS system statistic.
void amns_elt_write(amns_block *x, uint8_t size, char *str)
Write a amns element into a string.
void amns_internal_red(amns_elt_ptr S, amns_llong *V, amns_srcptr AMNS)
Internal reduction using Montgomery method, optimised with templates to allow the compiler to guess t...
void amns_elt_read(amns_block *x, char *str)
Read a AMNS element from a string.
void amns_elt_copy_ul_2_amns(amns_elt dst, const amns_ulong *a, amns_srcptr AMNS)
Copy a unsigned vector into a signed vector modulo phi, the modulo is applied through the cast.
void amns_print_elt_raw_ul(const amns_ulong *x, uint8_t size)
Print an amns ulong vector.
void amns_to_binary(const amns_elt_srcptr a, number_ptr dst, amns_srcptr AMNS)
Convert AMNS representation into a number.
void amns_calcule_Mi(amns_ptr AMNS, const amns_block *M)
Compute the Mti used by the internal reduction.
void amns_elt_free(amns_elt *dst)
Free the amns element.
void amns_print_bloc(amns_block b)
Print b.
void amns_alloc_init_str(amns_ptr *AMNS, char *str, number p)
Allocate and initialise the amns system from the string generated by the Sage AMNS generator from htt...
void set_fast_internal_reduction_nist521(amns_ptr AMNS)
Set up a dedicated AMNS internal reduction for NIST 521 (Mersenne prime), the AMNS must be exactly th...
Declaration of Adapted Modular Number System (AMNS) functions.
const amns_block * amns_elt_srcptr
Define amns_elt_srcptr, use in all functions where the parameter is const.
amns_t * amns_ptr
Define amns_ptr, use in all functions.
void amns_elt_sqr(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Set dst to a^2.
void amns_elt_mul(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a * b.
amns_block * amns_elt_ptr
Define amns_elt_ptr, use in all functions.
static void amns_elt_relax_pool_elt(amns_elt *dst, amns_srcptr AMNS, uint8_t stack)
Relax an initialised amns element from the pool.
static void amns_elt_get_pool_elt(amns_elt *dst, amns_srcptr AMNS, uint8_t stack)
Get an initialised amns element from the pool.
void amns_alloc(amns_ptr *AMNS, uint8_t n, number_srcptr p)
Allocate the amns system according to the degree of the external reduction polynomial E.
amns_block * amns_elt
An AMNS element is a polynomial, we stock the digits in a left to right representation (a_0 is the co...
int64_t amns_block
Define the AMNS base block type.
bool number_isequal_ui(number_srcptr src1, const block src2)
Test if src1 == src2.
uint8_t number_block_size(number_srcptr src)
Calculate the number of block used by src.
bool number_isequal(number_srcptr src1, number_srcptr src2)
Test if src1 == src2.
void number_mod(number_ptr dst, number_srcptr src1, number_srcptr src2)
Compute dst such that src1 = q * src2 + dst ; dst < src2.
void number_copy(number_ptr dst, number_srcptr src)
Copy src into dst.
void number_addmul_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to dst + src1 * src2.
void number_set_ui(number_ptr dst, const block src)
Set dst to src.
void number_free(number *dst)
Free a number_ptr allocated on the RAM memory (malloc)
void number_set_str(number_ptr dst, const char *str, const uint8_t base)
Set dst to str.
void number_powm_ui(number_ptr dst, number_srcptr src1, const block src2, number_srcptr mod, uint8_t stack)
Set dst to src1^src2 modulo mod.
bool number_isdiff_ui(number_srcptr src1, const block src2)
Test if src1 != src2.
void number_tmp_free(number *t, const uint8_t size, uint8_t stack)
Free a temporary number.
void number_mul_mod(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr mod, uint8_t stack)
Set dst to (src1 * src2) % mod.
int8_t number_cmp(number_srcptr src1, number_srcptr src2)
Compare src1 and src2.
void number_divmod_ui(number_ptr q, block *r, number_srcptr src1, const block src2)
Compute (q, r) such that src1 = q * src2 + r ; r < src2.
void number_submul_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to dst - src1 * src2.
void number_tmp_alloc(number *t, const uint8_t size, uint8_t stack)
Allocate a temporary number.
int8_t number_cmp_ui(number_srcptr src1, const block src2)
Compare src1 and src2.
uint16_t number_log2(number_srcptr src)
Calculate log2(src), which is the binary size of src.
void number_print(number_srcptr src, const uint8_t base)
Print src in base "base".
void number_init(number *dst, const uint8_t n)
Allocate a number_ptr on the RAM memory (malloc)
uint8_t bits_to_nblock(const uint16_t nbits)
Return the number of blocks required to store a nbits number.
amns_llong max_amns_block
amns_block max_digit_delta
amns_block min_digit_delta