AlgoPlus v0.1.0
Loading...
Searching...
No Matches
mersenne_primes.h
1#ifndef MERSENNE_PRIMES_H
2#define MERSENNE_PRIMES_H
3
4#ifdef __cplusplus
5#include <cassert>
6#include <cmath>
7#include <iostream>
8#include <vector>
9#endif
10
11namespace helpers {
18std::vector<bool> soe(int64_t n) {
19 assert(n != 0);
20 std::vector<bool> prime(n + 1, true);
21 for (int64_t p = 2; p * p <= n; ++p) {
22 if (prime[p]) {
23 for (int64_t i = p * p; i <= n; i += p) {
24 prime[i] = false;
25 }
26 }
27 }
28 return prime;
29}
30} // namespace helpers
31
38std::vector<int64_t> mersenne(int64_t n) {
39 std::vector<bool> prime = helpers::soe(n + 1);
40 std::vector<int64_t> elements;
41
42 for (int k = 2; ((1LL << k) - 1) <= n; k++) {
43 int64_t val = (1LL << k) - 1;
44 if (val <= n && prime[val]) {
45 elements.push_back(k);
46 }
47 }
48
49 return elements;
50}
51
52#endif