Pollard-p − 1-Methode: Unterschied zwischen den Versionen

Aus testwiki
Zur Navigation springen Zur Suche springen
imported>Acky69
K zus. Links, Wichtiges nach vorn
 
(kein Unterschied)

Aktuelle Version vom 28. Februar 2025, 09:14 Uhr

Die Pollard-p − 1-Methode ist ein Verfahren zur Faktorisierung von zusammengesetzten Zahlen. Sie wurde 1974 von John M. Pollard beschrieben.

Anwendungen

Die Pollard-p − 1-Methode wird u. a. von GIMPS (Great Internet Mersenne Prime Search) verwendet, um Zahlen der Gestalt 2p1 zu faktorisieren und damit die Anzahl der zeitaufwändigen Lucas-Lehmer-Tests zu verringern, die für die Suche nach Mersenne-Primzahlen notwendig sind.

Mathematische Grundlagen

Die p1-Faktorisierungsmethode von Pollard basiert auf dem kleinen fermatschen Satz. Sei p eine Primzahl, und a eine Zahl, die nicht von p geteilt wird, dann gilt

ap11(modp).

Ebenso gilt dann am1(modp) für alle Vielfachen m von p1. Das bedeutet, dass am1 ein Vielfaches von p ist. Wenn nun N eine zu faktorisierende Zahl mit (unbekanntem) Primteiler p ist, teilt dieses p den ggT(am1,N), da es beide Zahlen teilt, von denen der ggT gebildet wurde. Meist ist dieser ggT ein echter Teiler von N. Im folgenden Absatz wird eine Methode beschrieben, wie man eine passende Zahl m finden kann.

Die 1. Phase des Verfahrens

Sei nun eine zu faktorisierende natürliche Zahl N gegeben. Insbesondere sei N eine zusammengesetzte Zahl. Man wählt eine Zahl a, die teilerfremd zu N ist. Anhand einer Heuristik bestimmt man eine weitere Zahl B, von der man annimmt, dass für jeden Primteiler p von N die Zahl p1 B-potenzglatt ist. Das heißt, für jeden Primteiler q von p1 gilt:

qeq(p1)B

Die Zahl eq(p1) bezeichnet den q-Exponenten von p1. Er gibt an, wie oft die Zahl q in der Primfaktorzerlegung von p1 auftritt. Ersetzt man in der Ungleichung die Zahl p1 durch eine beliebige B-potenzglatte Zahl m, so bleibt die Ungleichung wahr. Umformen nach dem q-Exponenten liefert:

eq(m)logBlogq

Sind B und q fix gewählt, so gibt diese Formel eine scharfe obere Grenze für den q-Exponenten an. Ist dieser größer als die rechte Seite der Ungleichung, so ist m nicht mehr B-potenzglatt. Man setzt nun

fq=logBlogq

Das ist der größte q-Exponent, den eine B-potenzglatte Zahl m haben kann. Man erstellt als Nächstes eine Liste F, in welcher die Primzahl q genau fq-mal vorkommt. Die Primzahlen in der Liste werden mit q1,q2,q3,,qR durchnummeriert, wobei R die Anzahl der Listenelemente von F ist. Das Produkt aller Zahlen in F wird mit M bezeichnet. Nach Konstruktion ist M B-potenzglatt. Es ist sogar die größte B-potenzglatte Zahl.

Besitzt N zumindest einen Primteiler p mit p1 B-potenzglatt, so ist M ein Vielfaches dieser Zahl p1. Es ist daher (siehe voriger Absatz) ggT(N,aM1) ein echter Teiler von N, oder gleich N. In der Regel reicht eine kleinere Potenz von a als die M-te aus, um einen Teiler zu erhalten. Die praktische Vorgehensweise ist daher die folgende: Man berechnet iterativ

a1=a
ai+1=aiqi für i=1,...,R

Dabei werden in jedem Schritt die auftretenden Potenzen durch ihre Reste modulo N ersetzt. Nach einer bestimmten Anzahl von Schritten, z. B. dem 20., überprüft man, ob man bereits einen Teiler gefunden hat. Das heißt, man betrachtet ggT(a201,N). Ist dieser ggT größer als 1, so hat man einen Teiler bestimmt, und bricht das Verfahren ab; ist der ggT gleich 1, so fährt man in 20er-Schritten fort, bis man einen Teiler gefunden oder aR=aM erreicht hat.

Insgesamt können am Ende drei Fälle auftreten:

  1. Man findet einen echten Teiler von N. In diesem Fall war das Verfahren erfolgreich, und man hat N in zwei Faktoren zerlegt. Gegebenenfalls kann man das Verfahren erneut auf diese beiden Zahlen anwenden, bis man die Primfaktorzerlegung von N erhält, oder für einen der Faktoren von N Fall 3 auftritt.
  2. Man findet den Teiler N von N. Dieser Fall ist nicht besonders wahrscheinlich, kann aber auftreten. In diesem Fall ist es ratsam, einen anderen Wert für a zu wählen.
  3. Man findet den Teiler 1 von N. In diesem Fall war die Annahme, dass es einen Teiler p von N gibt, für den p1 B-potenzglatt ist, falsch. In diesem Fall sollte man die 2. Phase der p1-Methode starten.

Die 2. Phase des Verfahrens

Versagt das Verfahren in der 1. Phase, so liegt die Ursache oft darin, dass für die Primfaktoren p von N gilt, dass p1=ul. Dabei ist u B-glatt oder sogar B-potenzglatt, und l eine Primzahl, die größer als B ist. Mit anderen Worten: p1 ist nur wegen eines einzigen Primfaktors nicht B-(potenz-)glatt.

Man wählt daher eine zweite Schranke B1, um den Faktor l „einzufangen“. B1 sollte wesentlich größer als B gewählt werden, aber nicht größer als B2. Häufig wählt man B1 im Bereich von B43.

Analog zur ersten Phase erstellt man die Liste F1 der Primzahlen die zwischen B und B1 liegen. Dabei speichert man die erste dieser Zahlen als l1 und trägt in die Liste die Differenzen zwischen benachbarten Primzahlen ein. Die Anzahl der Elemente von F1 sei S. Beachte: Für B1<20.000.000 ist jede dieser Differenzen kleiner oder gleich 200. Es treten also nur wenige, und nur kleine Differenzen auf.

Als Startwert für die 2. Phase dient die Zahl aR, welche am Ende der 1. Phase berechnet wurde. Als weitere Vorbereitung berechnet man für jede Differenz d in F1 die Zahl

jd=aRd (genauer: den Rest dieser Zahl modulo N)

Einerseits müssen hier nur wenige jd berechnet werden, andererseits wird nur eine kleine Potenz benötigt. Wie in Phase 1 startet man nun wieder eine Iteration. Dabei kann man das aufwändige Potenzieren durch Multiplikationen ersetzen.

aR+1=aRl1
aR+i=aR+i1jdi=aRli1aRdi=aRli1+di=aRli für i=2,3,...,S

Dabei sei di die Differenz zwischen der (i1)-ten und der i-ten Primzahl in F1. Wiederum ersetzt man die Zahlen in jedem Schritt durch ihre Reste modulo N.

Anders als in Phase 1 reicht es nicht aus, nach einer festen Anzahl von Schritten den ggT(aR+i1,N) zu bilden. Stattdessen muss man die Zahlen aR+i1 akkumulieren, d. h. man bildet das Produkt all dieser Zahlen. Das kann im Zuge der obigen Iteration mit erledigt werden, indem man z1=aR+11, und zi=zi1(aR+i1) setzt. Durch das Akkumulieren erreicht man, dass auch Primfaktoren p von N gefunden werden können, bei denen mehr als ein Primfaktor von p1 größer als B ist.

Nach einer festen Anzahl von Schritten, etwa wieder jedem 20., bildet man ggT(zi,N). Wieder können am Ende die drei Fälle auftreten, die am Ende von Phase 1 auftreten konnten. Versagt das Verfahren, so kann man die Schranken B und B1 vergrößern und das Verfahren erneut starten. Besser ist es allerdings, in diesem Fall ein anderes Verfahren zu verwenden.

Die Heuristik des größten Primteilers

Eine natürliche Zahl m hat im Durchschnitt loglogm Primteiler. Diese Aussage lässt sich präzise formulieren und beweisen. Man tut so, als hätte die Anzahl der Primteiler von m genau diesen Wert, d. h., man nimmt an, dass

ω(m)=loglogm

Es sei nun q der größte Primteiler von m. Dann gilt:

ω(mq)=ω(m)1

Auflösen dieser Gleichung nach q liefert:

q=m11e

Dabei ist e die Eulersche Zahl. Das ist eine heuristische Begründung dafür, dass der größte Primteiler von m etwa gleich m0,632 ist. Dieser Sachverhalt wird genutzt, um einen Wert für die Suchschranke B aus dem obigen Verfahren zu bestimmen.

Anwendung auf das Verfahren

Sei nun N eine zusammengesetzte natürliche Zahl, auf die man die p1-Methode anwenden möchte. Da sie zusammengesetzt ist, besitzt sie einen Primteiler pN. Nach der Heuristik gilt für den größten Primteiler q von p1

q(p1)11en12(11e)n0,316

Wählt man also BN0,316, so ist zu erwarten, dass p1 B-glatt ist. Die B-Potenzglattheit lässt sich nun so erreichen: Angenommen p1 sei B-glatt. Dann gilt für alle Primteiler q von p1:

qeq(p1)n12Bee1

Wie in der Beschreibung der 1. Phase (siehe oben) erhält man daraus für eine B-potenzglatte Zahl m:

eq(m)ee1logBlogq1,6fq

Die Zahl fq ist hier dieselbe, die in der 1. Phase berechnet wurde.

Das bedeutet: Für diese Wahl von B muss man die Werte der fq durch die etwas größeren Werte 1,6fq ersetzen, um die B-Potenzglattheit der p1 zu erreichen.

In der Praxis legt man einen Wert für B fest und schließt umgekehrt, für welche Werte von N diese Schranke ausreichend ist. Hierfür gilt:

NB2ee1B3,164

Gibt man sich also die Schranke B=10.000 vor, so lassen sich damit alle N behandeln, die kleiner oder gleich 4,51012 sind.

Komplexität

Aus der Abschätzung BN0,316 ergibt sich eine Komplexität des Verfahrens von:

O(N3)

Der Aufwand wächst exponentiell mit der Länge der Eingabe.

Literatur

  • G. Tenenbaum: Introduction to Analytic and Probabilistic Number Theory. S. 41, Th. 6.