/* 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); }
/* this/=2 */ public void Div2() { a.Div2(); b.Div2(); }