]> git.leopard-lacewing.eu Git - crypt.git/commitdiff
Berechnung des Jacobi-Symbols für ungerade n > 2 hinzugefügt, siehe auf Folie 4.2/10.
authorjakob <jakob@6904cdf7-2833-49b9-980b-463876255000>
Sat, 1 May 2010 11:55:12 +0000 (11:55 +0000)
committerjakob <jakob@6904cdf7-2833-49b9-980b-463876255000>
Sat, 1 May 2010 11:55:12 +0000 (11:55 +0000)
git-svn-id: https://drops.fb12.tu-berlin.de/svn/crypt/trunk@4 6904cdf7-2833-49b9-980b-463876255000

jacobiSymbol.m [new file with mode: 0644]

diff --git a/jacobiSymbol.m b/jacobiSymbol.m
new file mode 100644 (file)
index 0000000..1902472
--- /dev/null
@@ -0,0 +1,65 @@
+function r = jacobiSymbol(a, n)
+    %
+    % Berechnet das Jacobi-Symbol "a über n" für ungerade n > 2.
+    %
+    
+    if (~isinteger(a))
+        a = int32(a);
+    end
+    
+    if (~isinteger(n))
+        n = int32(n);
+    end
+    
+    if a >= n
+        a = mod(a, n);
+    end
+
+    if a == 1
+        r = 1;
+        
+    elseif a == 0
+        r = 0;
+        
+    elseif a == 2
+        
+        switch mod(n, 8)
+            case {1, 7}
+                r = -1;
+            case {3, 5}
+                r = 1;
+        end
+        
+    else
+                
+        if mod(a, 2) == 0
+            % a gerade
+            
+            k = 1;
+            p = 2;
+            
+            while mod(a, 2*p) == 0
+                k = k + 1;
+                p = p * 2;
+            end
+            
+            r = jacobiSymbol(idivide(a,p), n) * jacobiSymbol(2, n)^k;
+            
+        else
+            % a ungerade
+            
+            if (mod(a, 4) == 3 && mod(n, 4) == 3)
+                r = -jacobiSymbol(n, a);
+                
+            else
+                r = jacobiSymbol(n, a);
+                
+            end
+            
+        end
+        
+    end
+    
+end
+    
+