@@ -1528,6 +1528,193 @@ static int test_mp_decr(void)
1528
1528
mp_clear_multi (& a , & b , NULL );
1529
1529
return EXIT_FAILURE ;
1530
1530
}
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
+
1531
1718
1532
1719
/*
1533
1720
Cannot test mp_exp(_d) without mp_root_n and vice versa.
@@ -2240,6 +2427,10 @@ static int unit_tests(int argc, char **argv)
2240
2427
T1 (mp_prime_next_prime , MP_PRIME_NEXT_PRIME ),
2241
2428
T1 (mp_prime_rand , MP_PRIME_RAND ),
2242
2429
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
+
2243
2434
T1 (mp_read_radix , MP_READ_RADIX ),
2244
2435
T1 (mp_read_write_ubin , MP_TO_UBIN ),
2245
2436
T1 (mp_read_write_sbin , MP_TO_SBIN ),
0 commit comments