Arbeitsblatt 3a - ergänzte Version

Werbung
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 1 von 11
Primzahlen.
In der modernen Kryptologie spielen (insbesondere "große") Primzahlen eine zentrale
Rolle. Dabei stehen die folgenden zwei Fragen im Vordergrund:
1. Wie findet man eine große Primzahl in einem gegebenen Bereich ?
2. Wie erkennt man, ob eine gegebene große Zahl eine Primzahl ist ?
Das älteste allgemein bekannte Verfahren um festzustellen, welche Zahlen unterhalb
einer gegebenen natürlichen Zahl N prim sind, ist das "Sieb des Eratosthenes". Es
basiert auf der Idee, aus der anfangs betrachteten Menge M = { n | n  N, n>1 und
n N } beginnend mit n = 2 alle (echten) Vielfachen von n zu entfernen und dieses
Verfahren iterativ mit dem nächsten, nicht gestrichenen n so lange fortzusetzen, bis
die Menge M durchlaufen ist. Die dann verbleibende Restmenge enthält genau alle
Primzahlen zwischen 2 und N .
Der Sieb-Algorithmus kann nur zur Bestimmung aller Primzahlen unterhalb einer
gegebenen natürlichen Zahl N benutzt werden; es sei denn, man verwendet als
Initialisierung eine Tabelle aller bereits bekannten Primzahlen unterhalb eines
gewissen N1 < N . In diesem Falle lassen sich natürlich auch alle Primzahlen
zwischen N1 und N ermitteln. Um den Aufwand abzuschätzen, der benötigt wird,
um nach diesem Konzept von einer "grossen" Zahl festzustellen, ob sie prim ist, kann
man den Primzahlsatz verwenden, der hier ohne Beweis angegeben wird:
Satz 3a.1 (Primzahlsatz):
Für die Anzahl (N) der Primzahlen unterhalb einer natürlichen Zahl N gilt
asymptotisch (also für N ):
 ( N ) 

N 
N
.
ln N
Der Aufwand zur Bestimmung einer neuen Primzahl mit dem Sieb-Algorithmus ist
proportional der Anzahl der bereits gefundenen Primzahlen, und daher, wie der
Primzahlsatz zeigt, zur Bestimmung "großer" Primzahlen nicht geeignet. Hierfür
werden "Primzahltests" verwendet.
Ein Primzahltest ist ein Test darauf, daß eine vorgelegte natürliche Zahl keine
Primzahl ist: Wenn eine Zahl N einen Primzahltest "besteht", dann kann N eine
Primzahl sein; wenn N eine ganze Reihe von Primzahltests besteht, dann ist N sehr
wahrscheinlich eine Primzahl. Besteht N andererseits einen einzigen Primzahltest
nicht, dann ist N definitiv zusammengesetzt. Damit wird jedoch die Frage nach den
Primfaktoren von N nicht beantwortet. Im allgemeinen ist es sehr viel aufwendiger,
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 2 von 11
eine große Zahl zu faktorisieren, wenn man weiß, daß sie zusammengesetzt ist, als
eine Primzahl der gleichen Größenordnung zu finden (dies ist kein Satz, sondern eine
empirische Feststellung: Die Sicherheit des RSA-Systems beruht auf der Annahme,
daß es viel einfacher ist, zwei große Primzahlen p und q zu finden, als die Zahl n
= p*q zu faktorisieren).
Der erste, hier vorgestellte Primzahltest beruht auf dem (kleinen) Satz von FERMAT:
Wenn p eine Primzahl ist, dann gilt für jedes b mit ggT(b,p) = 1, daß
b p-1  1 mod p
(*)
ist.
Wenn p keine Primzahl ist, dann ist es möglich (aber nicht sehr wahrscheinlich), daß
(*) ebenfalls gilt (z.B. sind im Bereich 3  n < 2000 nur die Zahlen 341, 561, 645,
1105, 1387, 1729 und 1905 Pseudoprimzahlen zur Basis 2 und die Zahlen 91, 121,
671, 703, 949, 1105, 1541, 1729 und 1891 Pseudoprimzahlen zur Basis 3).
Falls jedoch für eine Zahl p mit einem einzigen teilerfremden b die Relation
(*) nicht gilt, dann ist p mit Sicherheit zusammengesetzt.
Dies führt zu der
Definition 3a.2:
Eine ungerade zusammengesetzte Zahl p, die für eine teilerfremde Basis b die
Relation (*) erfüllt, heißt Pseudoprimzahl zur Basis b .
(Eine Pseudoprimzahl ist also eine Zahl, die durch Erfüllen der Relation
"vorgibt", eine Primzahl zu sein.)
(*)
Beispiel:
Die Zahl 91 = 7 13 ist Pseudoprimzahl zur Basis 3 (390 mod 91 = 1) , nicht aber zur
Basis 2 (290 mod 91 = 64  1).
Leider gibt es – wenn auch sehr vereinzelt – zusammengesetzte Zahlen, die
Pseudoprimzahlen zu jeder erlaubten Basis sind:
Definition 3a.3:
Eine zusammengesetzte Zahl, die zu jeder erlaubten Basis Pseudoprimzahl ist, heißt
Carmichael-Zahl (die kleinste Carmichael-Zahl ist 561 = 3  11  17; auch die Zahlen
1105 = 5  13  17 und 1729 = 7  13  19, von denen wir oben gesehen haben, daß sie
Pseudoprimzahlen zu den Basen 2 und 3 sind, sind beispielsweise CarmichaelZahlen). Die ersten zehn davon sind
561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841 und 29341.
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 3 von 11
Es ist nicht bekannt, ob es unendlich viele Carmichael-Zahlen gibt; es wird jedoch
vermutet. Sie sind allerdings sehr selten; unterhalb von 25  10 9 gibt es lediglich
2163 Carmichael-Zahlen.
Carmichael-Zahlen widersprechen also am stärksten der Umkehrbarkeit des kleinen
Satzes von FERMAT.
Für Carmichael-Zahlen gelten folgende Aussagen (Beweise dazu vgl. z.B. Koblitz, N:
"A Course in Number Theory and Cryptography", Springer 1987):
Satz 3a.4:
Eine ungerade zusammengesetzte Zahl n ≥ 3 ist genau dann eine Carmichael-Zahl,
wenn gilt
a) n ist quadratfrei, d.h. n enthält keinen mehrfachen Primteiler,
b) Für jeden Primfaktor p | n gilt p – 1 | n – 1 .
Satz 3a.5:
Eine Carmichael-Zahl muß das Produkt von mindestens drei Primfaktoren sein.
Im Zusammenhang mit der Frage, "mit welcher Wahrscheinlichkeit" eine
Pseudoprimzahl tatsächlich Primzahl ist, ist der folgende Satz von Bedeutung:
Satz 3a.6:
Sei n eine zusammengesetzte Zahl.
(a) Falls n pseudoprim zu den zueinander und zu n teilerfremden Basen b1 und b2
ist, dann ist n auch pseudoprim zu den Basen b1 b2 und b1 b2-1 , wobei b2-1 die
Inverse zu b2 modulo n ist.
(b) Falls n den Test (*) für eine einzige Basis b nicht besteht, dann besteht n den
Test nicht für mindestens die Hälfte der möglichen Basen.
Beweis:
(a) folgt unmittelbar aus den Rechengesetzen in Restklassenringen. Zum Beweis von
(b) sei {b1 , b2 , . . . bk } die Menge aller Basen, für die n pseudoprim ist. Sei b eine
feste Basis, für die n nicht pseudoprim ist. Wäre nun n pseudoprim für irgend eine
Basis b bi , dann wäre nach (a) n auch pseudoprim für die Basis (b bi) bi-1 = b
im Widerspruch zur Annahme. Daher erfüllt n die Relation (*) nicht für die Basen
{bb1, bb2, . . . b bk}. Also gibt es mindestens ebenso viele Basen, für die n nicht
pseudoprim ist wie solche, für die n pseudoprim ist.
Wenn also n zusammengesetzt ist und nicht für jede mögliche Basis b die Relation
(*) erfüllt, dann wird bei zufällig gewähltem b mit ggT(b,n) = 1 die Wahrscheinlichkeit dafür, daß n nicht pseudoprim zu dieser Basis ist, mindestens 50%
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 4 von 11
betragen. Diese Überlegung ist die Grundlage einer Strategie zur Beantwortung der
Frage, ob eine gegebene natürliche Zahl n zusammengesetzt ist (leider versagt die
Argumentation bei den Carmichael-Zahlen, die die Relation (*) für jede mögliche
Basis erfüllen):
Angenommen, wir wollen herausfinden, ob eine große ungerade natürliche Zahl n
eine Primzahl ist. Dazu wählen wir zunächst ein zufälliges natürliches b mit 0 < b < n
und bestimmen d = ggT(b,n). Ist d > 1, dann ist n zusammengesetzt und d | n . Ist d =
1, dann berechnen wir z = b n-1 mod n. Ist z  1, dann ist n zusammengesetzt,
andernfalls besteht eine Chance dafür, daß n eine Primzahl ist.
Um diese Chance zu vergrößern, wiederholen wir das Verfahren maximal k mal.
Erfüllt n für sämtliche zufälligen b i , i = 1, 2, ... k die Relation (*), dann ist die
Wahrscheinlichkeit dafür, daß n zusammengesetzt und keine Carmichael-Zahl ist,
höchstens gleich 1 / 2 k (vgl. hierzu auch die Anmerkung am Ende des Arbeitsblatts).
Die geschilderte Idee führt auf den folgenden Algorithmus zur Beurteilung dessen, ob
eine vorgelegte Zahl n wahrscheinlich Primzahl (oder Carmichael-Zahl) ist oder
nicht:
Algorithmus 3a.7:
0. Setze k = 0 , wähle ein natürliches k0 > 1.
1. Wähle eine zufällige Zahl b mit 0 < b < n . Bilde d = ggT(b,n). Setze k = k+1.
2. Falls d > 1, gib aus: "n ist zusammengesetzt" und beende den Algorithmus.
3. Bilde z = bn-1 . Falls z  1 mod n , gib aus: "n ist zusammengesetzt" und
beende den Algorithmus.
4. Falls k < k0 , gehe zu Schritt 1, andernfalls gib aus: "n ist mit Wahrscheinlichkeit
größer als 1 - 1 / 2k eine Primzahl oder eine Carmichael-Zahl" und beende den
Algorithmus.
Ein solcher Test wird, da er die Primalität von n nicht mit Sicherheit nachweisen
kann, als "probabilistischer Primzahltest" bezeichnet (in diesem Fall ist er
allerdings, streng betrachtet, kein Primzahltest, sondern ein Test darauf, ob die
vorgelegte Zahl Prim- oder Carmichael-Zahl ist).
Eine Implementierung dieses Pseudoprimzahl-Tests in C++ kann etwa wie folgt
aussehen (dabei wurde die Zahl k0 = 10 gewählt)1:
// Test auf Pseudo-Primalitaet implementiert in C++
1
Da in C++ kein elementarer Datentyp für beliebig große Integers existiert, muß der
benutzerdefinierte Datentyp langzahl über die Quelldatei langzahl_mfc.cpp eingeführt
werden. Langzahlen können dann als Zeichenketten definiert und ansonsten wie Integers behandelt
werden.
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 5 von 11
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include "langzahl_mfc.cpp"
#define k0 10
langzahl plrand(langzahl lseed) // erzeugt große Zufallszahlen
{
langzahl xl, b = "4294967296";
langzahl zl = "6364136223846793005";
xl = (lseed * zl + 1) % (b*b);
return xl;
}
int main()
{
char s[101];
for (int i=0; i<101; i++) s[i] = ' ';
unsigned long t;
double tinvers;
langzahl z, seed, p, a, zero;
CString pstr, tstr;
cout << "Eingabe Zahl: ";
cin >> s;
cout << endl;
pstr = s;
p = cstring2lang(pstr);
seed = 3551;
if ((p % 2) == zero)
{
cout << pstr << " ist keine Primzahl" << endl;
getchar();
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 6 von 11
return 0;
}
t = 2;
for (int k=0; k<k0; k++)
{
wieder:
a = plrand(seed);
seed = a;
a = a % p;
if (ggT(a,p) != 1) goto wieder;
z = expo(a, p-1, p);
if (z == 1)
{
if (k == k0-1)
{
tinvers = 1-1/(double)t;
tstr.Format("%f",tinvers);
cout << pstr << " ist mit Wahrscheinlichkeit> " << tstr;
cout << " Primzahl oder Carmichael-Zahl" << endl;
}
t = 2*t;
continue;
}
if (z != 1)
{
cout << pstr << " ist keine Primzahl" << endl;
getchar();
return 1;
}
t = 2 * t;
}
getchar();
return 0;
}
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 7 von 11
Der Schönheitsfehler des Pseudoprimzahl-Tests, der darin liegt, daß man (wegen der
nur sporadisch vorkommenden Carmichael-Zahlen allerdings mit geringer
Wahrscheinlichkeit) bei positivem Ausgang eine Carmichael-Zahl statt einer
Primzahl erwischen kann, führt zur Forderung nach anderen Tests, bei denen
lediglich die Alternative besteht, daß sich n entweder mit Sicherheit als
zusammengesetzt oder aber mit beliebig vorgegebener Wahrscheinlichkeit als
tatsächlich prim erweist.
Zu diesem Zweck definieren wir eine EULER-Pseudoprimzahl:
Definition 3a.8:
Eine ungerade zusammengesetzte Zahl n heißt EULER-Pseudoprimzahl zur Basis b,
wenn ggT(n,b) = 1 ist und die Relation
b
b( n 1) / 2    mod n
n
(**)
gilt. Dabei ist das sogenannte JACOBI-Symbol
bn 

gleich 0, wenn n | b ,

gleich 1, wenn b ein quadratischer Rest modulo n ist,

gleich −1, wenn b ein quadratischer Nicht-Rest modulo n ist.
Zunächst gilt:
Satz 3a.9:
Ist n eine Primzahl, dann ist die Relation (**) für jedes b  Z erfüllt.
Beweis:
Falls n | b, sind beide Seiten von (**) gleich Null.
Falls b ein quadratischer Rest modulo n ist, ist also b = r 2 mod n für eine ganze Zahl
r. Dann folgt
b( n 1) / 2  r n 1  1 mod n
nach dem Satz von FERMAT.
Sei g eine Primitivwurzel mod n . Für das Element y: = g (n-1)/2 gilt y  1 mod n , aber
y 2  1 mod n. Da im Restklassenkörper modulo n die Gleichung x 2 = 1 nur die
beiden Lösungen 1 hat, folgt y  −1 mod n . Sei jetzt b eine zu n teilerfremde ganze
Zahl, die kein quadratischer Rest modulo n ist. Dann gilt b = g s mod n mit einem
ungeraden s. Da
s(n  1) / 2  (n  1) / 2 mod (n  1) ist, folgt
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 8 von 11
b( n 1) / 2  g s ( n 1) / 2  g ( n 1) / 2  1 mod n .
Satz 3a.10:
Ist n eine EULER-Pseudoprimzahl zur Basis b, dann ist n eine Pseudoprimzahl zur
Basis b.
Beweis:
Quadrieren der Relation (**) liefert die Relation (*).
Anmerkung:
Die Umkehrung von Satz 3a.10 ist falsch (Beispiel: 91 ist Pseudoprimzahl zur Basis
3, nicht aber EULER-Pseudoprimzahl zu dieser Basis).
Wir notieren nun, daß der oben angegebene Primzahltest entsprechend modifiziert
auf EULER-Pseudoprimzahlen für Carmichael-Zahlen nicht versagt, d.h. diese
Zahlen als zusammengesetzt ausweist. Dazu formulieren wir:
Satz 3a.11:
Für eine zusammengesetzte Zahl n erfüllen mindestens die Hälfte aller b  (Z / nZ)*
nicht die Relation (**).
Beweisskizze:
Zunächst beweist man: Erfüllt ein b1 die Relation (**) und ein b2 nicht, dann erfüllt
auch b1 b2 die Relation nicht. Erfüllt also nur ein einziges b die Relation nicht, dann
ist die Anzahl der b's , die sie nicht erfüllen, mindestens so groß wie die der b's , die
sie erfüllen (die Argumentation ist analog zu der im Beweis von Satz 3a.6).
Da mithin für ein beliebiges zusammengesetztes n die Relation (**) für mindestens
die Hälfte der möglichen Basen b nicht erfüllt ist, gibt es auch kein Analogon zu den
Carmichael-Zahlen bei diesem Test (die Relation (**) kann nicht für alle erlaubten
Basen erfüllt sein!). Der Algorithmus des nach SOLOVAY und STRASSEN
benannten Tests auf Nicht-Primalität einer gegebenen Zahl n verläuft also ganz genau
so wie der Algorithmus 3a.7 mit der entsprechenden Modifikation in Schritt 3. Dort
b
ist allerdings das JACOBI-Symbol ni zu berechnen, worauf hier nicht eingegangen
werden soll (dazu muß festgestellt werden, ob das gewählte bi ein quadratischer Rest
modulo n ist oder nicht). Ein Algorithmus zur Berechnung des JACOBI-Symbols
findet sich an vielen Stellen in der Literatur, z.B. in Forster,O:"Algorithmische
Zahlentheorie", Vieweg 1996.

Dort finden sich auch weitere Primzahltests: Einer der bekanntesten ist der
sogenannte strenge Pseudoprimzahl-Test, der den Vorteil hat, daß das JACOBISymbol nicht berechnet werden muß.
Dazu sieht man sich den kleinen Satz von FERMAT etwas genauer an:
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 9 von 11
Ist p eine ungerade Primzahl und b teilerfremd zu p, dann ist also b p-1  1 mod p. Da
p ungerade ist und p | b p-1 – 1 ist mithin
b( p 1) / 2  1 mod p .
Diese Überlegung können wir wiederholen, so lange wir nochmals ohne Rest durch 2
teilen können. Wir schreiben also
p = 2s r + 1
mit ungeradem r. Sei nun 0  t  s die kleinste Zahl, so daß
t
b 2 r  1 mod p
ist. Falls t ≥ 1, ist wie oben
t
p | (b2 r  1)  (b2
t 1
r
 1)(b2
t 1
r
 1),
also, da t minimal gewählt war:
b2
t 1
r
 1 mod p .
Damit haben wir folgende Verallgemeinerung des kleinen Satzes von FERMAT
bewiesen:
Satz 3a.12:
Sei n ≥ 3 prim und
n = 2 s r + 1 mit ungeradem r.
Dann gilt für ein zu n teilerfremdes b entweder
b r  1 mod n ,
(***)
t
oder es gibt ein 0  t  s mit b 2 r  1 mod n .
Wir definieren nun
Definition 3a.13:
Sei n ≥ 3 ungerade, zusammengesetzt und ggT(b,n) = 1. Dann heißt n eine strenge
Pseudoprimzahl zur Basis b, wenn (***) gilt.
Man kann zeigen, daß n eine Primzahl ist, wenn n strenge Pseudoprimzahl zu allen
erlaubten Basen ist. Damit gibt es keine Analoga zu den Carmichael-Zahlen, diese
können keine strengen Pseudoprimzahlen sein.
Da man außerdem beweisen kann, daß eine ungerade zusammengesetzte Zahl eine
strenge Pseudoprimzahl zu höchstens ¼ aller erlaubten Basen sein kann, lässt sich ein
probabilistischer Primzahltest angeben, der analog wie im Falle des einfachen
Pseudoprimzahl-Tests argumentiert und das Ergebnis liefert, daß eine ungerade Zahl
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 10 von 11
n mit einer Wahrscheinlichkeit von mehr als 1 − (1/4) k tatsächlich eine Primzahl ist,
falls die Relation (***) für k zufällig gewählte Basen erfüllt ist: Den Algorithmus für
diesen (am häufigsten benutzten) probabilistischen Primzahltest von MILLER und
RABIN stellen wir hier ohne Beweis vor:
Algorithmus 3a.14 (MILLER und RABIN):
0. Wähle die ungerade zu testende Zahl n, k = 0, k0 > 1 und bestimme q und t mit
n−1 = 2t q, q ungerade.
1. Wähle ein zufälliges a mit 1 < a < n . Setze e = 0, b = a q mod n . Falls b = 1
und k = k0 , gehe zu Schritt 4. Ist b = 1 und k < k 0 , setze k = k+1 und gehe zu
Schritt 1.
2. So lange gilt b   1 mod n und e < t − 1, setze b = b2 mod n und e = e + 1.
Falls b  n – 1 mod n, gib aus "n ist zusammengesetzt" und beende den
Algorithmus.
3. Ist k < k0 , setze k = k + 1 und gehe zu Schritt 1. Ist k = k0 , gehe zu Schritt 4.
4. Gib aus "n ist mit Wahrscheinlichkeit größer als 1 - 1 / 4k eine Primzahl" und
beende den Algorithmus.
Anmerkung zum probabilistischen Primzahltest.
Ist n eine Primzahl oder eine Carmichael-Zahl ?
Die beiden Ereignisse
A: n ist zusammengesetzt und keine Carmichael-Zahl,
A': n ist Primzahl oder Carmichael-Zahl
partitionieren den Ereignisraum. Bei willkürlicher Wahl einer natürlichen Zahl n ist
P(A) = P(A') = ½ .
Das Ereignis B sei:
Ein k-maliger Test mit willkürlich gewählten erlaubten Basen liefert bi n-1 = 1 mod n
für i = 1 bis k.
Die Wahrscheinlichkeit P(A | B) ist dann
P( A | B) 
P( B | A)  P( A)
.
P( B | A)  P( A)  P( B | A' )  P( A' )
Die auf der rechten Seite auftretenden bedingten Wahrscheinlichkeiten sind:
Prof. Dr. Gerhard Berendt
SS 2005
Mathematische Grundlagen der Codierung / Endliche Strukturen
Arbeitsblatt 3a / S. 11 von 11
P(B | A) < (½) k ,
da – wenn A zutrifft – nach Satz 3a.6 mindestens genau so viele Basen
existieren, die den Test nicht erfüllen wie solche, die den Test erfüllen, und die
einzelnen Tests stochastisch unabhängig sind,
P(B | A') = 1,
da – wenn A nicht zutrifft – jede erlaubte Basis den Test erfüllt.
Damit folgt
P(A | B) < (½) k
wie behauptet.
Herunterladen