nth_prime: iteration 2
This commit is contained in:
parent
034d292560
commit
62aaca3931
1 changed files with 10 additions and 11 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue