added function mp_ilogb
This commit is contained in:
parent
96ece822c3
commit
35311aea49
183
bn_mp_ilogb.c
Normal file
183
bn_mp_ilogb.c
Normal file
@ -0,0 +1,183 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_ILOGB_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* Compute log_{base}(a) */
|
||||
static mp_word s_pow(mp_word base, mp_word exponent)
|
||||
{
|
||||
mp_word result = 1uLL;
|
||||
while (exponent) {
|
||||
if ((exponent & 0x1) == 1) {
|
||||
result *= base;
|
||||
}
|
||||
exponent >>= 1;
|
||||
base *= base;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static mp_digit s_digit_ilogb(mp_digit base, mp_digit n)
|
||||
{
|
||||
mp_word bracket_low = 1uLL, bracket_mid, bracket_high, N;
|
||||
mp_digit ret, high = 1uL, low = 0uL, mid;
|
||||
|
||||
if (n < base) {
|
||||
return (mp_digit)0uL;
|
||||
}
|
||||
if (n == base) {
|
||||
return (mp_digit)1uL;
|
||||
}
|
||||
|
||||
bracket_high = (mp_word) base ;
|
||||
N = (mp_word) n;
|
||||
|
||||
while (bracket_high < N) {
|
||||
low = high;
|
||||
bracket_low = bracket_high;
|
||||
high <<= 1;
|
||||
bracket_high *= bracket_high;
|
||||
}
|
||||
|
||||
while (((mp_digit)(high - low)) > 1uL) {
|
||||
mid = (low + high) >> 1;
|
||||
bracket_mid = bracket_low * s_pow(base, mid - low) ;
|
||||
|
||||
if (N < bracket_mid) {
|
||||
high = mid ;
|
||||
bracket_high = bracket_mid ;
|
||||
}
|
||||
if (N > bracket_mid) {
|
||||
low = mid ;
|
||||
bracket_low = bracket_mid ;
|
||||
}
|
||||
if (N == bracket_mid) {
|
||||
return (mp_digit) mid;
|
||||
}
|
||||
}
|
||||
|
||||
if (bracket_high == N) {
|
||||
ret = high;
|
||||
} else {
|
||||
ret = low;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* TODO: output could be "int" because the output of mp_radix_size is int, too,
|
||||
as is the output of mp_bitcount.
|
||||
With the same problem: max size is INT_MAX * MP_DIGIT not INT_MAX only!
|
||||
*/
|
||||
int mp_ilogb(mp_int *a, mp_digit base, mp_int *c)
|
||||
{
|
||||
int err, cmp;
|
||||
unsigned int high, low, mid;
|
||||
mp_int bracket_low, bracket_high, bracket_mid, t, bi_base;
|
||||
mp_digit tmp;
|
||||
|
||||
err = MP_OKAY;
|
||||
if (a->sign == MP_NEG) {
|
||||
return MP_VAL;
|
||||
}
|
||||
if (IS_ZERO(a)) {
|
||||
return MP_VAL;
|
||||
}
|
||||
|
||||
if (base < 2) {
|
||||
return MP_VAL;
|
||||
} else if (base == 2) {
|
||||
cmp = mp_count_bits(a) - 1;
|
||||
mp_set_int(c, (unsigned long)cmp);
|
||||
return err;
|
||||
} else if (a->used == 1) {
|
||||
tmp = s_digit_ilogb(base, a->dp[0]);
|
||||
mp_set(c, tmp);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
cmp = mp_cmp_d(a, base);
|
||||
|
||||
if (cmp == MP_LT) {
|
||||
mp_zero(c);
|
||||
return err;
|
||||
} else if (cmp == MP_EQ) {
|
||||
mp_set(c, (mp_digit)1uL);
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((err =
|
||||
mp_init_multi(&bracket_low, &bracket_high,
|
||||
&bracket_mid, &t, &bi_base, NULL)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
|
||||
low = 0uL;
|
||||
mp_set(&bracket_low, 1uL);
|
||||
high = 1uL;
|
||||
|
||||
mp_set(&bracket_high, base);
|
||||
|
||||
/*
|
||||
A kind of Giant-step/baby-step algorithm.
|
||||
Idea shamelessly stolen from https://programmingpraxis.com/2010/05/07/integer-logarithms/2/
|
||||
The effect is asymptotic, hence needs benchmarks to test if the Giant-step should be skipped
|
||||
for small n.
|
||||
*/
|
||||
while (mp_cmp(&bracket_high, a) == MP_LT) {
|
||||
low = high;
|
||||
if ((err = mp_copy(&bracket_high, &bracket_low)) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
high <<= 1;
|
||||
if ((err = mp_sqr(&bracket_high, &bracket_high)) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
mp_set(&bi_base, base);
|
||||
|
||||
while ((high - low) > 1) {
|
||||
mid = (high + low) >> 1;
|
||||
/* Difference can be larger then the type behind mp_digit can hold */
|
||||
if ((mid - low) > (unsigned int)(MP_MASK)) {
|
||||
err = MP_VAL;
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if ((err = mp_expt_d(&bi_base, (mid - low), &t)) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if ((err = mp_mul(&bracket_low, &t, &bracket_mid)) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
cmp = mp_cmp(a, &bracket_mid);
|
||||
if (cmp == MP_LT) {
|
||||
high = mid;
|
||||
mp_exch(&bracket_mid, &bracket_high);
|
||||
}
|
||||
if (cmp == MP_GT) {
|
||||
low = mid;
|
||||
mp_exch(&bracket_mid, &bracket_low);
|
||||
}
|
||||
if (cmp == MP_EQ) {
|
||||
mp_set_int(c, (unsigned long)mid);
|
||||
goto LBL_END;
|
||||
}
|
||||
}
|
||||
|
||||
if (mp_cmp(&bracket_high, a) == MP_EQ) {
|
||||
mp_set_int(c, (unsigned long)high);
|
||||
} else {
|
||||
mp_set_int(c, (unsigned long)low);
|
||||
}
|
||||
|
||||
LBL_END:
|
||||
LBL_ERR:
|
||||
mp_clear_multi(&bracket_low, &bracket_high, &bracket_mid,
|
||||
&t, &bi_base, NULL);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
284
callgraph.txt
284
callgraph.txt
@ -2616,6 +2616,290 @@ BN_MP_GET_LONG_LONG_C
|
||||
BN_MP_GROW_C
|
||||
|
||||
|
||||
BN_MP_ILOGB_C
|
||||
+--->BN_MP_RADIX_SIZE_C
|
||||
| +--->BN_MP_COUNT_BITS_C
|
||||
| +--->BN_MP_INIT_COPY_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | +--->BN_MP_COPY_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_MP_DIV_D_C
|
||||
| | +--->BN_MP_COPY_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_DIV_2D_C
|
||||
| | | +--->BN_MP_ZERO_C
|
||||
| | | +--->BN_MP_MOD_2D_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_RSHD_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_DIV_3_C
|
||||
| | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_EXCH_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_EXCH_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_MP_CLEAR_C
|
||||
+--->BN_MP_COUNT_BITS_C
|
||||
+--->BN_MP_SET_INT_C
|
||||
| +--->BN_MP_SET_LONG_C
|
||||
+--->BN_MP_SET_C
|
||||
| +--->BN_MP_ZERO_C
|
||||
+--->BN_MP_CMP_D_C
|
||||
+--->BN_MP_ZERO_C
|
||||
+--->BN_MP_INIT_MULTI_C
|
||||
| +--->BN_MP_INIT_C
|
||||
| +--->BN_MP_CLEAR_C
|
||||
+--->BN_MP_CMP_C
|
||||
| +--->BN_MP_CMP_MAG_C
|
||||
+--->BN_MP_COPY_C
|
||||
| +--->BN_MP_GROW_C
|
||||
+--->BN_MP_SQR_C
|
||||
| +--->BN_MP_TOOM_SQR_C
|
||||
| | +--->BN_MP_MOD_2D_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_RSHD_C
|
||||
| | +--->BN_MP_MUL_2_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_ADD_C
|
||||
| | | +--->BN_S_MP_ADD_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_SUB_C
|
||||
| | | +--->BN_S_MP_ADD_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_DIV_2_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_MUL_2D_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_MUL_D_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_DIV_3_C
|
||||
| | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | +--->BN_MP_INIT_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_EXCH_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_CLEAR_MULTI_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_MP_KARATSUBA_SQR_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_INIT_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_S_MP_ADD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_S_MP_SUB_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_RSHD_C
|
||||
| | +--->BN_MP_ADD_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_FAST_S_MP_SQR_C
|
||||
| | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| +--->BN_S_MP_SQR_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_INIT_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_EXCH_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
+--->BN_MP_EXPT_D_C
|
||||
| +--->BN_MP_EXPT_D_EX_C
|
||||
| | +--->BN_MP_INIT_COPY_C
|
||||
| | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_MUL_C
|
||||
| | | +--->BN_FAST_S_MP_MUL_DIGS_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_BALANCE_MUL_C
|
||||
| | | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | +--->BN_MP_CLEAR_C
|
||||
| | | | +--->BN_MP_LSHD_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | | +--->BN_MP_RSHD_C
|
||||
| | | | +--->BN_MP_ADD_C
|
||||
| | | | | +--->BN_S_MP_ADD_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | | +--->BN_MP_CMP_MAG_C
|
||||
| | | | | +--->BN_S_MP_SUB_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_EXCH_C
|
||||
| | | | +--->BN_MP_CLEAR_MULTI_C
|
||||
| | | +--->BN_MP_TOOM_MUL_C
|
||||
| | | | +--->BN_MP_MOD_2D_C
|
||||
| | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_RSHD_C
|
||||
| | | | +--->BN_MP_MUL_2_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_ADD_C
|
||||
| | | | | +--->BN_S_MP_ADD_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | | +--->BN_MP_CMP_MAG_C
|
||||
| | | | | +--->BN_S_MP_SUB_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_SUB_C
|
||||
| | | | | +--->BN_S_MP_ADD_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | | +--->BN_MP_CMP_MAG_C
|
||||
| | | | | +--->BN_S_MP_SUB_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_DIV_2_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_MUL_2D_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | | +--->BN_MP_LSHD_C
|
||||
| | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_MUL_D_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_DIV_3_C
|
||||
| | | | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | | +--->BN_MP_CLAMP_C
|
||||
| | | | | +--->BN_MP_EXCH_C
|
||||
| | | | | +--->BN_MP_CLEAR_C
|
||||
| | | | +--->BN_MP_LSHD_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLEAR_MULTI_C
|
||||
| | | | | +--->BN_MP_CLEAR_C
|
||||
| | | +--->BN_MP_KARATSUBA_MUL_C
|
||||
| | | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_S_MP_ADD_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_ADD_C
|
||||
| | | | | +--->BN_MP_CMP_MAG_C
|
||||
| | | | | +--->BN_S_MP_SUB_C
|
||||
| | | | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_S_MP_SUB_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_LSHD_C
|
||||
| | | | | +--->BN_MP_GROW_C
|
||||
| | | | | +--->BN_MP_RSHD_C
|
||||
| | | | +--->BN_MP_CLEAR_C
|
||||
| | | +--->BN_S_MP_MUL_DIGS_C
|
||||
| | | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | | +--->BN_MP_EXCH_C
|
||||
| | | | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
+--->BN_MP_MUL_C
|
||||
| +--->BN_FAST_S_MP_MUL_DIGS_C
|
||||
| | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| +--->BN_MP_BALANCE_MUL_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_INIT_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_RSHD_C
|
||||
| | +--->BN_MP_ADD_C
|
||||
| | | +--->BN_S_MP_ADD_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_EXCH_C
|
||||
| | +--->BN_MP_CLEAR_MULTI_C
|
||||
| +--->BN_MP_TOOM_MUL_C
|
||||
| | +--->BN_MP_MOD_2D_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_RSHD_C
|
||||
| | +--->BN_MP_MUL_2_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_ADD_C
|
||||
| | | +--->BN_S_MP_ADD_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_SUB_C
|
||||
| | | +--->BN_S_MP_ADD_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_DIV_2_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_MUL_2D_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_MUL_D_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_DIV_3_C
|
||||
| | | +--->BN_MP_INIT_SIZE_C
|
||||
| | | | +--->BN_MP_INIT_C
|
||||
| | | +--->BN_MP_CLAMP_C
|
||||
| | | +--->BN_MP_EXCH_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_CLEAR_MULTI_C
|
||||
| | | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_MP_KARATSUBA_MUL_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_INIT_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_S_MP_ADD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_ADD_C
|
||||
| | | +--->BN_MP_CMP_MAG_C
|
||||
| | | +--->BN_S_MP_SUB_C
|
||||
| | | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_S_MP_SUB_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | +--->BN_MP_LSHD_C
|
||||
| | | +--->BN_MP_GROW_C
|
||||
| | | +--->BN_MP_RSHD_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
| +--->BN_S_MP_MUL_DIGS_C
|
||||
| | +--->BN_MP_INIT_SIZE_C
|
||||
| | | +--->BN_MP_INIT_C
|
||||
| | +--->BN_MP_CLAMP_C
|
||||
| | +--->BN_MP_EXCH_C
|
||||
| | +--->BN_MP_CLEAR_C
|
||||
+--->BN_MP_EXCH_C
|
||||
+--->BN_MP_CLEAR_MULTI_C
|
||||
| +--->BN_MP_CLEAR_C
|
||||
|
||||
|
||||
BN_MP_IMPORT_C
|
||||
+--->BN_MP_ZERO_C
|
||||
+--->BN_MP_MUL_2D_C
|
||||
|
165
demo/test.c
165
demo/test.c
@ -1229,6 +1229,168 @@ LBL_ERR:
|
||||
return EXIT_SUCCESS;
|
||||
# endif /* LTM_DEMO_TEST_REDUCE_2K_L */
|
||||
}
|
||||
/* stripped down version of mp_radix_size. The faster version can be off by up t
|
||||
o +3 */
|
||||
static int s_rs(const mp_int *a, int radix, int *size)
|
||||
{
|
||||
int res, digs = 0;
|
||||
mp_int t;
|
||||
mp_digit d;
|
||||
*size = 0;
|
||||
if (mp_iszero(a) == MP_YES) {
|
||||
*size = 2;
|
||||
return MP_OKAY;
|
||||
}
|
||||
if (radix == 2) {
|
||||
*size = mp_count_bits(a) + 1;
|
||||
return MP_OKAY;
|
||||
}
|
||||
if ((res = mp_init_copy(&t, a)) != MP_OKAY) {
|
||||
return res;
|
||||
}
|
||||
t.sign = MP_ZPOS;
|
||||
while (mp_iszero(&t) == MP_NO) {
|
||||
if ((res = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) {
|
||||
mp_clear(&t);
|
||||
return res;
|
||||
}
|
||||
++digs;
|
||||
}
|
||||
mp_clear(&t);
|
||||
*size = digs + 1;
|
||||
return MP_OKAY;
|
||||
}
|
||||
static int test_mp_ilogb(void)
|
||||
{
|
||||
mp_int a, lb;
|
||||
mp_digit d, base;
|
||||
int size;
|
||||
|
||||
if (mp_init_multi(&a, &lb, NULL) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
|
||||
/*
|
||||
base a result
|
||||
0 x MP_VAL
|
||||
1 x MP_VAL
|
||||
*/
|
||||
mp_set(&a, 42uL);
|
||||
base = 0uL;
|
||||
if (mp_ilogb(&a, base, &lb) != MP_VAL) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
base = 1uL;
|
||||
if (mp_ilogb(&a, base, &lb) != MP_VAL) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
/*
|
||||
base a result
|
||||
2 0 MP_VAL
|
||||
2 1 0
|
||||
2 2 1
|
||||
2 3 1
|
||||
*/
|
||||
base = 2uL;
|
||||
mp_zero(&a);
|
||||
if (mp_ilogb(&a, base, &lb) != MP_VAL) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
|
||||
for (d = 1; d < 4; d++) {
|
||||
mp_set(&a, d);
|
||||
if (mp_ilogb(&a, base, &lb) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (mp_cmp_d(&lb, (d == 1)?0uL:1uL) != MP_EQ) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
/*
|
||||
base a result
|
||||
3 0 MP_VAL
|
||||
3 1 0
|
||||
3 2 0
|
||||
3 3 1
|
||||
*/
|
||||
base = 3uL;
|
||||
mp_zero(&a);
|
||||
if (mp_ilogb(&a, base, &lb) != MP_VAL) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
for (d = 1; d < 4; d++) {
|
||||
mp_set(&a, d);
|
||||
if (mp_ilogb(&a, base, &lb) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (mp_cmp_d(&lb, (d < base)?0uL:1uL) != MP_EQ) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
bases 2..64 with "a" a random large constant.
|
||||
The range of bases tested allows to check with
|
||||
radix_size.
|
||||
*/
|
||||
if (mp_rand(&a, 10) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
for (base = 2uL; base < 65uL; base++) {
|
||||
if (mp_ilogb(&a, base, &lb) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (s_rs(&a,(int)base, &size) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
/* radix_size includes the memory needed for '\0', too*/
|
||||
size -= 2;
|
||||
if (mp_cmp_d(&lb, size) != MP_EQ) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
bases 2..64 with "a" a random small constant to
|
||||
test the part of mp_ilogb that uses native types.
|
||||
*/
|
||||
if (mp_rand(&a, 1) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
for (base = 2uL; base < 65uL; base++) {
|
||||
if (mp_ilogb(&a, base, &lb) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (s_rs(&a,(int)base, &size) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
size -= 2;
|
||||
if (mp_cmp_d(&lb, size) != MP_EQ) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
/*Test upper edgecase with base MP_MASK and number (MP_MASK/2)*MP_MASK^10 */
|
||||
mp_set(&a, MP_MASK);
|
||||
if (mp_expt_d(&a, 10uL, &a) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (mp_add_d(&a, (MP_MASK>>1), &a) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (mp_ilogb(&a, MP_MASK, &lb) != MP_OKAY) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
if (mp_cmp_d(&lb, 10uL) != MP_EQ) {
|
||||
goto LBL_ERR;
|
||||
}
|
||||
|
||||
mp_clear_multi(&a, &lb, NULL);
|
||||
return EXIT_SUCCESS;
|
||||
LBL_ERR:
|
||||
mp_clear_multi(&a, &lb, NULL);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
static int test_mp_incr(void)
|
||||
{
|
||||
@ -1678,7 +1840,8 @@ int unit_tests(void)
|
||||
T(mp_tc_xor),
|
||||
T(mp_incr),
|
||||
T(mp_decr),
|
||||
T(mp_balance_mul)
|
||||
T(mp_balance_mul),
|
||||
T(mp_ilogb)
|
||||
#undef T
|
||||
};
|
||||
unsigned long i;
|
||||
|
65
doc/bn.tex
65
doc/bn.tex
@ -1844,6 +1844,71 @@ int mp_sqrt (mp_int * a, mp_digit b, mp_int * c)
|
||||
\end{alltt}
|
||||
|
||||
|
||||
\chapter{Logarithm}
|
||||
\section{Integer Logarithm}
|
||||
A logarithm function for positive integer input \texttt{a, base} computing $\floor{\log_bx}$ such that $(\ilog_bx)^b \le x$.
|
||||
\index{mp\_ilogb}
|
||||
\begin{alltt}
|
||||
int mp_ilogb(mp_int *a, mp_digit base, mp_int *c)
|
||||
\end{alltt}
|
||||
\subsection{Example}
|
||||
\begin{alltt}
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <tommath.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
mp_int x, output;
|
||||
mp_digit base;
|
||||
int e;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr,"Usage %s base x\textbackslash{}n", argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if ((e = mp_init_multi(&x, &output, NULL)) != MP_OKAY) {
|
||||
fprintf(stderr,"mp_init failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
|
||||
mp_error_to_string(e));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
errno = 0;
|
||||
#ifdef MP_64BIT
|
||||
base = (mp_digit)strtoull(argv[1], NULL, 10);
|
||||
#else
|
||||
base = (mp_digit)strtoul(argv[1], NULL, 10);
|
||||
#endif
|
||||
if ((errno == ERANGE) || (base > (base & MP_MASK))) {
|
||||
fprintf(stderr,"strtoul(l) failed: input out of range\textbackslash{}n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if ((e = mp_read_radix(&x, argv[2], 10)) != MP_OKAY) {
|
||||
fprintf(stderr,"mp_read_radix failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
|
||||
mp_error_to_string(e));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if ((e = mp_ilogb(&x, base, &output)) != MP_OKAY) {
|
||||
fprintf(stderr,"mp_ilogb failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
|
||||
mp_error_to_string(e));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if ((e = mp_fwrite(&output, 10, stdout)) != MP_OKAY) {
|
||||
fprintf(stderr,"mp_fwrite failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
|
||||
mp_error_to_string(e));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
putchar('\textbackslash{}n');
|
||||
|
||||
mp_clear_multi(&x, &output, NULL);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
\end{alltt}
|
||||
|
||||
|
||||
|
||||
\chapter{Prime Numbers}
|
||||
\section{Trial Division}
|
||||
\index{mp\_prime\_is\_divisible}
|
||||
|
@ -504,6 +504,10 @@
|
||||
RelativePath="bn_mp_grow.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_ilogb.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_import.c"
|
||||
>
|
||||
|
26
makefile
26
makefile
@ -34,19 +34,19 @@ bn_mp_decr.o bn_mp_div.o bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.
|
||||
bn_mp_dr_reduce.o bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o \
|
||||
bn_mp_exptmod.o bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o \
|
||||
bn_mp_get_bit.o bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o \
|
||||
bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o \
|
||||
bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o \
|
||||
bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o bn_mp_kronecker.o \
|
||||
bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o bn_mp_montgomery_calc_normalization.o \
|
||||
bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o \
|
||||
bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o bn_mp_or.o bn_mp_prime_fermat.o \
|
||||
bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o bn_mp_prime_is_prime.o \
|
||||
bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o bn_mp_prime_rabin_miller_trials.o \
|
||||
bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o bn_mp_radix_size.o bn_mp_radix_smap.o \
|
||||
bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.o bn_mp_reduce.o \
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_ilogb.o bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o \
|
||||
bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o \
|
||||
bn_mp_is_square.o bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o \
|
||||
bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||
bn_mp_read_unsigned_bin.o bn_mp_reduce.o bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o \
|
||||
bn_mp_reduce_2k_setup_l.o bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o \
|
||||
bn_mp_set.o bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
|
@ -37,19 +37,19 @@ bn_mp_decr.o bn_mp_div.o bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.
|
||||
bn_mp_dr_reduce.o bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o \
|
||||
bn_mp_exptmod.o bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o \
|
||||
bn_mp_get_bit.o bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o \
|
||||
bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o \
|
||||
bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o \
|
||||
bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o bn_mp_kronecker.o \
|
||||
bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o bn_mp_montgomery_calc_normalization.o \
|
||||
bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o \
|
||||
bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o bn_mp_or.o bn_mp_prime_fermat.o \
|
||||
bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o bn_mp_prime_is_prime.o \
|
||||
bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o bn_mp_prime_rabin_miller_trials.o \
|
||||
bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o bn_mp_radix_size.o bn_mp_radix_smap.o \
|
||||
bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.o bn_mp_reduce.o \
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_ilogb.o bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o \
|
||||
bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o \
|
||||
bn_mp_is_square.o bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o \
|
||||
bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||
bn_mp_read_unsigned_bin.o bn_mp_reduce.o bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o \
|
||||
bn_mp_reduce_2k_setup_l.o bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o \
|
||||
bn_mp_set.o bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
|
@ -29,19 +29,19 @@ bn_mp_decr.obj bn_mp_div.obj bn_mp_div_2.obj bn_mp_div_2d.obj bn_mp_div_3.obj bn
|
||||
bn_mp_dr_reduce.obj bn_mp_dr_setup.obj bn_mp_exch.obj bn_mp_export.obj bn_mp_expt_d.obj bn_mp_expt_d_ex.obj \
|
||||
bn_mp_exptmod.obj bn_mp_exptmod_fast.obj bn_mp_exteuclid.obj bn_mp_fread.obj bn_mp_fwrite.obj bn_mp_gcd.obj \
|
||||
bn_mp_get_bit.obj bn_mp_get_double.obj bn_mp_get_int.obj bn_mp_get_long.obj bn_mp_get_long_long.obj bn_mp_grow.obj \
|
||||
bn_mp_import.obj bn_mp_incr.obj bn_mp_init.obj bn_mp_init_copy.obj bn_mp_init_multi.obj bn_mp_init_set.obj \
|
||||
bn_mp_init_set_int.obj bn_mp_init_size.obj bn_mp_invmod.obj bn_mp_invmod_slow.obj bn_mp_is_square.obj \
|
||||
bn_mp_iseven.obj bn_mp_isodd.obj bn_mp_jacobi.obj bn_mp_karatsuba_mul.obj bn_mp_karatsuba_sqr.obj bn_mp_kronecker.obj \
|
||||
bn_mp_lcm.obj bn_mp_lshd.obj bn_mp_mod.obj bn_mp_mod_2d.obj bn_mp_mod_d.obj bn_mp_montgomery_calc_normalization.obj \
|
||||
bn_mp_montgomery_reduce.obj bn_mp_montgomery_setup.obj bn_mp_mul.obj bn_mp_mul_2.obj bn_mp_mul_2d.obj bn_mp_mul_d.obj \
|
||||
bn_mp_mulmod.obj bn_mp_n_root.obj bn_mp_n_root_ex.obj bn_mp_neg.obj bn_mp_or.obj bn_mp_prime_fermat.obj \
|
||||
bn_mp_prime_frobenius_underwood.obj bn_mp_prime_is_divisible.obj bn_mp_prime_is_prime.obj \
|
||||
bn_mp_prime_miller_rabin.obj bn_mp_prime_next_prime.obj bn_mp_prime_rabin_miller_trials.obj \
|
||||
bn_mp_prime_random_ex.obj bn_mp_prime_strong_lucas_selfridge.obj bn_mp_radix_size.obj bn_mp_radix_smap.obj \
|
||||
bn_mp_rand.obj bn_mp_read_radix.obj bn_mp_read_signed_bin.obj bn_mp_read_unsigned_bin.obj bn_mp_reduce.obj \
|
||||
bn_mp_reduce_2k.obj bn_mp_reduce_2k_l.obj bn_mp_reduce_2k_setup.obj bn_mp_reduce_2k_setup_l.obj \
|
||||
bn_mp_reduce_is_2k.obj bn_mp_reduce_is_2k_l.obj bn_mp_reduce_setup.obj bn_mp_rshd.obj bn_mp_set.obj \
|
||||
bn_mp_set_double.obj bn_mp_set_int.obj bn_mp_set_long.obj bn_mp_set_long_long.obj bn_mp_shrink.obj \
|
||||
bn_mp_ilogb.obj bn_mp_import.obj bn_mp_incr.obj bn_mp_init.obj bn_mp_init_copy.obj bn_mp_init_multi.obj \
|
||||
bn_mp_init_set.obj bn_mp_init_set_int.obj bn_mp_init_size.obj bn_mp_invmod.obj bn_mp_invmod_slow.obj \
|
||||
bn_mp_is_square.obj bn_mp_iseven.obj bn_mp_isodd.obj bn_mp_jacobi.obj bn_mp_karatsuba_mul.obj bn_mp_karatsuba_sqr.obj \
|
||||
bn_mp_kronecker.obj bn_mp_lcm.obj bn_mp_lshd.obj bn_mp_mod.obj bn_mp_mod_2d.obj bn_mp_mod_d.obj \
|
||||
bn_mp_montgomery_calc_normalization.obj bn_mp_montgomery_reduce.obj bn_mp_montgomery_setup.obj bn_mp_mul.obj \
|
||||
bn_mp_mul_2.obj bn_mp_mul_2d.obj bn_mp_mul_d.obj bn_mp_mulmod.obj bn_mp_n_root.obj bn_mp_n_root_ex.obj bn_mp_neg.obj \
|
||||
bn_mp_or.obj bn_mp_prime_fermat.obj bn_mp_prime_frobenius_underwood.obj bn_mp_prime_is_divisible.obj \
|
||||
bn_mp_prime_is_prime.obj bn_mp_prime_miller_rabin.obj bn_mp_prime_next_prime.obj \
|
||||
bn_mp_prime_rabin_miller_trials.obj bn_mp_prime_random_ex.obj bn_mp_prime_strong_lucas_selfridge.obj \
|
||||
bn_mp_radix_size.obj bn_mp_radix_smap.obj bn_mp_rand.obj bn_mp_read_radix.obj bn_mp_read_signed_bin.obj \
|
||||
bn_mp_read_unsigned_bin.obj bn_mp_reduce.obj bn_mp_reduce_2k.obj bn_mp_reduce_2k_l.obj bn_mp_reduce_2k_setup.obj \
|
||||
bn_mp_reduce_2k_setup_l.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_is_2k_l.obj bn_mp_reduce_setup.obj bn_mp_rshd.obj \
|
||||
bn_mp_set.obj bn_mp_set_double.obj bn_mp_set_int.obj bn_mp_set_long.obj bn_mp_set_long_long.obj bn_mp_shrink.obj \
|
||||
bn_mp_signed_bin_size.obj bn_mp_sqr.obj bn_mp_sqrmod.obj bn_mp_sqrt.obj bn_mp_sqrtmod_prime.obj bn_mp_sub.obj \
|
||||
bn_mp_sub_d.obj bn_mp_submod.obj bn_mp_tc_and.obj bn_mp_tc_div_2d.obj bn_mp_tc_or.obj bn_mp_tc_xor.obj \
|
||||
bn_mp_to_signed_bin.obj bn_mp_to_signed_bin_n.obj bn_mp_to_unsigned_bin.obj bn_mp_to_unsigned_bin_n.obj \
|
||||
|
@ -31,19 +31,19 @@ bn_mp_decr.o bn_mp_div.o bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.
|
||||
bn_mp_dr_reduce.o bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o \
|
||||
bn_mp_exptmod.o bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o \
|
||||
bn_mp_get_bit.o bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o \
|
||||
bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o \
|
||||
bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o \
|
||||
bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o bn_mp_kronecker.o \
|
||||
bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o bn_mp_montgomery_calc_normalization.o \
|
||||
bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o \
|
||||
bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o bn_mp_or.o bn_mp_prime_fermat.o \
|
||||
bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o bn_mp_prime_is_prime.o \
|
||||
bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o bn_mp_prime_rabin_miller_trials.o \
|
||||
bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o bn_mp_radix_size.o bn_mp_radix_smap.o \
|
||||
bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.o bn_mp_reduce.o \
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_ilogb.o bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o \
|
||||
bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o \
|
||||
bn_mp_is_square.o bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o \
|
||||
bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||
bn_mp_read_unsigned_bin.o bn_mp_reduce.o bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o \
|
||||
bn_mp_reduce_2k_setup_l.o bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o \
|
||||
bn_mp_set.o bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
|
@ -38,19 +38,19 @@ bn_mp_decr.o bn_mp_div.o bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.
|
||||
bn_mp_dr_reduce.o bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o \
|
||||
bn_mp_exptmod.o bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o \
|
||||
bn_mp_get_bit.o bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o \
|
||||
bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o \
|
||||
bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o \
|
||||
bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o bn_mp_kronecker.o \
|
||||
bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o bn_mp_montgomery_calc_normalization.o \
|
||||
bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o \
|
||||
bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o bn_mp_or.o bn_mp_prime_fermat.o \
|
||||
bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o bn_mp_prime_is_prime.o \
|
||||
bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o bn_mp_prime_rabin_miller_trials.o \
|
||||
bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o bn_mp_radix_size.o bn_mp_radix_smap.o \
|
||||
bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.o bn_mp_reduce.o \
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_ilogb.o bn_mp_import.o bn_mp_incr.o bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o \
|
||||
bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o bn_mp_invmod.o bn_mp_invmod_slow.o \
|
||||
bn_mp_is_square.o bn_mp_iseven.o bn_mp_isodd.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o bn_mp_karatsuba_sqr.o \
|
||||
bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||
bn_mp_read_unsigned_bin.o bn_mp_reduce.o bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o \
|
||||
bn_mp_reduce_2k_setup_l.o bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o \
|
||||
bn_mp_set.o bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
|
@ -567,6 +567,11 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style);
|
||||
*/
|
||||
int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat);
|
||||
|
||||
|
||||
/* Integer logarithm to integer base */
|
||||
int mp_ilogb(mp_int *a, mp_digit base, mp_int *c);
|
||||
|
||||
|
||||
/* ---> radix conversion <--- */
|
||||
int mp_count_bits(const mp_int *a);
|
||||
|
||||
|
@ -58,6 +58,7 @@
|
||||
# define BN_MP_GET_LONG_C
|
||||
# define BN_MP_GET_LONG_LONG_C
|
||||
# define BN_MP_GROW_C
|
||||
# define BN_MP_ILOGB_C
|
||||
# define BN_MP_IMPORT_C
|
||||
# define BN_MP_INCR_C
|
||||
# define BN_MP_INIT_C
|
||||
@ -466,6 +467,24 @@
|
||||
#if defined(BN_MP_GROW_C)
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_ILOGB_C)
|
||||
# define BN_MP_RADIX_SIZE_C
|
||||
# define BN_MP_BITCOUNT_C
|
||||
# define BN_MP_COUNT_BITS_C
|
||||
# define BN_MP_SET_INT_C
|
||||
# define BN_MP_SET_C
|
||||
# define BN_MP_CMP_D_C
|
||||
# define BN_MP_ZERO_C
|
||||
# define BN_MP_INIT_MULTI_C
|
||||
# define BN_MP_CMP_C
|
||||
# define BN_MP_COPY_C
|
||||
# define BN_MP_SQR_C
|
||||
# define BN_MP_EXPT_D_C
|
||||
# define BN_MP_MUL_C
|
||||
# define BN_MP_EXCH_C
|
||||
# define BN_MP_CLEAR_MULTI_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_IMPORT_C)
|
||||
# define BN_MP_ZERO_C
|
||||
# define BN_MP_MUL_2D_C
|
||||
|
Loading…
Reference in New Issue
Block a user