Lucas-Lehmer test: Difference between revisions

Content added Content deleted
m (→‎{{header|D}}: buggy, fixed & remove thread version // still buggy, missing 9689 & 21701... or may be bigint broken?)
Line 308: Line 308:
=={{header|D}}==
=={{header|D}}==
{{trans|Python}}
{{trans|Python}}
<lang d>import std.stdio, std.algorithm, std.range, std.math, std.conv ;
<lang d>import std.stdio, std.math, std.bigint;
import std.bigint, core.thread ;


bool isPrime(int p) {
bool isPrime(int p) {
if(p < 2 || p % 2 == 0) return p == 2 ;
if(p < 2 || p % 2 == 0) return p == 2 ;
foreach( i ; iota(3, max(to!uint(sqrt(p)),3) + 1,2))
foreach( i ; 3..cast(uint)(sqrt(p)) + 1)
if(p % i == 0)
if(p % i == 0)
return false ;
return false ;
Line 324: Line 323:
auto mp = (BigInt(1) << p) - 1 ;
auto mp = (BigInt(1) << p) - 1 ;
auto s = BigInt(4) ;
auto s = BigInt(4) ;
foreach(_ ; iota(3, p + 1))
foreach(_ ; 3..p+1)
s = (s*s - 2) % mp ;
s = (s*s - 2) % mp ;
return s == 0 ;
return s == 0 ;
}
}

shared int[] result ;


void main() {
void main() {
int[] result ;
auto tgroup = new ThreadGroup ;
foreach(p ; iota(2,1000))
tgroup.add(new class (p) Thread {
int num ;
this(int n) { num = n ; super(&run) ; }
private void run() {
if(isMersennePrime(num))
result ~= num ;
}
}) ;
foreach(t ; tgroup)
t.start() ;
tgroup.joinAll() ;


foreach(p ; 2..10000)
writeln(reduce!`a~" "~b`(map!`"M"~to!string(a)`(result.sort))) ;
if(isMersennePrime(p)) {
write(" M", p) ;
stdout.flush() ;
}
}</lang>
}</lang>
Output:
Output:
<pre>M2 M5 M7 M13 M17 M19 M31 M61 M89 M107 M127 M521 M607</pre>
<pre> M2 M3 M5 M7 M13 M17 M19 M31 M61 M89 M107 M127 M521 M607 M1279 M2203 M2281 M3217 M4253 M4423 M9941</pre>

=={{header|Erlang}}==
=={{header|Erlang}}==
<lang erlang>-module(mp).
<lang erlang>-module(mp).