Skip to content

Commit 77f047f

Browse files
authored
Merge pull request #497 from czurnieden/proven_log_n
Addition of a proof for mp_log and extension of mp_log to bigint bases
2 parents 3f10a28 + 8781b24 commit 77f047f

21 files changed

+585
-233
lines changed

.github/workflows/main.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ jobs:
4343
- { BUILDOPTIONS: '--symbols', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'libtool-bin' }
4444
# Run always with valgrind (no sanitizer, but debug info)
4545
- { BUILDOPTIONS: '--with-cc=gcc --with-m64 --with-valgrind', SANITIZER: '', COMPILE_DEBUG: '1', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
46+
# Alternative big-int version of mp_log(_n)
47+
- { BUILDOPTIONS: '--with-cc=gcc --with-m64 --cflags=-DS_MP_WORD_TOO_SMALL_C="" --with-valgrind', SANITIZER: '', COMPILE_DEBUG: '1', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
4648
# Shared library build
4749
- { BUILDOPTIONS: '--with-cc=gcc --make-option=-f --make-option=makefile.shared', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '1', CONV_WARNINGS: '', OTHERDEPS: 'libtool-bin' }
4850
# GCC for the 32-bit architecture (no valgrind)
4951
- { BUILDOPTIONS: '--with-cc=gcc --with-m32', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'libc6-dev-i386 gcc-multilib' }
52+
# Alternative big-int version of mp_log(_n) for the 32-bit architecture (no valgrind)
53+
- { BUILDOPTIONS: '--with-cc=gcc --with-m32 --cflags=-DS_MP_WORD_TOO_SMALL_C="" ', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'libc6-dev-i386 gcc-multilib' }
5054
# clang for the 32-bit architecture (no valgrind)
5155
- { BUILDOPTIONS: '--with-cc=clang-10 --with-m32', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'clang-10 llvm-10 gcc-multilib' }
5256
# RSA superclass with tests (no sanitizer, but debug info)
@@ -103,6 +107,10 @@ jobs:
103107
# but testing all three in one run took to long and timed out.
104108
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_16BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
105109
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_32BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
110+
# Alternative big-int version of mp_log(_n)
111+
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_16BIT --cflags=-DS_MP_WORD_TOO_SMALL_C="" --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
112+
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_32BIT --cflags=-DS_MP_WORD_TOO_SMALL_C="" --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
113+
106114
# clang for the x86-64 architecture with restricted limb sizes
107115
- { BUILDOPTIONS: '--with-cc=clang --cflags=-DMP_16BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'clang llvm' }
108116
- { BUILDOPTIONS: '--with-cc=clang --cflags=-DMP_32BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'clang llvm' }

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@ etc/tune
8585
tommath.tex
8686
libtommath.pc
8787

88+
# ignore files generated by bibtex/biber
89+
83aea75e0c59d1de027747003151d53dcb2a51c9.bib
90+
*.bbl
91+
*.bcf
92+
*.blg
93+
*.loa
94+
*.lol
95+
*.run.xml
96+
97+
8898
# ignore files generated by testme.sh
8999
gcc_errors_*.txt
90100
test_*.txt

demo/test.c

Lines changed: 97 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,8 +1395,7 @@ static int test_mp_reduce_2k_l(void)
13951395
return EXIT_SUCCESS;
13961396
# endif /* LTM_DEMO_TEST_REDUCE_2K_L */
13971397
}
1398-
/* stripped down version of mp_radix_size. The faster version can be off by up t
1399-
o +3 */
1398+
/* stripped down version of mp_radix_size. The faster version can be off by up to +3 */
14001399
static mp_err s_rs(const mp_int *a, int radix, int *size)
14011400
{
14021401
mp_err res;
@@ -1425,13 +1424,21 @@ static mp_err s_rs(const mp_int *a, int radix, int *size)
14251424
*size = digs + 1;
14261425
return MP_OKAY;
14271426
}
1427+
1428+
14281429
static int test_mp_log_n(void)
14291430
{
14301431
mp_int a;
14311432
mp_digit d;
1432-
int base, lb, size;
1433+
int base, lb, size, i;
14331434
const int max_base = MP_MIN(INT_MAX, MP_DIGIT_MAX);
14341435

1436+
if (MP_HAS(S_MP_WORD_TOO_SMALL)) {
1437+
fprintf(stderr, "Testing mp_log_n with restricted size of mp_word.\n");
1438+
} else {
1439+
fprintf(stderr, "Testing mp_log_n with normal size of mp_word.\n");
1440+
}
1441+
14351442
DOR(mp_init(&a));
14361443

14371444
/*
@@ -1484,25 +1491,32 @@ static int test_mp_log_n(void)
14841491
DO(mp_rand(&a, 10));
14851492
for (base = 2; base < 65; base++) {
14861493
DO(mp_log_n(&a, base, &lb));
1487-
DO(s_rs(&a,(int)base, &size));
1494+
DO(s_rs(&a,base, &size));
14881495
/* radix_size includes the memory needed for '\0', too*/
14891496
size -= 2;
14901497
EXPECT(lb == size);
14911498
}
14921499

14931500
/*
1494-
bases 2..64 with "a" a random small constant to
1495-
test the part of mp_ilogb that uses native types.
1501+
bases 2..64 with "a" a small constant and a small exponent "n" to test
1502+
in the range a^n - 10 .. a^n + 10. That will check the correction loops
1503+
and the test for perfect power.
1504+
For simplicity a = base and n = 23 (64^23 == 2^138 > 2^128)
14961505
*/
1497-
DO(mp_rand(&a, 1));
14981506
for (base = 2; base < 65; base++) {
1499-
DO(mp_log_n(&a, base, &lb));
1500-
DO(s_rs(&a,(int)base, &size));
1501-
size -= 2;
1502-
EXPECT(lb == size);
1507+
mp_set(&a,(mp_digit)base);
1508+
DO(mp_expt_n(&a, 23, &a));
1509+
DO(mp_sub_d(&a, 10u, &a));
1510+
for (i = 0; i < 20; i++) {
1511+
DO(mp_log_n(&a, base, &lb));
1512+
DO(s_rs(&a, base, &size));
1513+
size -= 2;
1514+
EXPECT(lb == size);
1515+
DO(mp_add_d(&a, 1u, &a));
1516+
}
15031517
}
15041518

1505-
/*Test upper edgecase with base UINT32_MAX and number (UINT32_MAX/2)*UINT32_MAX^10 */
1519+
/*Test base upper edgecase with base = UINT32_MAX and number = (UINT32_MAX/2)*UINT32_MAX^10 */
15061520
mp_set(&a, max_base);
15071521
DO(mp_expt_n(&a, 10uL, &a));
15081522
DO(mp_add_d(&a, max_base / 2, &a));
@@ -1516,6 +1530,76 @@ static int test_mp_log_n(void)
15161530
return EXIT_FAILURE;
15171531
}
15181532

1533+
static int test_mp_log(void)
1534+
{
1535+
mp_int a, base, bn, t;
1536+
int lb, lb2, i, j;
1537+
1538+
if (MP_HAS(S_MP_WORD_TOO_SMALL)) {
1539+
fprintf(stdout, "Testing mp_log with restricted size of mp_word.\n");
1540+
} else {
1541+
fprintf(stdout, "Testing mp_log with normal size of mp_word.\n");
1542+
}
1543+
1544+
DOR(mp_init_multi(&a, &base, &bn, &t, NULL));
1545+
1546+
/*
1547+
The small values got tested above for mp_log_n already, leaving the big stuff
1548+
with bases larger than INT_MAX.
1549+
*/
1550+
1551+
/* Edgecases a^b and -1+a^b (floor(log_2(256^129)) = 1032) */
1552+
for (i = 2; i < 256; i++) {
1553+
mp_set_i32(&a,i);
1554+
for (j = 2; j < ((i/2)+1); j++) {
1555+
DO(mp_expt_n(&a, j, &bn));
1556+
mp_set_i32(&base,j);
1557+
/* i^j a perfect power */
1558+
DO(mp_log(&bn, &a, &lb));
1559+
DO(mp_expt_n(&a, lb, &t));
1560+
if (mp_cmp(&t, &bn) != MP_EQ) {
1561+
fprintf(stderr,"FAILURE mp_log for perf. power at i = %d, j = %d\n", i, j);
1562+
goto LBL_ERR;
1563+
}
1564+
/* -1 + i^j */
1565+
DO(mp_decr(&bn));
1566+
DO(mp_log(&bn, &a, &lb2));
1567+
if (lb != (lb2+1)) {
1568+
fprintf(stderr,"FAILURE mp_log for -1 + i^j at i = %d, j = %d\n", i, j);
1569+
goto LBL_ERR;
1570+
}
1571+
}
1572+
}
1573+
1574+
/* Random a, base */
1575+
for (i = 1; i < 256; i++) {
1576+
DO(mp_rand(&a, i));
1577+
for (j = 1; j < ((i/2)+1); j++) {
1578+
DO(mp_rand(&base, j));
1579+
DO(mp_log(&a, &base, &lb));
1580+
DO(mp_expt_n(&base, lb, &bn));
1581+
/* "bn" must be smaller than or equal to "a" at this point. */
1582+
if (mp_cmp(&bn, &a) == MP_GT) {
1583+
fprintf(stderr,"FAILURE mp_log random in GT check");
1584+
goto LBL_ERR;
1585+
}
1586+
DO(mp_mul(&bn, &base, &bn));
1587+
/* "bn" must be bigger than "a" at this point. */
1588+
if (mp_cmp(&bn, &a) != MP_GT) {
1589+
fprintf(stderr,"FAILURE mp_log random in NOT GT check");
1590+
goto LBL_ERR;
1591+
}
1592+
}
1593+
}
1594+
1595+
mp_clear_multi(&a, &base, &bn, &t, NULL);
1596+
return EXIT_SUCCESS;
1597+
LBL_ERR:
1598+
mp_clear_multi(&a, &base, &bn, &t, NULL);
1599+
return EXIT_FAILURE;
1600+
}
1601+
1602+
15191603
static int test_mp_incr(void)
15201604
{
15211605
mp_int a, b;
@@ -2373,6 +2457,7 @@ static int unit_tests(int argc, char **argv)
23732457
T1(mp_get_u64, MP_GET_I64),
23742458
T1(mp_get_ul, MP_GET_L),
23752459
T1(mp_log_n, MP_LOG_N),
2460+
T1(mp_log, MP_LOG),
23762461
T1(mp_incr, MP_ADD_D),
23772462
T1(mp_invmod, MP_INVMOD),
23782463
T1(mp_is_square, MP_IS_SQUARE),

doc/bn.tex

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1946,18 +1946,24 @@ \section{Root Finding}
19461946
\begin{alltt}
19471947
mp_err mp_sqrt(const mp_int *arg, mp_int *ret)
19481948
\end{alltt}
1949-
19501949
\chapter{Logarithm}
19511950
\section{Integer Logarithm}
19521951
A logarithm function for positive integer input \texttt{a, base} computing $\floor{\log_bx}$ such
1953-
that $(\log_b x)^b \le x$.
1952+
that $(\log_b x)^b \le x$. The function \texttt{mp\_log\_n} is just a wrapper that converts \texttt{base}
1953+
to a bigint and calls \texttt{mp\_log}.
1954+
1955+
\index{mp\_log}
1956+
\begin{alltt}
1957+
mp_err mp_log(const mp_int *a, const mp_int *base, int *c)
1958+
\end{alltt}
19541959

19551960
\index{mp\_log\_n}
19561961
\begin{alltt}
19571962
mp_err mp_log_n(const mp_int *a, int base, int *c)
19581963
\end{alltt}
19591964

19601965
\subsection{Example}
1966+
Example given for \texttt{mp\_log\_n} only because the single difference is the type of \texttt{base}.
19611967
\begin{small}
19621968
\begin{alltt}
19631969
#include <stdlib.h>
@@ -1968,15 +1974,15 @@ \subsection{Example}
19681974
19691975
int main(int argc, char **argv)
19701976
{
1971-
mp_int x, output;
1972-
int base;
1977+
mp_int x;
1978+
int base, output;
19731979
mp_err e;
19741980
19751981
if (argc != 3) {
19761982
fprintf(stderr,"Usage %s base x\textbackslash{}n", argv[0]);
19771983
exit(EXIT_FAILURE);
19781984
}
1979-
if ((e = mp_init_multi(&x, &output, NULL)) != MP_OKAY) {
1985+
if ((e = mp_init(&x)) != MP_OKAY) {
19801986
fprintf(stderr,"mp_init failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
19811987
mp_error_to_string(e));
19821988
exit(EXIT_FAILURE);
@@ -1998,20 +2004,18 @@ \subsection{Example}
19982004
mp_error_to_string(e));
19992005
exit(EXIT_FAILURE);
20002006
}
2007+
printf("%d\n",output);
20012008
2002-
if ((e = mp_fwrite(&output, 10, stdout)) != MP_OKAY) {
2003-
fprintf(stderr,"mp_fwrite failed: \textbackslash{}"%s\textbackslash{}"\textbackslash{}n",
2004-
mp_error_to_string(e));
2005-
exit(EXIT_FAILURE);
2006-
}
2007-
putchar('\textbackslash{}n');
2008-
2009-
mp_clear_multi(&x, &output, NULL);
2009+
mp_clear(&x);
20102010
exit(EXIT_SUCCESS);
20112011
}
20122012
\end{alltt}
20132013
\end{small}
20142014

2015+
2016+
2017+
2018+
20152019
\chapter{Prime Numbers}
20162020

20172021
\section{Fermat Test}

libtommath_VS2008.vcproj

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,10 @@
544544
RelativePath="mp_lcm.c"
545545
>
546546
</File>
547+
<File
548+
RelativePath="mp_log.c"
549+
>
550+
</File>
547551
<File
548552
RelativePath="mp_log_n.c"
549553
>
@@ -829,27 +833,27 @@
829833
>
830834
</File>
831835
<File
832-
RelativePath="s_mp_get_bit.c"
836+
RelativePath="s_mp_fp_log.c"
833837
>
834838
</File>
835839
<File
836-
RelativePath="s_mp_invmod.c"
840+
RelativePath="s_mp_fp_log_d.c"
837841
>
838842
</File>
839843
<File
840-
RelativePath="s_mp_invmod_odd.c"
844+
RelativePath="s_mp_get_bit.c"
841845
>
842846
</File>
843847
<File
844-
RelativePath="s_mp_log.c"
848+
RelativePath="s_mp_invmod.c"
845849
>
846850
</File>
847851
<File
848-
RelativePath="s_mp_log_2expt.c"
852+
RelativePath="s_mp_invmod_odd.c"
849853
>
850854
</File>
851855
<File
852-
RelativePath="s_mp_log_d.c"
856+
RelativePath="s_mp_log_2expt.c"
853857
>
854858
</File>
855859
<File

makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ mp_error_to_string.o mp_exch.o mp_expt_n.o mp_exptmod.o mp_exteuclid.o mp_fread.
3333
mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_mag_u32.o \
3434
mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o \
3535
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
36-
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
36+
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
3737
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
3838
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
3939
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
@@ -44,8 +44,8 @@ mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o
4444
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4545
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4646
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
47-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \
48-
s_mp_invmod_odd.o s_mp_log.o s_mp_log_2expt.o s_mp_log_d.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
47+
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
48+
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
4949
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
5050
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
5151
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \

makefile.mingw

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ mp_error_to_string.o mp_exch.o mp_expt_n.o mp_exptmod.o mp_exteuclid.o mp_fread.
3535
mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_mag_u32.o \
3636
mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o \
3737
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
38-
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
38+
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
3939
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
4040
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
4141
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
@@ -46,8 +46,8 @@ mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o
4646
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4747
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4848
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
49-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \
50-
s_mp_invmod_odd.o s_mp_log.o s_mp_log_2expt.o s_mp_log_d.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
49+
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
50+
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
5151
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
5252
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
5353
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \

makefile.msvc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ mp_error_to_string.obj mp_exch.obj mp_expt_n.obj mp_exptmod.obj mp_exteuclid.obj
3131
mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj mp_get_l.obj mp_get_mag_u32.obj \
3232
mp_get_mag_u64.obj mp_get_mag_ul.obj mp_grow.obj mp_hash.obj mp_init.obj mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj \
3333
mp_init_l.obj mp_init_multi.obj mp_init_set.obj mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj \
34-
mp_invmod.obj mp_is_square.obj mp_kronecker.obj mp_lcm.obj mp_log_n.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj \
34+
mp_invmod.obj mp_is_square.obj mp_kronecker.obj mp_lcm.obj mp_log.obj mp_log_n.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj \
3535
mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \
3636
mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \
3737
mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \
@@ -42,8 +42,8 @@ mp_reduce_setup.obj mp_root_n.obj mp_rshd.obj mp_sbin_size.obj mp_set.obj mp_set
4242
mp_set_l.obj mp_set_u32.obj mp_set_u64.obj mp_set_ul.obj mp_shrink.obj mp_signed_rsh.obj mp_sqrmod.obj mp_sqrt.obj \
4343
mp_sqrtmod_prime.obj mp_sub.obj mp_sub_d.obj mp_submod.obj mp_to_radix.obj mp_to_sbin.obj mp_to_ubin.obj mp_ubin_size.obj \
4444
mp_unpack.obj mp_xor.obj mp_zero.obj s_mp_add.obj s_mp_copy_digs.obj s_mp_div_3.obj s_mp_div_recursive.obj \
45-
s_mp_div_school.obj s_mp_div_small.obj s_mp_exptmod.obj s_mp_exptmod_fast.obj s_mp_get_bit.obj s_mp_invmod.obj \
46-
s_mp_invmod_odd.obj s_mp_log.obj s_mp_log_2expt.obj s_mp_log_d.obj s_mp_montgomery_reduce_comba.obj s_mp_mul.obj \
45+
s_mp_div_school.obj s_mp_div_small.obj s_mp_exptmod.obj s_mp_exptmod_fast.obj s_mp_fp_log.obj s_mp_fp_log_d.obj \
46+
s_mp_get_bit.obj s_mp_invmod.obj s_mp_invmod_odd.obj s_mp_log_2expt.obj s_mp_montgomery_reduce_comba.obj s_mp_mul.obj \
4747
s_mp_mul_balance.obj s_mp_mul_comba.obj s_mp_mul_high.obj s_mp_mul_high_comba.obj s_mp_mul_karatsuba.obj \
4848
s_mp_mul_toom.obj s_mp_prime_is_divisible.obj s_mp_prime_tab.obj s_mp_radix_map.obj \
4949
s_mp_radix_size_overestimate.obj s_mp_rand_platform.obj s_mp_sqr.obj s_mp_sqr_comba.obj s_mp_sqr_karatsuba.obj \

0 commit comments

Comments
 (0)