Ich möchte hier nur kurz skizzieren, wie sich lineare Rekursionen prinzipiell anwenden lassen, um natürliche Zahlen zu faktorisieren.10
Wenn eine zusammengesetzte Zahl
N = p . Q (mit p Primzahl und
Q möglicherweise noch weiter zerlegbar) gegeben ist und K : = p - 1
(für
() = 1) bzw. K : = p + 1 (für
(
) = - 1)
in viele kleine Teiler zerfällt11, so haben wir eine Chance, den Primfaktor p über die Fibonaccifolge
zu ermitteln: Wir konstruieren eine hochgradig in kleine Primzahlen12 zerlegbare »riesengroße« Zahl h und hoffen darauf, daß diese
durch K teilbar ist. Wenn wir Erfolg haben, ist dies der Fall.
Dann aber gilt
Fh
FK
0 ( mod p) und damit
auch
gcd(Fh, p) = p und wegen
gcd(p, N) = p ist
gcd(Fh, N)
p.
Mit einiger Wahrscheinlichkeit haben wir dann auch
gcd(Fh, N) = p
gefunden. Der Leser möge sich davon überzeugen, daß es ausreicht,
Fh mod N zu berechnen; dies vermeidet eine explosionsartige
Vergrößerung der Folgenwerte.
Der Algorithmus 2 bewerkstelligt
das oben ausgeführte. Die »riesengroße« Zahl h wird dabei als
Produkt kleinerer Zahlen hi sukzessive aufgebaut; dies ermöglicht
es,
Fhi mod N bereits in den Schleifendurchläufen
zu ermitteln und die Schleife abzubrechen, wenn ein Faktor gefunden
wird. Sobald ein Teiler von N gefunden ist, liefert fibfactor
diesen als Ergebnis zurück; der gefundene Faktor ist nicht notwendigerweise
eine Primzahl, in seltenen Fällen kann er sogar N selbst sein (z.B.
für N : = Fq mit q prim und Fq zusammengesetzt (vgl. 5.4.1)).
Auch ist nicht jeder gefundene Primfaktor notwendigerweise ±1
in kleine Teiler zerlegbar.13
Wählen wir
p : = 12347 = 22 . 32 . 73 - 1 und
Q : = 100000127 = 27 . 3 . 260417 - 1;
beides sind Primzahlen. Wir setzen
N : = p . Q = 1234701568069. Nun
»vergessen« wir die gewählten Faktoren und setzen den Algorithmus
auf diese Zahl an. Wir wählen
h : = 23 . 33 . 53 . 73 = 9261000.
Nun berechnen wir
Fh mod N = 194310245762. Wir berechnen den
größten gemeinsamen Teiler dieser Zahl mit N; es ergibt sich
gcd(194310245762, N) = 12347.
Nun prüfen wir (z.B. durch Probedivision), daß es sich bei p = 12347
um eine Primzahl handelt und stellen ferner fest:
p + 1 = 22 . 32 . 73.
Wir dividieren den gefundenen Teiler ab und erhalten
Q = = 100000127.
Der angegebene Algorithmus cap:Faktorisierung-mit-Fibonaccizahlen kann als Template aufgefaßt werden, um strukturverwandte Faktorisierungsalgorithmen zu implementieren.
In einer effizienten Implementierung wäre der oben angegebene Algorithmus nur die erste Phase eines komplexeren Algorithmus.
Man würde die Phase 1 nach einiger Zeit abbrechen, um nach einem einzelnen verbliebenen Restfaktor in der Zerlegung von K zu suchen. Der simple Ansatz führt auf die sogenannte »standard continuation«, dieser läßt sich zur »improved standard continuation« verbessern. Letzterer wiederum läßt sich mittels »Pairing« von zwei Zahlen in seiner Geschwindigkeit verdoppeln. Bei Fibonaccizahlen kann man hierzu Formel 9.3 benutzen. Eine weitere Effizienzsteigerung läßt sich erreichen, in dem man die einzelnen Faktoren (oder Faktorpaare) zusammenmultipliziert, bevor man den größten gemeinsamen Teiler berechnet. Dann lassen sich diese aber bei geeigneter Strukturierung als Nullstellen eines Polynoms (sehr hohen Grades) betrachten. Solche Polynome wiederum können unter Zuhilfenahme der diskreten Variante der schnellen Fouriertransformation ausgewertet werden (fft-continuation).
Alle diese Stufen habe ich für die (p-1)-Methode, für elliptische Kurven und nun auch für die Fibonacci-Methode implementiert. Sie sind Bestandteil eines Faktorisierungsprogramms, das ich auf meiner Homepage zum Download bereitgestellt habe.
Thorsten Reinecke 2004-07-11