arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/bw6_761/src/fields/fq3.rs
bw6_761/src/fields/fq3.rsRaw
 1use ark_ff::{
 2    field_new,
 3    fields::fp3::{Fp3, Fp3Parameters},
 4};
 5
 6use crate::{
 7    fields::{FQ_ONE, FQ_ZERO},
 8    Fq,
 9};
10
11pub type Fq3 = Fp3<Fq3Parameters>;
12
13pub struct Fq3Parameters;
14
15impl Fp3Parameters for Fq3Parameters {
16    type Fp = Fq;
17
18    /// NONRESIDUE = -4
19    // Fq3 = Fq[u]/u^3+4
20    #[rustfmt::skip]
21    const NONRESIDUE: Fq = field_new!(Fq, "-4");
22
23    // (MODULUS^3 - 1) % 2^TWO_ADICITY == 0
24    const TWO_ADICITY: u32 = 1;
25
26    // (T-1)/2 with T = (MODULUS^3-1) / 2^TWO_ADICITY
27    #[rustfmt::skip]
28    const T_MINUS_ONE_DIV_TWO: &'static [u64] = &[
29        0xb5e7c000000a3eac,
30        0xf79b99dbf41cf4ab,
31        0xe9372b1919e55ee5,
32        0xbb7bbc4936c1980b,
33        0x7c0cb9d4399b36e1,
34        0x73304a5507bb1ae0,
35        0x92f639be8963936f,
36        0x4f574ac2439ba816,
37        0x670d9bd389dd29ef,
38        0x606ddf900d2124f1,
39        0x928fb14985ec3270,
40        0x6b2f2428c5f420f3,
41        0xac9ade29d5ab5fbe,
42        0xec0d0434c4005822,
43        0x973f10d7f3c5c108,
44        0x6d5e83fc81095979,
45        0xdac3e6e4e1647752,
46        0x227febf93994603e,
47        0x4ab8755d894167d1,
48        0x4fd2d3f67d8b537a,
49        0x33e196a4d5f4030a,
50        0x88b51fb72092df1a,
51        0xa67e5b1e8fc48316,
52        0xb0855eb2a00d7dab,
53        0xe875dd2da6751442,
54        0x777594a243e25676,
55        0x294e0f70376a85a8,
56        0x83f431c7988e4f18,
57        0x8e8fb6af3ca2f5f1,
58        0x7297896b4b9e90f1,
59        0xff38f54664d66123,
60        0xb5ecf80bfff41e13,
61        0x1662a3666bb8392a,
62        0x07a0968e8742d3e1,
63        0xf12927e564bcdfdc,
64        0x5de9825a0e,
65    ];
66
67    // NONRESIDUE^T % q
68    #[rustfmt::skip]
69    const QUADRATIC_NONRESIDUE_TO_T: (Fq, Fq, Fq) = (
70        field_new!(Fq, "6891450384315732539396789682275657542479668912536150109513790160209623422243491736087683183289411687640864567753786613451161759120554247759349511699125301598951605099378508850372543631423596795951899700429969112842764913119068298"),
71        FQ_ZERO,
72        FQ_ZERO,
73    );
74
75    // NQR ^ (MODULUS^i - 1)/3, i=0,1,2 with NQR = u = (0,1,0)
76    #[rustfmt::skip]
77    const FROBENIUS_COEFF_FP3_C1: &'static [Fq] = &[
78        FQ_ONE,
79        field_new!(Fq, "4922464560225523242118178942575080391082002530232324381063048548642823052024664478336818169867474395270858391911405337707247735739826664939444490469542109391530482826728203582549674992333383150446779312029624171857054392282775648"),
80        field_new!(Fq, "1968985824090209297278610739700577151397666382303825728450741611566800370218827257750865013421937292370006175842381275743914023380727582819905021229583192207421122272650305267822868639090213645505120388400344940985710520836292650"),
81    ];
82
83    // NQR ^ (2*MODULUS^i - 2)/3, i=0,1,2 with NQR = u = (0,1,0)
84    #[rustfmt::skip]
85    const FROBENIUS_COEFF_FP3_C2: &'static [Fq] = &[
86        FQ_ONE,
87        field_new!(Fq, "1968985824090209297278610739700577151397666382303825728450741611566800370218827257750865013421937292370006175842381275743914023380727582819905021229583192207421122272650305267822868639090213645505120388400344940985710520836292650"),
88        field_new!(Fq, "4922464560225523242118178942575080391082002530232324381063048548642823052024664478336818169867474395270858391911405337707247735739826664939444490469542109391530482826728203582549674992333383150446779312029624171857054392282775648"),
89    ];
90
91    #[inline(always)]
92    fn mul_fp_by_nonresidue(fe: &Self::Fp) -> Self::Fp {
93        let original = -(*fe);
94        let double = original + &original;
95        double + &double
96    }
97}