in src/pair256.js [365:535]
fexp: function(m) {
var fa, fb, f, x, r, lv,
t1,t2,t3,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.FP48(m); //r.copy(m);
/* Easy part of final exp */
lv = new ctx.FP48(r); //lv.copy(r);
lv.inverse();
r.conj();
r.mul(lv);
lv.copy(r);
r.frob(f,8);
r.mul(lv);
// if (r.isunity())
// {
// r.zero();
// return r;
// }
/* Hard part of final exp */
// Ghamman & Fouotsa Method
t7=new ctx.FP48(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.FP48(t1); t3.conj();
t2.mul(t3);
t2.mul(r);
r.mul(t7);
t1=t2.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,14);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,13);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,12);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,11);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,10);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,9);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,8);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t2); t3.conj();
t1.mul(t3);
t3.copy(t1);
t3.frob(f,7);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,6);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,5);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,4);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,3);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,2);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
t3.copy(t1);
t3.frob(f,1);
r.mul(t3);
t1=t1.pow(x);
if (ctx.ECP.SIGN_OF_X==ctx.ECP.NEGATIVEX) {
t1.conj();
}
r.mul(t1);
t2.frob(f,15);
r.mul(t2);
r.reduce();
return r;
}