-{
- fctx *f = (fctx *)ff;
- mp_div(0, &d, x, f->mm.m);
- return (d);
+ { fctx *f = (fctx *)ff; mp_div(0, &d, x, f->mm.m); return (d); }
+
+static mp *fsqrt(field *ff, mp *d, mp *x) {
+ fctx *f = (fctx *)ff; d = mpmont_reduce(&f->mm, d, x);
+ d = mp_modsqrt(d, d, f->mm.m); if (!d) return (d);
+ return (mpmont_mul(&f->mm, d, d, f->mm.r2));