@@ -883,7 +883,7 @@ static int test_mp_prime_rand(void)
883
883
884
884
/* test for size */
885
885
for (ix = 10 ; ix < 128 ; ix ++ ) {
886
- printf ("Testing (not safe-prime): %9d bits \n " , ix );
886
+ printf ("\rTesting (not safe-prime): %9d bits " , ix );
887
887
fflush (stdout );
888
888
DO (mp_prime_rand (& a , 8 , ix , (rand_int () & 1 ) ? 0 : MP_PRIME_2MSB_ON ));
889
889
EXPECT (mp_count_bits (& a ) == ix );
@@ -912,15 +912,20 @@ static const uint32_t SPSP_3[] = {
912
912
};
913
913
914
914
/* SPSP to all bases < 100 */
915
- /* still needs computing
916
- static const char *SPSP_2_100_LARGE[] = {
917
- "",
918
- "",
919
- "",
920
- "",
921
- ""
915
+ static const char * SPSP_2_100_LARGE [4 ] = {
916
+ "3L2x7YRmz7g4q+DwxESBacAClxrNiuspLCf8BUEphtky+5VNHLAb2ZZLLI0bu6cAOtNkUXenakBCCL"
917
+ "Vn7gqOpkcrQ/ptxZdk+4gnI99wFjgcfM512N71ZzbwvLe+5Pzat2k+nHIjE0w/WbQvzk4a2/syAY8S"
918
+ "i1B5XRjXYVAQOLyNWhsFpXeWXUgqiNzv7avfwBA3ZOXt" , /* bases 2 - 100 */
919
+ "JOcSIwxGqGEjeQ2GsdlnFMwhc+xY7EtZo5Kf4BglOuakxTJaP8qrdZyduXaAZUdzyPgQLf7B8vqvVE"
920
+ "VLJwH7dLkLEiw19tfu3naT6DgQWzk+b5WuwWJzsTMdgWWH86M1h/Gjt2J/qABtTTH26C8bS4v/q9Fh"
921
+ "R8jqHNOiufUgHkDQdW9Z+BLlf6OVVh2VwPIOGVc7kFF" , /* bases 2 - 107 */
922
+ "1ZCddPKHO7yeqI5ZeKG5ssTnzJeIDpWElJEZnHwejl4tsyly44JgwdiRmXgsi9FQfYhMzFZMgV6qWZZ"
923
+ "sIJl4RNgpD/PDb3nam++ECkzMBuNIXVpmZzw+Gj5xQmpKK+OX8pFSy2IQiKyKAOfSaivXEb2/dga2J/"
924
+ "Pc2d23lw+eP3WtBbfHc7TAQGgNI/6Xmcpl1G64eXCrJ" , /* bases 2 - 103 */
925
+ "cCax282DurA+2Z54W3VLKSC2mwgpilQpGydCDHvXHNRKbJQRa5NtLLfa3sXvCmUWZ9okP2ZSsPDnw0X"
926
+ "dUQLzaz59vnw0rKbfsoA4nDBjMXR78Q889+KS4HFKfXkzxsiIKYo0kSfwPKYxFUi4Zj185kwwAPTAr2"
927
+ "IjegdWjQLeX1ZQM0HVUUF3WEVhHXcFzF0sMiJU5hl" /* bases 2 - 101 */
922
928
};
923
- */
924
929
925
930
/* Extra strong Lucas test with Baillie's parameters Q = 1, P = 3 */
926
931
static const uint32_t ESLPSP [] = {
@@ -940,7 +945,7 @@ static const uint32_t AESLPSP[] = {
940
945
4269341 , 5192309 , 7045433 , 7226669 , 7265561
941
946
};
942
947
943
- /* Some randomly choosen 200 decimal digits large primes (https://primes.utm.edu/lists/small/small2.html) */
948
+ /* Some randomly choosen 200 decimal digit large primes (https://primes.utm.edu/lists/small/small2.html) */
944
949
static const char * medium_primes [10 ] = {
945
950
"C8Ckh0vviS3HUPdB1NSrSm+gOodw/f1aQ5+aaH1W6RMB0jVkO6lTaL54O3o7U5BSGUFGxm5gAvisbJamasuLZS8g3ZsJ2JM4Vtn9cQZRfkP6b8V" ,
946
951
"64xDN9FqLBiovZ/9q/EPm0DONpIfn5MbJKHa+IjT0fjAzkg34FpAmad+CwhcpKaiTbZEpErut+DhpVyiQfqBFrgcGnGhhIrMF/XkyY3aVx6E96B" ,
@@ -961,6 +966,7 @@ static int test_mp_prime_miller_rabin(void)
961
966
mp_int a , b , c ;
962
967
bool result ;
963
968
int i ;
969
+ mp_digit j ;
964
970
DOR (mp_init_multi (& a , & b , & c , NULL ));
965
971
966
972
/* SPSP to base 2 */
@@ -998,6 +1004,35 @@ static int test_mp_prime_miller_rabin(void)
998
1004
EXPECT (result == true);
999
1005
}
1000
1006
1007
+ /* SPSP to bases 2 -- 100 */
1008
+ mp_set (& b , 2u );
1009
+ for (i = 0 ; i < 4 ; i ++ ) {
1010
+ DO (mp_read_radix (& a , SPSP_2_100_LARGE [i ], 64 ));
1011
+ for (j = 2u ; j <= 100u ; j ++ ) {
1012
+ result = false;
1013
+ mp_set (& b , j );
1014
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
1015
+ EXPECT (result == true);
1016
+ }
1017
+ /* 107 is a prime that works */
1018
+ mp_set (& b , 107u );
1019
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
1020
+ EXPECT (result == false);
1021
+ }
1022
+
1023
+ /* SPSP to bases 2 -- 100, automatic */
1024
+ mp_set (& b , 2u );
1025
+ for (i = 0 ; i < 4 ; i ++ ) {
1026
+ DO (mp_read_radix (& a , SPSP_2_100_LARGE [i ], 64 ));
1027
+ for (j = 2u ; j <= (mp_digit )mp_prime_rabin_miller_trials (mp_count_bits (& a )); j ++ ) {
1028
+ result = false;
1029
+ mp_set (& b , (mp_digit )s_mp_prime_tab [j ]);
1030
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
1031
+ }
1032
+ /* These numbers are not big enough for the heuristics to work */
1033
+ EXPECT (result == true);
1034
+ }
1035
+
1001
1036
mp_clear_multi (& a , & b , & c , NULL );
1002
1037
return EXIT_SUCCESS ;
1003
1038
LBL_ERR :
@@ -1064,6 +1099,17 @@ static int test_mp_prime_is_prime(void)
1064
1099
mp_int a , b ;
1065
1100
DOR (mp_init_multi (& a , & b , NULL ));
1066
1101
1102
+ /* strong Miller-Rabin pseudoprimes to the first 100 primes (gernerated with Arnault's method) */
1103
+ printf ("Testing mp_prime_is_prime() with SPSPs to the first 100 primes\n" );
1104
+ for (ix = 0 ; ix < 4 ; ix ++ ) {
1105
+ DO (mp_read_radix (& a ,SPSP_2_100_LARGE [ix ],64 ));
1106
+ DO (mp_prime_is_prime (& a , mp_prime_rabin_miller_trials (mp_count_bits (& a )), & cnt ));
1107
+ if (cnt ) {
1108
+ printf ("SPSP_2_100_LARGE[%d] is not prime but mp_prime_is_prime says it is.\n" , ix );
1109
+ goto LBL_ERR ;
1110
+ }
1111
+ }
1112
+
1067
1113
/* strong Miller-Rabin pseudoprime to the first 200 primes (F. Arnault) */
1068
1114
printf ("Testing mp_prime_is_prime() with Arnault's pseudoprime 803...901" );
1069
1115
DO (mp_read_radix (& a ,
0 commit comments