use ark_ff::{fields::*, MontFp}; use crate::*; pub type Fq6 = Fp6; #[derive(Clone, Copy)] pub struct Fq6Config; impl Fp6Config for Fq6Config { type Fp2Config = Fq2Config; /// NONRESIDUE = (U + 1) const NONRESIDUE: Fq2 = Fq2::new(Fq::ONE, Fq::ONE); const FROBENIUS_COEFF_FP6_C1: &'static [Fq2] = &[ // Fp2::NONRESIDUE^(((q^0) - 1) / 3) Fq2::new( Fq::ONE, Fq::ZERO, ), // Fp2::NONRESIDUE^(((q^1) - 1) / 3) Fq2::new( Fq::ZERO, MontFp!("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436"), ), // Fp2::NONRESIDUE^(((q^2) - 1) / 3) Fq2::new( MontFp!("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350"), Fq::ZERO, ), // Fp2::NONRESIDUE^(((q^3) - 1) / 3) Fq2::new( Fq::ZERO, Fq::ONE, ), // Fp2::NONRESIDUE^(((q^4) - 1) / 3) Fq2::new( MontFp!("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436"), Fq::ZERO, ), // Fp2::NONRESIDUE^(((q^5) - 1) / 3) Fq2::new( Fq::ZERO, MontFp!("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350"), ), ]; #[rustfmt::skip] const FROBENIUS_COEFF_FP6_C2: &'static [Fq2] = &[ // Fq2(u + 1)**(((2q^0) - 2) / 3) Fq2::new( Fq::ONE, Fq::ZERO, ), // Fq2(u + 1)**(((2q^1) - 2) / 3) Fq2::new( MontFp!("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437"), Fq::ZERO, ), // Fq2(u + 1)**(((2q^2) - 2) / 3) Fq2::new( MontFp!("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436"), Fq::ZERO, ), // Fq2(u + 1)**(((2q^3) - 2) / 3) Fq2::new( MontFp!("-1"), Fq::ZERO, ), // Fq2(u + 1)**(((2q^4) - 2) / 3) Fq2::new( MontFp!("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350"), Fq::ZERO, ), // Fq2(u + 1)**(((2q^5) - 2) / 3) Fq2::new( MontFp!("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351"), Fq::ZERO, ), ]; /// Multiply this element by the quadratic nonresidue 1 + u. /// Make this generic. fn mul_fp2_by_nonresidue(fe: &Fq2) -> Fq2 { let mut copy = *fe; let t0 = copy.c0; copy.c0 -= &fe.c1; copy.c1 += &t0; copy } }