2.4.1 Rho-Faktorisierung von Pollard
Pollards Rho-Faktorisierung ist ein spezieller Algorithmus um kleine
Primfaktoren zu finden. Betrachte man dabei folgenden Satz:
Sei f: S→S eine beliebige Funktion, wobei S eine endliche Menge sei mit
|S| = n. Sei weiter x0 ∈ S, beliebig. Betrachten wir nun die
Folge x0, x1, x2, ... welche durch
xi+1 = f(xi ) definiert sei. Da S endlich ist, muss die
Folge in einem Zyklus enden und einen Rumpf besitzen.
Möchte man nun die Länge des Zyklus herausfinden, so eignet sich
folgender Algorithmus dafür (Floyd's Zyklen-Such-Algorithmus):
Bei dieser Methode beginnt man mit einem Paar (x1 , x2 )
und berechnet iterativ (xi , x2i ) aus dem
vorherigen Paar (xi-1 , x2i-2 ) bis man ein
Duplikat xm = x2m erhält. ⇒ Falls der Rumpf eine
Länge von λ hat und der Zyklus eine Länge von μ,
so ist das erste Mal, wenn xm = x2m ist,
m = μ (1 + ⌊λ / μ ⌋ ).
Pollard's Rho-Algorithmus verwendet nun Floyd's Algorithmus um in der
Folge der Ganzzahlen y0, y1, y2, ...,
yi ∈ Z ∀ i, ein solches Duplikat zu finden. Die
Folge wird dabei folgendermaßen definiert: y0 = 2, yi+1
= f(yi ) = (yi2 + 1) mod p, i ≥ 0. Floyd's
Algorithmus wird nun verwendet, um ym und y2m zu finden
mit ym ≡ y2m (mod p). Da p n teilt, jedoch nicht
bekannt ist, wird dies durch die Ausdrücke yi mod n berechnet, und
getestet, ob der ggT(ym - y2m , n ) > n ist. Falls
nun also ein solches m gefunden ist und ggT(ym - y2m
, n ) < n, dann hat man einen nicht-trivialen Faktor von n erhalten
( = n tritt mit geringer Wahrscheinlichkeit auf).
Beispiel:
Sei n = 221. Man beginnt mit:
y0 = 2
y1 = f(y0 ) = ((y0 )2 + 1) mod n
= 5, y2 = f( f( y0 )) = 26, d = ggT(y1 -
y2 , n ) = ggT ( 21, 221 ) = 1,
y2 = 26, y4 = 197, d = ggT ( 26 - 197, 221 ) = 1,
y3 = 262 + 1 mod 221 = 14, y6 = 104,
d = ggT ( 90, 221 ) = 1,
y4 = 197, y8 = 145, d = 13,
Damit ist 13 ein nicht-trivialer Primfaktor von 221 und der andere
nicht-triviale Faktor ist 221 / 13 = 17.
Falls der Algorithmus scheitert, so kann man es mit einer anderen Funktion
f mit anderem Ganzzahlkoeffizienten etwa f = x2 + c , c ≠ 0, -2
versuchen.
Man bedenke jedoch, dass dieser Algorithmus in erster Linie für
zusammengesetzte Ganzzahlen, die nicht Potenzen von Primzahlen sind, gedacht
ist.
Applet Rho-Faktorisierung:
Quellcode:
RhoFacSF.java - Appletoberfläche
RhoFac.java - Algorithmenklasse
2.4.2 (p-1)-Faktorisierung |