summaryrefslogtreecommitdiff
path: root/mpz/jacobi.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2011-05-22 20:31:06 +0200
committerNiels Möller <nisse@lysator.liu.se>2011-05-22 20:31:06 +0200
commitea42d2b6a8a568b972d01390b5a7fa2ece1cbbea (patch)
tree31985b160bfc77a6c395724127b94872faaae14b /mpz/jacobi.c
parent7779ca717a8922f155985ae2b50efbbd610e3fcb (diff)
downloadgmp-ea42d2b6a8a568b972d01390b5a7fa2ece1cbbea.tar.gz
Jacobi bugfix and corresponding test case.
Diffstat (limited to 'mpz/jacobi.c')
-rw-r--r--mpz/jacobi.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/mpz/jacobi.c b/mpz/jacobi.c
index 09bbd036b..40255d8ec 100644
--- a/mpz/jacobi.c
+++ b/mpz/jacobi.c
@@ -94,7 +94,6 @@ mpz_jacobi (mpz_srcptr a, mpz_srcptr b)
JACOBI_STRIP_LOW_ZEROS (result_bit1, alow, bsrcp, bsize, blow);
count_trailing_zeros (btwos, blow);
- result_bit1 ^= JACOBI_TWOS_U_BIT1(btwos, alow);
blow >>= btwos;
if (bsize > 1 && btwos > 0)
@@ -116,6 +115,8 @@ mpz_jacobi (mpz_srcptr a, mpz_srcptr b)
if (bsize == 1)
{
+ result_bit1 ^= JACOBI_TWOS_U_BIT1(btwos, alow);
+
if (blow == 1)
return JACOBI_BIT1_TO_PN (result_bit1);
@@ -130,19 +131,11 @@ mpz_jacobi (mpz_srcptr a, mpz_srcptr b)
/* Logic copied from mpz_ui_kronecker */
if (alow == 1)
return JACOBI_BIT1_TO_PN (result_bit1); /* (1/b)=1 */
-
- if (btwos > 0)
- {
- /* Only bit 1 of blow is used below. */
- if (btwos == GMP_NUMB_BITS - 1)
- blow = bsrcp[1] << 1;
- else
- blow >> btwos;
- }
- else if ( (alow & 1) == 0)
+ if ( (alow & 1) == 0)
{
unsigned atwos;
+ ASSERT (btwos == 0);
count_trailing_zeros (atwos, alow);
alow >>= atwos;
result_bit1 ^= JACOBI_TWOS_U_BIT1 (atwos, blow);
@@ -156,6 +149,7 @@ mpz_jacobi (mpz_srcptr a, mpz_srcptr b)
JACOBI_MOD_OR_MODEXACT_1_ODD (result_bit1, blow, bsrcp, bsize, alow);
return mpn_jacobi_base (blow, alow, result_bit1);
}
+ result_bit1 ^= JACOBI_TWOS_U_BIT1(btwos, alow);
bits = mpn_jacobi_init (alow, blow, (result_bit1>>1) & 1);