Browse Source

Working Jacobi symbol function!

Petra Lamborn 5 years ago
parent
commit
d6bcf93f84
1 changed files with 20 additions and 9 deletions
  1. 20
    9
      lucas.py

+ 20
- 9
lucas.py View File

@@ -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