/* sqrt(a+ib) = sqrt(a+sqrt(a*a-n*b*b)/2)+ib/(2*sqrt(a+sqrt(a*a-n*b*b)/2)) */ /* returns true if this is QR */ public bool Sqrt() { if (IsZilch()) { return(true); } FP w1 = new FP(b); FP w2 = new FP(a); w1.Sqr(); w2.Sqr(); w1.Add(w2); if (w1.Jacobi() != 1) { Zero(); return(false); } w1 = w1.Sqrt(); w2.Copy(a); w2.Add(w1); w2.Norm(); w2.Div2(); if (w2.Jacobi() != 1) { w2.Copy(a); w2.Sub(w1); w2.Norm(); w2.Div2(); if (w2.Jacobi() != 1) { Zero(); return(false); } } w2 = w2.Sqrt(); a.Copy(w2); w2.Add(w2); w2.Inverse(); b.Mul(w2); return(true); }
/* negate this mod Modulus */ public void Neg() { FP m = new FP(a); FP t = new FP(0); m.Add(b); m.Neg(); t.Copy(m); t.Add(b); b.Copy(m); b.Add(a); a.Copy(t); }
/* copy this=x */ public void Copy(FP2 x) { a.Copy(x.a); b.Copy(x.b); }