nth_prime: work in progress
This commit is contained in:
parent
fc7478f03f
commit
a3d06da574
2 changed files with 72 additions and 0 deletions
59
cpp/nth-prime/nth_prime.cpp
Normal file
59
cpp/nth-prime/nth_prime.cpp
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
#include "nth_prime.h"
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
namespace prime {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
number_t nth(size_t n)
|
||||||
|
{
|
||||||
|
if (n < 1)
|
||||||
|
throw std::domain_error("invalid prime index");
|
||||||
|
|
||||||
|
vector<number_t> 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
cpp/nth-prime/nth_prime.h
Normal file
13
cpp/nth-prime/nth_prime.h
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
#define EXERCISM_RUN_ALL_TESTS
|
||||||
|
|
||||||
|
namespace prime {
|
||||||
|
|
||||||
|
typedef unsigned long long number_t;
|
||||||
|
|
||||||
|
number_t nth(size_t);
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue