From b4c075de96a452fd85f5bb1028b0c111da2177c2 Mon Sep 17 00:00:00 2001 From: Seth Troisi Date: Sat, 18 May 2019 16:02:49 -0700 Subject: [PATCH] Faster (20-30x) nthprime_ui sieve implementation --- mpz/nthprime_ui.c | 12 ++++++++---- tests/mpz/t-nthprime_ui.c | 6 +++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/mpz/nthprime_ui.c b/mpz/nthprime_ui.c index a11cbe4..76d7a60 100644 --- a/mpz/nthprime_ui.c +++ b/mpz/nthprime_ui.c @@ -36,7 +36,6 @@ see https://www.gnu.org/licenses/. */ /* Enhancements: - - Use sieve for smallish n - Use precomputed lookup values as started point - Implement a more modern algorithm */ @@ -60,9 +59,14 @@ mpz_nthprime_ui (mpz_ptr p, unsigned long n) return; } - /* Simple proof of concept implementation, soon to be replaced. */ - while (n-- > 0) + /* Simple sieve implementation. */ + gmp_primesieve_t ps; + gmp_init_primesieve (&ps); + + while (n-- > 1) { - mpz_nextprime(p, p); + gmp_nextprime (&ps); } + + PTR (p)[0] = gmp_nextprime (&ps); } diff --git a/tests/mpz/t-nthprime_ui.c b/tests/mpz/t-nthprime_ui.c index 88fc214..401b6f4 100644 --- a/tests/mpz/t-nthprime_ui.c +++ b/tests/mpz/t-nthprime_ui.c @@ -68,6 +68,10 @@ check_data (void) { 100, 541 }, { 1000, 7919 }, { 3141, 28843 }, + { 10000, 104729 }, + { 78499, 1000003 }, + { 1000000, 15485863 }, + { 2718281, 45001883 }, }; for (int i = 0; i < numberof (data); i++) @@ -103,7 +107,7 @@ check_small (void) mpz_t test; mpz_init_set_ui(test, 1); - for (int i = 1; i < 1000; i++) + for (int i = 1; i < 5000; i++) { mpz_nextprime(test, test);