in src/pair192.js [365:464]
fexp: function(m) {
var fa, fb, f, x, r, lv,
t0,t1,t2,t3,t4,t5,t6,t7;
fa = new ctx.BIG(0);
fa.rcopy(ctx.ROM_FIELD.Fra);
fb = new ctx.BIG(0);
fb.rcopy(ctx.ROM_FIELD.Frb);
f = new ctx.FP2(fa, fb);
x = new ctx.BIG(0);
x.rcopy(ctx.ROM_CURVE.CURVE_Bnx);
r = new ctx.FP24(m); //r.copy(m);
/* Easy part of final exp */
lv = new ctx.FP24(r); //lv.copy(r);
lv.inverse();
r.conj();
r.mul(lv);
lv.copy(r);
r.frob(f,4);
r.mul(lv);
// if (r.isunity())
// {
// r.zero();
// return r;
// }
/* Hard part of final exp */
// Ghamman & Fouotsa Method
t7=new ctx.FP24(r); t7.usqr();
t1=t7.pow(x);
x.fshr(1);
t2=t1.pow(x);
x.fshl(1);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3=new ctx.FP24(t1); t3.conj();
t2.mul(t3);
t2.mul(r);
t3=t2.pow(x);
t4=t3.pow(x);
t5=t4.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t3.conj(); t5.conj();
}
t3.frob(f,6); t4.frob(f,5);
t3.mul(t4);
t6=t5.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t6.conj();
}
t5.frob(f,4);
t3.mul(t5);
t0=new ctx.FP24(t2); t0.conj();
t6.mul(t0);
t5.copy(t6);
t5.frob(f,3);
t3.mul(t5);
t5=t6.pow(x);
t6=t5.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t5.conj();
}
t0.copy(t5);
t0.frob(f,2);
t3.mul(t0);
t0.copy(t6);
t0.frob(f,1);
t3.mul(t0);
t5=t6.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t5.conj();
}
t2.frob(f,7);
t5.mul(t7);
t3.mul(t2);
t3.mul(t5);
r.mul(t3);
r.reduce();
return r;
}