|
@@ -43,23 +43,34 @@ def Legendere(a, p):
|
43
|
43
|
def Jacobi(a, n):
|
44
|
44
|
if (n % 2 == 0):
|
45
|
45
|
raise ValueError("n must be odd, is {}".format(n))
|
46
|
|
- a = a % n
|
47
|
|
- mv = 1
|
48
|
|
- while a != 0 and a % 2 == 0:
|
49
|
|
- a = a / 2
|
|
46
|
+ if a % n != a:
|
|
47
|
+ return Jacobi(a%n, n)
|
|
48
|
+ if a != 0 and a % 2 == 0:
|
50
|
49
|
nm8 = n % 8
|
51
|
50
|
if (nm8 == 3 or nm8 == 5):
|
52
|
|
- mv = mv * -1
|
|
51
|
+ return -1 * Jacobi(a//2, n)
|
|
52
|
+ else:
|
|
53
|
+ return Jacobi(a//2, n)
|
53
|
54
|
if a == 1:
|
54
|
|
- return mv * 1
|
|
55
|
+ return 1
|
55
|
56
|
if gcd(a, n) != 1:
|
56
|
57
|
return 0
|
57
|
58
|
if a == 0 and n == 1:
|
58
|
|
- return mv * 1
|
59
|
|
- return mv * Jacobi(n, a)
|
|
59
|
+ return 1
|
|
60
|
+ if n % 4 == 3 and a % 4 == 3:
|
|
61
|
+ return -1 * Jacobi(n, a)
|
|
62
|
+ return Jacobi(n, a)
|
|
63
|
+
|
|
64
|
+print(" ", end=" ")
|
|
65
|
+for k in range(1, 10):
|
|
66
|
+ print("{}".format(k).rjust(2, " "), end=" ")
|
|
67
|
+print()
|
60
|
68
|
|
61
|
69
|
for n in range(1, 21, 2):
|
62
|
|
- print("{}:\t{}".format(n, Jacobi(3, n)))
|
|
70
|
+ print("{}:".format(n).rjust(3, " "), end=" ")
|
|
71
|
+ for k in range(1, 10):
|
|
72
|
+ print("{}".format(Jacobi(k, n)).rjust(2, " "), end=" ")
|
|
73
|
+ print()
|
63
|
74
|
|
64
|
75
|
|
65
|
76
|
|