Skip to content

Commit

Permalink
Overhaul of the prime-tests
Browse files Browse the repository at this point in the history
 - Removal of the Fermat test mp_prime_fermat
 - Replacement of the Strong Lucas-Selfridge test with the
   Extra Strong Lucas test with Robert Baillie's parameters
   P = 3 and Q = 1
 - Additional tests to check the implementations of the
   Miller-Rabin and Extra Strong Lucas tests
  • Loading branch information
czurnieden committed Apr 11, 2023
1 parent 0df542c commit e34d96f
Show file tree
Hide file tree
Showing 15 changed files with 582 additions and 118 deletions.
249 changes: 247 additions & 2 deletions demo/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -883,7 +883,7 @@ static int test_mp_prime_rand(void)

/* test for size */
for (ix = 10; ix < 128; ix++) {
printf("Testing (not safe-prime): %9d bits \n", ix);
printf("\rTesting (not safe-prime): %9d bits ", ix);
fflush(stdout);
DO(mp_prime_rand(&a, 8, ix, (rand_int() & 1) ? 0 : MP_PRIME_2MSB_ON));
EXPECT(mp_count_bits(&a) == ix);
Expand All @@ -896,6 +896,238 @@ static int test_mp_prime_rand(void)
return EXIT_FAILURE;
}

/* Some small pseudoprimes to test the individual implementations */

/* Miller-Rabin base 2 */
static const uint32_t SPSP_2[] = {
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799,
49141, 52633, 65281, 74665, 80581, 85489, 88357, 90751
};

/* Miller-Rabin base 3 */
static const uint32_t SPSP_3[] = {
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531,
18721, 19345, 23521, 31621, 44287, 47197, 55969, 63139,
74593, 79003, 82513, 87913, 88573, 97567
};

/* SPSP to all bases < 100 */
static const char *SPSP_2_100_LARGE[4] = {
"3L2x7YRmz7g4q+DwxESBacAClxrNiuspLCf8BUEphtky+5VNHLAb2ZZLLI0bu6cAOtNkUXenakBCCL"
"Vn7gqOpkcrQ/ptxZdk+4gnI99wFjgcfM512N71ZzbwvLe+5Pzat2k+nHIjE0w/WbQvzk4a2/syAY8S"
"i1B5XRjXYVAQOLyNWhsFpXeWXUgqiNzv7avfwBA3ZOXt", /* bases 2 - 100 */
"JOcSIwxGqGEjeQ2GsdlnFMwhc+xY7EtZo5Kf4BglOuakxTJaP8qrdZyduXaAZUdzyPgQLf7B8vqvVE"
"VLJwH7dLkLEiw19tfu3naT6DgQWzk+b5WuwWJzsTMdgWWH86M1h/Gjt2J/qABtTTH26C8bS4v/q9Fh"
"R8jqHNOiufUgHkDQdW9Z+BLlf6OVVh2VwPIOGVc7kFF", /* bases 2 - 107 */
"1ZCddPKHO7yeqI5ZeKG5ssTnzJeIDpWElJEZnHwejl4tsyly44JgwdiRmXgsi9FQfYhMzFZMgV6qWZZ"
"sIJl4RNgpD/PDb3nam++ECkzMBuNIXVpmZzw+Gj5xQmpKK+OX8pFSy2IQiKyKAOfSaivXEb2/dga2J/"
"Pc2d23lw+eP3WtBbfHc7TAQGgNI/6Xmcpl1G64eXCrJ", /* bases 2 - 103 */
"cCax282DurA+2Z54W3VLKSC2mwgpilQpGydCDHvXHNRKbJQRa5NtLLfa3sXvCmUWZ9okP2ZSsPDnw0X"
"dUQLzaz59vnw0rKbfsoA4nDBjMXR78Q889+KS4HFKfXkzxsiIKYo0kSfwPKYxFUi4Zj185kwwAPTAr2"
"IjegdWjQLeX1ZQM0HVUUF3WEVhHXcFzF0sMiJU5hl" /* bases 2 - 101 */
};

/* Extra strong Lucas test with Baillie's parameters Q = 1, P = 3 */
static const uint32_t ESLPSP[] = {
989, 3239, 5777, 10877, 27971, 29681, 30739, 31631, 39059, 72389,
73919, 75077, 100127, 113573, 125249, 137549, 137801, 153931, 155819,
161027, 162133, 189419, 218321, 231703, 249331, 370229, 429479, 430127,
459191, 473891, 480689, 600059, 621781, 632249, 635627
};

/*
Almost extra strong Lucas test with Baillie's parameters Q = 1, P = 3
Only those that are not in ESLPSP.
*/
static const uint32_t AESLPSP[] = {
10469, 154697, 233659, 472453, 629693, 852389, 1091093, 1560437,
1620673, 1813601, 1969109, 2415739, 2595329, 2756837, 3721549,
4269341, 5192309, 7045433, 7226669, 7265561
};

/* Some randomly choosen 200 decimal digit large primes (https://primes.utm.edu/lists/small/small2.html) */
static const char *medium_primes[10] = {
"C8Ckh0vviS3HUPdB1NSrSm+gOodw/f1aQ5+aaH1W6RMB0jVkO6lTaL54O3o7U5BSGUFGxm5gAvisbJamasuLZS8g3ZsJ2JM4Vtn9cQZRfkP6b8V",
"64xDN9FqLBiovZ/9q/EPm0DONpIfn5MbJKHa+IjT0fjAzkg34FpAmad+CwhcpKaiTbZEpErut+DhpVyiQfqBFrgcGnGhhIrMF/XkyY3aVx6E96B",
"8cyuMlENm0vh/eWwgHUpDKqmLyCSsRQZRWvbHpA2jHDZv1EhHkVhceg3OFRZn/aXRBnbdtsc2xO6sWh9KZ5Mo7u9rJgBJMVtDnu094MCExj1YvB",
"BRFZFsYjSz45un8qptnuSqEsy9wV0BzbMpVAB1TrwImENOVIc1cASZNQ/mXG2xtazqgn/juVzFo91XLx9PtIlkcK0L2T6fBNgy8Lc7dSVoKQ+XP",
"Ez/mDl+to2gm69+VdIHI9Q7vaO3DuIdLVT69myM3HYwVBE+G24KffAOUAp3FGrSOU+LtERMiIYIEtxPI7n/DRJtmL2i0+REwGpTMge2d2EpabfB",
"5+Uz1gPFjZJ/nNdEOmOaMouJSGzygo42qz7xOwXn/moSUvBpPjo4twRGbK0+qaeU/RI8yYYxXr3OBP4w+/jgL3mN9GiENDM5LtEKMiQrZ9jIVEb",
"AQ5nD1+G1grv41s/XlK+0YTGyZgr/88PzdQJ8QT9tavisTgyG6k8/80A4HQhnFndskHNAaB2EW5fE7KH3kk7m89s8JnVqkJyGZWSfs1+JlmHLPf",
"3F19vPmM0Ih89KZ04Xmd62QB9F6E2sztT10A7Kcqc44eKvsNHh+JY6Z6gJXkbWg1Iw7xr29QAhEF/o1YAgfutQtpdzHkex06Yd71kPsaZdKXiC5",
"2fIcJ1t/VYCColXGs+ji/txNMEXn2FXdowLzlo7QKqzAWHdAbwtltSO5qpSp3OUiEOGUUi3hbyw3iQRE8nFJaikJ89Wdox6vpPtIsc3QRjexMnv",
"8aOicQ5gIbFCarFUgSgzh40LpuZ0jjK1u48/YT+C0h1dAQ8CIEgZjHZT+5/7cCRGmJlo+XCp7S41MSQ2ZNRSJh2texRYtvAXBAZfR8A8twl316P"
};

const mp_digit prime_tab[] = {
0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013,
0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035,
0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059,
0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083,
0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD,
0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF,
0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107,
0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137,

0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167,
0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199,
0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9,
0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7,
0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239,
0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265,
0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293,
0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF,

0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301,
0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B,
0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371,
0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD,
0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5,
0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419,
0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449,
0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B,

0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7,
0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503,
0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529,
0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F,
0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3,
0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7,
0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623,
0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653
};

#define ARR_LENGTH(a) ((int)(sizeof((a))/sizeof((a)[0])))

static int test_mp_prime_miller_rabin(void)
{
mp_int a, b, c;
bool result;
int i;
mp_digit j;
DOR(mp_init_multi(&a, &b, &c, NULL));

/* SPSP to base 2 */
mp_set(&b, 2u);
for (i = 0; i < ARR_LENGTH(SPSP_2); i++) {
result = false;
mp_set_u32(&a, SPSP_2[i]);
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == true);
}

/* Some larger primes to check for false negatives */
for (i = 0; i < 10; i++) {
result = false;
DO(mp_read_radix(&a, medium_primes[i], 64));
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == true);
}
/* Some semi-primes */
for (i = 0; i < 5; i += 2) {
result = false;
DO(mp_read_radix(&a, medium_primes[i], 64));
DO(mp_read_radix(&c, medium_primes[i+1], 64));
DO(mp_mul(&a, &c, &a));
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == false);
}

/* SPSP to base 3 */
mp_set(&b, 3u);
for (i = 0; i < ARR_LENGTH(SPSP_3); i++) {
result = false;
mp_set_u32(&a, SPSP_3[i]);
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == true);
}

/* SPSP to bases 2 -- 100 */
mp_set(&b, 2u);
for (i = 0; i < 4; i++) {
DO(mp_read_radix(&a, SPSP_2_100_LARGE[i], 64));
for (j = 2u; j <= 100u; j++) {
result = false;
mp_set(&b, j);
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == true);
}
/* 107 is a prime that works */
mp_set(&b, 107u);
DO(mp_prime_miller_rabin(&a, &b, &result));
EXPECT(result == false);
}

/* SPSP to bases 2 -- 100, automatic */
mp_set(&b, 2u);
for (i = 0; i < 4; i++) {
DO(mp_read_radix(&a, SPSP_2_100_LARGE[i], 64));
for (j = 2u; j <= (mp_digit)mp_prime_rabin_miller_trials(mp_count_bits(&a)); j++) {
result = false;
mp_set(&b, (mp_digit)prime_tab[j]);
DO(mp_prime_miller_rabin(&a, &b, &result));
}
/* These numbers are not big enough for the heuristics to work */
EXPECT(result == true);
}

mp_clear_multi(&a, &b, &c, NULL);
return EXIT_SUCCESS;
LBL_ERR:
mp_clear_multi(&a, &b, &c, NULL);
return EXIT_FAILURE;
}


static int test_mp_prime_extra_strong_lucas(void)
{
mp_int a, b;
bool result;
int i;

DOR(mp_init_multi(&a, &b, NULL));

/* Check Extra Strong pseudoprimes */
for (i = 0; i < ARR_LENGTH(ESLPSP); i++) {
result = false;
mp_set_u32(&a, ESLPSP[i]);
DO(mp_prime_extra_strong_lucas(&a, &result));
EXPECT(result == true);
}

/* Check Almost Extra Strong pseudoprimes (not in ESLPSP) */
for (i = 0; i < ARR_LENGTH(AESLPSP); i++) {
result = false;
mp_set_u32(&a, AESLPSP[i]);
DO(mp_prime_extra_strong_lucas(&a, &result));
EXPECT(result == false);
}

/* Some larger primes to check for false negatives */
for (i = 0; i < 10; i++) {
result = false;
DO(mp_read_radix(&a, medium_primes[i], 64));
DO(mp_prime_extra_strong_lucas(&a, &result));
EXPECT(result == true);
}

/* Some semi-primes */
for (i = 0; i < 5; i++) {
result = false;
DO(mp_read_radix(&a, medium_primes[i], 64));
DO(mp_read_radix(&a, medium_primes[i+1], 64));
DO(mp_mul(&a, &b, &a));
DO(mp_prime_extra_strong_lucas(&a, &result));
EXPECT(result == false);
}

mp_clear_multi(&a, &b, NULL);
return EXIT_SUCCESS;
LBL_ERR:
mp_clear_multi(&a, &b, NULL);
return EXIT_FAILURE;
}

static int test_mp_prime_is_prime(void)
{
int ix;
Expand All @@ -905,6 +1137,17 @@ static int test_mp_prime_is_prime(void)
mp_int a, b;
DOR(mp_init_multi(&a, &b, NULL));

/* strong Miller-Rabin pseudoprimes to the first 100 primes (gernerated with Arnault's method) */
printf("Testing mp_prime_is_prime() with SPSPs to the first 100 primes\n");
for (ix = 0; ix < 4; ix++) {
DO(mp_read_radix(&a,SPSP_2_100_LARGE[ix],64));
DO(mp_prime_is_prime(&a, mp_prime_rabin_miller_trials(mp_count_bits(&a)), &cnt));
if (cnt) {
printf("SPSP_2_100_LARGE[%d] is not prime but mp_prime_is_prime says it is.\n", ix);
goto LBL_ERR;
}
}

/* strong Miller-Rabin pseudoprime to the first 200 primes (F. Arnault) */
printf("Testing mp_prime_is_prime() with Arnault's pseudoprime 803...901");
DO(mp_read_radix(&a,
Expand Down Expand Up @@ -965,7 +1208,7 @@ static int test_mp_prime_is_prime(void)
DO(mp_read_radix(&a,
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF",
16));
DO(mp_prime_strong_lucas_selfridge(&a, &cnt));
DO(mp_prime_extra_strong_lucas(&a, &cnt));
/* large problem */
EXPECT(cnt);
if ((e != MP_OKAY) || !cnt) {
Expand Down Expand Up @@ -2465,6 +2708,8 @@ static int unit_tests(int argc, char **argv)
T1(mp_montgomery_reduce, MP_MONTGOMERY_REDUCE),
T1(mp_root_n, MP_ROOT_N),
T1(mp_or, MP_OR),
T1(mp_prime_extra_strong_lucas, MP_PRIME_EXTRA_STRONG_LUCAS),
T1(mp_prime_miller_rabin, MP_PRIME_MILLER_RABIN),
T1(mp_prime_is_prime, MP_PRIME_IS_PRIME),
T1(mp_prime_next_prime, MP_PRIME_NEXT_PRIME),
T1(mp_prime_rand, MP_PRIME_RAND),
Expand Down
32 changes: 9 additions & 23 deletions doc/bn.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2018,15 +2018,6 @@ \subsection{Example}

\chapter{Prime Numbers}

\section{Fermat Test}
\index{mp\_prime\_fermat}
\begin{alltt}
mp_err mp_prime_fermat (const mp_int *a, const mp_int *b, int *result)
\end{alltt}
Performs a Fermat primality test to the base $b$. That is it computes $b^a \mbox{ mod }a$ and
tests whether the value is equal to $b$ or not. If the values are equal then $a$ is probably prime
and $result$ is set to one. Otherwise $result$ is set to zero.

\section{Miller--Rabin Test}
\index{mp\_prime\_miller\_rabin}
\begin{alltt}
Expand All @@ -2036,9 +2027,6 @@ \section{Miller--Rabin Test}
test and is very hard to fool (besides with Carmichael numbers). If $a$ passes the test (therefore
is probably prime) $result$ is set to one. Otherwise $result$ is set to zero.

Note that it is suggested that you use the Miller--Rabin test instead of the Fermat test since all
of the failures of Miller--Rabin are a subset of the failures of the Fermat test.

\subsection{Required Number of Tests}
Generally to ensure a number is very likely to be prime you have to perform the Miller--Rabin with
at least a half--dozen or so unique bases. However, it has been proven that the probability of
Expand Down Expand Up @@ -2220,9 +2208,8 @@ \subsection{Required Number of Tests}
the diagonal from $(512,2^{-80})$ downwards and to the right to gain a lower probability of getting
a composite declared a pseudoprime for the same amount of work or less.

If this version of the library has the strong Lucas--Selfridge and/or the Frobenius--Underwood test
implemented only one or two rounds of the Miller--Rabin test with a random base is necessary for
numbers larger than or equal to $1024$ bits.
If this version of the library has the extra strong Lucas test implemented only one or two rounds
of the Miller--Rabin test with a random base is necessary for numbers larger than or equal to $1024$ bits.

This function is meant for RSA. The number of rounds for DSA is $\lceil -log_2(p)/2\rceil$ with $p$
the probability which is just the half of the absolute value of $p$ if given as a power of two.
Expand All @@ -2233,12 +2220,12 @@ \subsection{Required Number of Tests}

See also table C.1 in FIPS 186-4.

\section{Strong Lucas--Selfridge Test}
\index{mp\_prime\_strong\_lucas\_selfridge}
\section{Extra Strong Lucas Test}
\index{mp\_prime\_extra\_strong\_lucas}
\begin{alltt}
mp_err mp_prime_strong_lucas_selfridge(const mp_int *a, bool *result)
mp_err mp_prime_extra_strong_lucas(const mp_int *a, bool *result)
\end{alltt}
Performs a strong Lucas--Selfridge test. The strong Lucas--Selfridge test together with the
Performs a extra strong Lucas test. The extra strong Lucas test together with the
Rabin--Miller test with bases $2$ and $3$ resemble the BPSW test. The single internal use is a
compile--time option in \texttt{mp\_prime\_is\_prime} and can be excluded from the Libtommath build
if not needed.
Expand All @@ -2250,8 +2237,7 @@ \section{Frobenius (Underwood) Test}
\end{alltt}
Performs the variant of the Frobenius test as described by Paul Underwood. It can be included at
build--time if the preprocessor macro \texttt{LTM\_USE\_FROBENIUS\_TEST} is defined and will be
used
instead of the Lucas--Selfridge test.
used after the extra strong Lucas test.

It returns \texttt{MP\_ITER} if the number of iterations is exhausted, assumes a composite as the
input and sets \texttt{result} accordingly. This will reduce the set of available pseudoprimes by a
Expand All @@ -2272,11 +2258,11 @@ \section{Primality Testing}
mp_err mp_prime_is_prime(const mp_int *a, int t, bool *result)
\end{alltt}
This will perform a trial division followed by two rounds of Miller--Rabin with bases 2 and 3 and a
Lucas--Selfridge test. The Frobenius--Underwood is available as a compile--time option with the
extra strong Lucas test. The Frobenius--Underwood time is available as a compile--time option with the
preprocessor macro \texttt{LTM\_USE\_FROBENIUS\_TEST}. See file \texttt{bn\_mp\_prime\_is\_prime.c}
for the necessary details. It shall be noted that both functions are much slower than the
Miller--Rabin test and if speed is an essential issue, the macro \texttt{LTM\_USE\_ONLY\_MR}
switches the Frobenius--Underwood test and the Lucas--Selfridge test off and their code will not
switches the Frobenius--Underwood test and the Lucas test off and their code will not
even be compiled into the library.

If $t$ is set to a positive value $t$ additional rounds of the Miller--Rabin test with random bases
Expand Down
2 changes: 1 addition & 1 deletion libtommath_VS2008.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@
>
</File>
<File
RelativePath="mp_prime_fermat.c"
RelativePath="mp_prime_extra_strong_lucas.c"
>
</File>
<File
Expand Down
2 changes: 1 addition & 1 deletion makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
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 \
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 \
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
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 \
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_extra_strong_lucas.o \
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
Expand Down
2 changes: 1 addition & 1 deletion makefile.mingw
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
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 \
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 \
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
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 \
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_extra_strong_lucas.o \
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
Expand Down
2 changes: 1 addition & 1 deletion makefile.msvc
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ mp_get_mag_u64.obj mp_get_mag_ul.obj mp_grow.obj mp_hash.obj mp_init.obj mp_init
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 \
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 \
mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \
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 \
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_extra_strong_lucas.obj \
mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \
mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj mp_radix_size.obj \
mp_radix_size_overestimate.obj mp_rand.obj mp_rand_source.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj \
Expand Down
Loading

0 comments on commit e34d96f

Please sign in to comment.