Im Folgenden lernen Sie die p-1-Methode von J. Pollard kennen, mit der Sie einen Faktor f einer natürlichen Zahl n bestimmen können. Diese Methode funktioniert allerdings nur dann, wenn n einen Primfaktor p enthält, derart dass p-1 aus hinreichend kleinen Primfaktorpotenzen besteht.
Beispiel:
n = | 7935104802863525901487 = p · q |
p = | 80768455531 |
p-1 = | 80768455530 = 2 · 3 · 5 · 7 · 41 · 997 · 972 |
Alle Primfaktorpotenzen, aus denen p-1 besteht, sind kleiner als b = 10000 (die größte ist 972 = 9409). In diesem Fall funktioniert also die p-1-Methode.
Die zu faktorisierende Zahl n ist ein Vielfaches einer Primzahl p. Ist nun eine Zahl m ebenfalls ein Vielfaches von p, so gilt
p | ggt(m, n).
Sofern ggt(m, n) ≠ n ist, haben Sie einen Faktor von n gefunden.
Ohne p zu kennen, begeben Sie sich nun auf die Suche nach einer solchen Zahl m, die ein Vielfaches von p ist.
Behauptung: Sei p > 2 eine Primzahl. Wenn k ein Vielfaches von p-1 ist, so ist 2k-1 ein Vielfaches von p.
Beispiel: Sei p = 5. Dann ist z.B. 12 ein Vielfaches von p-1, und es gilt 212-1 = 4096-1 ist Vielfaches von 5.
Beweis: Nach dem kleinen Satz von Fermat gilt für jede Primzahl p > 2
2p-1 ≡ 1 (mod p).
Wenn k ein Vielfaches von p-1 ist, etwa k = (p-1)·r, so gilt
2k ≡ 2(p-1)·r ≡ 1r ≡ 1 (mod p).
Dies aber bedeutet nach Definition von ≡
p | 2k-1,
d.h. 2k-1 ist ein Vielfaches von p.
Wenn p-1 nur aus Primfaktorpotenzen < b besteht, so finden Sie ein Vielfaches k von p-1, indem Sie alle Primzahlpotenzen < b miteinander multiplizieren:
k = q prim, qe<b, e maximal qe
Dann aber ist m = 2k-1 das gesuchte Vielfache von p. Damit gilt p | ggt(m, n), und sofern ggt(m, n) ≠ n ist, haben Sie einen Faktor von n gefunden.
Ist die Grenze b groß, etwa 104, so wird die Zahl k sehr groß, und natürlich erst recht die Zahl 2k-1. Zum Glück lässt sich jedoch vermeiden, dass die Zahlen über alle Maßen groß werden.
Es gilt nämlich
ggt(m, n) = ggt(m mod n, n).
Mit m = 2k-1 gilt
m mod n = (2k-1) mod n = 2k mod n – 1
Statt 2k berechnen Sie also 2k mod n. Da k ein Produkt von Zahlen k0, ..., ks-1 ist, erhalten Sie 2k mod n als wiederholte modulare Exponentiation:
v = 2k mod n = (...((2k0 mod n)k1 mod n) ... )ks-1 mod n.
Um den Fall auszuschließen, dass ggt(m, n) = n ist, prüfen Sie nach jeder modularen Exponentiation in dem obigen Ausdruck, ob ggt(v-1, n) ≠ 1 ist. Ist dies der Fall, so haben Sie einen Faktor f von n mit
f = ggt(v-1, n)
gefunden.
Es folgt eine Implementierung der p-1-Methode in Python.
Pollardp-1.py
Die Funktionen ggt zur Berechnung des größten gemeinsamen Teilers und modexp zur schnellen Exponentiation importieren Sie aus dem Python-Modul BasicFunctions.
[Bu 00] J.A. Buchmann: Introduction to Cryptography. Springer (2000)
[Lan 23] H.W. Lang: Kryptografie für Dummies. 2. Auflage, Wiley (2023)
Weiter mit: [up]