From a3d06da574f704c64e2012dd920821066a4951c4 Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Sat, 26 Mar 2016 15:40:36 +0300 Subject: [PATCH] nth_prime: work in progress --- cpp/nth-prime/nth_prime.cpp | 59 +++++++++++++++++++++++++++++++++++++ cpp/nth-prime/nth_prime.h | 13 ++++++++ 2 files changed, 72 insertions(+) create mode 100644 cpp/nth-prime/nth_prime.cpp create mode 100644 cpp/nth-prime/nth_prime.h diff --git a/cpp/nth-prime/nth_prime.cpp b/cpp/nth-prime/nth_prime.cpp new file mode 100644 index 0000000..348460d --- /dev/null +++ b/cpp/nth-prime/nth_prime.cpp @@ -0,0 +1,59 @@ +#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]; +} + +} diff --git a/cpp/nth-prime/nth_prime.h b/cpp/nth-prime/nth_prime.h new file mode 100644 index 0000000..5e06a1a --- /dev/null +++ b/cpp/nth-prime/nth_prime.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#define EXERCISM_RUN_ALL_TESTS + +namespace prime { + +typedef unsigned long long number_t; + +number_t nth(size_t); + +}