summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2020-03-20 12:16:04 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2020-03-20 12:16:04 +0100
commitc61b2f8490d84812ce8afd993ce67ca92e71740e (patch)
tree21de2f551a47694b2f6a55463b003d622ed5b698 /tests
parent3fc1d2b6e65abbdb21a90ed05cf452e5d1576413 (diff)
downloadgmp-c61b2f8490d84812ce8afd993ce67ca92e71740e.tar.gz
tests/devel/primes.c: New testing strategy, nextrpime on every number in an intervall.
Diffstat (limited to 'tests')
-rw-r--r--tests/devel/primes.c88
1 files changed, 84 insertions, 4 deletions
diff --git a/tests/devel/primes.c b/tests/devel/primes.c
index e14fcc748..b5b42a061 100644
--- a/tests/devel/primes.c
+++ b/tests/devel/primes.c
@@ -1,5 +1,5 @@
/*
-Copyright 2018-2019 Free Software Foundation, Inc.
+Copyright 2018-2020 Free Software Foundation, Inc.
This file is part of the GNU MP Library test suite.
@@ -237,7 +237,7 @@ check_nprime (unsigned long begin, unsigned long end)
TRACE(printf ("%li ", begin),1);
mpz_nextprime (g, g);
if (mpz_cmp_ui (g, 2) != 0)
- STOP (something_wrong (g, -1));
+ STOP (something_wrong (g, 2));
begin = mpz_get_ui (g);
}
if (begin < 3)
@@ -246,7 +246,7 @@ check_nprime (unsigned long begin, unsigned long end)
TRACE(printf ("%li ", begin),1);
mpz_nextprime (g, g);
if (mpz_cmp_ui (g, 3) != 0)
- STOP (something_wrong (g, -1));
+ STOP (something_wrong (g, 3));
begin = mpz_get_ui (g);
}
if (end > 4)
@@ -266,7 +266,81 @@ check_nprime (unsigned long begin, unsigned long end)
mpz_nextprime (g, g);
if (mpz_cmp_ui (g, prime) != 0)
- STOP (something_wrong (g, -1));
+ STOP (something_wrong (g, prime));
+
+ if (prime - start > 200)
+ {
+ start = prime;
+ spinner();
+ if (prime - begin > 0xfffffff)
+ {
+ begin = prime;
+ printf ("%li (0x%lx)\n", begin, begin);
+ }
+ }
+
+ LOOP_ON_SIEVE_END;
+
+ __GMP_FREE_FUNC_LIMBS (sieve, size);
+ }
+
+ if (mpz_cmp_ui (g, end) < 0)
+ {
+ mpz_nextprime (g, g);
+ if (mpz_cmp_ui (g, end) <= 0)
+ STOP (something_wrong (g, -1));
+ }
+
+ gmp_printf ("%Zd\n", g);
+ return 0;
+}
+
+int
+check_Nprime (unsigned long begin, unsigned long end)
+{
+ mpz_t op;
+ mpz_init_set_ui (op, end);
+
+ for (;begin < 2; ++begin)
+ {
+ *(op->_mp_d) = begin;
+ TRACE(printf ("%li ", begin),1);
+ mpz_nextprime (g, op);
+ if (mpz_cmp_ui (g, 2) != 0)
+ STOP (something_wrong (g, 2));
+ }
+ if (begin < 3)
+ {
+ *(op->_mp_d) = begin;
+ TRACE(printf ("%li ", begin),1);
+ mpz_nextprime (g, op);
+ if (mpz_cmp_ui (g, 3) != 0)
+ STOP (something_wrong (g, 3));
+ begin = 3;
+ }
+ if (end > 4)
+ {
+ mp_limb_t *sieve;
+ mp_size_t size;
+ unsigned long start;
+ unsigned long opl;
+
+ size = primesieve_size (end);
+
+ sieve = __GMP_ALLOCATE_FUNC_LIMBS (size);
+ gmp_primesieve (sieve, end);
+ start = MAX (begin, 5) | 1;
+ opl = begin;
+ LOOP_ON_SIEVE_BEGIN (prime, n_to_bit(start) + (start % 3 == 0),
+ n_to_bit (end), 0, sieve);
+
+ do {
+ *(op->_mp_d) = opl;
+ mpz_nextprime (g, op);
+ if (mpz_cmp_ui (g, prime) != 0)
+ STOP (something_wrong (g, prime));
+ ++opl;
+ } while (opl < prime);
if (prime - start > 200)
{
@@ -312,6 +386,9 @@ main (int argc, char **argv)
case 'n':
mode = 1;
break;
+ case 'N':
+ mode = 3;
+ break;
default:
begin = end;
end = atol (argv[1]);
@@ -329,6 +406,9 @@ main (int argc, char **argv)
case 1:
ret = check_nprime (begin, end);
break;
+ case 3:
+ ret = check_Nprime (begin, end);
+ break;
default:
ret = check_pprime (begin, end, mode);
}