From: jakob Date: Sun, 2 May 2010 07:18:03 +0000 (+0000) Subject: Fehler in Berechnung des Jacobi-Symbols korrigiert. Solovay-Strassen-Test und Rabin... X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=e30ec7742235c64848d67ad7512e305270482327;p=crypt.git Fehler in Berechnung des Jacobi-Symbols korrigiert. Solovay-Strassen-Test und Rabin-Miller-Test hinzugefügt. git-svn-id: https://drops.fb12.tu-berlin.de/svn/crypt/trunk@5 6904cdf7-2833-49b9-980b-463876255000 --- diff --git a/bsp18.m b/bsp18.m new file mode 100644 index 0000000..082d2e1 --- /dev/null +++ b/bsp18.m @@ -0,0 +1,13 @@ + + +n = 15 +a = []; + +for i = 1:(n-1) + if rabinMillerTest(n, i) + a = [a i]; + end +end + +a + diff --git a/jacobiSymbol.m b/jacobiSymbol.m index 1902472..6c1374c 100644 --- a/jacobiSymbol.m +++ b/jacobiSymbol.m @@ -25,9 +25,9 @@ function r = jacobiSymbol(a, n) switch mod(n, 8) case {1, 7} - r = -1; - case {3, 5} r = 1; + case {3, 5} + r = -1; end else diff --git a/rabinMillerTest.m b/rabinMillerTest.m new file mode 100644 index 0000000..79dac7b --- /dev/null +++ b/rabinMillerTest.m @@ -0,0 +1,55 @@ +function isPrime = rabinMillerTest(n, a) + % + % Rabin-Miller Primzahltest + % Prüft, ob n Primzahl ist. + % Führt den Test mit Basis a durch (1 <= a <= n-1). + % + % Fehlerwahrscheinlichkeit unter 25 Prozent. + % + + if (n == 2) + isPrime = 1; + + elseif mod(n, 2) == 0 + isPrime = 0; + + elseif gcd(n, a) ~= 1 + isPrime = 0; + + else + + % Größte Zweierpotenz aus n-1 herausholen + + s = 1; + p = 2; + + while mod(n-1, 2*p) == 0 + s = s + 1; + p = p * 2; + end + + % Größte Zweierpotenz in n-1 ist also p=2^s + d = (n-1)/p; + + b = sqmult(a, d, n, '*', 1); + + if mod(b, n) == 1 + isPrime = 1; + + else + isPrime = 0; + + for i = 1:s + if mod(b, n) == mod(-1, n) + isPrime = 1; + break; + end + + b = mod(b*b, n); + end + + end + + end + +end \ No newline at end of file diff --git a/solovayStrassenTest.m b/solovayStrassenTest.m new file mode 100644 index 0000000..d0183ef --- /dev/null +++ b/solovayStrassenTest.m @@ -0,0 +1,45 @@ +function isPrime = solovayStrassenTest(n, a) + % + % Solovay-Strassen Primzahltest + % Prüft, ob n Primzahl ist. + % Führt den Test mit Basis a durch (1 <= a <= n-1). + % + % Ergebnis 0 (keine Primzahl) ist immer korrekt. + % Ergebnis 1 (Primzahl) ist in mindestens 50 Prozent der Fälle korrekt. + % + + + % Falls n bzw. a integer sind, macht das komischerweise Probleme mit + % sqmult... + + %if (~isinteger(n)) + % n = int32(n); + %end + + %if (~isinteger(a)) + % a = int32(a); + %end + + + if (n == 2) + isPrime = 1; + + elseif mod(n, 2) == 0 + isPrime = 0; + + else + j = jacobiSymbol(a, n); + + if j == 0 + isPrime = 0; + + else + j = mod(j, n); + b = sqmult(a, (n-1)/2, n, '*', 1); + + isPrime = (j == b); + end + + end + +end \ No newline at end of file