#include "nth_prime.h" #include #include #include #include #include namespace prime { using namespace std; number_t nth(size_t n) { if (n < 1) throw std::domain_error("invalid prime index"); vector primes = {2, 3, 5, 7, 11, 13}; primes.reserve(n - 1); static const size_t sieve_size = 32*1024; bool sieve[sieve_size] = {0}; sieve[0] = sieve[1] = true; size_t page = 0; while (primes.size() < n) { for (auto p : primes) { size_t start = page*sieve_size % p; for (size_t i = start; i < sieve_size; i += p) { sieve[i] = true; } } for (auto i : sieve) { if (!sieve[i]) { number_t new_prime = page*sieve_size + i; //cout << page << " " << i << " " << new_prime << endl; primes.push_back(new_prime); break; } } //if ( //memset(sieve, 0, sieve_size); } return primes[n - 1]; } }