summaryrefslogtreecommitdiff
path: root/mpz/remove.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2012-05-24 10:12:28 +0200
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2012-05-24 10:12:28 +0200
commit908987076649a0e51310803f7c0ad61a8198026a (patch)
tree098bdb77cbff6bf682ea713733e98fc0b33a663f /mpz/remove.c
parent8b9e31a23847f806a9a0cb521a596bc52eaa1ec8 (diff)
downloadgmp-908987076649a0e51310803f7c0ad61a8198026a.tar.gz
mpz/remove.c: Support negative divisor, and test them.
Diffstat (limited to 'mpz/remove.c')
-rw-r--r--mpz/remove.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/mpz/remove.c b/mpz/remove.c
index 70ddf2cf1..68a63da36 100644
--- a/mpz/remove.c
+++ b/mpz/remove.c
@@ -31,18 +31,19 @@ mpz_remove (mpz_ptr dest, mpz_srcptr src, mpz_srcptr f)
if (UNLIKELY (mpz_cmpabs_ui (f, 1) <= 0))
DIVIDE_BY_ZERO;
- if (SIZ (src) == 0)
+ if (UNLIKELY (SIZ (src) == 0))
{
- if (src != dest)
- mpz_set (dest, src);
+ SIZ (dest) = 0;
return 0;
}
- if (mpz_cmp_ui (f, 2) == 0)
+ if (mpz_cmpabs_ui (f, 2) == 0)
{
mp_bitcnt_t s0;
s0 = mpz_scan1 (src, 0);
mpz_div_2exp (dest, src, s0);
+ if (s0 & (SIZ (f) < 0)) /*((s0 % 2 == 1) && (SIZ (f) < 0))*/
+ mpz_neg (dest, dest);
return s0;
}