summaryrefslogtreecommitdiff
path: root/tests/refmpz.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2010-02-25 17:23:46 +0100
committerNiels Möller <nisse@lysator.liu.se>2010-02-25 17:23:46 +0100
commitbc4711c37fbd6a2d9702e8dce13b381dc213394d (patch)
tree3698833992dc0a29c7e269f64e97e0581d25ab28 /tests/refmpz.c
parent73253a76f1b9d93cffb6a9b0939671a160ffd2f5 (diff)
downloadgmp-bc4711c37fbd6a2d9702e8dce13b381dc213394d.tar.gz
Rewrote refmpz_legendre, and support it in try.c
Diffstat (limited to 'tests/refmpz.c')
-rw-r--r--tests/refmpz.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/tests/refmpz.c b/tests/refmpz.c
index 29e0a16f8..1fa162101 100644
--- a/tests/refmpz.c
+++ b/tests/refmpz.c
@@ -191,10 +191,40 @@ refmpz_jacobi (mpz_srcptr a, mpz_srcptr b)
return refmpz_kronecker (a, b_odd);
}
+/* Legendre symbol via powm. p must be an odd prime. */
int
-refmpz_legendre (mpz_srcptr a, mpz_srcptr b)
+refmpz_legendre (mpz_srcptr a, mpz_srcptr p)
{
- return refmpz_jacobi (a, b);
+ int res;
+
+ mpz_t r;
+ mpz_t e;
+
+ ASSERT_ALWAYS (mpz_sgn (p) > 0);
+ ASSERT_ALWAYS (mpz_odd_p (p));
+
+ mpz_init (r);
+ mpz_init (e);
+
+ mpz_fdiv_r (r, a, p);
+
+ mpz_set (e, p);
+ mpz_sub_ui (e, e, 1);
+ mpz_fdiv_q_2exp (e, e, 1);
+ mpz_powm (r, r, e, p);
+
+ /* Normalize to a more or less symmetric range around zero */
+ if (mpz_cmp (r, e) > 0)
+ mpz_sub (r, r, p);
+
+ ASSERT_ALWAYS (mpz_cmpabs_ui (r, 1) <= 0);
+
+ res = mpz_sgn (r);
+
+ mpz_clear (r);
+ mpz_clear (e);
+
+ return res;
}