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);
}