aboutsummaryrefslogtreecommitdiffstats
path: root/src/make_prm.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-07-05 17:01:16 +0000
committerlloyd <[email protected]>2008-07-05 17:01:16 +0000
commit7cc2151c3944f23bd43280610b15a0cbe1b52f0a (patch)
tree261e9aa9897d946d346b9fa09eb861c1362010aa /src/make_prm.cpp
parenta297e294a01fca7e5abc71e05715059711a697e5 (diff)
Extend random_prime() to be able to generate primes of any bit size.
bits <= 1 -> error bits == 2 -> choose 2 or 3 at random bits == 3 -> choose 5 or 7 at random bits == 4 -> choose 11 or 13 at random bits >= 5 -> procedure used previously. Tested by running random_prime() with random bit sizes <= 16 until it had generated all <= 16 bit primes.
Diffstat (limited to 'src/make_prm.cpp')
-rw-r--r--src/make_prm.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/make_prm.cpp b/src/make_prm.cpp
index 35d1dde38..dc26a0400 100644
--- a/src/make_prm.cpp
+++ b/src/make_prm.cpp
@@ -16,9 +16,15 @@ BigInt random_prime(RandomNumberGenerator& rng,
u32bit bits, const BigInt& coprime,
u32bit equiv, u32bit modulo)
{
- if(bits < 48)
+ if(bits <= 1)
throw Invalid_Argument("random_prime: Can't make a prime of " +
to_string(bits) + " bits");
+ else if(bits == 2)
+ return ((rng.next_byte() % 1) ? 2 : 3);
+ else if(bits == 3)
+ return ((rng.next_byte() % 1) ? 5 : 7);
+ else if(bits == 4)
+ return ((rng.next_byte() % 1) ? 11 : 13);
if(coprime <= 0)
throw Invalid_Argument("random_prime: coprime must be > 0");
@@ -52,6 +58,9 @@ BigInt random_prime(RandomNumberGenerator& rng,
++counter;
p += modulo;
+ if(p.bits() > bits)
+ break;
+
for(u32bit j = 0; j != sieve.size(); ++j)
{
sieve[j] = (sieve[j] + modulo) % PRIMES[j];