summaryrefslogtreecommitdiffstats
path: root/libcxx/src/hash.cpp
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2010-09-13 01:43:27 +0000
committerHoward Hinnant <hhinnant@apple.com>2010-09-13 01:43:27 +0000
commit8fb62e398a9dff0d4f61b22928acf65d8a8e59eb (patch)
tree42f4e80c1628c021b972a1aa4a74462c72b9162d /libcxx/src/hash.cpp
parentac32b4ddc0ee0b5bf621209c1d8d341edff3e978 (diff)
downloadbcm5719-llvm-8fb62e398a9dff0d4f61b22928acf65d8a8e59eb.tar.gz
bcm5719-llvm-8fb62e398a9dff0d4f61b22928acf65d8a8e59eb.zip
Experimenting with a new forward fomulation (kudos Daniel Kruegler), updated insert iterators to work better with pproxies, and doubled the speed of __next_prime.
llvm-svn: 113731
Diffstat (limited to 'libcxx/src/hash.cpp')
-rw-r--r--libcxx/src/hash.cpp346
1 files changed, 198 insertions, 148 deletions
diff --git a/libcxx/src/hash.cpp b/libcxx/src/hash.cpp
index 1189894f78b..dd4e8e3e1ac 100644
--- a/libcxx/src/hash.cpp
+++ b/libcxx/src/hash.cpp
@@ -157,7 +157,7 @@ __next_prime(size_t n)
// Select first potential prime >= n
// Known a-priori n >= L
size_t k0 = n / L;
- size_t in = std::lower_bound(indices, indices + M, n % L) - indices;
+ size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices;
n = L * k0 + indices[in];
while (true)
{
@@ -170,302 +170,352 @@ __next_prime(size_t n)
// small prime.
for (size_t j = 5; j < N - 1; ++j)
{
- if (n % small_primes[j] == 0)
- goto next;
- if (n / small_primes[j] < small_primes[j])
+ const std::size_t p = small_primes[j];
+ const std::size_t q = n / p;
+ if (q < p)
return n;
+ if (n == q * p)
+ goto next;
}
// n wasn't divisible by small primes, try potential primes
{
size_t i = 211;
while (true)
{
- if (n % i == 0)
- break;
- if (n / i < i)
+ std::size_t q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 10;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 8;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 8;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 10;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
// This will loop i to the next "plane" of potential primes
i += 2;
OpenPOWER on IntegriCloud