finalExponentiation method
Implementation
GtNative finalExponentiation() {
Bls12NativeFp12 f = inner;
// Compute t0 = f^(p^6)
Bls12NativeFp12 t0 =
f
.frobeniusMap()
.frobeniusMap()
.frobeniusMap()
.frobeniusMap()
.frobeniusMap()
.frobeniusMap();
Bls12NativeFp12? t1 = f.invert();
if (t1 == null) {
throw CryptoException.failed(
"finalExponentiation",
reason: "Non-invertible Fp12",
);
}
Bls12NativeFp12 t2 = t0 * t1;
t1 = t2;
t2 = t2.frobeniusMap().frobeniusMap();
t2 *= t1;
t1 = cyclotomicSquare(t2).conjugate();
Bls12NativeFp12 t3 = cyclotomicExp(t2);
Bls12NativeFp12 t4 = cyclotomicSquare(t3);
Bls12NativeFp12 t5 = t1 * t3;
t1 = cyclotomicExp(t5);
t0 = cyclotomicExp(t1);
Bls12NativeFp12 t6 = cyclotomicExp(t0);
t6 *= t4;
t4 = cyclotomicExp(t6);
t5 = t5.conjugate();
t4 *= t5 * t2;
t5 = t2.conjugate();
t1 *= t2;
t1 = t1.frobeniusMap().frobeniusMap().frobeniusMap();
t6 *= t5;
t6 = t6.frobeniusMap();
t3 *= t0;
t3 = t3.frobeniusMap().frobeniusMap();
t3 *= t1;
t3 *= t6;
f = t3 * t4;
return GtNative(f);
}