Einzelnen Beitrag anzeigen

qwertz543221
(Gast)

n/a Beiträge
 
#1

Miller-Rabin primzahltest

  Alt 16. Jun 2009, 17:57
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.

beispielezahl/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??
  Mit Zitat antworten Zitat