Factors of a Mersenne number: Difference between revisions
Content added Content deleted
m (→{{header|Perl}}: wrong output) |
(Updated D code) |
||
Line 364: | Line 364: | ||
=={{header|D}}== |
=={{header|D}}== |
||
<lang d>import std.stdio, std.math; |
<lang d>import std.stdio, std.math, std.traits; |
||
ulong mersenneFactor(ulong p) { |
ulong mersenneFactor(in ulong p) pure nothrow { |
||
static bool isPrime(T)(in T n) pure nothrow { |
|||
if (n < 2 || n % 2 == 0) |
|||
return n == 2; |
|||
for (Unqual!T i = 3; i ^^ 2 <= n; i += 2) |
|||
if (n % i == 0) |
|||
return false; |
|||
⚫ | |||
} |
} |
||
⚫ | |||
} |
|||
long |
static long modPow(in long cb,in long ce,in long m) pure nothrow{ |
||
long |
long b = cb; |
||
long result = 1; |
|||
for (long e = ce; e > 0; e >>= 1) { |
|||
if ((e & 1) == 1) |
|||
result = (result * b) % m; |
|||
b = (b ^^ 2) % m; |
|||
} |
} |
||
return result; |
|||
e >>= 1; |
|||
} |
} |
||
return result; |
|||
} |
|||
immutable ulong limit = cast(ulong)sqrt(2 ^^ p - 1); |
|||
bool isPrime(T) (T n) { |
|||
for (ulong k = 1; (2 * p * k - 1) < limit; k++) { |
|||
immutable ulong q = 2 * p * k + 1; |
|||
if ( |
if (isPrime(q) && (q % 8 == 1 || q % 8 == 7) && |
||
modPow(2, p, q) == 1) |
|||
return q; |
|||
} |
} |
||
return |
return 0; |
||
} |
} |
||
Line 402: | Line 400: | ||
writefln("Factor of M929: %s", mersenneFactor(929)); |
writefln("Factor of M929: %s", mersenneFactor(929)); |
||
}</lang> |
}</lang> |
||
Output: |
|||
<pre>Factor of M929: 13007</pre> |
|||
=={{header|Forth}}== |
=={{header|Forth}}== |