nth_prime: passes tests

This commit is contained in:
Dmitry Kokorin 2016-03-26 20:36:45 +03:00
parent a3d06da574
commit a2c1c4a6ac

View file

@ -1,6 +1,5 @@
#include "nth_prime.h" #include "nth_prime.h"
#include <cstddef>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
@ -14,7 +13,7 @@ using namespace std;
number_t nth(size_t n) number_t nth(size_t n)
{ {
if (n < 1) if (n < 1)
throw std::domain_error("invalid prime index"); throw domain_error("invalid prime index");
vector<number_t> primes = {2, 3, 5, 7, 11, 13}; vector<number_t> primes = {2, 3, 5, 7, 11, 13};
primes.reserve(n - 1); primes.reserve(n - 1);
@ -26,11 +25,12 @@ number_t nth(size_t n)
size_t page = 0; size_t page = 0;
while (primes.size() < n) { while (primes.size() < n - 1) {
for (auto p : primes) { for (auto p : primes) {
size_t start = page*sieve_size % p; size_t start = ((page*sieve_size + p - 1)/p)*p
- page*sieve_size;
for (size_t i = start; i < sieve_size; i += p) { for (size_t i = start; i < sieve_size; i += p) {
@ -38,19 +38,22 @@ number_t nth(size_t n)
} }
} }
for (auto i : sieve) { for (size_t i = 0; i < sieve_size; ++i) {
if (!sieve[i]) { if (sieve[i])
continue;
number_t new_prime = page*sieve_size + i; number_t p = page*sieve_size + i;
//cout << page << " " << i << " " << new_prime << endl; primes.push_back(p);
primes.push_back(new_prime);
break; for (size_t j = i; j < sieve_size; j += p) {
sieve[j] = true;
} }
} }
//if ( memset(sieve, 0, sieve_size);
//memset(sieve, 0, sieve_size); ++page;
} }
return primes[n - 1]; return primes[n - 1];