@@ -811,7 +811,7 @@ static int test_mp_prime_rand(void)
811
811
812
812
/* test for size */
813
813
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 );
815
815
fflush (stdout );
816
816
DO (mp_prime_rand (& a , 8 , ix , (rand_int () & 1 ) ? 0 : MP_PRIME_2MSB_ON ));
817
817
EXPECT (mp_count_bits (& a ) == ix );
@@ -1529,6 +1529,177 @@ static int test_mp_decr(void)
1529
1529
return EXIT_FAILURE ;
1530
1530
}
1531
1531
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
+
1532
1703
/*
1533
1704
Cannot test mp_exp(_d) without mp_root_n and vice versa.
1534
1705
So one of the two has to be tested from scratch.
@@ -2240,6 +2411,11 @@ static int unit_tests(int argc, char **argv)
2240
2411
T1 (mp_prime_next_prime , MP_PRIME_NEXT_PRIME ),
2241
2412
T1 (mp_prime_rand , MP_PRIME_RAND ),
2242
2413
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
+
2243
2419
T1 (mp_read_radix , MP_READ_RADIX ),
2244
2420
T1 (mp_read_write_ubin , MP_TO_UBIN ),
2245
2421
T1 (mp_read_write_sbin , MP_TO_SBIN ),
0 commit comments