ark-curves-cherry-picked/bls12_377/src/fields/fq6.rs
bls12_377/src/fields/fq6.rsRaw
1use ark_ff::{fields::*, MontFp, QuadExt};
2
3use crate::*;
4
5pub type Fq6 = Fp6<Fq6Config>;
6
7#[derive(Clone, Copy)]
8pub struct Fq6Config;
9
10impl Fp6Config for Fq6Config {
11 type Fp2Config = Fq2Config;
12
13 /// NONRESIDUE = U
14 const NONRESIDUE: Fq2 = QuadExt!(FQ_ZERO, FQ_ONE);
15
16 const FROBENIUS_COEFF_FP6_C1: &'static [Fq2] = &[
17 // Fp2::NONRESIDUE^(((q^0) - 1) / 3)
18 QuadExt!(FQ_ONE, FQ_ZERO),
19 // Fp2::NONRESIDUE^(((q^1) - 1) / 3)
20 QuadExt!(
21 MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410946"),
22 FQ_ZERO,
23 ),
24 // Fp2::NONRESIDUE^(((q^2) - 1) / 3)
25 QuadExt!(
26 MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
27 FQ_ZERO,
28 ),
29 // Fp2::NONRESIDUE^(((q^3) - 1) / 3)
30 QuadExt!(MontFp!(Fq, "-1"), FQ_ZERO),
31 // Fp2::NONRESIDUE^(((q^4) - 1) / 3)
32 QuadExt!(
33 MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
34 FQ_ZERO,
35 ),
36 // Fp2::NONRESIDUE^(((q^5) - 1) / 3)
37 QuadExt!(
38 MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047232"),
39 FQ_ZERO,
40 ),
41 ];
42
43 const FROBENIUS_COEFF_FP6_C2: &'static [Fq2] = &[
44 // Fp2::NONRESIDUE^((2*(q^0) - 2) / 3)
45 QuadExt!(FQ_ONE, FQ_ZERO),
46 // Fp2::NONRESIDUE^((2*(q^1) - 2) / 3)
47 QuadExt!(
48 MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
49 FQ_ZERO
50 ),
51 // Fp2::NONRESIDUE^((2*(q^2) - 2) / 3)
52 QuadExt!(
53 MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
54 FQ_ZERO,
55 ),
56 // Fp2::NONRESIDUE^((2*(q^3) - 2) / 3)
57 QuadExt!(FQ_ONE, FQ_ZERO),
58 // Fp2::NONRESIDUE^((2*(q^4) - 2) / 3)
59 QuadExt!(
60 MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
61 FQ_ZERO,
62 ),
63 // Fp2::NONRESIDUE^((2*(q^5) - 2) / 3)
64 QuadExt!(
65 MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
66 FQ_ZERO,
67 ),
68 ];
69
70 #[inline(always)]
71 fn mul_fp2_by_nonresidue(fe: &Fq2) -> Fq2 {
72 // Karatsuba multiplication with constant other = u.
73 let c0 = Fq2Config::mul_fp_by_nonresidue(&fe.c1);
74 let c1 = fe.c0;
75 QuadExt!(c0, c1)
76 }
77}