Skip to content

Commit 2f3ae38

Browse files
committed
A prime sieve
1 parent 96f9edf commit 2f3ae38

17 files changed

+882
-42
lines changed

demo/test.c

+191
Original file line numberDiff line numberDiff line change
@@ -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),

libtommath_VS2008.vcproj

+20
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,10 @@
596596
RelativePath="mp_neg.c"
597597
>
598598
</File>
599+
<File
600+
RelativePath="mp_next_small_prime.c"
601+
>
602+
</File>
599603
<File
600604
RelativePath="mp_or.c"
601605
>
@@ -608,6 +612,10 @@
608612
RelativePath="mp_pack_count.c"
609613
>
610614
</File>
615+
<File
616+
RelativePath="mp_prec_small_prime.c"
617+
>
618+
</File>
611619
<File
612620
RelativePath="mp_prime_fermat.c"
613621
>
@@ -740,6 +748,18 @@
740748
RelativePath="mp_shrink.c"
741749
>
742750
</File>
751+
<File
752+
RelativePath="mp_sieve.c"
753+
>
754+
</File>
755+
<File
756+
RelativePath="mp_sieve_clear.c"
757+
>
758+
</File>
759+
<File
760+
RelativePath="mp_sieve_init.c"
761+
>
762+
</File>
743763
<File
744764
RelativePath="mp_signed_rsh.c"
745765
>

makefile

+8-7
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,14 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
3535
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
3636
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
3737
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
38-
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
39-
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
40-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
41-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
42-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
43-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
44-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
38+
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_next_small_prime.o mp_or.o mp_pack.o mp_pack_count.o \
39+
mp_prec_small_prime.o mp_prime_fermat.o mp_prime_frobenius_underwood.o mp_prime_is_prime.o \
40+
mp_prime_miller_rabin.o mp_prime_next_prime.o mp_prime_rabin_miller_trials.o mp_prime_rand.o \
41+
mp_prime_strong_lucas_selfridge.o mp_radix_size.o mp_radix_size_overestimate.o mp_rand.o \
42+
mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o mp_reduce_2k_setup.o \
43+
mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o mp_root_n.o mp_rshd.o \
44+
mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o mp_set_u32.o mp_set_u64.o \
45+
mp_set_ul.o mp_shrink.o mp_sieve.o mp_sieve_clear.o mp_sieve_init.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4546
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4647
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
4748
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \

makefile.mingw

+9-7
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
3737
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
3838
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
3939
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
40-
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
41-
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
42-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
43-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
44-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
45-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
46-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
40+
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_next_small_prime.o mp_or.o mp_pack.o mp_pack_count.o \
41+
mp_prec_small_prime.o mp_prime_fermat.o mp_prime_frobenius_underwood.o mp_prime_is_prime.o \
42+
mp_prime_miller_rabin.o mp_prime_next_prime.o mp_prime_rabin_miller_trials.o mp_prime_rand.o \
43+
mp_prime_strong_lucas_selfridge.o mp_radix_size.o mp_radix_size_overestimate.o mp_rand.o \
44+
mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o mp_reduce_2k_setup.o \
45+
mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o mp_root_n.o mp_rshd.o \
46+
mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o mp_set_u32.o mp_set_u64.o \
47+
mp_set_ul.o mp_shrink.o mp_sieve.o mp_sieve_clear.o mp_sieve_init.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4748
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4849
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
4950
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \
@@ -56,6 +57,7 @@ s_mp_sqr_toom.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
5657
HEADERS_PUB=tommath.h
5758
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)
5859

60+
5961
#The default rule for make builds the libtommath.a library (static)
6062
default: $(LIBMAIN_S)
6163

makefile.msvc

+9-7
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ mp_get_mag_u64.obj mp_get_mag_ul.obj mp_grow.obj mp_hash.obj mp_init.obj mp_init
3333
mp_init_l.obj mp_init_multi.obj mp_init_set.obj mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj \
3434
mp_invmod.obj mp_is_square.obj mp_kronecker.obj mp_lcm.obj mp_log_n.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj \
3535
mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \
36-
mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \
37-
mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \
38-
mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj mp_radix_size.obj \
39-
mp_radix_size_overestimate.obj mp_rand.obj mp_rand_source.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj \
40-
mp_reduce_2k_l.obj mp_reduce_2k_setup.obj mp_reduce_2k_setup_l.obj mp_reduce_is_2k.obj mp_reduce_is_2k_l.obj \
41-
mp_reduce_setup.obj mp_root_n.obj mp_rshd.obj mp_sbin_size.obj mp_set.obj mp_set_double.obj mp_set_i32.obj mp_set_i64.obj \
42-
mp_set_l.obj mp_set_u32.obj mp_set_u64.obj mp_set_ul.obj mp_shrink.obj mp_signed_rsh.obj mp_sqrmod.obj mp_sqrt.obj \
36+
mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_next_small_prime.obj mp_or.obj mp_pack.obj mp_pack_count.obj \
37+
mp_prec_small_prime.obj mp_prime_fermat.obj mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj \
38+
mp_prime_miller_rabin.obj mp_prime_next_prime.obj mp_prime_rabin_miller_trials.obj mp_prime_rand.obj \
39+
mp_prime_strong_lucas_selfridge.obj mp_radix_size.obj mp_radix_size_overestimate.obj mp_rand.obj \
40+
mp_rand_source.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj mp_reduce_2k_l.obj mp_reduce_2k_setup.obj \
41+
mp_reduce_2k_setup_l.obj mp_reduce_is_2k.obj mp_reduce_is_2k_l.obj mp_reduce_setup.obj mp_root_n.obj mp_rshd.obj \
42+
mp_sbin_size.obj mp_set.obj mp_set_double.obj mp_set_i32.obj mp_set_i64.obj mp_set_l.obj mp_set_u32.obj mp_set_u64.obj \
43+
mp_set_ul.obj mp_shrink.obj mp_sieve.obj mp_sieve_clear.obj mp_sieve_init.obj mp_signed_rsh.obj mp_sqrmod.obj mp_sqrt.obj \
4344
mp_sqrtmod_prime.obj mp_sub.obj mp_sub_d.obj mp_submod.obj mp_to_radix.obj mp_to_sbin.obj mp_to_ubin.obj mp_ubin_size.obj \
4445
mp_unpack.obj mp_xor.obj mp_zero.obj s_mp_add.obj s_mp_copy_digs.obj s_mp_div_3.obj s_mp_div_recursive.obj \
4546
s_mp_div_school.obj s_mp_div_small.obj s_mp_exptmod.obj s_mp_exptmod_fast.obj s_mp_get_bit.obj s_mp_invmod.obj \
@@ -52,6 +53,7 @@ s_mp_sqr_toom.obj s_mp_sub.obj s_mp_zero_buf.obj s_mp_zero_digs.obj
5253
HEADERS_PUB=tommath.h
5354
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)
5455

56+
5557
#The default rule for make builds the tommath.lib library (static)
5658
default: $(LIBMAIN_S)
5759

makefile.shared

+8-7
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
3232
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
3333
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
3434
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
35-
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
36-
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
37-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
38-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
39-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
40-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
41-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
35+
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_next_small_prime.o mp_or.o mp_pack.o mp_pack_count.o \
36+
mp_prec_small_prime.o mp_prime_fermat.o mp_prime_frobenius_underwood.o mp_prime_is_prime.o \
37+
mp_prime_miller_rabin.o mp_prime_next_prime.o mp_prime_rabin_miller_trials.o mp_prime_rand.o \
38+
mp_prime_strong_lucas_selfridge.o mp_radix_size.o mp_radix_size_overestimate.o mp_rand.o \
39+
mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o mp_reduce_2k_setup.o \
40+
mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o mp_root_n.o mp_rshd.o \
41+
mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o mp_set_u32.o mp_set_u64.o \
42+
mp_set_ul.o mp_shrink.o mp_sieve.o mp_sieve_clear.o mp_sieve_init.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4243
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4344
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
4445
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \

makefile.unix

+8-7
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,14 @@ mp_get_mag_u64.o mp_get_mag_ul.o mp_grow.o mp_hash.o mp_init.o mp_init_copy.o mp
3838
mp_init_l.o mp_init_multi.o mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o \
3939
mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log_n.o mp_lshd.o mp_mod.o mp_mod_2d.o \
4040
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
41-
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
42-
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
43-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
44-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
45-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
46-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
47-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
41+
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_next_small_prime.o mp_or.o mp_pack.o mp_pack_count.o \
42+
mp_prec_small_prime.o mp_prime_fermat.o mp_prime_frobenius_underwood.o mp_prime_is_prime.o \
43+
mp_prime_miller_rabin.o mp_prime_next_prime.o mp_prime_rabin_miller_trials.o mp_prime_rand.o \
44+
mp_prime_strong_lucas_selfridge.o mp_radix_size.o mp_radix_size_overestimate.o mp_rand.o \
45+
mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o mp_reduce_2k_setup.o \
46+
mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o mp_root_n.o mp_rshd.o \
47+
mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o mp_set_u32.o mp_set_u64.o \
48+
mp_set_ul.o mp_shrink.o mp_sieve.o mp_sieve_clear.o mp_sieve_init.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
4849
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
4950
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
5051
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod.o \

mp_error_to_string.c

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const char *mp_error_to_string(mp_err code)
2121
return "Buffer overflow";
2222
case MP_OVF:
2323
return "Integer overflow";
24+
case MP_SIEVE_MAX_REACHED:
25+
return "Upper limit of prime sieve reached";
2426
default:
2527
return "Invalid error code";
2628
}

0 commit comments

Comments
 (0)