From 098ecc99d417944ae521bbc643d06d8e3d9a9811 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 15 Feb 2021 10:41:09 +0100 Subject: [PATCH 1/3] Add our own version of the Jacobi symbol --- gap/TestActionPackage.gi | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/gap/TestActionPackage.gi b/gap/TestActionPackage.gi index c0a0a08..97369cf 100644 --- a/gap/TestActionPackage.gi +++ b/gap/TestActionPackage.gi @@ -8,3 +8,44 @@ function() Print( "This is a placeholder function, replace it with your own code.\n" ); end ); +BindGlobal("MyJacobi", function ( n, m ) + local jac, t; + + # check the argument + if m <= 0 then + Error(" must be positive"); + fi; + + # compute the Jacobi symbol similar to Euclid's algorithm + jac := 1; + while m <> 1 do + + # if the gcd of $n$ and $m$ is $>1$ Jacobi returns $0$ + if n = 0 or (n mod 2 = 0 and m mod 2 = 0) then + jac := 0; m := 1; + + # $J(n,2*m) = J(n,m) * J(n,2) = J(n,m) * (-1)^{(n^2-1)/8}$ + elif m mod 2 = 0 then + if n mod 8 = 3 or n mod 8 = 5 then jac := -jac; fi; + m := m / 2; + + # $J(2*n,m) = J(n,m) * J(2,m) = J(n,m) * (-1)^{(m^2-1)/8}$ + elif n mod 2 = 0 then + if m mod 8 = 3 or m mod 8 = 5 then jac := -jac; fi; + n := n / 2; + + # $J(-n,m) = J(n,m) * J(-1,m) = J(n,m) * (-1)^{(m-1)/2}$ + elif n < 0 then + if m mod 4 = 3 then jac := -jac; fi; + n := -n; + + # $J(n,m) = J(m,n) * (-1)^{(n-1)*(m-1)/4}$ (quadratic reciprocity) + else + if n mod 4 = 3 and m mod 4 = 3 then jac := -jac; fi; + t := n; n := m mod n; m := t; + + fi; + od; + + return jac; +end); From e915de866b3ab10f6f3aa61b84574ae4ab9f3576 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 15 Feb 2021 11:54:12 +0100 Subject: [PATCH 2/3] Add missing test file --- tst/jacobi.tst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 tst/jacobi.tst diff --git a/tst/jacobi.tst b/tst/jacobi.tst new file mode 100644 index 0000000..446a001 --- /dev/null +++ b/tst/jacobi.tst @@ -0,0 +1,3 @@ +# Test MyJacobi +gap> List([0..5], n -> MyJacobi(n, 5)); +[ 0, 1, -1, -1, 1, 0 ] From c1de931ae2bbedd165bf9fbb53e561886ab86497 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 15 Feb 2021 12:02:18 +0100 Subject: [PATCH 3/3] update --- tst/jacobi.tst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tst/jacobi.tst b/tst/jacobi.tst index 446a001..008274d 100644 --- a/tst/jacobi.tst +++ b/tst/jacobi.tst @@ -1,3 +1,5 @@ # Test MyJacobi gap> List([0..5], n -> MyJacobi(n, 5)); [ 0, 1, -1, -1, 1, 0 ] +gap> MyJacobi(0,0); +Error, must be positive