/* this*=y */ /* Now uses Lazy reduction */ public void Mul(FP2 y) { if ((long)(a.XES + b.XES) * (y.a.XES + y.b.XES) > (long)FP.FEXCESS) { if (a.XES > 1) { a.Reduce(); } if (b.XES > 1) { b.Reduce(); } } DBIG pR = new DBIG(0); BIG C = new BIG(a.x); BIG D = new BIG(y.a.x); pR.UCopy(new BIG(ROM.Modulus)); DBIG A = BIG.Mul(a.x, y.a.x); DBIG B = BIG.Mul(b.x, y.b.x); C.Add(b.x); C.Norm(); D.Add(y.b.x); D.Norm(); DBIG E = BIG.Mul(C, D); DBIG F = new DBIG(A); F.Add(B); B.RSub(pR); A.Add(B); A.Norm(); E.Sub(F); E.Norm(); a.x.Copy(FP.Mod(A)); a.XES = 3; b.x.Copy(FP.Mod(E)); b.XES = 2; }