summaryrefslogtreecommitdiff
path: root/nbtheory.cpp
diff options
context:
space:
mode:
authorweidai <weidai11@users.noreply.github.com>2003-07-19 03:47:20 +0000
committerweidai <weidai11@users.noreply.github.com>2003-07-19 03:47:20 +0000
commit5307588c579cea190110da798d498f3ffc15079f (patch)
tree09d13a6fae123a46962ad82f4b88b7c91bd08335 /nbtheory.cpp
parentdb4981d479d967dafa5ec2f55c6a0735f897b2cb (diff)
downloadcryptopp-git-5307588c579cea190110da798d498f3ffc15079f.tar.gz
remove Diamond2, code size reductions
Diffstat (limited to 'nbtheory.cpp')
-rw-r--r--nbtheory.cpp147
1 files changed, 50 insertions, 97 deletions
diff --git a/nbtheory.cpp b/nbtheory.cpp
index d691e43c..2a517d7c 100644
--- a/nbtheory.cpp
+++ b/nbtheory.cpp
@@ -13,103 +13,45 @@
NAMESPACE_BEGIN(CryptoPP)
-const unsigned int maxPrimeTableSize = 3511; // last prime 32719
-const word lastSmallPrime = 32719;
-unsigned int primeTableSize=552;
-
-word primeTable[maxPrimeTableSize] =
- {2, 3, 5, 7, 11, 13, 17, 19,
- 23, 29, 31, 37, 41, 43, 47, 53,
- 59, 61, 67, 71, 73, 79, 83, 89,
- 97, 101, 103, 107, 109, 113, 127, 131,
- 137, 139, 149, 151, 157, 163, 167, 173,
- 179, 181, 191, 193, 197, 199, 211, 223,
- 227, 229, 233, 239, 241, 251, 257, 263,
- 269, 271, 277, 281, 283, 293, 307, 311,
- 313, 317, 331, 337, 347, 349, 353, 359,
- 367, 373, 379, 383, 389, 397, 401, 409,
- 419, 421, 431, 433, 439, 443, 449, 457,
- 461, 463, 467, 479, 487, 491, 499, 503,
- 509, 521, 523, 541, 547, 557, 563, 569,
- 571, 577, 587, 593, 599, 601, 607, 613,
- 617, 619, 631, 641, 643, 647, 653, 659,
- 661, 673, 677, 683, 691, 701, 709, 719,
- 727, 733, 739, 743, 751, 757, 761, 769,
- 773, 787, 797, 809, 811, 821, 823, 827,
- 829, 839, 853, 857, 859, 863, 877, 881,
- 883, 887, 907, 911, 919, 929, 937, 941,
- 947, 953, 967, 971, 977, 983, 991, 997,
- 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049,
- 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
- 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163,
- 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
- 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
- 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,
- 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423,
- 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459,
- 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,
- 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571,
- 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619,
- 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,
- 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747,
- 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811,
- 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877,
- 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949,
- 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003,
- 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069,
- 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
- 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203,
- 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267,
- 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311,
- 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377,
- 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
- 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503,
- 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579,
- 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657,
- 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,
- 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
- 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801,
- 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861,
- 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939,
- 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011,
- 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
- 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167,
- 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221,
- 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301,
- 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347,
- 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
- 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491,
- 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541,
- 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607,
- 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671,
- 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
- 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797,
- 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863,
- 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923,
- 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003};
-
-void BuildPrimeTable()
+const word s_lastSmallPrime = 32719;
+
+std::vector<word> * NewPrimeTable()
{
- unsigned int p=primeTable[primeTableSize-1];
- for (unsigned int i=primeTableSize; i<maxPrimeTableSize; i++)
+ const unsigned int maxPrimeTableSize = 3511;
+
+ std::auto_ptr<std::vector<word> > pPrimeTable(new std::vector<word>);
+ std::vector<word> &primeTable = *pPrimeTable;
+ primeTable.reserve(maxPrimeTableSize);
+
+ primeTable.push_back(2);
+ unsigned int testEntriesEnd = 1;
+
+ for (unsigned int p=3; p<=s_lastSmallPrime; p+=2)
{
- int j;
- do
+ for (unsigned int j=1; j<testEntriesEnd; j++)
+ if (p%primeTable[j] == 0)
+ break;
+ if (j == testEntriesEnd)
{
- p+=2;
- for (j=1; j<54; j++)
- if (p%primeTable[j] == 0)
- break;
- } while (j!=54);
- primeTable[i] = p;
+ primeTable.push_back(p);
+ testEntriesEnd = STDMIN(54U, primeTable.size());
+ }
}
- primeTableSize = maxPrimeTableSize;
- assert(primeTable[primeTableSize-1] == lastSmallPrime);
+
+ return pPrimeTable.release();
+}
+
+const word * GetPrimeTable(unsigned int &size)
+{
+ std::vector<word> &primeTable = StaticObject<std::vector<word> >(&NewPrimeTable);
+ size = primeTable.size();
+ return &primeTable[0];
}
bool IsSmallPrime(const Integer &p)
{
- BuildPrimeTable();
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
if (p.IsPositive() && p <= primeTable[primeTableSize-1])
return std::binary_search(primeTable, primeTable+primeTableSize, (word)p.ConvertToLong());
@@ -119,6 +61,9 @@ bool IsSmallPrime(const Integer &p)
bool TrialDivision(const Integer &p, unsigned bound)
{
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
+
assert(primeTable[primeTableSize-1] >= bound);
unsigned int i;
@@ -134,7 +79,8 @@ bool TrialDivision(const Integer &p, unsigned bound)
bool SmallDivisorsTest(const Integer &p)
{
- BuildPrimeTable();
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
return !TrialDivision(p, primeTable[primeTableSize-1]);
}
@@ -273,9 +219,9 @@ bool IsStrongLucasProbablePrime(const Integer &n)
bool IsPrime(const Integer &p)
{
- static const Integer lastSmallPrimeSquared = Integer(lastSmallPrime).Squared();
+ static const Integer lastSmallPrimeSquared = Integer(s_lastSmallPrime).Squared();
- if (p <= lastSmallPrime)
+ if (p <= s_lastSmallPrime)
return IsSmallPrime(p);
else if (p <= lastSmallPrimeSquared)
return SmallDivisorsTest(p);
@@ -384,7 +330,8 @@ void PrimeSieve::SieveSingle(std::vector<bool> &sieve, word p, const Integer &fi
void PrimeSieve::DoSieve()
{
- BuildPrimeTable();
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
const unsigned int maxSieveSize = 32768;
unsigned int sieveSize = STDMIN(Integer(maxSieveSize), (m_last-m_first)/m_step+1).ConvertToLong();
@@ -431,11 +378,12 @@ bool FirstPrime(Integer &p, const Integer &max, const Integer &equiv, const Inte
return false;
}
- BuildPrimeTable();
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
if (p <= primeTable[primeTableSize-1])
{
- word *pItr;
+ const word *pItr;
--p;
if (p.IsPositive())
@@ -491,6 +439,9 @@ static bool ProvePrime(const Integer &p, const Integer &q)
if (((r%q).Squared()-4*(r/q)).IsSquare())
return false;
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
+
assert(primeTableSize >= 50);
for (int i=0; i<50; i++)
{
@@ -507,7 +458,7 @@ Integer MihailescuProvablePrime(RandomNumberGenerator &rng, unsigned int pbits)
Integer minP = Integer::Power2(pbits-1);
Integer maxP = Integer::Power2(pbits) - 1;
- if (maxP <= Integer(lastSmallPrime).Squared())
+ if (maxP <= Integer(s_lastSmallPrime).Squared())
{
// Randomize() will generate a prime provable by trial division
p.Randomize(rng, minP, maxP, Integer::PRIME);
@@ -546,7 +497,9 @@ Integer MaurerProvablePrime(RandomNumberGenerator &rng, unsigned int bits)
const unsigned smallPrimeBound = 29, c_opt=10;
Integer p;
- BuildPrimeTable();
+ unsigned int primeTableSize;
+ const word * primeTable = GetPrimeTable(primeTableSize);
+
if (bits < smallPrimeBound)
{
do