openvm_pairing_guest/pairing/operations/
fp12.rs

1use openvm_algebra_guest::{field::FieldExtension, Field, IntMod};
2
3use super::{
4    fp6_invert_assign, fp6_mul_assign, fp6_mul_by_nonresidue_assign, fp6_square_assign,
5    fp6_sub_assign,
6};
7
8pub(crate) fn fp12_invert_assign<
9    Fp: IntMod + Field,
10    Fp2: Field + FieldExtension<Fp, Coeffs = [Fp; 2]>,
11>(
12    c: &mut [Fp2; 6],
13    xi: &Fp2,
14) {
15    let mut c0s = [c[0].clone(), c[2].clone(), c[4].clone()];
16    let mut c1s = [c[1].clone(), c[3].clone(), c[5].clone()];
17
18    fp6_square_assign(&mut c0s, xi);
19    fp6_square_assign(&mut c1s, xi);
20    fp6_mul_by_nonresidue_assign(&mut c1s, xi);
21    fp6_sub_assign(&mut c0s, &c1s);
22
23    fp6_invert_assign(&mut c0s, xi);
24    let mut t0 = c0s.clone();
25    let mut t1 = c0s;
26    fp6_mul_assign(&mut t0, &[c[0].clone(), c[2].clone(), c[4].clone()], xi);
27    fp6_mul_assign(&mut t1, &[c[1].clone(), c[3].clone(), c[5].clone()], xi);
28    c[0] = t0[0].clone();
29    c[2] = t0[1].clone();
30    c[4] = t0[2].clone();
31    c[1] = t1[0].clone().neg();
32    c[3] = t1[1].clone().neg();
33    c[5] = t1[2].clone().neg();
34}