Delphi-Quellcode:
function witness(a,n:ansistring):boolean;
var f,x,i,t,u:ansistring;
mathe:tmathe;
begin
result:=false;
mathe:=tmathe.Create;
t:='0';
u:=mathe.Differenz(n,'1');
while (mathe.Modulo(u,'2')='0') do
begin
u:=mathe.Quotient(u,'2');
t:=mathe.Summe(t,'1');
end;
x:=mathe.PotenzModulo(a,u,n);
i:='1';
while mathe.Vergleich(i,t,vkleiner)do
begin
f:=x;
x:=mathe.PotenzModulo(f,'2',n);
if (x='1')and(f<>'1')and(f<>mathe.Differenz(n,'1'))
then
begin
result:=true;
exit;
end;
i:=mathe.Summe(i,'1');
end;
if not result
then result:=x<>'1';
end;
function millerrabin(n,s:ansistring):boolean;
var i,a:ansistring;
mathe:tmathe;
begin
result:=true;
i:='1';
mathe:=tmathe.Create;
if mathe.istGerade(n)
then result:=true
else
if (mathe.istungerade(n))and(mathe.Vergleich(n,'3')>0)
then
begin
while mathe.Vergleich(i,s,vkleiner) do
begin
a:=mathe.Zufall(mathe,'0',mathe.Differenz(n,'1'));
if witness(a,n)=false
then begin
result:=false;
exit;
end
else begin
result:=true;
exit;
end;
end;
end
else
begin result:=false;
exit;
end;
end;
mithilfe der kleinen mathe lib(
http://www.delphipraxis.net/internal...t.php?t=159592) habe ich den code von miller und rabin zur bestätigung der nicht-primalität implementiert. Das ganze liefert jedoch falsche testergebnisse, und ich weiß nicht wo sich - wiedermal- ein denkfehler versteckt.
beispiele
zahl/durchläufe/ergebnis)
2/50/NP
3/50/P
3/500/P
17/50/P
17/395/P
17/30/NP
991/300/NP
991/3000/P
991/20/P
991/50/NP
Oder liegt das Ganze an der im miller-rabin-algorithmus inbegriffenen fehlerwahrscheinlichkeit??