@@ -824,6 +824,165 @@ static int test_mp_prime_rand(void)
824
824
return EXIT_FAILURE ;
825
825
}
826
826
827
+ /* Some small pseudoprimes to test the individual implementations */
828
+
829
+ /* Miller-Rabin base 2 */
830
+ static const uint32_t SPSP_2 [] = {
831
+ 2047 , 3277 , 4033 , 4681 , 8321 , 15841 , 29341 , 42799 ,
832
+ 49141 , 52633 , 65281 , 74665 , 80581 , 85489 , 88357 , 90751
833
+ };
834
+
835
+ /* Miller-Rabin base 3 */
836
+ static const uint32_t SPSP_3 [] = {
837
+ 121 , 703 , 1891 , 3281 , 8401 , 8911 , 10585 , 12403 , 16531 ,
838
+ 18721 , 19345 , 23521 , 31621 , 44287 , 47197 , 55969 , 63139 ,
839
+ 74593 , 79003 , 82513 , 87913 , 88573 , 97567
840
+ };
841
+
842
+ /* SPSP to all bases < 100 */
843
+ /* still needs computing
844
+ static const char *SPSP_2_100_LARGE[] = {
845
+ "",
846
+ "",
847
+ "",
848
+ "",
849
+ ""
850
+ };
851
+ */
852
+
853
+ /* Extra strong Lucas test with Baillie's parameters Q = 1, P = 3 */
854
+ static const uint32_t ESLPSP [] = {
855
+ 989 , 3239 , 5777 , 10877 , 27971 , 29681 , 30739 , 31631 , 39059 , 72389 ,
856
+ 73919 , 75077 , 100127 , 113573 , 125249 , 137549 , 137801 , 153931 , 155819 ,
857
+ 161027 , 162133 , 189419 , 218321 , 231703 , 249331 , 370229 , 429479 , 430127 ,
858
+ 459191 , 473891 , 480689 , 600059 , 621781 , 632249 , 635627
859
+ };
860
+
861
+ /*
862
+ Almost extra strong Lucas test with Baillie's parameters Q = 1, P = 3
863
+ Only those that are not in ESLPSP.
864
+ */
865
+ static const uint32_t AESLPSP [] = {
866
+ 10469 , 154697 , 233659 , 472453 , 629693 , 852389 , 1091093 , 1560437 ,
867
+ 1620673 , 1813601 , 1969109 , 2415739 , 2595329 , 2756837 , 3721549 ,
868
+ 4269341 , 5192309 , 7045433 , 7226669 , 7265561
869
+ };
870
+
871
+ /* Some randomly choosen 200 decimal digits large primes (https://primes.utm.edu/lists/small/small2.html) */
872
+ static const char * medium_primes [10 ] = {
873
+ "C8Ckh0vviS3HUPdB1NSrSm+gOodw/f1aQ5+aaH1W6RMB0jVkO6lTaL54O3o7U5BSGUFGxm5gAvisbJamasuLZS8g3ZsJ2JM4Vtn9cQZRfkP6b8V" ,
874
+ "64xDN9FqLBiovZ/9q/EPm0DONpIfn5MbJKHa+IjT0fjAzkg34FpAmad+CwhcpKaiTbZEpErut+DhpVyiQfqBFrgcGnGhhIrMF/XkyY3aVx6E96B" ,
875
+ "8cyuMlENm0vh/eWwgHUpDKqmLyCSsRQZRWvbHpA2jHDZv1EhHkVhceg3OFRZn/aXRBnbdtsc2xO6sWh9KZ5Mo7u9rJgBJMVtDnu094MCExj1YvB" ,
876
+ "BRFZFsYjSz45un8qptnuSqEsy9wV0BzbMpVAB1TrwImENOVIc1cASZNQ/mXG2xtazqgn/juVzFo91XLx9PtIlkcK0L2T6fBNgy8Lc7dSVoKQ+XP" ,
877
+ "Ez/mDl+to2gm69+VdIHI9Q7vaO3DuIdLVT69myM3HYwVBE+G24KffAOUAp3FGrSOU+LtERMiIYIEtxPI7n/DRJtmL2i0+REwGpTMge2d2EpabfB" ,
878
+ "5+Uz1gPFjZJ/nNdEOmOaMouJSGzygo42qz7xOwXn/moSUvBpPjo4twRGbK0+qaeU/RI8yYYxXr3OBP4w+/jgL3mN9GiENDM5LtEKMiQrZ9jIVEb" ,
879
+ "AQ5nD1+G1grv41s/XlK+0YTGyZgr/88PzdQJ8QT9tavisTgyG6k8/80A4HQhnFndskHNAaB2EW5fE7KH3kk7m89s8JnVqkJyGZWSfs1+JlmHLPf" ,
880
+ "3F19vPmM0Ih89KZ04Xmd62QB9F6E2sztT10A7Kcqc44eKvsNHh+JY6Z6gJXkbWg1Iw7xr29QAhEF/o1YAgfutQtpdzHkex06Yd71kPsaZdKXiC5" ,
881
+ "2fIcJ1t/VYCColXGs+ji/txNMEXn2FXdowLzlo7QKqzAWHdAbwtltSO5qpSp3OUiEOGUUi3hbyw3iQRE8nFJaikJ89Wdox6vpPtIsc3QRjexMnv" ,
882
+ "8aOicQ5gIbFCarFUgSgzh40LpuZ0jjK1u48/YT+C0h1dAQ8CIEgZjHZT+5/7cCRGmJlo+XCp7S41MSQ2ZNRSJh2texRYtvAXBAZfR8A8twl316P"
883
+ };
884
+
885
+ #define ARR_LENGTH (a ) ((int)(sizeof((a))/sizeof((a)[0])))
886
+
887
+ static int test_mp_prime_miller_rabin (void )
888
+ {
889
+ mp_int a , b , c ;
890
+ bool result ;
891
+ int i ;
892
+ DOR (mp_init_multi (& a , & b , & c , NULL ));
893
+
894
+ /* SPSP to base 2 */
895
+ mp_set (& b , 2u );
896
+ for (i = 0 ; i < ARR_LENGTH (SPSP_2 ); i ++ ) {
897
+ result = false;
898
+ mp_set_u32 (& a , SPSP_2 [i ]);
899
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
900
+ EXPECT (result == true);
901
+ }
902
+
903
+ /* Some larger primes to check for false negatives */
904
+ for (i = 0 ; i < 10 ; i ++ ) {
905
+ result = false;
906
+ DO (mp_read_radix (& a , medium_primes [i ], 64 ));
907
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
908
+ EXPECT (result == true);
909
+ }
910
+ /* Some semi-primes */
911
+ for (i = 0 ; i < 5 ; i += 2 ) {
912
+ result = false;
913
+ DO (mp_read_radix (& a , medium_primes [i ], 64 ));
914
+ DO (mp_read_radix (& c , medium_primes [i + 1 ], 64 ));
915
+ DO (mp_mul (& a , & c , & a ));
916
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
917
+ EXPECT (result == false);
918
+ }
919
+
920
+ /* SPSP to base 3 */
921
+ mp_set (& b , 3u );
922
+ for (i = 0 ; i < ARR_LENGTH (SPSP_3 ); i ++ ) {
923
+ result = false;
924
+ mp_set_u32 (& a , SPSP_3 [i ]);
925
+ DO (mp_prime_miller_rabin (& a , & b , & result ));
926
+ EXPECT (result == true);
927
+ }
928
+
929
+ mp_clear_multi (& a , & b , & c , NULL );
930
+ return EXIT_SUCCESS ;
931
+ LBL_ERR :
932
+ mp_clear_multi (& a , & b , & c , NULL );
933
+ return EXIT_FAILURE ;
934
+ }
935
+
936
+
937
+ static int test_mp_prime_extra_strong_lucas (void )
938
+ {
939
+ mp_int a , b ;
940
+ bool result ;
941
+ int i ;
942
+
943
+ DOR (mp_init_multi (& a , & b , NULL ));
944
+
945
+ /* Check Extra Strong pseudoprimes */
946
+ for (i = 0 ; i < ARR_LENGTH (ESLPSP ); i ++ ) {
947
+ result = false;
948
+ mp_set_u32 (& a , ESLPSP [i ]);
949
+ DO (mp_prime_extra_strong_lucas (& a , & result ));
950
+ EXPECT (result == true);
951
+ }
952
+
953
+ /* Check Almost Extra Strong pseudoprimes (not in ESLPSP) */
954
+ for (i = 0 ; i < ARR_LENGTH (AESLPSP ); i ++ ) {
955
+ result = false;
956
+ mp_set_u32 (& a , AESLPSP [i ]);
957
+ DO (mp_prime_extra_strong_lucas (& a , & result ));
958
+ EXPECT (result == false);
959
+ }
960
+
961
+ /* Some larger primes to check for false negatives */
962
+ for (i = 0 ; i < 10 ; i ++ ) {
963
+ result = false;
964
+ DO (mp_read_radix (& a , medium_primes [i ], 64 ));
965
+ DO (mp_prime_extra_strong_lucas (& a , & result ));
966
+ EXPECT (result == true);
967
+ }
968
+
969
+ /* Some semi-primes */
970
+ for (i = 0 ; i < 5 ; i ++ ) {
971
+ result = false;
972
+ DO (mp_read_radix (& a , medium_primes [i ], 64 ));
973
+ DO (mp_read_radix (& a , medium_primes [i + 1 ], 64 ));
974
+ DO (mp_mul (& a , & b , & a ));
975
+ DO (mp_prime_extra_strong_lucas (& a , & result ));
976
+ EXPECT (result == false);
977
+ }
978
+
979
+ mp_clear_multi (& a , & b , NULL );
980
+ return EXIT_SUCCESS ;
981
+ LBL_ERR :
982
+ mp_clear_multi (& a , & b , NULL );
983
+ return EXIT_FAILURE ;
984
+ }
985
+
827
986
static int test_mp_prime_is_prime (void )
828
987
{
829
988
int ix ;
@@ -893,7 +1052,7 @@ static int test_mp_prime_is_prime(void)
893
1052
DO (mp_read_radix (& a ,
894
1053
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF" ,
895
1054
16 ));
896
- DO (mp_prime_strong_lucas_selfridge (& a , & cnt ));
1055
+ DO (mp_prime_extra_strong_lucas (& a , & cnt ));
897
1056
/* large problem */
898
1057
EXPECT (cnt );
899
1058
if ((e != MP_OKAY ) || !cnt ) {
@@ -1358,7 +1517,7 @@ static int test_mp_log_n(void)
1358
1517
mp_int a ;
1359
1518
mp_digit d ;
1360
1519
int base , lb , size ;
1361
- const int max_base = MP_MIN (INT_MAX , MP_DIGIT_MAX );
1520
+ const mp_digit max_base = MP_MIN (INT_MAX , MP_DIGIT_MAX );
1362
1521
1363
1522
DOR (mp_init (& a ));
1364
1523
@@ -2236,6 +2395,8 @@ static int unit_tests(int argc, char **argv)
2236
2395
T1 (mp_montgomery_reduce , MP_MONTGOMERY_REDUCE ),
2237
2396
T1 (mp_root_n , MP_ROOT_N ),
2238
2397
T1 (mp_or , MP_OR ),
2398
+ T1 (mp_prime_extra_strong_lucas , MP_PRIME_EXTRA_STRONG_LUCAS ),
2399
+ T1 (mp_prime_miller_rabin , MP_PRIME_MILLER_RABIN ),
2239
2400
T1 (mp_prime_is_prime , MP_PRIME_IS_PRIME ),
2240
2401
T1 (mp_prime_next_prime , MP_PRIME_NEXT_PRIME ),
2241
2402
T1 (mp_prime_rand , MP_PRIME_RAND ),
0 commit comments