Pollard-Rho-Methode
Die Pollard-Rho-Methoden sind Algorithmen zur Bestimmung der Periodenlänge einer Zahlenfolge, die mit einer mathematischen Funktion berechnet wird. Verschiedene schwierige mathematische Probleme wie der diskrete Logarithmus und die Primfaktorzerlegung lassen sich auf die Bestimmung der Periodenlänge zurüchführen. Eine optimierte Variante der Pollard-Rho-Methode wurde von John M. Pollard im Jahre 1975 zur Primfaktorzerlegung entwickelt. Derartige Verfahren lassen sich auch zur Berechnung von Kollisionen in Hashfunktionen anwenden.
Funktionsweise
Gesucht ist ein Teiler p, nicht zwingend eine Primzahl, der Zahl n. Das Verfahren beruht auf der Erzeugung einer zufälligen Zahlenfolge aus Pseudozufallszahlen. Zur Erstellung der Zufallsfolge kann eine relativ beliebige Funktion verwendet werden.
Die Folge startet mit einem weitgehend beliegig wählbarem Startwert . Die weiteren Werte werden iterativ berechnet gemäß . Die Funktionswerte modulo p können maximal die p verschiedenen Werte 0,1,2, ..., und p-1 annehmen. Tritt einer dieser Werte erneut auf, wiederholen sich anschließen diese Werte moduo p. Dies geschieht spätestens nach p-Iterationen und im Mittel nach etwa Iterationen. Wir können diese Reste zunächst nicht berechnen, da p als gesuchter Wert unbekannt ist. Dies spielt jedoch keine Rolle. Wir betrachen gedanklich die Reste der Division durch p.
Bei einer derart berechneten Zahlenfolge mit endlich vielen möglichen Funktionswerten werden zunächst in einer Vorperiode einige Werte
angenommen. Sobald ein Wert wiederholt auftritt, wiederholen sich die Werte anschließlich zyklisch
Dieses Verhalten der Folge gab der Methode ihren Namen, da man sich die Periode wie einen Kreis vorstellen kann und die Folgenglieder am Anfang wie einen Stengel, der in den Kreis hineinführt. Graphisch sieht das aus wie der griechische Buchstabe ρ.
Haben zwei Werte x und y modulo p aus der Folge den gleichen Wert, für die folglich x y modulo p gilt, so ergibt ggT(x-y,n) ein Vielfaches von p und oftmals einen echten Teiler von n.
Es ist jedoch sehr aufwendige alle Zahlenwerte auf diese Weise zu vergleichen. Eine optimierte Varianate der Pollard Rho Methode berechnet daher zur Bestimmung der Periodenlänge zwei Folgen. Eine Folge
und die zweite Folge
Durch diesen Trick kann der Vergleich sehr vieler Funktionswerte vermieden werden. Es muss jetzt nicht für alle Paare der größte gemeinsame Teiler ggT berechnet werden. Es genügt jeweils den ggT bzw. ggT zu berechnen.
Da p als ein gesuchter Teiler von unbekannt ist, kann zunächst der Rest der Division durch p nicht berechnet werden. Es wird daher nicht die Gleichheit zweier Werte x und y abgefragt, sondern der ggT(x - y, n) berechnet. Falls sich die Werte x und y nur um ein Vielfaches von p unterscheiden, ist der Wert des ggT(x-y,n) ein Vielfaches des gesuchten Teilers p von n. Ganzahlige Vielfache von n sind zugleich ganzzahlige Vielfache von p, die bei der Berechnung nicht berüchsichtigt werden brauchen. Die Funktionswerte können daher zur Vereinfachung modulo n berechnet werden.
Zur Berechnung der Zahlenfolge kann eine Funktion der Form f(x)=x2 + const benutzt werden. Durch diese Wahl können nur ein Teil, etwa die Hälfte, der Werte 0 bis p-1 bei der Restbildung auftreten.
Algorithmus
Eingabe: n ist die zu faktorisierende Zahl und f(x) sei die Pseudo-Zufallsfunktion modulo n
Ausgabe: Ein nicht-trivialer faktor von n, oder Fehlmeldung
- x ← 2, y ← 2; d ← 1
- While d = 1:
- x ← f(x)
- y ← f(f(y))
- d ← ggT(|x − y|, n)
- If 1 < d < n, then return d.
- If d = n, return "Fehler".
Anmerkung: Dieser Algorithmus liefert für alle n, die nur durch 1 und sich selbst teilbar sind, eine Fehlermeldung zurück. Allerdings kann auch für die anderen n eine Fehlermelung zurückgeliert werden. In diesem Fall wählt man eine andere Funktion f(x) und versucht es erneut.
Ist das Ergebnis eine Zahl, so ist diese wirklich auch ein Primfaktor und damit ein korrektes Ergebnis. Kurzum, der Pollard-Rho-Algorithmus liefert nie ein inkorrektes Ergebnis.
Für f wählt man ein Polynom mit einem ganzzahligem Koeffizienten. Eine übliche Funktion für diesen Algorithmus hat folgende Form:
Alternative Schreibweise des Algorithmuses
- x0 ← 2; d ← 1
- While d = 1:
- xi ← f(xi-1) (falls noch nicht berechnet)
- x2i ← f(x2i-1)
- d ← ggT(|xi − x2i|, n)
- If 1 < d < n, then return d.
- If d = n, return "Fehler"
Abschätzung der Laufzeit
Die Zahlenfolgen mod p und mod p können als Pseudo-Zufallsfolgen angesehen werden. Falls ein Zahlenwert erneut auftritt, wiederholen sich zwangsläufig die folgenden Werte. Es können bis zu p-Werte angenommen werden. Der Erwartungswert für die Länge eines Zyklus beträgt im Durchschnitt . Die Tatsache, dass weit weniger als p Berechnungen erforderlich sind, wird zuweilen Geburtstagsparadoxon genannt. Da sich die Folge jedoch weniger als p Werte modulo p annehmen kann und n mindestens einen Faktor kleiner als besitzt, ist das Verfahren auch im ungünstigsten Fall nicht wesentlich langsamer als die Probedivision.
Diese Überlegung gilt natürlich für alle Primfaktoren, so dass die Methode gut geeignet ist, Zahlen mit mehreren kleineren Faktoren zu faktorisieren.
Zahlenbeispiel

- Gesucht seien die Faktoren der Zahl n=703. Wir verwenden die Funktion f(x)=x2+23 und den Startwert x0=431.
- x1=(+23)mod 703=192, x2=(((+23)mod 703)2+23)mod 703=331, ggT(192-331,703)=1
- x2=(+23)mod 703=331, x4=(((+23)mod 703)2+23)+23)mod 703=49, ggT(331-49,703)=1
- x3=(+23)mod 703=619, x6=(((+23)mod 703)2+23)+23)mod 703=125, ggT(619-125,703)=19
Damit ist die Primfaktorzerlegung von 703=19·37 gefunden.
- x4=(+23)mod 703=49
- x5=(+23)mod 703=315
- x6=(+23)mod 703=125 <= Hier wird der Primfaktor ermittelt.
- x7=(+23)mod 703=182
- x8=(+23)mod 703=106
- x9=(+23)mod 703=11
- x11=(+23)mod 703=144
- x12=(+23)mod 703=372
- x13=(+23)mod 703=619 =x3
- x14=(+23)mod 703=49 =x4
Das periodische Verhalten ist nun erkennbar. Es entsteht ein Zyklus ab x13.
- Gesucht seien die Faktoren der Zahl 16061993. Mit f(x)=x2+12 und dem Startwert x0=1 erhält nach 18 Schritten den Faktor 4657:
- x1=(+12)mod 16061993=13, x2=(((+12)mod 16061993)2+12)mod 16061993=181, ggT(13-181,16061993)=1
- x2=(+12)mod 16061993=181, x4=(((+12)mod 16061993)2+12)mod 16061993=13978003, ggT(181-13978003,16061993)=1
- x3=32773, x6=8711797, ggT(32773-8711797,16061993)=1
- x4=13978003, x8=7982227, ggT(13978003-7982227,16061993)=1
- x5=12032842, x10=4985718, ggT(12032842-4985718,16061993)=1
- x6=8711797, x12=8138577, ggT(8711797-8138577,16061993)=1
- x7=435306, x14=2566882, ggT(435306-2566882,16061993)=1
- x8=7982227, x16=10372210, ggT(7982227-10372210,16061993)=1
- x9=13335673, x18=5638320, ggT(13335673-5638320,16061993)=1
- x10=4985718, x20=12304164, ggT(4985718-12304164,16061993)=1
- x11=4228666, x22=5872876, ggT(4228666-5872876,16061993)=1
- x12=8138577, x24=11257858, ggT(8138577-11257858,16061993)=1
- x13=4913534, x26=15071483, ggT(4913534-15071483,16061993)=1
- x14=2566882, x28=7315289, ggT(2566882-7315289,16061993)=1
- x15=12743441, x30=9148207, ggT(12743441-9148207,16061993)=1
- x16=10372210, x32=15066270, ggT(10372210-15066270,16061993)=1
- x17=9091895, x34=11187185, ggT(9091895-11187185,16061993)=1
- x18=5638320, x36=13536592, ggT(5638320-13536592,16061993)=4657
Zum Vergleich: Mit Probedivision hätte man, selbst wenn man bei der Probedivision nur Primzahlen benutzt, 630 Schritte gebraucht.
Verbesserte Verfahren zur Faktorisierung
Mit der beschriebenen Methode konnte 1980 die Fermat-Zahl faktorisiert werden. Diese Zahl hat 256 Bit. 2005 wurde mit einem optimierten Verfahren die Zahl RSA-200 mit 663 Bit faktorisiert und bereits 1988 gelang es Brent und Morain mit 2048 Bit vollständig zu faktoriesieren.
Literatur
- A Monte Carlo Method for Factorization, J.M.Pollard, BIT 15 (1975) 331-334
- An Improved Monte Carlo Factorization Algorithm, R.P.Brent, BIT 20 (1980) 176-184