From: jakob Date: Sat, 1 May 2010 11:55:12 +0000 (+0000) Subject: Berechnung des Jacobi-Symbols für ungerade n > 2 hinzugefügt, siehe auf Folie 4.2/10. X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=f30db33217d0001f0bc1a1fe1102b30c2e36cb88;p=crypt.git Berechnung des Jacobi-Symbols für ungerade n > 2 hinzugefügt, siehe auf Folie 4.2/10. git-svn-id: https://drops.fb12.tu-berlin.de/svn/crypt/trunk@4 6904cdf7-2833-49b9-980b-463876255000 --- diff --git a/jacobiSymbol.m b/jacobiSymbol.m new file mode 100644 index 0000000..1902472 --- /dev/null +++ b/jacobiSymbol.m @@ -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 + +