@@ -1577,8 +1577,75 @@ static int test_mp_is_small_prime(void)
1577
1577
1578
1578
static int test_mp_next_small_prime (void )
1579
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 ));
1580
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 );
1581
1644
return EXIT_SUCCESS ;
1645
+ LBL_ERR :
1646
+ mp_clear_multi (& primesum , & t , NULL );
1647
+ mp_sieve_clear (& sieve );
1648
+ return EXIT_FAILURE ;
1582
1649
}
1583
1650
1584
1651
static int test_mp_prec_small_prime (void )
0 commit comments