nth_prime: cleanup

This commit is contained in:
Dmitry Kokorin 2016-04-01 14:52:07 +03:00
parent a8a482b106
commit 034d292560

View file

@ -37,17 +37,7 @@ number_t nth(size_t n, size_t sieve_size)
sieve[0] = true; sieve[0] = true;
number_t first_number = 1; number_t sieve_first = 1;
auto create_next = [&first_number](number_t p) -> number_t {
return (p*p - first_number)/2;
};
transform(primes.cbegin(), primes.cend(), next.begin(), create_next);
for (auto p : primes)
sieve[(p - first_number) / 2] = true;
auto process_prime = [sieve_size,&sieve](const number_t &p, number_t &next) { auto process_prime = [sieve_size,&sieve](const number_t &p, number_t &next) {
@ -61,22 +51,22 @@ number_t nth(size_t n, size_t sieve_size)
next = i - sieve_size; next = i - sieve_size;
}; };
auto create_next = [&sieve_first](number_t p) -> number_t {
return (p*p - sieve_first)/2;
};
transform(primes.cbegin(), primes.cend(), next.begin(), create_next);
for (auto p : primes)
sieve[(p - sieve_first) / 2] = true;
while (true) { while (true) {
for (size_t pn = 0; pn < primes.size(); ++pn) { for (size_t pn = 0; pn < primes.size(); ++pn) {
const number_t &p = primes[pn]; process_prime(primes[pn], next[pn]);
number_t i = next[pn];
for (; i < sieve_size; i += p) {
sieve[i] = true;
}
next[pn] = i - sieve_size;
// process_prime(primes[pn], next[pn]);
} }
for (size_t i = 0; i < sieve_size; ++i) { for (size_t i = 0; i < sieve_size; ++i) {
@ -84,33 +74,27 @@ number_t nth(size_t n, size_t sieve_size)
if (sieve[i]) if (sieve[i])
continue; continue;
number_t p = first_number + 2*i; number_t p = sieve_first + 2*i;
primes.push_back(p); primes.push_back(p);
if (primes.size() == n - 1) if (primes.size() == n - 1)
return p; return p;
next[primes.size() - 1] = create_next(p);//(p*p - first_number)/2; size_t pn = primes.size() - 1;
next[pn] = create_next(p);
sieve[i] = true; sieve[i] = true;
number_t j = next[primes.size() - 1]; process_prime(primes[pn], next[pn]);
for (; j < sieve_size; j += p) {
sieve[j] = true;
} }
next[primes.size() - 1] = j - sieve_size; number_t next_sieve_first = sieve_first + 2*sieve_size;
}
number_t next_first_number = first_number + 2*sieve_size; if (next_sieve_first < sieve_first)
if (next_first_number < first_number)
throw runtime_error("failed to reach prime number"); throw runtime_error("failed to reach prime number");
first_number = next_first_number; sieve_first = next_sieve_first;
memset(&sieve[0], false, sieve.size()*sizeof(sieve[0])); memset(&sieve[0], false, sieve.size()*sizeof(sieve[0]));
} }
} }