public Fp2 FrobeniusMap(int power) { Fp ra = a; Fp rb = FROBENIUS_COEFFS_B[power % 2].Mul(b); return(new Fp2(ra, rb)); }
public static Fp2 Create(byte[] aa, byte[] bb) { Fp a = Fp.Create(aa); Fp b = Fp.Create(bb); return(new Fp2(a, b)); }
public static Fp2 Create(BigInteger aa, BigInteger bb) { Fp a = Fp.Create(aa); Fp b = Fp.Create(bb); return(new Fp2(a, b)); }
public Fp2 Mul(Fp2 o) { Fp aa = a.Mul(o.a); Fp bb = b.Mul(o.b); Fp ra = bb.Mul(Fp.NON_RESIDUE).Add(aa); // ra = a1 * a2 + NON_RESIDUE * b1 * b2 Fp rb = a.Add(b).Mul(o.a.Add(o.b)).Sub(aa).Sub(bb); // rb = (a1 + b1)(a2 + b2) - a1 * a2 - b1 * b2 return(new Fp2(ra, rb)); }
public Fp2 Squared() { Fp ab = a.Mul(b); Fp ra = a.Add(b).Mul(b.Mul(Fp.NON_RESIDUE).Add(a)) .Sub(ab) .Sub(ab.Mul(Fp.NON_RESIDUE)); // ra = (a + b)(a + NON_RESIDUE * b) - ab - NON_RESIDUE * b Fp rb = ab.Dbl(); return(new Fp2(ra, rb)); }
public Fp2 Inverse() { Fp t0 = a.Squared(); Fp t1 = b.Squared(); Fp t2 = t0.Sub(Fp.NON_RESIDUE.Mul(t1)); Fp t3 = t2.Inverse(); Fp ra = a.Mul(t3); // ra = a * t3 Fp rb = b.Mul(t3).Negate(); // rb = -(b * t3) return(new Fp2(ra, rb)); }
public Fp2(Fp a, Fp b) { this.a = a; this.b = b; }