--- /dev/null
+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
+
+