37 #if MPHELL_USE_AMNS_32 == 0
38 #define AMNS_WORD_SIZE 64
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;
48 #define AMNS_WORD_SIZE 32
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;
111 #if MPHELL_USE_MULTITHREADING == 1
124 #if MPHELL_USE_DEBUG == 1
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");
175 #elif MPHELL_USE_MULTITHREADING == 1
178 MPHELL_ASSERT(AMNS->
i_1 < POOL_SIZE_AMNS,
"amns_elt_get_pool_elt, stack is too small \n");
181 else if (stack == STACK_2)
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)++];
204 #if MPHELL_USE_MULTITHREADING == 0
205 MPHELL_ASSERT(stack == STACK_1,
"amns_elt_relax_pool_elt, unknow stack \n");
207 MPHELL_ASSERT(AMNS->
i_1 >= 0,
"AMNS->i_1 is < 0 in pool 1\n");
208 #elif MPHELL_USE_MULTITHREADING == 1
212 MPHELL_ASSERT(AMNS->i_1 >= 0,
"AMNS->i_1 is < 0 in pool 1\n");
214 else if (stack == STACK_2)
217 MPHELL_ASSERT(AMNS->i_2 >= 0,
"AMNS->i_2 is < 0 in pool 2\n");
221 mphell_error(
"amns_elt_relax_pool_elt, unknow stack \n");
void amns_free(amns_ptr *AMNS)
Free the amns system.
const amns_block * amns_elt_srcptr
Define amns_elt_srcptr, use in all functions where the parameter is const.
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_init_stat(amns_ptr AMNS)
Initialise again the AMNS statistics.
void amns_print_AMNS(amns_srcptr AMNS)
Print the AMNS system.
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.
void amns_elt_read_ul(amns_ulong *x, char *str)
Read a ulong polynomial from a string.
amns_t * amns_ptr
Define amns_ptr, use in all functions.
void amns_elt_set_zero(amns_elt_ptr dst, amns_srcptr AMNS)
Set dst to 0.
amns_t * amns
Address of an AMNS structure.
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_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.
int8_t amns_elt_cmp_ui(amns_elt_srcptr src1, block scr2, amns_srcptr AMNS)
Compare src1 and src2.
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 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.
void binary_to_amns(number_srcptr a, amns_elt_ptr dst, amns_srcptr AMNS)
Convert a number into its AMNS representation.
amns_block * amns_elt_ptr
Define amns_elt_ptr, use in all functions.
void amns_print_elt_raw(const amns_block *x, uint8_t size)
Print the AMNS element x.
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.
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_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.
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...
void amns_elt_read(amns_block *x, char *str)
Read a AMNS element from a string.
void amns_to_binary(const amns_elt_srcptr a, number_ptr dst, amns_srcptr AMNS)
Convert AMNS representation into a number.
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...
int64_t amns_block
Define the AMNS base block type.
void mphell_error(char *expr)
Write in stderr, filename, line and expr, free mphell.
Declaration of arithmetic functions, interface to chose either GMP mpz or number as base type for ari...
amns_elt pool_1[POOL_SIZE_AMNS]
amns_llong max_amns_block
amns_block max_digit_delta
amns_block min_digit_delta