@@ -1528,6 +1528,193 @@ static int test_mp_decr(void)
15281528 mp_clear_multi (& a , & b , NULL );
15291529 return EXIT_FAILURE ;
15301530}
1531+ static int test_mp_is_small_prime (void )
1532+ {
1533+ mp_sieve sieve ;
1534+ int e ;
1535+ int i , test_size ;
1536+
1537+ mp_sieve_prime to_test [] = {
1538+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1539+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1540+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,39626 ,
1541+ 207423 , 128857 , 37419 , 141696 , 189465 ,
1542+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1543+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1544+ 1019879755 , 72282698 , 2048787577 , 2058368053
1545+ };
1546+ mp_sieve_prime tested [] = {
1547+ 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 ,
1548+ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0
1549+ };
1550+ mp_sieve_prime result ;
1551+
1552+ mp_sieve_init (& sieve );
1553+
1554+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1555+
1556+ for (i = 0 ; i < test_size ; i ++ ) {
1557+ if ((e = mp_is_small_prime (to_test [i ], & result , & sieve )) != MP_OKAY ) {
1558+ fprintf (stderr ,"mp_is_small_prime failed: \"%s\"\n" ,mp_error_to_string (e ));
1559+ goto LTM_ERR ;
1560+ }
1561+ if (result != tested [i ]) {
1562+ fprintf (stderr ,"mp_is_small_prime failed for %lu. Said %lu but is %lu \n" ,
1563+ (unsigned long )to_test [i ], (unsigned long )result , (unsigned long )tested [i ]);
1564+ goto LTM_ERR ;
1565+ }
1566+ }
1567+ mp_sieve_clear (& sieve );
1568+ return EXIT_SUCCESS ;
1569+ LTM_ERR :
1570+ mp_sieve_clear (& sieve );
1571+ return EXIT_FAILURE ;
1572+ }
1573+
1574+ static int test_mp_next_small_prime (void )
1575+ {
1576+ mp_sieve sieve ;
1577+ mp_sieve_prime ret , p ;
1578+ mp_int primesum , t ;
1579+ int e ;
1580+ int i , test_size ;
1581+
1582+ clock_t start , stop ;
1583+
1584+ mp_sieve_prime to_test [] = {
1585+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1586+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1587+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,
1588+ 39626 , 207423 , 128857 , 37419 , 141696 , 189465 ,
1589+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1590+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1591+ 1019879755 , 72282698 , 2048787577 , 2058368053
1592+ };
1593+ mp_sieve_prime tested [] = {
1594+ 53 , 137 , 157 , 179 , 7 , 157 , 53 , 137 , 151 , 67 ,
1595+ 27427 , 36341 , 36161 , 11069 , 52067 , 5741 ,
1596+ 29759 , 2699 , 52579 , 13063 , 9377 , 47251 ,
1597+ 39631 , 207433 , 128857 , 37423 , 141697 , 189467 ,
1598+ 41507 , 127373 , 91673 , 8501 , 479142427 , 465566393 ,
1599+ 961126169 , 1057886083 , 1222702081 , 1017450823 ,
1600+ 1019879761 , 72282701 , 2048787577 , 2058368113
1601+ };
1602+
1603+ #if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1604+ /* primesum up to 2^33. Would fit into a 64-bit type */
1605+ /*const char *primesum_64 = "1649816561794735645";*/
1606+ /* primesum up to 2^64
1607+ $ time /home/czurnieden/GITHUB/primesum/primesum 2^64
1608+ 3879578600671960388666457126750869198
1609+
1610+ real 37m6,448s
1611+ user 107m17,056s
1612+ sys 0m12,152s
1613+ */
1614+ const char * primesum_64 = "3879578600671960388666457126750869198" ;
1615+ #else
1616+ const char * primesum_32 = "425649736193687430" ;
1617+ #endif
1618+
1619+ mp_sieve_init (& sieve );
1620+
1621+
1622+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1623+
1624+ for (i = 0 ; i < test_size ; i ++ ) {
1625+ if ((e = mp_next_small_prime (to_test [i ], & ret , & sieve )) != MP_OKAY ) {
1626+ fprintf (stderr ,"mp_next_small_prime failed with \"%s\" at index %d\n" ,
1627+ mp_error_to_string (e ), i );
1628+ goto LBL_ERR ;
1629+ }
1630+ if (ret != tested [i ]) {
1631+ fprintf (stderr ,"mp_next_small_prime failed for %lu. Said %lu but is %lu \n" ,
1632+ (unsigned long )to_test [i ], (unsigned long )ret , (unsigned long )tested [i ]);
1633+ goto LBL_ERR ;
1634+ }
1635+ }
1636+
1637+ DOR (mp_init_multi (& primesum , & t , NULL ));
1638+ start = clock ();
1639+ for (p = 0 ;ret < (mp_sieve_prime )MP_SIEVE_BIGGEST_PRIME ;p ++ ) {
1640+ DO (mp_next_small_prime (p , & ret , & sieve ));
1641+ #if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1642+ mp_set_u64 (& t , ret );
1643+ #else
1644+ mp_set_u32 (& t , ret );
1645+ #endif
1646+ DO (mp_add (& primesum , & t , & primesum ));
1647+ }
1648+ stop = clock ();
1649+ printf ("Time for primesum up to %" MP_SIEVE_PR_UINT " was %.2f seconds\n" , MP_SIEVE_BIGGEST_PRIME , (double )(stop - start )/(double )CLOCKS_PER_SEC );
1650+
1651+ #if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1652+ DO (mp_read_radix (& t , primesum_64 , 10 ));
1653+ #else
1654+ DO (mp_read_radix (& t , primesum_32 , 10 ));
1655+ #endif
1656+ EXPECT (mp_cmp (& primesum , & t ) == MP_EQ );
1657+
1658+ mp_sieve_clear (& sieve );
1659+ mp_clear_multi (& primesum , & t , NULL );
1660+ return EXIT_SUCCESS ;
1661+ LBL_ERR :
1662+ mp_clear_multi (& primesum , & t , NULL );
1663+ mp_sieve_clear (& sieve );
1664+ return EXIT_FAILURE ;
1665+ }
1666+
1667+ static int test_mp_prec_small_prime (void )
1668+ {
1669+ mp_sieve sieve ;
1670+ mp_sieve_prime ret ;
1671+ int e ;
1672+ int i , test_size ;
1673+
1674+ mp_sieve_prime to_test [] = {
1675+ 52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1676+ 27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
1677+ 29755 , 2698 , 52572 , 13053 , 9375 , 47241 ,
1678+ 39626 , 207423 , 128857 , 37419 , 141696 , 189465 ,
1679+ 41503 , 127370 , 91673 , 8473 , 479142414 , 465566339 ,
1680+ 961126169 , 1057886067 , 1222702060 , 1017450741 ,
1681+ 1019879755 , 72282698 , 2048787577 , 2058368053
1682+ };
1683+ mp_sieve_prime tested [] = {
1684+ 47 , 137 , 151 , 179 , 5 , 151 , 53 , 131 , 149 , 61 ,
1685+ 27409 , 36319 , 36151 , 11059 , 52057 , 5741 ,
1686+ 29753 , 2693 , 52571 , 13049 , 9371 , 47237 ,
1687+ 39623 , 207409 , 128857 , 37409 , 141689 , 189463 ,
1688+ 41491 , 127363 , 91673 , 8467 , 479142413 , 465566323 ,
1689+ 961126169 , 1057886029 , 1222702051 , 1017450739 ,
1690+ 1019879717 , 72282697 , 2048787577 , 2058368051
1691+ };
1692+
1693+ mp_sieve_init (& sieve );
1694+
1695+ test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1696+
1697+ for (i = 0 ; i < test_size ; i ++ ) {
1698+ if ((e = mp_prec_small_prime (to_test [i ], & ret , & sieve )) != MP_OKAY ) {
1699+ fprintf (stderr ,"mp_prec_small_prime failed with \"%s\" at index %d\n" ,
1700+ mp_error_to_string (e ), i );
1701+ goto LTM_ERR ;
1702+ }
1703+ if (ret != tested [i ]) {
1704+ fprintf (stderr ,"mp_prec_small_prime failed for %lu. Said %lu but is %lu \n" ,
1705+ (unsigned long )to_test [i ], (unsigned long )ret , (unsigned long )tested [i ]);
1706+ goto LTM_ERR ;
1707+ }
1708+ }
1709+
1710+ mp_sieve_clear (& sieve );
1711+ return EXIT_SUCCESS ;
1712+ LTM_ERR :
1713+ mp_sieve_clear (& sieve );
1714+ return EXIT_FAILURE ;
1715+ }
1716+
1717+
15311718
15321719/*
15331720 Cannot test mp_exp(_d) without mp_root_n and vice versa.
@@ -2240,6 +2427,10 @@ static int unit_tests(int argc, char **argv)
22402427 T1 (mp_prime_next_prime , MP_PRIME_NEXT_PRIME ),
22412428 T1 (mp_prime_rand , MP_PRIME_RAND ),
22422429 T1 (mp_rand , MP_RAND ),
2430+ T1 (mp_is_small_prime , ),
2431+ T1 (mp_next_small_prime , MP_NEXT_SMALL_PRIME_C ),
2432+ T1 (mp_prec_small_prime , MP_PREC_SMALL_PRIME_C ),
2433+
22432434 T1 (mp_read_radix , MP_READ_RADIX ),
22442435 T1 (mp_read_write_ubin , MP_TO_UBIN ),
22452436 T1 (mp_read_write_sbin , MP_TO_SBIN ),
0 commit comments