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}