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, ..., yiZ ∀ 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