constexprな素数列挙(エラトステネスの篩)
概要
タイトル通りです
constexpr auto p = Prime<100000, 9592>();
p.prime[hoge]
みたいに使います
fugaが素数かを見たい時は
p.sieve[fuga]
みたいに使います
以下本編です
template<size_t max_N, size_t prime_size>
struct Prime{
bool sieve[max_N];
int_fast64_t prime[prime_size];
size_t counter = 0;
constexpr Prime() : sieve(), prime() {
for(int_fast64_t i = 0; i < max_N; ++i)
sieve[i] = true;
sieve[0] = sieve[1] = false;
for(int_fast64_t i = 2; i < max_N; ++i){
if(sieve[i]){
prime[counter] = i;
++counter;
if(counter > prime_size)break;
}
for(int_fast64_t j = i * i; j < max_N; j += i)
sieve[j] = false;
}
}
};
本編ここまで