nth_prime: iteration 2

This commit is contained in:
Dmitry Kokorin 2016-04-01 15:16:41 +03:00
parent 034d292560
commit 62aaca3931

View file

@ -39,16 +39,16 @@ number_t nth(size_t n, size_t sieve_size)
number_t sieve_first = 1; number_t sieve_first = 1;
auto process_prime = [sieve_size,&sieve](const number_t &p, number_t &next) { auto process_prime = [&](size_t pn) {
number_t i = next; number_t i = next[pn];
for (; i < sieve_size; i += p) { for (; i < sieve_size; i += primes[pn]) {
sieve[i] = true; sieve[i] = true;
} }
next = i - sieve_size; next[pn] = i - sieve_size;
}; };
auto create_next = [&sieve_first](number_t p) -> number_t { auto create_next = [&sieve_first](number_t p) -> number_t {
@ -66,7 +66,7 @@ number_t nth(size_t n, size_t sieve_size)
for (size_t pn = 0; pn < primes.size(); ++pn) { for (size_t pn = 0; pn < primes.size(); ++pn) {
process_prime(primes[pn], next[pn]); process_prime(pn);
} }
for (size_t i = 0; i < sieve_size; ++i) { for (size_t i = 0; i < sieve_size; ++i) {
@ -74,19 +74,18 @@ number_t nth(size_t n, size_t sieve_size)
if (sieve[i]) if (sieve[i])
continue; continue;
number_t p = sieve_first + 2*i; number_t p = sieve_first + 2*i;
size_t pn = primes.size();
primes.push_back(p); primes.push_back(p);
if (primes.size() == n - 1) if (pn == n - 2)
return p; return p;
size_t pn = primes.size() - 1;
next[pn] = create_next(p); next[pn] = create_next(p);
sieve[i] = true; sieve[i] = true;
process_prime(primes[pn], next[pn]); process_prime(pn);
} }
number_t next_sieve_first = sieve_first + 2*sieve_size; number_t next_sieve_first = sieve_first + 2*sieve_size;