/* 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); }
/* 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=1/this */ public void Inverse() { Norm(); FP w1 = new FP(a); FP w2 = new FP(b); w1.Sqr(); w2.Sqr(); w1.Add(w2); w1.Inverse(); a.Mul(w1); w1.Neg(); w1.Norm(); b.Mul(w1); }
/* this*=this */ public void Sqr() { FP w1 = new FP(a); FP w3 = new FP(a); FP mb = new FP(b); w1.Add(b); mb.Neg(); w3.Add(a); w3.Norm(); b.Mul(w3); a.Add(mb); w1.Norm(); a.Norm(); a.Mul(w1); }
/* this+=a */ public void Add(FP2 x) { a.Add(x.a); b.Add(x.b); }