@@ -811,7 +811,7 @@ static int test_mp_prime_rand(void)
811811
812812 /* test for size */
813813 for (ix = 10 ; ix < 128 ; ix ++ ) {
814- printf ("Testing (not safe-prime): %9d bits \n " , ix );
814+ printf ("\rTesting (not safe-prime): %9d bits " , ix );
815815 fflush (stdout );
816816 DO (mp_prime_rand (& a , 8 , ix , (rand_int () & 1 ) ? 0 : MP_PRIME_2MSB_ON ));
817817 EXPECT (mp_count_bits (& a ) == ix );
@@ -1529,6 +1529,177 @@ static int test_mp_decr(void)
15291529 return EXIT_FAILURE ;
15301530}
15311531
1532+ static int test_mp_is_small_prime (void )
1533+ {
1534+ mp_sieve sieve ;
1535+ mp_err e ;
1536+ int i , test_size ;
1537+
1538+ const mp_sieve_prime to_test [] = {
1539+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1540+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1541+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,39626 ,
1542+ 207423 , 128857 , 37419 , 141696 , 189465 ,
1543+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1544+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1545+ 1019879755 , 72282698 , 2048787577 , 2058368053
1546+ };
1547+ const bool tested [] = {
1548+ false, true, false, true, false, false, true, false, false,
1549+ false, false, false, false, false, false, true, false, false,
1550+ false, false, false, false, false, false, true, false, false,
1551+ false, false, false, true, false, false, false, true, false,
1552+ false, false, false, false, true, false
1553+ };
1554+ bool result ;
1555+
1556+ mp_sieve_init (& sieve );
1557+
1558+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1559+
1560+ for (i = 0 ; i < test_size ; i ++ ) {
1561+ if ((e = mp_is_small_prime (to_test [i ], & result , & sieve )) != MP_OKAY ) {
1562+ fprintf (stderr ,"mp_is_small_prime failed: \"%s\"\n" ,mp_error_to_string (e ));
1563+ goto LTM_ERR ;
1564+ }
1565+ if (result != tested [i ]) {
1566+ fprintf (stderr ,"mp_is_small_prime failed for %lu. Said %lu but is %lu \n" ,
1567+ (unsigned long )to_test [i ], (unsigned long )result , (unsigned long )tested [i ]);
1568+ goto LTM_ERR ;
1569+ }
1570+ }
1571+ mp_sieve_clear (& sieve );
1572+ return EXIT_SUCCESS ;
1573+ LTM_ERR :
1574+ mp_sieve_clear (& sieve );
1575+ return EXIT_FAILURE ;
1576+ }
1577+
1578+ static int test_mp_next_small_prime (void )
1579+ {
1580+ mp_sieve sieve ;
1581+ mp_sieve_prime ret = 0lu , p ;
1582+ mp_int primesum , t ;
1583+ mp_err e ;
1584+ int i , test_size ;
1585+
1586+ /* Jumping wildly to and fro */
1587+ const mp_sieve_prime to_test [] = {
1588+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1589+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1590+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,
1591+ 39626 , 207423 , 128857 , 37419 , 141696 , 189465 ,
1592+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1593+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1594+ 1019879755 , 72282698 , 2048787577 , 2058368053
1595+ };
1596+ const mp_sieve_prime tested [] = {
1597+ 53 , 137 , 157 , 179 , 7 , 157 , 53 , 137 , 151 , 67 ,
1598+ 27427 , 36341 , 36161 , 11069 , 52067 , 5741 ,
1599+ 29759 , 2699 , 52579 , 13063 , 9377 , 47251 ,
1600+ 39631 , 207433 , 128857 , 37423 , 141697 , 189467 ,
1601+ 41507 , 127373 , 91673 , 8501 , 479142427 , 465566393 ,
1602+ 961126169 , 1057886083 , 1222702081 , 1017450823 ,
1603+ 1019879761 , 72282701 , 2048787577 , 2058368113
1604+ };
1605+ const char * primesum_32 = "202259606268580" ;
1606+
1607+ mp_sieve_init (& sieve );
1608+
1609+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1610+
1611+ for (i = 0 ; i < test_size ; i ++ ) {
1612+ if ((e = mp_next_small_prime (to_test [i ], & ret , & sieve )) != MP_OKAY ) {
1613+ fprintf (stderr ,"mp_next_small_prime failed with \"%s\" at index %d\n" ,
1614+ mp_error_to_string (e ), i );
1615+ goto LBL_ERR ;
1616+ }
1617+ if (ret != tested [i ]) {
1618+ fprintf (stderr ,"mp_next_small_prime failed for %lu. Said %lu but is %lu \n" ,
1619+ (unsigned long )to_test [i ], (unsigned long )ret , (unsigned long )tested [i ]);
1620+ goto LBL_ERR ;
1621+ }
1622+ }
1623+
1624+ DOR (mp_init_multi (& primesum , & t , NULL ));
1625+
1626+ for (p = 4293918720lu ; ret < (mp_sieve_prime )MP_SIEVE_BIGGEST_PRIME ;) {
1627+ DO (mp_next_small_prime (p , & ret , & sieve ));
1628+ p = ret + 1u ;
1629+ #ifdef MP_64BIT
1630+ mp_set_u64 (& t , ret );
1631+ #else
1632+ mp_set_u32 (& t , ret );
1633+ #endif
1634+ DO (mp_add (& primesum , & t , & primesum ));
1635+ }
1636+ printf ("Primesum computed: " );
1637+ DO (mp_fwrite (& primesum , 10 , stdout ));
1638+ puts ("" );
1639+ DO (mp_read_radix (& t , primesum_32 , 10 ));
1640+ EXPECT (mp_cmp (& primesum , & t ) == MP_EQ );
1641+
1642+ mp_sieve_clear (& sieve );
1643+ mp_clear_multi (& primesum , & t , NULL );
1644+ return EXIT_SUCCESS ;
1645+ LBL_ERR :
1646+ mp_clear_multi (& primesum , & t , NULL );
1647+ mp_sieve_clear (& sieve );
1648+ return EXIT_FAILURE ;
1649+ }
1650+
1651+ static int test_mp_prec_small_prime (void )
1652+ {
1653+ mp_sieve sieve ;
1654+ mp_sieve_prime ret ;
1655+ mp_err e ;
1656+ int i , test_size ;
1657+
1658+ const mp_sieve_prime to_test [] = {
1659+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1660+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1661+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,
1662+ 39626 , 207423 , 128857 , 37419 , 141696 , 189465 ,
1663+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1664+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1665+ 1019879755 , 72282698 , 2048787577 , 2058368053
1666+ };
1667+ const mp_sieve_prime tested [] = {
1668+ 47 , 137 , 151 , 179 , 5 , 151 , 53 , 131 , 149 , 61 ,
1669+ 27409 , 36319 , 36151 , 11059 , 52057 , 5741 ,
1670+ 29753 , 2693 , 52571 , 13049 , 9371 , 47237 ,
1671+ 39623 , 207409 , 128857 , 37409 , 141689 , 189463 ,
1672+ 41491 , 127363 , 91673 , 8467 , 479142413 , 465566323 ,
1673+ 961126169 , 1057886029 , 1222702051 , 1017450739 ,
1674+ 1019879717 , 72282697 , 2048787577 , 2058368051
1675+ };
1676+
1677+ mp_sieve_init (& sieve );
1678+
1679+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1680+
1681+ for (i = 0 ; i < test_size ; i ++ ) {
1682+ if ((e = mp_prec_small_prime (to_test [i ], & ret , & sieve )) != MP_OKAY ) {
1683+ fprintf (stderr ,"mp_prec_small_prime failed with \"%s\" at index %d\n" ,
1684+ mp_error_to_string (e ), i );
1685+ goto LTM_ERR ;
1686+ }
1687+ if (ret != tested [i ]) {
1688+ fprintf (stderr ,"mp_prec_small_prime failed for %lu. Said %lu but is %lu \n" ,
1689+ (unsigned long )to_test [i ], (unsigned long )ret , (unsigned long )tested [i ]);
1690+ goto LTM_ERR ;
1691+ }
1692+ }
1693+
1694+ mp_sieve_clear (& sieve );
1695+ return EXIT_SUCCESS ;
1696+ LTM_ERR :
1697+ mp_sieve_clear (& sieve );
1698+ return EXIT_FAILURE ;
1699+ }
1700+
1701+
1702+
15321703/*
15331704 Cannot test mp_exp(_d) without mp_root_n and vice versa.
15341705 So one of the two has to be tested from scratch.
@@ -2240,6 +2411,11 @@ static int unit_tests(int argc, char **argv)
22402411 T1 (mp_prime_next_prime , MP_PRIME_NEXT_PRIME ),
22412412 T1 (mp_prime_rand , MP_PRIME_RAND ),
22422413 T1 (mp_rand , MP_RAND ),
2414+
2415+ T1 (mp_is_small_prime , MP_IS_SMALL_PRIME ),
2416+ T1 (mp_next_small_prime , MP_NEXT_SMALL_PRIME ),
2417+ T1 (mp_prec_small_prime , MP_PREC_SMALL_PRIME ),
2418+
22432419 T1 (mp_read_radix , MP_READ_RADIX ),
22442420 T1 (mp_read_write_ubin , MP_TO_UBIN ),
22452421 T1 (mp_read_write_sbin , MP_TO_SBIN ),
0 commit comments