#include <iostream>
#include <map>
#include <cstdint>
#include <chrono>
namespace SieveOfEratosthenes{//追記型エラトステネスの篩
//えーっと、Prime[2]=trueだけはどうやっても導き方がわからんのでハードコーディングで死守している。
static std::map < std::uint64_t, bool> Prime;
std::uint64_t GetLastFound(){
Prime[2] = true;
return (*(Prime.rbegin())).first;
}
bool FindNextPrime(){
Prime[2] = true;
std::uint64_t i = GetLastFound() + 1;
bool F = true;;
while (true){
F = true;
for (auto& o : Prime){
if (o.first > ((i / 2)+2)) break;
if (i%o.first == 0){
F = false;
break;
}
}
if (F == true){
Prime[i] = true;
return true;
}
i++;
}
}
bool FindToCount(std::uint64_t N){
while (Prime.size() < N){
FindNextPrime();
}
return true;
}
bool IsPrime(std::uint64_t N){
while (GetLastFound() < N){
FindNextPrime();
}
auto it = Prime.find(N);
return (it != Prime.end());
}
}
int main(){
//bool B = SieveOfEratosthenes::IsPrime(10000);
//bool b2 = SieveOfEratosthenes::IsPrime(10007);
std::cout << "おぎゃー" << std::endl;
//bool b3 = SieveOfEratosthenes::IsPrime(65535);
auto S=std::chrono::system_clock::now();
SieveOfEratosthenes::FindToCount(10000);
auto E = std::chrono::system_clock::now();
auto Eli = std::chrono::duration_cast<std::chrono::milliseconds>(E - S);
std::cout << "経過時間は" << Eli.count() << "ミリ秒だ!" << std::endl;//17268ms on my pc.
return 0;
}