]> git.leopard-lacewing.eu Git - crypt.git/commitdiff
Fehler in Berechnung des Jacobi-Symbols korrigiert. Solovay-Strassen-Test und Rabin...
authorjakob <jakob@6904cdf7-2833-49b9-980b-463876255000>
Sun, 2 May 2010 07:18:03 +0000 (07:18 +0000)
committerjakob <jakob@6904cdf7-2833-49b9-980b-463876255000>
Sun, 2 May 2010 07:18:03 +0000 (07:18 +0000)
git-svn-id: https://drops.fb12.tu-berlin.de/svn/crypt/trunk@5 6904cdf7-2833-49b9-980b-463876255000

bsp18.m [new file with mode: 0644]
jacobiSymbol.m
rabinMillerTest.m [new file with mode: 0644]
solovayStrassenTest.m [new file with mode: 0644]

diff --git a/bsp18.m b/bsp18.m
new file mode 100644 (file)
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
+
index 1902472fe6252cb50805b548d90711bb8d96cb70..6c1374c9588d6f9079e7a98aeefa3d89e5f3ff5f 100644 (file)
@@ -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 (file)
index 0000000..79dac7b
--- /dev/null
@@ -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 (file)
index 0000000..d0183ef
--- /dev/null
@@ -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