Factors of a Mersenne number: Difference between revisions

Added C++ solution
(Add Swift)
(Added C++ solution)
Line 541:
}
}</lang>
 
=={{header|C++}}==
<lang cpp>#include <iostream>
#include <cstdint>
#include <vector>
 
typedef uint64_t integer;
 
integer bit_count(integer n)
{
integer count = 0;
while (n > 0)
{
n >>= 1;
++count;
}
return count;
}
 
integer mod_pow(integer p, integer n)
{
integer square = 1;
integer bits = bit_count(p);
while (bits > 0)
{
square = square * square;
if ((p & (1 << --bits)) != 0)
square <<= 1;
square %= n;
}
return square;
}
 
class sieve_of_eratosthenes
{
public:
explicit sieve_of_eratosthenes(size_t max) : is_prime_(max, true)
{
is_prime_[0] = is_prime_[1] = false;
for (integer p = 2; p * p < max; ++p)
{
if (is_prime_[p])
{
for (integer q = p * p; q < max; q +=p)
is_prime_[q] = false;
}
}
}
bool is_prime(integer n) const
{
return is_prime_[n];
}
private:
std::vector<bool> is_prime_;
};
 
const integer limit = 100000U;
 
integer find_mersenne_factor(const sieve_of_eratosthenes& sieve, integer p)
{
integer k = 0;
integer q = 1;
do
{
++k;
q = 2 * k * p + 1;
if (q % 8 == 1 || q % 8 == 7)
{
if (mod_pow(p, q) == 1)
return q;
}
}
while (q < limit);
return 0;
}
 
int main()
{
sieve_of_eratosthenes sieve(limit);
std::cout << find_mersenne_factor(sieve, 929) << '\n';
return 0;
}</lang>
 
{{out}}
<pre>
13007
</pre>
 
=={{header|Clojure}}==
1,777

edits