/* this-=x */ public void Sub(FP4 x) { FP4 m = new FP4(x); m.Neg(); Add(m); }
/* Chung-Hasan SQR2 method from http://cacr.uwaterloo.ca/techreports/2006/cacr2006-24.pdf */ public void Sqr() { //System.out.println("Into sqr"); FP4 A = new FP4(a); FP4 B = new FP4(b); FP4 C = new FP4(c); FP4 D = new FP4(a); A.Sqr(); B.Mul(c); B.Add(B); B.Norm(); C.Sqr(); D.Mul(b); D.Add(D); c.Add(a); c.Add(b); c.Norm(); c.Sqr(); a.Copy(A); A.Add(B); A.Norm(); A.Add(C); A.Add(D); A.Norm(); A.Neg(); B.Times_I(); C.Times_I(); a.Add(B); b.Copy(C); b.Add(D); c.Add(A); //System.out.println("Out of sqr"); Norm(); }
/* Special case of multiplication arises from special form of ATE pairing line function */ public void SMul(FP12 y, int type) { //System.out.println("Into smul"); if (type == ECP.D_TYPE) { FP4 z0 = new FP4(a); FP4 z2 = new FP4(b); FP4 z3 = new FP4(b); FP4 t0 = new FP4(0); FP4 t1 = new FP4(y.a); z0.Mul(y.a); z2.PMul(y.b.Real()); b.Add(a); t1.Real().Add(y.b.Real()); t1.Norm(); b.Norm(); b.Mul(t1); z3.Add(c); z3.Norm(); z3.PMul(y.b.Real()); t0.Copy(z0); t0.Neg(); t1.Copy(z2); t1.Neg(); b.Add(t0); b.Add(t1); z3.Add(t1); z2.Add(t0); t0.Copy(a); t0.Add(c); t0.Norm(); z3.Norm(); t0.Mul(y.a); c.Copy(z2); c.Add(t0); z3.Times_I(); a.Copy(z0); a.Add(z3); } if (type == ECP.M_TYPE) { FP4 z0 = new FP4(a); FP4 z1 = new FP4(0); FP4 z2 = new FP4(0); FP4 z3 = new FP4(0); FP4 t0 = new FP4(a); FP4 t1 = new FP4(0); z0.Mul(y.a); t0.Add(b); t0.Norm(); z1.Copy(t0); z1.Mul(y.a); t0.Copy(b); t0.Add(c); t0.Norm(); z3.Copy(t0); //z3.mul(y.c); z3.PMul(y.c.GetB()); z3.Times_I(); t0.Copy(z0); t0.Neg(); z1.Add(t0); b.Copy(z1); z2.Copy(t0); t0.Copy(a); t0.Add(c); t1.Copy(y.a); t1.Add(y.c); t0.Norm(); t1.Norm(); t0.Mul(t1); z2.Add(t0); t0.Copy(c); t0.PMul(y.c.GetB()); t0.Times_I(); t1.Copy(t0); t1.Neg(); c.Copy(z2); c.Add(t1); z3.Add(t1); t0.Times_I(); b.Add(t0); z3.Norm(); z3.Times_I(); a.Copy(z0); a.Add(z3); } Norm(); //System.out.println("Out of smul"); }
/* FP12 full multiplication this=this*y */ public void mul(FP12 y) { //System.out.println("Into mul"); FP4 z0 = new FP4(a); FP4 z1 = new FP4(0); FP4 z2 = new FP4(b); FP4 z3 = new FP4(0); FP4 t0 = new FP4(a); FP4 t1 = new FP4(y.a); z0.Mul(y.a); z2.Mul(y.b); t0.Add(b); t1.Add(y.b); t0.Norm(); t1.Norm(); z1.Copy(t0); z1.Mul(t1); t0.Copy(b); t0.Add(c); t1.Copy(y.b); t1.Add(y.c); t0.Norm(); t1.Norm(); z3.Copy(t0); z3.Mul(t1); t0.Copy(z0); t0.Neg(); t1.Copy(z2); t1.Neg(); z1.Add(t0); //z1.norm(); b.Copy(z1); b.Add(t1); z3.Add(t1); z2.Add(t0); t0.Copy(a); t0.Add(c); t1.Copy(y.a); t1.Add(y.c); t0.Norm(); t1.Norm(); t0.Mul(t1); z2.Add(t0); t0.Copy(c); t0.Mul(y.c); t1.Copy(t0); t1.Neg(); // z2.norm(); // z3.norm(); // b.norm(); c.Copy(z2); c.Add(t1); z3.Add(t1); t0.Times_I(); b.Add(t0); z3.Norm(); z3.Times_I(); a.Copy(z0); a.Add(z3); Norm(); //System.out.println("Out of mul"); }