Factors of a Mersenne number: Difference between revisions

C++ - no need to use a sieve in this case
m (Minor edit to C++ code)
(C++ - no need to use a sieve in this case)
Line 546:
#include <cstdint>
#include <vector>
#include "sieve_of_eratosthenes.h"
 
typedef uint64_t integer;
Line 571 ⟶ 570:
}
 
constbool is_prime(integer limitn) = 100000U;{
if (n ==< 2)
return false;
if (n < 2 || n % 2 == 0)
return truen == 2;
for (size_tinteger p = 3; p * p <= limitn; p += 2) {
if (qn >% p == limit0)
breakreturn false;
}
return true;
 
integer find_mersenne_factor(const sieve_of_eratosthenes& sieve, integer p) {
integer k = 0;
integer q = 1;
Line 579 ⟶ 588:
++k;
q = 2 * k * p + 1;
if (q >= limit)
break;
if (q % 8 == 1 || q % 8 == 7) {
if (mod_pow(p, q) == 1 && sieve.is_prime(q))
return q;
}
Line 590 ⟶ 597:
 
int main() {
std::cout << find_mersenne_factor(sieve, 929) << '\n';
sieve_of_eratosthenes sieve(limit);
std::cout << find_mersenne_factor(sieve, 929) << '\n';
return 0;
}</lang>
 
Contents of sieve_of_eratosthenes.h:
<lang cpp>#ifndef SIEVE_OF_ERATOSTHENES_H
#define SIEVE_OF_ERATOSTHENES_H
 
#include <algorithm>
#include <vector>
 
class sieve_of_eratosthenes {
public:
explicit sieve_of_eratosthenes(size_t);
bool is_prime(size_t) const;
private:
std::vector<bool> odd_prime_;
};
 
inline bool sieve_of_eratosthenes::is_prime(size_t n) const {
if (n == 2)
return true;
if (n < 2 || n % 2 == 0)
return false;
return odd_prime_[n/2 - 1];
 
inline sieve_of_eratosthenes::sieve_of_eratosthenes(size_t limit) {
limit = std::max(size_t(3), 1 + 2*(limit/2));
odd_prime_.resize(limit/2, true);
for (size_t p = 3; p * p <= limit; p += 2) {
if (odd_prime_[p/2 - 1]) {
size_t inc = 2 * p;
for (size_t q = p * p; q <= limit; q += inc)
odd_prime_[q/2 - 1] = false;
}
}
}
 
#endif</lang>
 
{{out}}
1,777

edits