use super::{
cyclotomic::{
exp_by_x_cyclo_bls12_381, exp_by_xdiv3_cyclo_bls12_381, exp_by_xone_cyclo_bls12_381,
},
fp12::{
conjugate_fp12_bls12_381, frobenius1_fp12_bls12_381, frobenius2_fp12_bls12_381,
inv_fp12_bls12_381, mul_fp12_bls12_381,
},
};
pub fn final_exp_bls12_381(
f: &[u64; 72],
#[cfg(feature = "hints")] hints: &mut Vec<u64>,
) -> [u64; 72] {
let f_conj = conjugate_fp12_bls12_381(
f,
#[cfg(feature = "hints")]
hints,
);
let f_inv = inv_fp12_bls12_381(
f,
#[cfg(feature = "hints")]
hints,
);
let easy1 = mul_fp12_bls12_381(
&f_conj,
&f_inv,
#[cfg(feature = "hints")]
hints,
);
let mut m = frobenius2_fp12_bls12_381(
&easy1,
#[cfg(feature = "hints")]
hints,
);
m = mul_fp12_bls12_381(
&m,
&easy1,
#[cfg(feature = "hints")]
hints,
);
let mut f = exp_by_xdiv3_cyclo_bls12_381(
&m,
#[cfg(feature = "hints")]
hints,
);
f = exp_by_xone_cyclo_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
);
let f1 = frobenius1_fp12_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
);
let f2 = exp_by_x_cyclo_bls12_381(
&conjugate_fp12_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
),
#[cfg(feature = "hints")]
hints,
);
let f = mul_fp12_bls12_381(
&f1,
&f2,
#[cfg(feature = "hints")]
hints,
);
let f1 = exp_by_x_cyclo_bls12_381(
&exp_by_x_cyclo_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
),
#[cfg(feature = "hints")]
hints,
);
let f2 = frobenius2_fp12_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
);
let f3 = conjugate_fp12_bls12_381(
&f,
#[cfg(feature = "hints")]
hints,
);
let mut f = mul_fp12_bls12_381(
&f1,
&f2,
#[cfg(feature = "hints")]
hints,
);
f = mul_fp12_bls12_381(
&f,
&f3,
#[cfg(feature = "hints")]
hints,
);
f = mul_fp12_bls12_381(
&f,
&m,
#[cfg(feature = "hints")]
hints,
);
f
}
#[cfg_attr(not(feature = "hints"), no_mangle)]
#[cfg_attr(feature = "hints", export_name = "hints_final_exp_bls12_381_c")]
pub unsafe extern "C" fn final_exp_bls12_381_c(
f_ptr: *const u64,
result_ptr: *mut u64,
#[cfg(feature = "hints")] hints: &mut Vec<u64>,
) {
let f = &*(f_ptr as *const [u64; 72]);
let result = &mut *(result_ptr as *mut [u64; 72]);
*result = final_exp_bls12_381(
f,
#[cfg(feature = "hints")]
hints,
);
}