Experimenting with a new forward fomulation (kudos Daniel Kruegler), updated insert iterators to work better with pproxies, and doubled the speed of __next_prime.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113731 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant
2010-09-13 01:43:27 +00:00
parent a0f1dc9f46
commit d2a9251977
3 changed files with 228 additions and 154 deletions

View File

@@ -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;