Zum Inhalt springen

Lucas-Lehmer-Test

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 11. Oktober 2010 um 00:02 Uhr durch Zumthie (Diskussion | Beiträge) (Pythonprogramm). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Ausschnitt von Seite 316 der Arbeit Théorie des Fonctions Numériques Simplement Périodiques von Édouard Lucas (1878)

Der Lucas-Lehmer-Test ist ein Primzahltest für Mersenne-Zahlen, das heißt für Zahlen der Form . Der Test wird im GIMPS-Projekt (engl.: Great Internet Mersenne Prime Search), der Suche nach bisher nicht bekannten Mersenne-Primzahlen, angewandt.

Dieser Test beruht auf Eigenschaften der Lucas-Folgen und nicht wie der Lucas-Test auf dem kleinen Fermatschen Satz.

Funktionsweise

Der Lucas-Lehmer-Test ist zum Testen von Mersenne-Zahlen ab M3 geeignet. Er basiert ganz wesentlich darauf, dass die Mersenne-Zahlen im Dualsystem nur aus lauter Einsen bestehen und funktioniert wie folgt:

Sei p ungerade und prim. Die Folge S(k) sei definiert durch S(1) = 4, S(k+1) = S(k)2–2.
Dann gilt: Mp = 2p–1 ist genau dann eine Primzahl, wenn S(p–1) durch Mp teilbar ist.[1]

Dieser Satz wurde 1930 von Derrick Lehmer gefundenen und geht auf Édouard Lucas zurück (siehe Abbildung). Mit Hilfe der Kongruenzschreibweise lässt sich der Satz so formulieren:

Sei S(1) = 4, S(k+1) ≡ S(k)2–2 mod Mp. Dann gilt: Mp ist genau dann eine Primzahl, wenn S(p–1) ≡ 0 mod Mp.

Beispiele

Beispiel 1: Wir prüfen mit diesem Verfahren, ob M5 = 25–1 = 31 eine Primzahl ist:

 S(1) = 4
 S(2) = ( 4² - 2) mod 31 = 14
 S(3) = (14² - 2) mod 31 =  8
 S(4) = ( 8² - 2) mod 31 =  0

Da S(4) = 0 ist, ist M5 = 31 eine Primzahl.

Beispiel 2: Wir prüfen, ob M11 = 211–1 = 2047 eine Primzahl ist:

 S( 1) = 4
 S( 2) = (   4² - 2) mod 2047 =   14
 S( 3) = (  14² - 2) mod 2047 =  194
 S( 4) = ( 194² - 2) mod 2047 =  788
 S( 5) = ( 788² - 2) mod 2047 =  701
 S( 6) = ( 701² - 2) mod 2047 =  119
 S( 7) = ( 119² - 2) mod 2047 = 1877
 S( 8) = (1877² - 2) mod 2047 =  240
 S( 9) = ( 240² - 2) mod 2047 =  282
 S(10) = ( 282² - 2) mod 2047 = 1736

Da S(10) > 0 ist, ist M11 = 2047 keine Primzahl (es gilt 2047 = 23·89).

Beispiel 3: Wir prüfen, ob M19 = 219–1 = 524287 eine Primzahl ist:

 S( 1) = 4
 S( 2) = (      4² - 2) mod 524287 =     14
 S( 3) = (     14² - 2) mod 524287 =    194
 S( 4) = (    194² - 2) mod 524287 =  37634
 S( 5) = (  37634² - 2) mod 524287 = 218767
 S( 6) = ( 218767² - 2) mod 524287 = 510066
 S( 7) = ( 510066² - 2) mod 524287 = 386344
 S( 8) = ( 386344² - 2) mod 524287 = 323156
 S( 9) = ( 323156² - 2) mod 524287 = 218526
 S(10) = ( 218526² - 2) mod 524287 = 504140
 S(11) = ( 504140² - 2) mod 524287 = 103469
 S(12) = ( 103469² - 2) mod 524287 = 417706
 S(13) = ( 417706² - 2) mod 524287 = 307417
 S(14) = ( 307417² - 2) mod 524287 = 382989
 S(15) = ( 382989² - 2) mod 524287 = 275842
 S(16) = ( 275842² - 2) mod 524287 =  85226
 S(17) = (  85226² - 2) mod 524287 = 523263
 S(18) = ( 523263² - 2) mod 524287 =      0

Da S(18) = 0 ist, ist M19 = 524287 eine Primzahl (dies ist schon seit 1603 bekannt).

Pythonprogramm

Umsetzung des Lucas-Lehmer-Test in ein Pythonprogramm (in der Programmiersprache Python kann mit beliebig großen ganzen Zahlen gerechnet werden, Grenzen setzt lediglich der verfügbare Speicher).

Auf einem Intel Pentium 4 von 2005 benötigt die Rechnung für p = 11213 mit diesem Programm nur 41 Sekunden. Die Rechnung im Jahr 1963, mit der nachgewiesen wurde, dass M11213 prim ist, dauerte dagegen auf einem Supercomputer Illiac II (siehe en.wikipedia Illiac II) noch 2¼ Stunden (siehe Donald B. Gillies: Three new Mersenne primes and a statistical theory).

#!/Lucas-Lehmer-Test
print 'Lucas-Lehmer-Test (Mersenne-Zahlen)'
p = int(raw_input ('Exponent p  von 2^p-1 '))
m=2**p-1
print 'm = 2 ^',p,'- 1 =',m
s=4
for i in range (2,p):
    s=(s*s-2)%m
print 'ist',
if s==0:
    print 'eine',
else:
    print 'keine',
print 'Mersenne-Primzahl'

Literatur

Einzelnachweise

  1. Zum Beweis siehe Ribenboim: Die Welt der Primzahlen, S. 78/79.