Skip to content

Commit 681dc56

Browse files
committed
Overhaul of the prime-tests
- 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 - Finer grained early-outs - All determistic tests < 2^64 empirically verified - Additional tests to check the implementations of the Miller-Rabin and Extra Strong Lucas tests - Addition of tests of the LTM_USE_ONLY_MR to the CI - Documentation update
1 parent 5809141 commit 681dc56

17 files changed

+750
-142
lines changed

.github/workflows/main.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ jobs:
5858
# Run always with valgrind (no sanitizer, but debug info)
5959
- { BUILDOPTIONS: '--with-cc=gcc --with-m64 --with-valgrind', SANITIZER: '', COMPILE_DEBUG: '1', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
6060
# Alternative big-int version of mp_log(_n)
61-
- { 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: '' }
61+
- { BUILDOPTIONS: '--with-cc=gcc --with-m64 --cflags=-DS_MP_WORD_TOO_SMALL_C="" --cflags=-DLTM_USE_ONLY_MR --with-valgrind', SANITIZER: '', COMPILE_DEBUG: '1', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
6262
# Shared library build
6363
- { BUILDOPTIONS: '--with-cc=gcc --make-option=-f --make-option=makefile.shared', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '1', CONV_WARNINGS: '', OTHERDEPS: 'libtool-bin' }
6464
# GCC for the 32-bit architecture (no valgrind)
6565
- { BUILDOPTIONS: '--with-cc=gcc --with-m32', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'libc6-dev-i386 gcc-multilib' }
6666
# Alternative big-int version of mp_log(_n) for the 32-bit architecture (no valgrind)
67-
- { 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' }
67+
- { BUILDOPTIONS: '--with-cc=gcc --with-m32 --cflags=-DS_MP_WORD_TOO_SMALL_C="" --cflags=-DLTM_USE_ONLY_MR ', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'libc6-dev-i386 gcc-multilib' }
6868
# clang for the 32-bit architecture (no valgrind)
6969
- { BUILDOPTIONS: '--with-cc=clang-10 --with-m32', SANITIZER: '', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'clang-10 llvm-10 gcc-multilib' }
7070
# RSA superclass with tests (no sanitizer, but debug info)
@@ -128,8 +128,8 @@ jobs:
128128
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_16BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
129129
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_32BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
130130
# Alternative big-int version of mp_log(_n)
131-
- { 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: '' }
132-
- { 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: '' }
131+
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_16BIT --cflags=-DS_MP_WORD_TOO_SMALL_C="" --cflags=-DLTM_USE_ONLY_MR --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
132+
- { BUILDOPTIONS: '--with-cc=gcc --cflags=-DMP_32BIT --cflags=-DS_MP_WORD_TOO_SMALL_C="" --cflags=-DLTM_USE_ONLY_MR --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: '' }
133133

134134
# clang for the x86-64 architecture with restricted limb sizes
135135
- { BUILDOPTIONS: '--with-cc=clang --cflags=-DMP_16BIT --limit-valgrind', SANITIZER: '1', COMPILE_DEBUG: '0', COMPILE_LTO: '0', CONV_WARNINGS: '', OTHERDEPS: 'clang llvm' }

demo/test.c

Lines changed: 300 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,7 @@ static int test_mp_prime_rand(void)
894894

895895
/* test for size */
896896
for (ix = 10; ix < 128; ix++) {
897-
printf("Testing (not safe-prime): %9d bits \n", ix);
897+
printf("\rTesting (not safe-prime): %9d bits ", ix);
898898
fflush(stdout);
899899
DO(mp_prime_rand(&a, 8, ix, (rand_int() & 1) ? 0 : MP_PRIME_2MSB_ON));
900900
EXPECT(mp_count_bits(&a) == ix);
@@ -907,15 +907,264 @@ static int test_mp_prime_rand(void)
907907
return EXIT_FAILURE;
908908
}
909909

910+
/* Some small pseudoprimes to test the individual implementations */
911+
912+
/* Miller-Rabin base 2 */
913+
static const uint32_t SPSP_2[] = {
914+
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799,
915+
49141, 52633, 65281, 74665, 80581, 85489, 88357, 90751
916+
};
917+
918+
/* Miller-Rabin base 3 */
919+
static const uint32_t SPSP_3[] = {
920+
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531,
921+
18721, 19345, 23521, 31621, 44287, 47197, 55969, 63139,
922+
74593, 79003, 82513, 87913, 88573, 97567
923+
};
924+
925+
/* SPSP to all bases < 100 */
926+
static const char *SPSP_2_100_LARGE[4] = {
927+
"3L2x7YRmz7g4q+DwxESBacAClxrNiuspLCf8BUEphtky+5VNHLAb2ZZLLI0bu6cAOtNkUXenakBCCL"
928+
"Vn7gqOpkcrQ/ptxZdk+4gnI99wFjgcfM512N71ZzbwvLe+5Pzat2k+nHIjE0w/WbQvzk4a2/syAY8S"
929+
"i1B5XRjXYVAQOLyNWhsFpXeWXUgqiNzv7avfwBA3ZOXt", /* bases 2 - 100 */
930+
"JOcSIwxGqGEjeQ2GsdlnFMwhc+xY7EtZo5Kf4BglOuakxTJaP8qrdZyduXaAZUdzyPgQLf7B8vqvVE"
931+
"VLJwH7dLkLEiw19tfu3naT6DgQWzk+b5WuwWJzsTMdgWWH86M1h/Gjt2J/qABtTTH26C8bS4v/q9Fh"
932+
"R8jqHNOiufUgHkDQdW9Z+BLlf6OVVh2VwPIOGVc7kFF", /* bases 2 - 107 */
933+
"1ZCddPKHO7yeqI5ZeKG5ssTnzJeIDpWElJEZnHwejl4tsyly44JgwdiRmXgsi9FQfYhMzFZMgV6qWZZ"
934+
"sIJl4RNgpD/PDb3nam++ECkzMBuNIXVpmZzw+Gj5xQmpKK+OX8pFSy2IQiKyKAOfSaivXEb2/dga2J/"
935+
"Pc2d23lw+eP3WtBbfHc7TAQGgNI/6Xmcpl1G64eXCrJ", /* bases 2 - 103 */
936+
"cCax282DurA+2Z54W3VLKSC2mwgpilQpGydCDHvXHNRKbJQRa5NtLLfa3sXvCmUWZ9okP2ZSsPDnw0X"
937+
"dUQLzaz59vnw0rKbfsoA4nDBjMXR78Q889+KS4HFKfXkzxsiIKYo0kSfwPKYxFUi4Zj185kwwAPTAr2"
938+
"IjegdWjQLeX1ZQM0HVUUF3WEVhHXcFzF0sMiJU5hl" /* bases 2 - 101 */
939+
};
940+
941+
#ifndef LTM_USE_ONLY_MR
942+
/* Extra strong Lucas test with Baillie's parameters Q = 1, P = 3 */
943+
static const uint32_t ESLPSP[] = {
944+
989, 3239, 5777, 10877, 27971, 29681, 30739, 31631, 39059, 72389,
945+
73919, 75077, 100127, 113573, 125249, 137549, 137801, 153931, 155819,
946+
161027, 162133, 189419, 218321, 231703, 249331, 370229, 429479, 430127,
947+
459191, 473891, 480689, 600059, 621781, 632249, 635627
948+
};
949+
950+
/*
951+
Almost extra strong Lucas test with Baillie's parameters Q = 1, P = 3
952+
Only those that are not in ESLPSP.
953+
*/
954+
static const uint32_t AESLPSP[] = {
955+
10469, 154697, 233659, 472453, 629693, 852389, 1091093, 1560437,
956+
1620673, 1813601, 1969109, 2415739, 2595329, 2756837, 3721549,
957+
4269341, 5192309, 7045433, 7226669, 7265561
958+
};
959+
#endif
960+
961+
/* Some randomly choosen 200 decimal digit large primes (https://primes.utm.edu/lists/small/small2.html) */
962+
static const char *medium_primes[10] = {
963+
"C8Ckh0vviS3HUPdB1NSrSm+gOodw/f1aQ5+aaH1W6RMB0jVkO6lTaL54O3o7U5BSGUFGxm5gAvisbJamasuLZS8g3ZsJ2JM4Vtn9cQZRfkP6b8V",
964+
"64xDN9FqLBiovZ/9q/EPm0DONpIfn5MbJKHa+IjT0fjAzkg34FpAmad+CwhcpKaiTbZEpErut+DhpVyiQfqBFrgcGnGhhIrMF/XkyY3aVx6E96B",
965+
"8cyuMlENm0vh/eWwgHUpDKqmLyCSsRQZRWvbHpA2jHDZv1EhHkVhceg3OFRZn/aXRBnbdtsc2xO6sWh9KZ5Mo7u9rJgBJMVtDnu094MCExj1YvB",
966+
"BRFZFsYjSz45un8qptnuSqEsy9wV0BzbMpVAB1TrwImENOVIc1cASZNQ/mXG2xtazqgn/juVzFo91XLx9PtIlkcK0L2T6fBNgy8Lc7dSVoKQ+XP",
967+
"Ez/mDl+to2gm69+VdIHI9Q7vaO3DuIdLVT69myM3HYwVBE+G24KffAOUAp3FGrSOU+LtERMiIYIEtxPI7n/DRJtmL2i0+REwGpTMge2d2EpabfB",
968+
"5+Uz1gPFjZJ/nNdEOmOaMouJSGzygo42qz7xOwXn/moSUvBpPjo4twRGbK0+qaeU/RI8yYYxXr3OBP4w+/jgL3mN9GiENDM5LtEKMiQrZ9jIVEb",
969+
"AQ5nD1+G1grv41s/XlK+0YTGyZgr/88PzdQJ8QT9tavisTgyG6k8/80A4HQhnFndskHNAaB2EW5fE7KH3kk7m89s8JnVqkJyGZWSfs1+JlmHLPf",
970+
"3F19vPmM0Ih89KZ04Xmd62QB9F6E2sztT10A7Kcqc44eKvsNHh+JY6Z6gJXkbWg1Iw7xr29QAhEF/o1YAgfutQtpdzHkex06Yd71kPsaZdKXiC5",
971+
"2fIcJ1t/VYCColXGs+ji/txNMEXn2FXdowLzlo7QKqzAWHdAbwtltSO5qpSp3OUiEOGUUi3hbyw3iQRE8nFJaikJ89Wdox6vpPtIsc3QRjexMnv",
972+
"8aOicQ5gIbFCarFUgSgzh40LpuZ0jjK1u48/YT+C0h1dAQ8CIEgZjHZT+5/7cCRGmJlo+XCp7S41MSQ2ZNRSJh2texRYtvAXBAZfR8A8twl316P"
973+
};
974+
975+
const mp_digit prime_tab[] = {
976+
0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013,
977+
0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035,
978+
0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059,
979+
0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083,
980+
0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD,
981+
0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF,
982+
0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107,
983+
0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137,
984+
985+
0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167,
986+
0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199,
987+
0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9,
988+
0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7,
989+
0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239,
990+
0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265,
991+
0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293,
992+
0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF,
993+
994+
0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301,
995+
0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B,
996+
0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371,
997+
0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD,
998+
0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5,
999+
0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419,
1000+
0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449,
1001+
0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B,
1002+
1003+
0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7,
1004+
0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503,
1005+
0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529,
1006+
0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F,
1007+
0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3,
1008+
0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7,
1009+
0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623,
1010+
0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653
1011+
};
1012+
1013+
#define ARR_LENGTH(a) ((int)(sizeof((a))/sizeof((a)[0])))
1014+
1015+
static int test_mp_prime_miller_rabin(void)
1016+
{
1017+
mp_int a, b, c;
1018+
bool result;
1019+
int i;
1020+
mp_digit j;
1021+
DOR(mp_init_multi(&a, &b, &c, NULL));
1022+
1023+
/* SPSP to base 2 */
1024+
mp_set(&b, 2u);
1025+
for (i = 0; i < ARR_LENGTH(SPSP_2); i++) {
1026+
result = false;
1027+
mp_set_u32(&a, SPSP_2[i]);
1028+
DO(mp_prime_miller_rabin(&a, &b, &result));
1029+
EXPECT(result == true);
1030+
}
1031+
1032+
/* Some larger primes to check for false negatives */
1033+
for (i = 0; i < 10; i++) {
1034+
result = false;
1035+
DO(mp_read_radix(&a, medium_primes[i], 64));
1036+
DO(mp_prime_miller_rabin(&a, &b, &result));
1037+
EXPECT(result == true);
1038+
}
1039+
/* Some semi-primes */
1040+
for (i = 0; i < 5; i += 2) {
1041+
result = false;
1042+
DO(mp_read_radix(&a, medium_primes[i], 64));
1043+
DO(mp_read_radix(&c, medium_primes[i+1], 64));
1044+
DO(mp_mul(&a, &c, &a));
1045+
DO(mp_prime_miller_rabin(&a, &b, &result));
1046+
EXPECT(result == false);
1047+
}
1048+
1049+
/* SPSP to base 3 */
1050+
mp_set(&b, 3u);
1051+
for (i = 0; i < ARR_LENGTH(SPSP_3); i++) {
1052+
result = false;
1053+
mp_set_u32(&a, SPSP_3[i]);
1054+
DO(mp_prime_miller_rabin(&a, &b, &result));
1055+
EXPECT(result == true);
1056+
}
1057+
1058+
/* SPSP to bases 2 -- 100 */
1059+
mp_set(&b, 2u);
1060+
for (i = 0; i < 4; i++) {
1061+
DO(mp_read_radix(&a, SPSP_2_100_LARGE[i], 64));
1062+
for (j = 2u; j <= 100u; j++) {
1063+
result = false;
1064+
mp_set(&b, j);
1065+
DO(mp_prime_miller_rabin(&a, &b, &result));
1066+
EXPECT(result == true);
1067+
}
1068+
/* 107 is a prime that works */
1069+
mp_set(&b, 107u);
1070+
DO(mp_prime_miller_rabin(&a, &b, &result));
1071+
EXPECT(result == false);
1072+
}
1073+
1074+
/* SPSP to bases 2 -- 100, automatic */
1075+
mp_set(&b, 2u);
1076+
for (i = 0; i < 4; i++) {
1077+
DO(mp_read_radix(&a, SPSP_2_100_LARGE[i], 64));
1078+
for (j = 2u; j <= (mp_digit)mp_prime_rabin_miller_trials(mp_count_bits(&a)); j++) {
1079+
result = false;
1080+
mp_set(&b, (mp_digit)prime_tab[j]);
1081+
DO(mp_prime_miller_rabin(&a, &b, &result));
1082+
}
1083+
/* These numbers are not big enough for the heuristics to work */
1084+
EXPECT(result == true);
1085+
}
1086+
1087+
mp_clear_multi(&a, &b, &c, NULL);
1088+
return EXIT_SUCCESS;
1089+
LBL_ERR:
1090+
mp_clear_multi(&a, &b, &c, NULL);
1091+
return EXIT_FAILURE;
1092+
}
1093+
1094+
#ifndef LTM_USE_ONLY_MR
1095+
static int test_mp_prime_extra_strong_lucas(void)
1096+
{
1097+
mp_int a, b;
1098+
bool result;
1099+
int i;
1100+
1101+
DOR(mp_init_multi(&a, &b, NULL));
1102+
1103+
/* Check Extra Strong pseudoprimes */
1104+
for (i = 0; i < ARR_LENGTH(ESLPSP); i++) {
1105+
result = false;
1106+
mp_set_u32(&a, ESLPSP[i]);
1107+
DO(mp_prime_extra_strong_lucas(&a, &result));
1108+
EXPECT(result == true);
1109+
}
1110+
1111+
/* Check Almost Extra Strong pseudoprimes (not in ESLPSP) */
1112+
for (i = 0; i < ARR_LENGTH(AESLPSP); i++) {
1113+
result = false;
1114+
mp_set_u32(&a, AESLPSP[i]);
1115+
DO(mp_prime_extra_strong_lucas(&a, &result));
1116+
EXPECT(result == false);
1117+
}
1118+
1119+
/* Some larger primes to check for false negatives */
1120+
for (i = 0; i < 10; i++) {
1121+
result = false;
1122+
DO(mp_read_radix(&a, medium_primes[i], 64));
1123+
DO(mp_prime_extra_strong_lucas(&a, &result));
1124+
EXPECT(result == true);
1125+
}
1126+
1127+
/* Some semi-primes */
1128+
for (i = 0; i < 5; i++) {
1129+
result = false;
1130+
DO(mp_read_radix(&a, medium_primes[i], 64));
1131+
DO(mp_read_radix(&a, medium_primes[i+1], 64));
1132+
DO(mp_mul(&a, &b, &a));
1133+
DO(mp_prime_extra_strong_lucas(&a, &result));
1134+
EXPECT(result == false);
1135+
}
1136+
1137+
mp_clear_multi(&a, &b, NULL);
1138+
return EXIT_SUCCESS;
1139+
LBL_ERR:
1140+
mp_clear_multi(&a, &b, NULL);
1141+
return EXIT_FAILURE;
1142+
}
1143+
#endif
1144+
9101145
static int test_mp_prime_is_prime(void)
9111146
{
9121147
int ix;
9131148
mp_err e;
914-
bool cnt, fu;
1149+
bool cnt;
1150+
#ifndef LTM_USE_ONLY_MR
1151+
bool fu;
1152+
#endif
9151153

9161154
mp_int a, b;
9171155
DOR(mp_init_multi(&a, &b, NULL));
9181156

1157+
/* strong Miller-Rabin pseudoprimes to the first 100 primes (gernerated with Arnault's method) */
1158+
printf("Testing mp_prime_is_prime() with SPSPs to the first 100 primes\n");
1159+
for (ix = 0; ix < 4; ix++) {
1160+
DO(mp_read_radix(&a,SPSP_2_100_LARGE[ix],64));
1161+
DO(mp_prime_is_prime(&a, mp_prime_rabin_miller_trials(mp_count_bits(&a)), &cnt));
1162+
if (cnt) {
1163+
printf("SPSP_2_100_LARGE[%d] is not prime but mp_prime_is_prime says it is.\n", ix);
1164+
goto LBL_ERR;
1165+
}
1166+
}
1167+
9191168
/* strong Miller-Rabin pseudoprime to the first 200 primes (F. Arnault) */
9201169
printf("Testing mp_prime_is_prime() with Arnault's pseudoprime 803...901");
9211170
DO(mp_read_radix(&a,
@@ -959,6 +1208,7 @@ static int test_mp_prime_is_prime(void)
9591208
DO(mp_prime_is_prime(&b, mp_prime_rabin_miller_trials(mp_count_bits(&b)), &cnt));
9601209
/* large problem */
9611210
EXPECT(cnt);
1211+
#ifndef LTM_USE_ONLY_MR
9621212
DO(mp_prime_frobenius_underwood(&b, &fu));
9631213
EXPECT(fu);
9641214
if ((e != MP_OKAY) || !cnt) {
@@ -970,13 +1220,14 @@ static int test_mp_prime_is_prime(void)
9701220
putchar('\n');
9711221
goto LBL_ERR;
9721222
}
973-
1223+
#endif
9741224
}
1225+
#ifndef LTM_USE_ONLY_MR
9751226
/* Check regarding problem #143 */
9761227
DO(mp_read_radix(&a,
9771228
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF",
9781229
16));
979-
DO(mp_prime_strong_lucas_selfridge(&a, &cnt));
1230+
DO(mp_prime_extra_strong_lucas(&a, &cnt));
9801231
/* large problem */
9811232
EXPECT(cnt);
9821233
if ((e != MP_OKAY) || !cnt) {
@@ -985,6 +1236,47 @@ static int test_mp_prime_is_prime(void)
9851236
putchar('\n');
9861237
goto LBL_ERR;
9871238
}
1239+
#endif
1240+
/* Check deterministic tests */
1241+
#ifdef LTM_USE_ONLY_MR
1242+
#if ((defined S_MP_PRIME_IS_DIVISIBLE_C) && (MP_PRIME_TAB_SIZE >= 256))
1243+
/* 2-SPRP 4188889 = 431 * 9719 < 2^22 */
1244+
DO(mp_read_radix(&a,"4188889",10));
1245+
DO(mp_prime_is_prime(&a, 0, &cnt));
1246+
EXPECT(cnt == false);
1247+
/* Last prime < 2^22 */
1248+
DO(mp_read_radix(&a,"4194301",10));
1249+
DO(mp_prime_is_prime(&a, 0, &cnt));
1250+
EXPECT(cnt == true);
1251+
/* 2,3-SPRP 6787327 = 1303 * 5209 < 2^23 */
1252+
DO(mp_read_radix(&a,"6787327",10));
1253+
DO(mp_prime_is_prime(&a, 0, &cnt));
1254+
EXPECT(cnt == false);
1255+
/* Last prime < 2^23 */
1256+
DO(mp_read_radix(&a,"8388593",10));
1257+
DO(mp_prime_is_prime(&a, 0, &cnt));
1258+
EXPECT(cnt == true);
1259+
1260+
/* 2,3,1459-SPRP < 2^32*/
1261+
DO(mp_read_radix(&a,"1518290707",10));
1262+
DO(mp_prime_is_prime(&a, -1, &cnt));
1263+
EXPECT(cnt == false);
1264+
#endif
1265+
/* 2,3,7,61-SPRP < 2^43*/
1266+
DO(mp_read_radix(&a,"7038007247701",10));
1267+
DO(mp_prime_is_prime(&a, -1, &cnt));
1268+
EXPECT(cnt == false);
1269+
1270+
/* 2,325,9375,28178,450775,9780504-SPRP < 2^64
1271+
which is also a
1272+
2,3,325,9375,28178,450775,9780504-SPRP
1273+
*/
1274+
DO(mp_read_radix(&a,"18411296009130176041",10));
1275+
DO(mp_prime_is_prime(&a, -1, &cnt));
1276+
EXPECT(cnt == false);
1277+
1278+
#endif
1279+
9881280

9891281
mp_clear_multi(&a, &b, NULL);
9901282
return EXIT_SUCCESS;
@@ -2579,6 +2871,10 @@ static int unit_tests(int argc, char **argv)
25792871
T1(mp_montgomery_reduce, MP_MONTGOMERY_REDUCE),
25802872
T1(mp_root_n, MP_ROOT_N),
25812873
T1(mp_or, MP_OR),
2874+
#ifndef LTM_USE_ONLY_MR
2875+
T1(mp_prime_extra_strong_lucas, MP_PRIME_EXTRA_STRONG_LUCAS),
2876+
#endif
2877+
T1(mp_prime_miller_rabin, MP_PRIME_MILLER_RABIN),
25822878
T1(mp_prime_is_prime, MP_PRIME_IS_PRIME),
25832879
T1(mp_prime_next_prime, MP_PRIME_NEXT_PRIME),
25842880
T1(mp_prime_rand, MP_PRIME_RAND),

0 commit comments

Comments
 (0)