X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/0f00dc4c8eb47e67bc0f148c2dd109f73a451e0a..HEAD:/math/f-prime.c diff --git a/math/f-prime.c b/math/f-prime.c index d9c5c179..b21ca2a6 100644 --- a/math/f-prime.c +++ b/math/f-prime.c @@ -63,20 +63,21 @@ static int fzerop(field *ff, mp *x) { return (MP_ZEROP(x)); } static mp *fneg(field *ff, mp *d, mp *x) { fctx_prime *f = (fctx_prime *)ff; - return (mp_sub(d, f->mm.m, x)); + if (MP_ZEROP(x)) { if (d != x) mp_drop(d); return (MP_COPY(x)); } + else return (mp_sub(d, f->mm.m, x)); } static mp *fadd(field *ff, mp *d, mp *x, mp *y) { fctx_prime *f = (fctx_prime *)ff; d = mp_add(d, x, y); if (MP_NEGP(d)) d = mp_add(d, d, f->mm.m); - else if (MP_CMP(d, >, f->mm.m)) d = mp_sub(d, d, f->mm.m); + else if (MP_CMP(d, >=, f->mm.m)) d = mp_sub(d, d, f->mm.m); return (d); } static mp *fsub(field *ff, mp *d, mp *x, mp *y) { fctx_prime *f = (fctx_prime *)ff; d = mp_sub(d, x, y); if (MP_NEGP(d)) d = mp_add(d, d, f->mm.m); - else if (MP_CMP(d, >, f->mm.m)) d = mp_sub(d, d, f->mm.m); + else if (MP_CMP(d, >=, f->mm.m)) d = mp_sub(d, d, f->mm.m); return (d); }