Studienarbeit
im Fachbereich Informationstechnik
Studiengang Softwaretechnik
der
Fachhochschule für Technik Esslingen\
Zvonko Kosic (Krnjajic)\
ll Betreuer: & Prof. Dr. Ing. Reinhardt Schmidt
Bearbeitungszeitraum: & 28.03.2005 bis 15.06.2005
Esslingen, Juni 2005
Die Frage, auf welche Arten sich eine gegebene natürliche Zahl
Wichtige Grundbausteine der Kryptographie sind Funktionen, die leicht berechnet, aber schwer invertiert werden können. Durch sie kann zum Beispiel verhindert werden, daß ein Angreifer den Schlüssel berechnen kann, wenn er eine Nachricht und den dazugehörigen Geheimtext vorliegen hat. In der Kryptologie nutzten Public-Key Verfahren solche Funktionen zur Verschlüsselung. Faktorisierungsprobleme z.B. werden speziell in RSA- und Rabin-Kryptosystemen ausgenutzt. Ein weiteres hartes Problem ist die Berechnung von diskreten Logarithmen das vom ElGamal-Krytosystem genützt wird.
Das Fehlen von effizienten Algorithmen zur Primfaktorzerlegung einer ganzen Zahl macht eine Faktorisierung in kurzer Zeit unmöglich. Für relativ kleine Zahlen ist eine Zerlegung mit der Probedivision möglich. Die Komplexität wächst jedoch mit der Größe der Zahl. Wird die zu untersuchende Zahl um ein paar Stellen vergrößert, benötigt die Probedivision die 100 fache Zeit.
Bisher bekannte Faktorisierungsverfahren haben zwar ein deutlich besseres Zeitverhalten als die Faktorisierung mit der Probedivision, doch für die Zerlegung von in der Kryptologie verwendenten Zahlen mit über 200 Dezimalstellen würden diese Verfahren Jahre brauchen. Ob es schnellere Verfahren gibt, ist nicht bekannt, aber auch nicht auszuschließen.
Peter Shor zeigte 1994 einen praktisch verwendbaren Algorithmus für Quantencomputer. Der in den Forschungslabors von AT&T arbeitende Mathematiker konnte beweisen, daß mit dieser neuen Generation von Rechnern die zur Zeit am häufigsten benutzten Geheimcodes ohne Probleme zu knacken sind. Eine Umsetzung dieses Algorithmus wäre eine Gefahr für die bestehende Kryptographie.
In dieser Studienarbeit sollen einige aus der Literatur bekannte Faktorisierungsverfahren untersucht und implementiert werden. Die Implementation erfolgt in C mit Hilfe der GNU multiple precision library, kurz GMP. Als weiterer Schritt sollen die Faktoriserungsverfahren in MATLAB Integriert werden, d.h. ein Aufruf aus MATLAB soll möglich sein. Die Verfahren dienen dann als Ergänzung zur bestehenden “crytlib”. Nicht alle Verfahren eignen sich um große Zahlen in entsprechender Zeit zu faktorisieren deshalb wird jedes Verfahren auf die Laufzeit geprüft. Zudem muss man unterscheiden ob sich eine Zahl aus kleinen bzw. großen Primfaktoren zusammensetzt. Vergleiche der Faktorisierungsverfahren werden aufzeigen welche Verfahren für die jewelige Situation am günstigsten sind.
Das Rechnen mit natürlichen Zahlen geht auf das Zählen zurück. Die
Addition der Zahlen
Die ganzen Zahlen bilden einen Ring bezüglich der Addition und der
Multiplikation, d. h. sie können ohne Einschränkung addiert, subtrahiert
und multipliziert werden. Dabei gelten Rechenregeln wie das
Kommutativgesetz und das Assoziativgesetz für Addition und
Multiplikation, außerdem gelten die Distributivgesetze. Die Menge
Eine weiter wichtige Eigenschaft von
Die Division ist in
Die Tatsache das
Ist
Gibt es zu der natürlichen Zahl
Offenbar ist mit
Unter Benutzung der Subtraktion kann der Begriff der Teilbarkeit auch
als eine lineare Gleichung aufgefasst werden:
Eine erste Aufgabe der Zahlentheorie besteht darin, eine gegebene
natürliche Zahl
Eine natürliche Zahl
In den Elementen von Euklid (Buch IX) findet sich ein Satz der besagt,
dass es unendlich viele Primzahlen gibt. Bei Euklid kommt das Wort
unendlich nicht vor, er formuliert seinen Satz wie folgt: Die
Primzahlen sind mehr als jede vorgegebene Menge von Primzahlen. Für den
Beweis nahm Euklid an, dass es endlich viele Primzahlen
Betrachtet wird die Zahl
Dieser Beweis ist konstruktiv, denn er zeigt außer der Gültigkeit des
Ergebnisses auch einen ganz konkreten Weg auf, wie man aus bekannte
Primzahlen neue Primzahlen gewinnen kann. Geht man z.B. von
$M = \left\lbrace 2, 3, 5, 31 \right\rbrace $ aus und konstruiert daraus
$ m = 2 \cdot 3 \cdot 5 \cdot 31 + 1 = 931$, das ist zwar keine Primzahl
aber es gilt
Zahlen der Form $M_n = 2^n - 1 $ werden, dem französischen Mathematiker
Mersenne zu Ehren, Mersenne-Primzahlen bezeichnet. Mersenne unternahm
große Anstrengungen, solche Primzahlen zu finden, und mit Fermat und
Descartes darüber zu korrespondieren. Es läßt sich zeigen das die Zahl
$M_n = 2^n -1 $ höchstens dann eine Mersennesche Primzahl, wenn der
Exponent
in der beide Faktoren rechts
Eine zweite Art von Primzahlen sind die Fermatschen Primzahlen. Diese
Primzahlen haben die Form
Es ist bekannt, dass man ganze Zahlen in ihre Primfaktoren zerlegen
kann. So ist
Jede ganze Zahl
mit
Man nennt die durch den Hauptsatz gegebene Zerlegung von
Die Implementierung der Faktorisierung-Algorithmen erfolgt in C. Zur späteren Integration in MATLAB ist es wichtig das die Programme mit einem C-Compiler übersetzt werden können. Da mit sehr großen Zahlen gerechnet wird eine Bibliothek zur Langzahlarithmetik verwendet.
Die GMP (GNU multiple precision) ist frei verfügbar und auf fast allen Betriesbsystemen lauffähig. Die GNU MP ist eine portable freie Bibliothek, geschrieben in C, für Langzahlarithmetik auf Ganzen und Rationalen Zahlen. Ihr Hauptziel ist es eine schnellte Arithmetik zur Verfügung zu stellen, für alle Anwendungen die eine höhere Genauigkeit benötigen als es die Datentypen in C unterstützten. Viele Anwendungen benutzen gerade einige hundert Bits zur Darstellung von Datentypen. Doch es gibt Anwendungen die auf eine höhre Genauigkeit angwiesen sind und einige Tausend bzw. Millionen von Bits brauchen. Die Hauptanwendungen für GMP sind die Kryptographie, Kryptoanalyse, Algebrasysteme und Numerische Methoden.
Bevor eines der aufwändigeren Faktorisierungsverfahren zur Anwendung
kommt, wird man natürlich die vorgegebene Zahl
$ \prod_{p\leq B} (1- \frac{1}{p})\sim \frac{e^{-\gamma}}{log B} \approx \frac{0.5615}{log B}$
abgeschätzt werden, wobei hier
Es gibt einige Varianten der Probedivision. Die erste und einfachste ist
indem bei der Zahl 2 anfangend der Reihe nach durch alle Primzahlen
Das Sieb des Eratosthenes wird dem griechischen Mathematiker Eratosthenes von Kyrene zugeschrieben. Er war Vorsteher der Bibliothek von Alexandria und fand Lösungen für ganz unterschiedliche Probleme.
Mit einer Schranke
Die Probedivision läßt sich so implementieren das einmal eine Liste von Primzahlen, entweder als Bit-Array oder alternativ immer die Hälfte der Differenz einer Primzahl zur vorhergehenden Primzahl gespeichert wird. In letzterem Fall benötigt man für jede Primzahl <1.872.851.947 nur ein Byte Speicherplatz. Alternativ kann man Bibliotheksfunktionen benützen die Primzahlen liefern.
Die GNU MP besitzt einige Zahlentheoretische Funktionen, unter anderem
auch die Funktion mpz_next_prim_p(mpz_t op) die Primzahlen
Es ist offensichtlich das die Verteilung der Primzahlen immer dünner
wird. Es gibt z.B. 168 Primzahlen zwischen 1 ud 1000, 77 Primzahlen
zwischen 199 000 und 200000 und 49 Primzahlen zwischen
Dem 15 jährigen Gauss gelang es, durch Studium von numerischen
Primzahltabellen, eine Vergleichsfunktion zu entdecken, die wie die
Funktion
Es ist
Der Primzahlsatz besagt, dass die Funktion von Gauss
Nach der Rechnung mit der Approximation von Gauss gibt es für große
Zahlen etwa
Im Durchschnitt werden, falls
Die Probedivision ist für Zahlen geeignet, die aus kleinen Faktoren
besteht. Oft wird die Probedivision dazu verwendet von einer Zahl
herauszufinden ob sie kleine Teiler enthält. Bis zu einer Schranke z.B.
*Beispiel:
Es soll die Zahl
Der erste Schritt besteht aus einem Primzahltest und testet ob
\
- Schritt: Testen ob die erste Primzahl
$2$ ein Teiler von$n$ ist,$420\equiv0\ mod\ 2 \rightarrow$ wir haben ein Teiler gefunden. Die Zahl$n$ wird jetzt so oft wie möglich durch$2$ geteilt bis das Ergebnis teilerfremd zur$2$ ist. Als Ergebnis erhalten wir$\frac{420}{2} = 210, \frac{210}{2} = 105$ .
\ - Schritt: Testen ob die zweite Primzahl
$3$ ein Teiler ist,$105\equiv 0\ mod\ 3 \rightarrow$ ein weiterer Teiler. Ergebnis$\frac{105}{3} = 35$ .
\ - Schritt: Testen ob die dritte Primzahl
$5$ ein Teiler ist,$35\equiv 0\ mod\ 5 \rightarrow$ der nächste Teiler.
Als Ergebnis erhalten wir die komplette Faktorisierung von$420 = 2^2\cdot3\cdot5\cdot7$ .
* Bei der Probedivision ergeben sich zwei Probleme. Bei der Faktorisierung einer sehr großen Zahl müssen möglicherweise sehr viele Primzahlen ermittelt oder gespeichert vorliegen. Besteht die Zahl$n$ aus etwa zwei gleichgroßen Primfaktoren$s,t$ muss im schlimmsten Fall durch alle Primzahlen$p<s$ bzw.$p<t$ geteilt werden. Wird versucht eine zusammengesetzte Zahl$n$ mit üblichen 150 Stellen mit der Probedivision zu faktorisieren, sieht man erst nach einer einfachen Rechnung welche unglaubliche Zeit man dafür brauchen würde.
Beispiel:
Es soll eine aus etwa zwei gleichgroßen Primfaktoren zusammengesetzte Zahl $n$ faktorisiert werden.
Nach dem großen Primzahlsatz gilt: $\frac{10^{75}}{ln(10^{75})} = 5,79\cdot10^{72}$. Ein Pentium 4 bei einer Taktfrequenz von 3 GHz kann ungefähr $6\cdot10^9 FLOPS$ erreichen, d.h. wir können ungefähr $10^9$ Zahlen pro Sekunde testen.
Aus $\frac{5,79\cdot10^{72}}{6\cdot10^9} = 9,65\cdot10^{62}$ und $\frac{9,65\cdot10^{62}}{60\cdot60\cdot24\cdot365} = 3,13\cdot10^{55}$ folgt das man ungefähr $\mathbf{10^{55} Jahre}$ brauchen würde um die Zahl $n$ zu faktorisieren!
Die Tabelle zeigt ein paar Faktorisierungsbeispiele der jeweiligen Verfahren. In weiteren Kapiteln werden ein Verfahren nach dem anderen aufgelistet und die Stärken und Schwächen anhand konkreter Beispiele gezeigt. Die Zeit entspricht der kompletten Faktorisierung.
Nr. Verfahren zu faktorisierende Zahl
Für kleine Primfaktoren ist die Probedivision unschlagbar wie man sehr schnell am letzten $n$ erkennt. Sobald aber die Primfaktoren etwa gleichgroß sind wird die Probedivision sehr sehr langsam.
Das kleine Teiler einer großen Zahl mit der Probedivision gefunden
werden können ist plausibel und überrascht nicht besonders. Erstaunlich
ist es aber das auch Teiler von
Seine Idee besteht darin, dass man versucht eine ungerade Zahl
Das wir jede natürliche Zahl als Differenz zweier Quadrate darstellen
können läßt sich einfach zeigen. Aus
$ a = x + y$
$ b = x - y$.
Durch Addition und Subtraktion von
$ a+b = 2x$
$ a-b = 2y$,
auflösen nach
$ x = \frac{1}{2}(a+b)$
$ y = \frac{1}{2}(a-b)$.
Schreibt man jetzt
Ausgehend davon das unsere Primfaktoren
Der Algorithmus sieht dann folgendermaßen aus. Als ersten Schritt setzt
man
Bei der Berechnugn von
Aus
Man erkennt, dass man nachfolgende Quadratzahlen
Um den mehrfachen Aufruf von mpz_perfect_square_p(v) zu vermeiden,
werden nur die Reste
*Beispiel:
Die Zahl
\
- Schritt: Man setzt
$u_1 = \lceil\sqrt{1052507}\rceil = 1026$ .\ - Schritt: Berechnen von
$v_1 = {u_1}^2 - n = 1026^2 - 1052507 = 169$ .\ - Schritt: Überprüfen ob
$v_1$ Quadratzahl ist.$v_1 = 169$ ,$\sqrt{169} = 13$ ,$13$ ist Quadratzahl\ - Schritt: Berechnen der Faktoren
$n = (u_1 - \sqrt{v_1})(u_1 + \sqrt{v_1}) = (1026 - 13)(1026 + 13) = 1013\cdot1039$ .
Als Ergebnis erhält man die Faktorisierung der Zahl$n=1052507=1013\cdot1039$ .
*
Der Worst-Case tritt dann auf wenn die zusammengesetzte Zahl in der From
Die Fermat-Faktorisierung ist nur dann effizient wenn $n$ zwei beieinander liegende Faktoren besitzt. Am Beispiel der Zahlen $7,8,9$ wird es sichtbar. Es wird auch direkt sichtbar, wie die Zeiten der Zahlen $n$ mit kleinen Faktoren immer größer werden obwohl der kleinste Primfaktor gleich ist. Umgekehrt steigen die Zeiten bei der Probedivision bei Primfaktoren, die in der Gegend von $\sqrt{n}$ liegen
Nr. Verfahren zu faktorisierende Zahl
Die Stärke der beiden Methoden zu vereinigen war eine Idee von Lehman. Er erzielte so eine Laufzeitverbesserung mit der Kombination beider Verfahren.
Die Lehmann-Methode wendet die Probedivision für
Die sogenannte
Der
Ist nun
Theoretisch könnte dies auch erst nach
Es wird ein Urnenmodell gewählt und es stellt sich die Frage: Wie oft
muss aus einer Urne, welche
ll
\
ll
&
&
\
Beispielsweise ergibt sich für
Für das Ausgangsproblem, wo
Es wäre sehr aufwendig, bei grosser Periode, die ganze Folge
Damit braucht man nur parallel zur Folge der
\
*Beispiel:
Es soll die Zahl
\
- Schritt: Man wählt eine Zufallszahl
$z = 431$ und initalisiert$x = y = 431$ \ - Schritt: Man berechne die rekursive Folge
$x_{n+1} = f(x_n)$ und$y_{n+1} = f(f(y_n))$ und testet ob$d = ggT(x-y,n) \neq 1$ . Hat man ein$d>1$ ist$d$ ein nicht trivialer Teiler von$n$ .
$x = y = 431$ *
Iteration
1
Als Ergebnis erhält man die Faktorisierung der Zahl
\
Das Verfahren sieht im Detail folgendermaßen aus. Man wählt eine
Abbildung
Als ersten Schritt wählt mann eine Zufallszahl und setzt
Das Verfahren kann aus zwei Gründen scheitern. Ist
Ist der
Bei der Berechnung des
Im Mittel benötigt die
Für die nachfolgenden Beispiele wurde einige Einträge entfernt. Sie sollten nur in den vorherigen Abschnitten den Unterschied zwischen Probedivision und Fermat aufzeigen. Für die weitere Betrachtung sind die beiden Verfahren zu langsam, aus anschaulichen Zwecken bleibt jedoch ein Beispiel.
Nr. Verfahren zu faktorisierende Zahl
Die Pollard Rho ist wieder eine Verbessrung im Vergleich zu Fermat und schafft die Zahl $12$ für die Fermat über $500\ sec$ gebraucht hat innerhalb von $1\ sec$. Beeindruckend ist wie schnell auch die komplette Faktorisierung der Zahl $2^{101}-1$ und $2^{201}-1$ vollzogen wurde.
Die Zahl
Bei der
Der kleine Satz von Fermat besagt, dass der Ausdruck
Wenn wir nun z.B. durch Raten alle Primfaktoren von
Der Wert von
Bei einem Test auf den
Für
Um die Anzahl der recht aufwendigen
Dafür wird für alle Primfaktoren
Beispiel:
*Man wählt z.B für
Darauf hin wird die Zahl
* Beispiel:
*Als
* Die Faktorisierung konnte nur gelingen weil alle Teiler
Falls der Grundalgorithmus versagt, kann man ein zweite Phase anhängen.
Diese zweite Phase ist erfolgreich, wenn
Als ersten Schritt setzt man
Insgesamt können am Ende jeder Phase 3 verschiede Fälle auftreten:
-
Man findet einen Teiler von N. Falls dieser Teiler nicht prim ist, kann man versuchen diesen Teiler auch zu zerlegen.
-
Man findet den Teiler N von N. Dieser Fall ist nicht besonder wahrscheinlich, kann aber auftreten. In diesem Fall kann man das Verfahren mit neuem
$a$ wieder starten -
Man findet den Teiler 1 von N. Befindet man sich in der ersten Phase war die Annahme falsch das ein Teiler existiert der B-potenzglatt ist. Befindet man sich in der zweiten Phase sollte man die Grenzen
$B$ und$B1$ erhöhen.
Die Pollard
Die Pollard
Wie vorhin erwähnt schlägt das $(p-1)$ Verfahren fehl, wenn die Primfaktoren einer Zahl größer sind als die Schranke $B$. Hat man Faktoren $p_1, p_2,...<B$ hat man relativ schnell die Faktorisierung einer Zahl vollzogen.
Nr. Verfahren zu faktorisierende Zahl
Aufbauend auf der Kettenbruchmethode von John Brillhart und Michael Morrison, sowie inspiriert durch das lineare Sieb von Richard Schroeppel erfand Carl Pomerance 1981 durch theoretische Überlegungen das Quadratische Sieb, welches schneller war, als alle bis dahin bekannten Faktorisierungsverfahren.
1994 gelang es mit Hilfe des Quadratischen Siebs die berühmte 129-stellige Zahl RSA-129 zu faktorisieren.
Das quadratische Sieb stellt einen der am weitestenn entwickelten
Algorithmen zur Faktorisierung dar. Das quadratische Sieb lässt sich in
zwei Schritte gliedern. Der erste Schritt ist der sogennante
Siebschritt, bei dem bestimmet Kongruenzen gesucht werden. Im zweiten
Auswahlschritt werden Kongruenzen ausgewählt mit denen sich eine
Zerlegung finden lässt.
Das quadratische Sieb basiert darauf, zwei Zahlen
In diesem Fall gilt dass
Daraus folgt das
\
Beispiel:
Die Zahl $n=6583175$ soll faktorisiert werden:
Es ist $x = 325$ und $y = 210$, dann gilt, dass
$x^2 \equiv y^2\ mod\ 6583175$ und $105625 \equiv 44100\ mod\ 6583175$
ist. Gleichzeitig gilt aber auch das $x \not\equiv \pm y\ mod\ 6583175$,
$325 \not\equiv \pm 210\ mod\ 6583175$ ist.
Der größte geimeinsame Teiler
\
Das quadratische Sieb ist eine Verfeinerung der Fermat-Methode. Die
Fermat-Methode basierte darauf das zwei ungefähr gleichgroße Primzahlen
die Zahl
Für die bestimmung der Variablen
Es gilt
\
*Beispiel:
Für die zu faktorisierende Zahl
*
... ... ... ...
Bei einem
\
Um zu überprüfen ob eine Zahl
Für das Sieben wird ein Intervall festgelegt, in dem die Werte für
Es wird nun ausgenutzt, dass das Polynom
Anschließend wird das Intervall nach einer zweiten Nullstelle
durchsucht. Hat man die zweite Nullstelle gefunden wird analog zur
ersten Stelle verfahren. Das Verfahren für eine Primzahl
Hat mann als Schranke z.B.
\
*Beispiel:
Es wird das Sieb für
*
Man erkennt für die Primzahl
Der große Vorteil am Sieb-Verfahren ist, dass man sich eine große Menge
an unnötiger Probedivisionen sparen kann und man maximal ein Intervall
der Länge der Primzahl
Hat man alle
Hier wird ausgenutzt das man aus solchen Kombinationen von Faktoren
leicht die Wurzel ziehen kann und man trotzdem eine eine natürliche Zahl
erhält. Ist die resultierende Zahl positiv und die Vielfachen der
Primfaktoren
Beispiel:
Nach kurzer Suche in der Tabelle, ergibt sich eine Kombination der
$f(s)$ Gleichung mit $s=1$ und $s=19$, bei der alle Primfaktoren mit
geraden Exponenten vorkommen. Natürlich können mehrere $f(s)$ Werte
Bestandteil einer Kombination sein.
Nun gilt mit $(s+m)^2 \equiv f(s)\ mod\ n$ = $y^2 \equiv x^2\ mod\ n$:
$(103\cdot121)^2\equiv2^3\cdot3\cdot7\cdot2^3\cdot3\cdot5^2\cdot7\ mod\ n$
$(103\cdot121)^2\equiv2^6\cdot3^2\cdot5^2\cdot7^2\ mod\ n$
$(103\cdot121)^2\equiv(2^3\cdot3^1\cdot5^1\cdot7^1)^2\ mod\ n$
Daraus ergibt sich
$103\cdot121 = 2022\not\equiv840 = 2^3\cdot3\cdot5\cdot7\ mod\ n$
Es ergeben sich Werte für $x = 2022$ und $y=840$ für die gilt
$x^2\equiv y^2\ mod\ n$ sowie $x^2\not\equiv\pm y^2\ mod\ n$ ist. Bildet
man den größten gemeinsamen Teiler, so erhält man
$ggT(4088484-705600, 10441) = 197$.
Um schnell eine gültige Kombination zu finden werden
Bei wenigen
Jeder
wobei
\
*Beispiel:
Zur Vereinfachung werden nur die Werte von
Man ordnet jeder Gleichung ein
*
Mit den obigen
\
Primzahl Gleichung
Aus dem Gleichungsystem erkennt man, dass die Exponenten der Primzahl
$p=3\ \ \lambda_1:\ 2^3\cdot3\cdot7
\lambda_{19}:\ 2^3\cdot3\cdot5^2\cdot7$
Die Koeffizienten
\
**
Primzahl Gleichung
Löst man das Gleichunssystem, ergibt sich:
$\lambda_1 = \lambda_2 = 0 $ und
Damit weiss man, dass man die Gleichung 1. und 19. zu wählen hat, um
eine Quadratzahl zu erhalten.
\
Bei solchen kleinen Gleichungssystemen ist es unproblematisch eine Lösung zu finden bzw. zu berechnen. Hat man aber eine sehr große Zahl zu faktorisieren kann es sein das man tausende von Gleichungen lösen muss, um eine Lösung zu finden. Das Auflösen des Gleichungssystems kann z.B. mit dem Gauß-Verfahren erfolgen. Doch bei so dünnbesetzten Gleichungssystemen wird man auf andere Verfahren umsteigen wie z.B. das von Wiedemann, das Verfahren der Konjugierte Gradienten oder das Lanczos Verfahren.
Das Quadratische Sieb eignet sich für große Zahlen bis etwa 110 Stellen, die keine Primpotenz sind. Für größere Zahlen ist das Zahlkörpersieb besser geeignet.
Der Aufwand steigt mit der größe der zu faktorisierenden Zahl
Häufig kann die Laufzeit eines Algorithmus in gewisse Kategorien eingeordnet wrde, z.B. lineare Laufzeit, polynomielle Laufzeit oder exponentielle Laufzeit.
Die Laufzeit des quadratischen Siebs ist zwischen der exponentiellen und der polynomiellen Laufzeit anzusiedeln. Um dies abzubilden wird folgende Gleichung verwendet:
Es ist bisher nicht gelungen, die Laufzeit des quadratischen Siebs
endgültig zu bestimmen, da Annahmen über die Verteilungder
Folgende mathematisch-rechnerisch aufwendigen Schritte sind für die Anwendung des quadratischen Siebs auszuführen:
-
Die Berechnung der Quadratwurzel von
$f(x)\ mod\ p$ in der Faktorbasis ist in Polynomzeit möglich. Die Berechnung aller Wurzeln sollte also in$L_n[\frac{1}{2},v+o(1)]$ Zeiteinheiten möglich sein. -
Die Siebzeit pro Primzahl
$p$ ist in der Ordnung$O(\frac{L_n[\frac{1}{2}, v+\frac{1}{4v}+o(1)]}{p})$ , da man in Schritten der Länge$p$ durch das Intervall$L_n[\frac{1}{2},v]$ gehen muss. Die gesamte Siebzeit inklusive der Vorberechnungen hat dann in etwa die Laufzeit$L_n[\frac{1}{2}, v+\frac{1}{4v}+o(1)]$ . -
Das Auflösen des Gleichungssystems mit dem Algorithmus von Wiedmann für dünn bestzte Gleichungssysteme benötigt etwa
$L_n[\frac{1}{2}, 2v+o(1)]$ Zeiteinheiten. Durch die Festsetzung des Wert$v = \frac{1}{2}$ wird die Siebzeit minimerit und wiederum mit der Zeit für das Lösen des Gleichungssystems gleichgesetzt.
Man erhält insgesamt eine Laufzeitabschätzung mit
Das quadratische Sieb ist zur Zeit das beste Verfahren um Primfaktoren einer Zahl in der Größenordnung von $100$-Stellen zu ermittlen. Im April 1994 konnte eine aus dem RSA-Verfahren entnommene 428-bit Zahl mit dem quadratischen Sieb faktorisiert werden. Eindrucksvoll ist auch das Beispiel $8$ in der Tabelle. In der Zeit von $79sec$ wurde ein $53$-stelliger Primfaktor der Zahl $n$, mit $73$-Stellen, ermittelt.
Nr. Verfahren zu faktorisierende Zahl
$ 678231584178474632390847 $ $ 684837382241323474$
Das Gegenstück zur
Wählt man nämlich
dass
Die Teilerbezeichnung
Der Algorithmus sieht dann folgendermaßen aus. Man wähle eine ganze Zahl
Die Williams p+1 Methode ist ähnlich der Pollard (p-1) Methode so dass ähnliche Laufzeiten zu erwarten sind.
Nr. Verfahren zu faktorisierende Zahl
$ 112323511231212312311231$
Das
Ist
genügen, zusammen mit dem unendlichen Punkt
beschrieben werden. Singularitätenfrei heißt, dass wenn man die obige
Kurvengleichung auf die Form
Elliptische Kurven sind keine Ellipsen. Der Name kommt daher, dass die Kurven mit den sogenannten Elliptischen Integralen zusammenhängen.
Die wichtigste Eigenschaft von elliptischen Kurven ist, dass sie abelsche Gruppen bilden. Eine abelsche Gruppe ist eine Gruppe die zusätzlich zu den Gruppenaxiomen fordert das die Verknüpfung in der Gruppe kommutativ ist. Zur kurzen Wiederholung und zum Vergleich mit den Eigenschaften der Addition auf einer elliptischen Kurve über einem Körper sind hier die vier Gruppenaxiome aufgelistet:
-
Für alle
$a, b$ gilt$a\circ b\in G$ . Die Verknüpfung führt nicht aus der Gruppe. -
Es ist
$(a\circ b)\circ c = a\circ (b\circ c)$ für alle$a,b,c\in G$ . Es muss das Assoziativgesetz gelten. -
Es gibt ein Element
$e\in G$ , sodass$e\circ a = a\circ e = a$ für alle$a\in G$ gilt. Das Element$e$ heißt neutrales Element. -
Zu jedem Element
$a\in G$ gibt es ein Element$a^{-1}\in G$ , sodass$a^{-1}\circ a= a\circ a^{-1} = e$ ist. Das Element$a^{-1}$ heißt inverses Element.
Im weiteren soll gezeigt werden welche Fälle für die Addition von zwei
Punkten
Es seien
-
Ist
$P=O$ bzw.$Q=O$ , so ist$P+Q = Q$ bzw.$P+Q=P$ , d.h.$O$ spielt die Rolle eines neutralen Elements bezüglich der Addition. -
Liegen
$P$ und$Q$ spiegelbildlich bezüglich der x-Achse, so ist$P+Q=O$ . Insbesondere sind in diesem Fall wegen dem vorherigen Satz die Punkte$P$ und$Q$ zueinander invers ($ -P=(x,-y) = Q $) . -
Liegt weder der erste bzw. der zweite Fall vor, so ist
$P+Q = R$ definiert. Man bestimmt den eindeutig definierten Schnittpunkt der Sekante durch$P$ und$Q$ mit der Kurve und definiert$P+Q$ als seinen Spiegelpunkt bezüglich der x-Achse.
Die einzige Schwierigkeit um zu zeigen dass eine elliptische Kurve mit
der Addition eine abelsche Gruppe bildet ist das Assoziativgesetz.
Hierfüt gibt es außer dem Beweis durch Nachrechnen noch verschiedenen
elegantere Beweise, etwa mit Hilfe von doppelperiodischen Funktionen in
der Funktionentheorie. Das neutrale Element ist per Definition
Die Addition zweier Punkte auf einer elliptischen Kurve läßt sich auch
in Formeln ausdrücken. Dazu sind zwei Punkte
Für die Koordinaten
Tritt hier der Fall ein das
Jetzt sei ein Punkt
Tritt hier der Fall
Beispiel:
Die elliptische Kurve $E$ über $\mathbb R$ sei gegeben durch
$y^2 = x^3-10x+11$. Es sollen die beiden Punkte $P=(-3.5,1.77)$ und
$Q=(0.2,3.0)$ addiert werden.
Mit $x_P \neq x_Q$ gilt für
$k=\frac{y_Q-y_P}{x_Q-x_P} = \frac{3.0 - 1.77}{0.2 + 3.5} = 0.332432 $.
Für $x_R$ folgt dann
$x_R = k^2-x_P-x_Q = 0.332432^2 + 3.5 - 0.2 = 3.41051$
und
$y_R = k(x_P - x_R) - y_P = 0.332432(-3.5 - 3.41051) - 1.7 = -4.06728$.
Die Addition kann im Fall
Für die Gruppeneigenschaft ist die Bedingung
Die Frage die sich jetzt stellt ist, wie kann man elliptische Kurven zur
Faktorisierung benützen. Zu Begin des Kapitels wurde erwähnt, dass das
Faktorisierungsverfahren mit elliptischen Kurven stärker ist als das
*Beispiel:
Es wird die Primzahl
Für die Ordnungen der elliptischen Kurven
*
Kurvenparameter b Ordnung Primfaktorzerlegung
$0$ $2804$ $(2,2,701)$
$1$ $2888$ $(2,2,2,19,19)$
$2$ $2836$ $(2,2,709)$
$3$ $2848$ $(2,2,2,2,2,89)$
$4$ $2856$ $(2,2,2,3,7,17)$
$5$ $2827$ $(11,257)$
$6$ $2904$ $(2,2,2,3,11,11)$
$7$ $2878$ $(2,1439)$
$8$ $2819$ $(2819)$
$9$ $2736$ $(2,2,2,2,3,3,19)$
$10$ $2778$ $(2,3,463)$
Man erkennt dass je nach Wahl der Kurvenparameter die Ordnung bzw. die Anzahl der Punkte eine elliptischen Kurve variiert.
Beim
Die Faktorzerlegung von
Der Algorithmus sieht dann folgendermaßen aus. Der erste Schritt besteht
aus der Wahl des Kurvenparameters
Zuerst sollte festgehalten werden das nicht direkt in
Tritt keine Ausnahme ein, also findet man keinen größten gemeinsamen
Teiler, wird die Schranke
Bei der Faktorisierung mit elliptischen Kurven sollte erwähnt werden,
dass viele Kurven ausprobiert werden müssen um auf einen Teiler zu
kommen. Insgesamt ist der Rechenaufwand zur Auffindung eines Primfaktors
Im ungünstigsten Fall
In der Praxis können mit dem Verfahren mit elliptischen Kurven
Primfaktoren von
Die Tabelle zeigt ein paar Faktorisierungsbeispiele mit elliptischen Kurven. Zum Vergleich wurde nur das $(p-1)$-Verfahren in Betracht gezogen um zu zeigen das die elliptischen Kurven eine Verbesserung gegenüber $(p-1)$ bzw. $(p+1)$ zeigen.
Nr. Verfahren zu faktorisierende Zahl
Man erkennt für die Zahl $3$ bzw. $4$, dass das Verfahren mit elliptischen Kurven die Zahl innerhalb von $5$ Sekunden faktorisiert hat, wofür das $(p-1)$-Verfahren über $18$ Sekunden gebraucht hat.
Jedes C-Programm kann aus MATLAB aufgerufen werden als wäre es ein eingebautes Kommando. Ein C-Programm das man in MATLAB aufrufen kann wird als MEX-Datei bezeichnet. MEX-Dateien sind dynamisch gebundene Bibliotheken die der MATLAB-Interpreter automatisch laden und entladen kann.
MEX-Dateien werden gebraucht wenn vorhandene C-Programme aus MATLAB aufgerufen werden sollen ohne als M-Dateien neuimplementiert zu werden. Werden in MATLAB-Programmen Konstrukte verwendet, z.B. for-Schleifen, die in MATLAB nicht sehr performant sind, können sie in C implementiert werden und die Anwendung um einiges schneller machen.
MEX-Dateien sind nicht für alle Anwendungen zu gebrauchen. Deshalb sollte vorher überlegt werden ob überhaupt MEX-Dateien gebraucht werden. Der größte Teil der Programmierung sollte in MATLAB erfolgen.
MEX-Dateien sind Unterprogramme die aus C-Code erstellt werden. Sie
verhalten sich wie M-Dateien und eingebaute Kommandos. MEX-Dateien
werden anhand ihrer plattformabhängigen Endung indentifiziert im
Gegensatz zu M-Dateien die eine plattformunabhängige Endung besitzen.
Der Grund für die verschiedenen Endungen ist, dass MEX-Dateien, die z.B.
unter Windows erstellt wurden, unter Linux bzw. irgendeinem anderen
UNIX-Derivat nicht lauffähig sind. Wird unter einer Linux-Umgebung eine
MEX-Datei in MATLAB aufgerufen, weiß MATLAB sofort dass die MEX-Datei
mit der Endung mexglx unter Linux ausführbar ist.
Die folgende Tabelle zeigt die verschiedenen Endungen auf den
Plattformen:
Plattform MEX-Datei Endung
HP-UX mexhpux Linux mexglx Solaris mexsol Windows dll
Wird z.B. die Funktion yprime innerhalb von MATLAB aufgerufen, sucht der Interpreter in der Liste der Verzeichnisse, die Verzeichnisse werden in einer speziellen Umgebungsvariable gespeichert dazu später mehr, nach einer Datei mit der plattformabhängigen Endung aus der obigen Tabelle bzw. nach einer Hilfe Datei die als M-File vorliegt. MEX-Dateien haben Vorrang vor M-Dateien, d.h. gibt es zwei gleichnamige Dateien mit verschiedenen Endungen wird die Datei mit einer MEX-Endung bevorzugt. Wenn MATLAB schließlich eine entsprechende Datei findet wird sie geladen und ausgeführt.
Damit MATLAB die C-Funktionen ausführen kann, müssen die MEX-Dateien (sie beinhalten die C-Funktionen) entweder in einem Verzeichnis das MATLAB kennt oder aber im aktuellen Verzeichnis liegen. Funktionen die im akutellen Verzeichnis liegen, haben Vorrang bzw. werden zuerst gefunden. Das aktuelle Verzeichnis läßt sich mit dem Kommando cd wechseln, gleich dem cd Shell Kommando.
Um zu erfahren welche Verzeichnisse MATLAB bekannt sind, kann man das Kommando path auf der Kommandozeile ausführen. Neue Verzeichnisse lassen sich leicht mit dem addpath Kommando hinzufügen. Eine weitere einfache Möglichkeit stellt die GUI zur Verfügung, in dem man auf File->SetPath klickt. Im folgendem Dialog lässt sich über einen Datei-Browser das Verzeichnis hinzufügen.
Vorsicht geboten ist bei Dateien die auf einem Netzlaufwerk liegen. Einige Datei-Server aktualisieren Veränderungen nicht sofort und so kann es passieren das MATLAB mit den alten Dateien weiterarbeitet. Abhilfe schafft der Wechsel in ein anderes Verzeichnis und die Rückkehr ins ursprüngliche Verzeichnis.
MATLAB speichert und arbeitet mit einem einzigen Daten-Objekt dem MATLAB-Array. Alle MATLAB Variablen: Skalare, Vektoren, Matrizen, Strings, Strukturen und Objekte werden in einem MATLAB-Array gespeichert. In C wird das MATLAB-Array als Datentyp mxArray deklariert. Dieser Datentyp ist mächtiger als ein normales C-Array, denn es enthält weiterführende Informationen zum Array. Unter anderem enthält die mxArray-Struktur Informationen über den Typ, Dimensionen, ob das Array imaginäre Zahlen enthält usw.
Ein wichtiger Punkt beim benützen von mxArrays ist das MATLAB die
Daten spaltenweise und nicht zeilenweise speichert, wie es in Fortran
üblich ist. Der Grund für diese Konvention ist das MATLAB ursprünglich
in Fortran geschrieben wurde.
\
Beispiel:
Gegeben sei in Array mit 3 Strings:
a=['house'; 'floor'; 'porch']
a =
house
floor
porch
mit den Dimensionen:
size(a)
ans =
3 5
und dem Speicherabbild:
\
h f p o l o u o r s o c e r h
Die Dimensionen sind nicht wie erwartet
Eine MATLAB Installation enthält alle Werkzeuge die notwendig sind um mit der API zu arbeiten. Unter anderem enthält die Installation einen C-Compiler mit dem Namen Lcc. Will man einen eigenen Compiler benützen muss drauf geachtet werden das es ein ANSI C-Compiler ist und das auf der Microsoft Plattform dll Dateien erstellt werden können.
MATLAB unterstützt viele Compiler und liefert für den jeweiligen Compiler eine Konfigurationsdatei mit, die die spezifischen Flags der Compiler steuern. Auf der Homepage von MathWorks lassen sich weitere Konfigurationsdateien runter laden und an den eigenen Compiler anpassen. MATLAB bietet so eine bestmögliche Flexibilität zum erstellen von MEX-Dateien.
Bevor überhaupt MEX-Dateien auf der Windows Plattform erstellt werden können, muss die Konfigurationsdatei mexopts.bat für den Compiler erstellt werden. Am einfachsten ist es das mex-Skript mit dem Aufrufparameter setup aufzurufen.
mex -setup
Mit dem mex-Skript, der Aufruf kann wahlweise vom Kommandoprompt in MATLAB oder einer MS-DOS Eingabeaufforderung erfolgen, lassen sich jederzeit Optionen ändern und hinzufügen. Da MATLAB einen Compiler von Haus aus mitliefert ist es meisstens nicht nötig den Compiler zu wechseln, das mex-Skript verwendet dann den mitgelieferten Lcc-Compiler.
Hat man sich einen eigenen Compiler konfiguriert und möchte das eine bestimmte Konfigurationsdatei verwendet wird kann man das mit dem -f Parameter erzwingen.
mex filename -f <optionsfile>
MATLAB liefert vorab erstellte Konfigurationsdateien für verschiedene Compiler mit, die mit dem mex-Skript benützt werden können.
C MEX-Dateien werden mit dem mex-Skript erstellt. Das Skript übersetzt den C-Code mit zusätzlichen API-Routinen in ein ablauffähiges Programm.
Der Quellcode für eine MEX-Datei besteht aus zwei unterschiedlichen Teilen. Der erste Teil ist die computational routine. Sie enthält den eigentlichen Anwendungscode. Der Anwendungscode kann sowohl Berechnungen ausführen als auch Daten eingeben bzw. ausgeben. Der zweite Teil ist die sogenannte gateway routine. Sie bildet die Schnittstelle zwischen MATLAB und der computational routine. Die zwei Programmteile einer MEX-Datei können getrennt (in zwei Dateien) oder zusammengefasst (in einer Datei) werden. In beiden Fällen muss die Header-Datei mex.h eingefügt werden. In der Header-Datei sind die gateway routine und die Schnittstellen-Routinen deklariert. Der Name der gateway routine muss auf jeden Fall mexFunction lauten. Der Prototyp sieht folgendermaßen aus:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Die Parameter nlhs und nrhs enthalten die Anzahl der Input und Output Argumente mit welchen die MEX-Datei aufgerufen wurde. Die Parameter plhs und prhs sind Vektoren die Zeiger auf die Argumente enthalten. Alle Eingabe- und Ausgabeparameter bzw. Argumente werden in der gateway routine ver- und aufbereitet. Die gateway routine ruft die computational routine als Unterprogramm auf.
Die übergebenen Daten, Parameter werden in der gateway routine in C-Datentypen umgewandelt. Wie vorhin erwähnt kennt MATLAB nur einen Datentyp das mxArray. Mit der Zeigerarithmetik in C lassen sich darauf nicht ohne weiteres Operationen ausführen. Will man z.B auf den ersten double-Wert aus dem mxArray prhs zugreifen, muss man sich zuerst ein Pointer auf das Array holen. Das kann z.B. mit der Funktion mexGetPr(prhs[0]) erfolgen. Dieser Pointer kann dann wie jeder andere in der Programmiersprache C benützt werden.
Nach dem Aufruf der computational routine aus der gateway routine
müssen plhs[0], plhs[1], plhs[2], ... auf die Daten zeigen die
zurückgegeben werden sollen. Nach erfolgreicher Abarbeitung kehrt das
Programm zurück und übergibt die Kontrolle wieder an MATLAB.
Das Übersichtsbild zeigt den generellen Ablauf bei C MEX-Dateien.\
Unterschied zwischen Funktionen mit mx und mex Präfix {#unterschied-zwischen-funktionen-mit-mx-und-mex-präfix .unnumbered}
API-Funktionen mit dem Präfix mx erlauben es mxArrays zu erzeugen, verändern, zerstören und darauf zu zugreifen. Ein Beispiel für so eine Funktione wäre mxGetPi, sie gibt einen Zeiger auf den Imaginären Teil einer Zahl im mxArray zurück. API-Funktionen mit dem Präfix mex interagieren mit der MATLAB-Umgebung.
Der folgende Abschnitt enthält Informationen und ein Besipiel, dass zeigt wie Argumente in MEX-Dateien übergeben und manipuliert werden können.
Die MATLAB API stellt einen kompletten Satz an Funktionen zur Verfügung mit denen es möglich ist, die verschiedenen Datentypen zu benützen die in MATLAB vorrätig sind. Für jeden Datentyp gibt es einen speziellen Satz an Funktionen die für die Manipulation des jeweiligen Datentyps verwendet werden können. Das Beispiel das beschrieben wird zeigt auf, wie aus einer C-Datei bzw. C-Code eine MEX-Datei entsteht.
Für das Beispiel wird eine C-Funktion verwendet die ein Skalar quadriert. Hier der dazugehörige Code:
/* Datei: square.c */
#include <math.h