Einzelnen Beitrag anzeigen

Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#1

Miller-Rabin - Eigene Impl. findet nicht jede Primzahl...

  Alt 20. Dez 2005, 17:54
Problem bei meiner Implentierung des Miller-Rabin Tests

Wie schon im Titel erwähnt, findet meine Implentierung von dem Miller-Rabin Primzahltest leider nicht jede Primzahl.
Das liegt leider an meiner Implentierung des Algos, ich kann aber absolut nicht den Fehler finden.

Delphi-Quellcode:
function Bin(Int: Integer): String;
VAR i : Integer;
begin
  Result := '';
  for i := 7 downto 0 do
    Result := Result + IntToStr((Int shr i) and 1);
end;

function modular_exponentiation(a,b,n : integer) : integer;
VAR c, d, i : integer;
    b_bin : string;
begin
    c := 0;
    d := 1;
    b_bin := Bin(b);
    for i := Length(b_bin) downto 1 do
      begin
        c := 2*c;
        d := (d*d) mod n;
        IF (b_bin[i] = '1') THEN
          begin
            d := (d*a) mod n;
            Inc(c);
          end;
      end;
    Result := d;
end;

function witness(a, n : integer) : boolean;
VAR f, x, i, t, u : integer;
begin
  Result := False;

  // n-1 = 2^t * u

  t := 0;
  u := n-1;

  while ((u mod 2) = 0) do
    begin
      u := Round(u/2);
      Inc(t);
    end;

  x := modular_exponentiation(a, u, n);

  for i := t downto 1 do
    begin
      f := x;
      x := (f*f) mod n;

      IF (x = 1) AND (f <> 1) AND (f <> n-1) THEN
        begin
          Result := True;
        end;

    end;

  IF NOT Result THEN
    Result := (x <> 1);
end;

function Miller_Rabin(n, s : integer) : boolean;
VAR i : integer;
begin
  Result := True;

  Randomize;

  for i := 1 to s do
    begin
      IF (witness((Random(n-1) + 1), n)) THEN
        Result := False;
    end;

end;
Bei der Implentierung habe ich mich an diesen Pseudocode gehalten.
Ich freue mich jetzt schon über jede Antwort... THX.
Gruß St.Pauli
  Mit Zitat antworten Zitat