diff options
author | Niels Möller <nisse@lysator.liu.se> | 2010-02-25 17:23:46 +0100 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2010-02-25 17:23:46 +0100 |
commit | bc4711c37fbd6a2d9702e8dce13b381dc213394d (patch) | |
tree | 3698833992dc0a29c7e269f64e97e0581d25ab28 /tests/refmpz.c | |
parent | 73253a76f1b9d93cffb6a9b0939671a160ffd2f5 (diff) | |
download | gmp-bc4711c37fbd6a2d9702e8dce13b381dc213394d.tar.gz |
Rewrote refmpz_legendre, and support it in try.c
Diffstat (limited to 'tests/refmpz.c')
-rw-r--r-- | tests/refmpz.c | 34 |
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; } |