2.4.2 (p-1)-Faktorisierung von Pollard
Der (p-1)-Faktorisierungsalgorithmus wurde entworfen um effizient
Primfaktoren p einer nichtprimen Zahl n, für welche p-1 in Bezug zu
einer relativ kleinen Schranke B glatt ist, zu finden. Dazu folgende
Definition:
Sei 0 > B ∈ Z. Ein n ∈ Z heißt B-glatt oder glatt
bezüglich B, falls alle Primfaktoren ≤ B sind.
Die Idee zum (p-1)-Algorithmus ist folgende:
Sei B eine Glattheitsschranke. Sei Q das kleinste gemeinsame Vielfache aller
Potenzen von Primzahlen ≤ B, welche ≤ n sind. Falls gl ≤
n, so ist l⋅ln q ≤ ln n und damit l ≤ ⌊ ln n / ln q ⌋.
Daher ist Q = ∏q ≤ b q⌊ ln n / ln q ⌋
wobei das Produkt über alle verschiedenen q ≤ B läuft. Falls p ein
Primfaktor von n ist, so dass p-1 B-glatt ist, dann gilt p-1|Q und folglich für
jedes a, für das gilt ggT(a, p) = 1, impliziert der kleine Fermatsche Satz
aQ ≡ 1 (mod p). Also gilt: falls d = ggT(aQ - 1,
n ), dann gilt p|d.
Es ist möglich, dass d = n ist. In diesem Fall scheitert der Algorithmus. Jedoch ist das unwahrscheinlich falls n mindestens zwei große unterschiedliche Primfaktoren hat.
Beispiel
Sei n = 27869. Man wähle nun eine Glattheitsschranke B, etwa B = 8 und wähle
eine weitere Zahl a0, wobei 2 ≤ a0 ≤ n-1, in
diesem Fall etwa a = 3.
Als ersten Schritt berechne man den ggT(a0 , n) = ggT(3, 27869) =
1. (Hätten wir hier ein d ≠ 1 so hätten wir bereits unseren nicht-trivialen
Faktor).
Nun berechnet man für jeden Primfaktor qi ≤ B:
1. li = ⌊ ln n / ln qi ⌋
2. ai+1 = aiqli mod n
Also ist:
a0 = 3,
q1 = 2, l1 = ⌊ ln n / ln q1 ⌋ =
⌊ 10,23527 / 0.69315 ⌋ = 14, a1 = 14465
q2 = 3, l2 = 9, a2 = 17337
q3 = 5, l3 = 6, a3 = 18787
q4 = 7, l4 = 5, a4 = 3597
ggT(a4 - 1, n) = ggT(3596, 27869) = 899.
Im Beispielprogramm wurde der Algorithmus so implementiert, dass nach jedem Schritt der Berechnung von a, der kleinste gemeinsame Teiler berechnet wird. Es gibt aber noch zahlreiche andere praktische Verbesserungen dieser Methode. Der Algorithmus ist in erster Linie für Zahlen gedacht, die aus einem Produkt von genau zwei großen Primzahlen bestehen. Bei solchen Zahlen ist ein Scheitern des Algorithmuses sehr unwahrscheinlich.
Applet (p-1)-Algorithmus:
Quellcode:
PmeAlgSF.java - Appletoberfläche
PmeAlg.java - Algorithmenklasse
2.4.3 RSA-Faktorisierung |