MPHELL  5.0.0
mphell-amns.h
Go to the documentation of this file.
1 /*
2  MPHELL-5.0
3  Author(s): The MPHELL team
4 
5  (C) Copyright 2015-2021 - Institut Fourier / Univ. Grenoble Alpes (France)
6 
7  This file is part of the MPHELL Library.
8  MPHELL is free software: you can redistribute it and/or modify
9  it under the terms of the GNU Lesser General Public License as published by
10  the Free Software Foundation, version 3 of the License.
11 
12  MPHELL is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with MPHELL. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
26 #ifndef MPHELL_AMNS_H
27 #define MPHELL_AMNS_H
28 
29 #include "mphell-number.h"
30 
31 /**************************************DATA STRUCTURE**********************************/
32 
37 #if MPHELL_USE_AMNS_32 == 0
38 #define AMNS_WORD_SIZE 64
39 typedef int64_t amns_block;
40 typedef uint64_t amns_ulong;
41 typedef __int128 amns_llong;
42 typedef unsigned __int128 amns_ullong;
43 typedef __float128 amns_ldouble;
44 typedef double amns_double;
45 
46 #else
47 
48 #define AMNS_WORD_SIZE 32
49 typedef int32_t amns_block;
50 typedef uint32_t amns_ulong;
51 typedef int64_t amns_llong;
52 typedef uint64_t amns_ullong;
53 typedef double amns_ldouble;
54 typedef double amns_double;
55 #endif
56 
61 typedef amns_block * amns_elt;
62 
68 
73 typedef const amns_block * amns_elt_srcptr;
74 
75 
80 struct amns
81 {
82  number p;
83  uint16_t p_size;
85  uint8_t k;
86  number gamma;
87  uint16_t gamma_size;
88  uint8_t n;
89  uint8_t rho;
94  uint8_t amns_block_size;
95  amns_llong max_amns_block;
98  uint8_t lambda_bit;
99  bool lambda_sign;
101  uint8_t nb_add_max;
107  number * gi;
109  amns_elt pool_1[POOL_SIZE_AMNS];
110  uint8_t i_1;
111 #if MPHELL_USE_MULTITHREADING == 1
112  amns_elt pool_2[POOL_SIZE_AMNS];
113  uint8_t i_2;
114 #endif
115 
116  void (*amns_elt_mul)(amns_elt_ptr, amns_elt_srcptr, amns_elt_srcptr, const struct amns *);
117  void (*amns_elt_sqr)(amns_elt_ptr, amns_elt_srcptr, const struct amns *);
118  void (*amns_elt_add)(amns_elt_ptr, amns_elt_srcptr, amns_elt_srcptr, const struct amns *);
119  void (*amns_elt_sub)(amns_elt_ptr, amns_elt_srcptr, amns_elt_srcptr, const struct amns *);
120  void (*amns_elt_neg)(amns_elt_ptr, amns_elt_srcptr, const struct amns *);
121  void (*amns_internal_red)(amns_elt_ptr, amns_llong *, const struct amns *);
122  bool (*amns_elt_is_reduced)(amns_elt_srcptr, const struct amns *);
123 
124 #if MPHELL_USE_DEBUG == 1
125  int nb_add;
126  int nb_sub;
127  int nb_mul;
128  int nb_add_red;
129  int nb_sub_red;
130  int nb_mul_red;
131 #endif
132 };
133 
138 typedef struct amns amns_t;
139 
144 typedef amns_t * amns;
145 
150 typedef amns_t * amns_ptr;
151 
156 typedef const amns_t * amns_srcptr;
157 
158 
159 /**************************************TMP**************************************/
160 
168 static inline void
169 amns_elt_get_pool_elt (amns_elt * dst, amns_srcptr AMNS, uint8_t stack)
170 {
171 #if MPHELL_USE_MULTITHREADING == 0
172  MPHELL_ASSERT(stack == STACK_1, "amns_elt_get_pool_elt, unknow stack \n");
173  MPHELL_ASSERT(AMNS->i_1 < POOL_SIZE_AMNS, "amns_elt_get_pool_elt, stack is too small \n");
174  *dst = (AMNS->pool_1)[(((amns_ptr)AMNS)->i_1)++];
175 #elif MPHELL_USE_MULTITHREADING == 1
176  if(stack == STACK_1)
177  {
178  MPHELL_ASSERT(AMNS->i_1 < POOL_SIZE_AMNS, "amns_elt_get_pool_elt, stack is too small \n");
179  *dst = (AMNS->pool_1)[(((amns_ptr)AMNS)->i_1)++];
180  }
181  else if (stack == STACK_2)
182  {
183  MPHELL_ASSERT(AMNS->i_2 < POOL_SIZE_AMNS, "amns_elt_get_pool_elt, stack is too small \n");
184  *dst = (AMNS->pool_2)[(((amns_ptr)AMNS)->i_2)++];
185  }
186  else
187  {
188  *dst = 0;
189  mphell_error("amns_elt_get_pool_elt, unknow stack \n");
190  }
191 #endif
192 }
193 
201 static inline void
202 amns_elt_relax_pool_elt (amns_elt * dst, amns_srcptr AMNS, uint8_t stack)
203 {
204 #if MPHELL_USE_MULTITHREADING == 0
205  MPHELL_ASSERT(stack == STACK_1, "amns_elt_relax_pool_elt, unknow stack \n");
206  (((amns_ptr)AMNS)->i_1)--;
207  MPHELL_ASSERT(AMNS->i_1 >= 0, "AMNS->i_1 is < 0 in pool 1\n");
208 #elif MPHELL_USE_MULTITHREADING == 1
209  if(stack == STACK_1)
210  {
211  (((amns_ptr)AMNS)->i_1)--;
212  MPHELL_ASSERT(AMNS->i_1 >= 0, "AMNS->i_1 is < 0 in pool 1\n");
213  }
214  else if (stack == STACK_2)
215  {
216  (((amns_ptr)AMNS)->i_2)--;
217  MPHELL_ASSERT(AMNS->i_2 >= 0, "AMNS->i_2 is < 0 in pool 2\n");
218  }
219  else
220  {
221  mphell_error("amns_elt_relax_pool_elt, unknow stack \n");
222  }
223 #endif
224 }
225 
226 /**************************************ALLOCATION**************************************/
227 
235 void amns_alloc(amns_ptr * AMNS, uint8_t n, number_srcptr p);
236 
242 void amns_free(amns_ptr * AMNS);
243 
250 void amns_elt_alloc(amns_elt * dst, amns_srcptr AMNS);
251 
257 void amns_elt_free(amns_elt * dst);
258 
259 
260 /*****************************************PRINT****************************************/
261 
268 
275 void amns_print_elt_raw(const amns_block * x, uint8_t size);
276 
284 
290 void amns_print_AMNS(amns_srcptr AMNS);
291 
297 void amns_print_stat(amns_srcptr AMNS);
298 
299 /***************************************HELPER*****************************************/
300 
307 
308 
309 /************************************INITIALISATION************************************/
310 
318 void amns_alloc_init_str(amns_ptr * AMNS, char * str, number p);
319 
334 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);
335 
342 
348 void amns_init_stat(amns_ptr AMNS);
349 
350 
351 /******************************************IO******************************************/
352 
360 void amns_elt_write(amns_block * x, uint8_t size, char * str);
361 
368 void amns_elt_read(amns_block * x, char * str);
369 
376 void amns_elt_read_ul(amns_ulong * x, char * str);
377 
385 
386 
387 /**************************************CONVERSION**************************************/
388 
396 void binary_to_amns(number_srcptr a, amns_elt_ptr dst, amns_srcptr AMNS);
397 
405 void binary_ui_to_amns(block a, amns_elt_ptr dst, amns_srcptr AMNS);
406 
414 void amns_to_binary(const amns_elt_srcptr a, number_ptr dst, amns_srcptr AMNS);
415 
416 
417 /***************************************COMPARISON**************************************/
418 
428 
439 
451 
462 int8_t amns_elt_cmp_ui(amns_elt_srcptr src1, block scr2, amns_srcptr AMNS);
463 
464 
465 /***************************************ARITHMETIC**************************************/
466 
475 
485 
494 
504 
514 
523 
524 
525 #endif
void amns_free(amns_ptr *AMNS)
Free the amns system.
Definition: mphell-amns.c:444
const amns_block * amns_elt_srcptr
Define amns_elt_srcptr, use in all functions where the parameter is const.
Definition: mphell-amns.h:73
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.
Definition: mphell-amns.c:1324
void amns_init_stat(amns_ptr AMNS)
Initialise again the AMNS statistics.
Definition: mphell-amns.c:2039
void amns_print_AMNS(amns_srcptr AMNS)
Print the AMNS system.
Definition: mphell-amns.c:577
void amns_elt_sub(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a - b.
Definition: mphell-amns.c:2507
void amns_print_elt(amns_elt_srcptr x, amns_srcptr AMNS)
Print the AMNS element x.
Definition: mphell-amns.c:561
void amns_elt_read_ul(amns_ulong *x, char *str)
Read a ulong polynomial from a string.
Definition: mphell-amns.c:2088
amns_t * amns_ptr
Define amns_ptr, use in all functions.
Definition: mphell-amns.h:150
void amns_elt_set_zero(amns_elt_ptr dst, amns_srcptr AMNS)
Set dst to 0.
Definition: mphell-amns.c:2103
amns_t * amns
Address of an AMNS structure.
Definition: mphell-amns.h:144
void amns_elt_add(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a + b.
Definition: mphell-amns.c:2354
void amns_elt_sqr(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Set dst to a^2.
void amns_elt_neg(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Set dst to -a.
Definition: mphell-amns.c:2427
int8_t amns_elt_cmp_ui(amns_elt_srcptr src1, block scr2, amns_srcptr AMNS)
Compare src1 and src2.
Definition: mphell-amns.c:2297
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.
Definition: mphell-amns.c:496
void amns_elt_copy(amns_elt_ptr dst, amns_elt_srcptr a, amns_srcptr AMNS)
Copy a into dst.
Definition: mphell-amns.c:2310
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 !!!
Definition: mphell-amns.c:2271
int8_t amns_elt_cmp(amns_elt_srcptr src1, amns_elt_srcptr src2, amns_srcptr AMNS)
Compare src1 and src2.
Definition: mphell-amns.c:2284
void amns_elt_mul(amns_elt_ptr dst, amns_elt_srcptr a, amns_elt_srcptr b, amns_srcptr AMNS)
Set dst to a * b.
void binary_ui_to_amns(block a, amns_elt_ptr dst, amns_srcptr AMNS)
Convert a small number into its AMNS representation.
Definition: mphell-amns.c:2189
void binary_to_amns(number_srcptr a, amns_elt_ptr dst, amns_srcptr AMNS)
Convert a number into its AMNS representation.
Definition: mphell-amns.c:2154
amns_block * amns_elt_ptr
Define amns_elt_ptr, use in all functions.
Definition: mphell-amns.h:67
void amns_print_elt_raw(const amns_block *x, uint8_t size)
Print the AMNS element x.
Definition: mphell-amns.c:533
static void amns_elt_relax_pool_elt(amns_elt *dst, amns_srcptr AMNS, uint8_t stack)
Relax an initialised amns element from the pool.
Definition: mphell-amns.h:202
static void amns_elt_get_pool_elt(amns_elt *dst, amns_srcptr AMNS, uint8_t stack)
Get an initialised amns element from the pool.
Definition: mphell-amns.h:169
bool amns_elt_is_zero(amns_elt_srcptr src, amns_srcptr AMNS)
Test if src is zero.
Definition: mphell-amns.c:2261
void amns_print_stat(amns_srcptr AMNS)
Print the AMNS system statistic.
Definition: mphell-amns.c:622
void amns_elt_write(amns_block *x, uint8_t size, char *str)
Write a amns element into a string.
Definition: mphell-amns.c:2053
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.
const amns_t * amns_srcptr
Define amns_srcptr, use in all functions where the parameter is const.
Definition: mphell-amns.h:156
uint8_t amns_calculate_rho(amns_srcptr AMNS)
Calculate rho from D (LLL reduced lattice associated to the AMNS)
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...
Definition: mphell-amns.h:61
void amns_elt_read(amns_block *x, char *str)
Read a AMNS element from a string.
Definition: mphell-amns.c:2069
void amns_to_binary(const amns_elt_srcptr a, number_ptr dst, amns_srcptr AMNS)
Convert AMNS representation into a number.
Definition: mphell-amns.c:2223
void amns_elt_free(amns_elt *dst)
Free the amns element.
Definition: mphell-amns.c:501
void amns_print_bloc(amns_block b)
Print b.
Definition: mphell-amns.c:510
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...
Definition: mphell-amns.c:1242
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...
Definition: mphell-amns.c:935
int64_t amns_block
Define the AMNS base block type.
Definition: mphell-amns.h:39
void mphell_error(char *expr)
Write in stderr, filename, line and expr, free mphell.
Definition: mphell-errors.c:45
Declaration of arithmetic functions, interface to chose either GMP mpz or number as base type for ari...
Define a AMNS.
Definition: mphell-amns.h:81
bool lambda_sign
Definition: mphell-amns.h:99
number gamma
Definition: mphell-amns.h:86
amns_elt pool_1[POOL_SIZE_AMNS]
Definition: mphell-amns.h:109
amns_elt E
Definition: mphell-amns.h:84
amns_elt * Mti
Definition: mphell-amns.h:103
uint8_t i_1
Definition: mphell-amns.h:110
amns_elt * Mtiprime
Definition: mphell-amns.h:104
uint8_t n
Definition: mphell-amns.h:88
uint16_t gamma_size
Definition: mphell-amns.h:87
amns_llong max_amns_block
Definition: mphell-amns.h:95
number p
Definition: mphell-amns.h:82
uint8_t amns_block_size
Definition: mphell-amns.h:94
amns_block lambda
Definition: mphell-amns.h:97
uint16_t p_size
Definition: mphell-amns.h:83
amns_elt * Ti
Definition: mphell-amns.h:106
uint8_t k
Definition: mphell-amns.h:85
number * gi
Definition: mphell-amns.h:107
uint8_t lambda_bit
Definition: mphell-amns.h:98
uint8_t nb_add_max
Definition: mphell-amns.h:101
amns_block max_digit_delta
Definition: mphell-amns.h:92
amns_block max_digit
Definition: mphell-amns.h:90
amns_block min_digit
Definition: mphell-amns.h:91
uint8_t rho
Definition: mphell-amns.h:89
amns_block min_digit_delta
Definition: mphell-amns.h:93