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