Subsections


10 Ein »einfacher« Faktorisierungsalgorithmus

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 ($ {\frac{{5}}{{p}}}$) = 1) bzw. K : = p + 1 (für ($ {\frac{{5}}{{p}}}$) = - 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 $ \equiv$ FK $ \equiv$ 0 ( mod p) und damit auch gcd(Fh, p) = p und wegen gcd(p, N) = p ist gcd(Fh, N) $ \geq$ 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, F$\scriptstyle \prod$hi 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

10.0.1 Beispiel

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 = $ {\frac{{N}}{{p}}}$ = 100000127.


\begin{algorithm}
% latex2html id marker 2491
[h]
\par
\caption{
Faktorisierung ...
...mponent~of~fib
\par
~return~gcd(fib1,N);
\par
end;\end{list}\par
\end{algorithm}

10.0.2 Bemerkungen:

Der angegebene Algorithmus cap:Faktorisierung-mit-Fibonaccizahlen kann als Template aufgefaßt werden, um strukturverwandte Faktorisierungsalgorithmen zu implementieren.

10.0.3 Zusätzliche Hinweise und Ausblicke

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