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    biginteger::BigInteger768 as BigInteger,
  3    field_new,
  4    fields::fp3::{Fp3, Fp3Parameters},
  5};
  6
  7use crate::Fq;
  8
  9pub type Fq3 = Fp3<Fq3Parameters>;
 10
 11pub struct Fq3Parameters;
 12
 13impl Fp3Parameters for Fq3Parameters {
 14    type Fp = Fq;
 15
 16    /// NONRESIDUE = -4
 17    // Fq3 = Fq[u]/u^3+4
 18    #[rustfmt::skip]
 19    const NONRESIDUE: Fq = field_new!(Fq, BigInteger([
 20        0xe12e00000001e9c2,
 21        0x63c1e3faa001cd69,
 22        0xb1b4384fcbe29cf6,
 23        0xc79630bc713d5a1d,
 24        0x30127ac071851e2d,
 25        0x0979f350dcd36af1,
 26        0x6a66defed8b361f2,
 27        0x53abac78b24d4e23,
 28        0xb7ab89dede485a92,
 29        0x5c3a0745675e8452,
 30        0x446f17918c5f5700,
 31        0xfdf24e3267fa1e,
 32    ]));
 33
 34    // (MODULUS^3 - 1) % 2^TWO_ADICITY == 0
 35    const TWO_ADICITY: u32 = 1;
 36
 37    // (T-1)/2 with T = (MODULUS^3-1) / 2^TWO_ADICITY
 38    #[rustfmt::skip]
 39    const T_MINUS_ONE_DIV_TWO: &'static [u64] = &[
 40        0xb5e7c000000a3eac,
 41        0xf79b99dbf41cf4ab,
 42        0xe9372b1919e55ee5,
 43        0xbb7bbc4936c1980b,
 44        0x7c0cb9d4399b36e1,
 45        0x73304a5507bb1ae0,
 46        0x92f639be8963936f,
 47        0x4f574ac2439ba816,
 48        0x670d9bd389dd29ef,
 49        0x606ddf900d2124f1,
 50        0x928fb14985ec3270,
 51        0x6b2f2428c5f420f3,
 52        0xac9ade29d5ab5fbe,
 53        0xec0d0434c4005822,
 54        0x973f10d7f3c5c108,
 55        0x6d5e83fc81095979,
 56        0xdac3e6e4e1647752,
 57        0x227febf93994603e,
 58        0x4ab8755d894167d1,
 59        0x4fd2d3f67d8b537a,
 60        0x33e196a4d5f4030a,
 61        0x88b51fb72092df1a,
 62        0xa67e5b1e8fc48316,
 63        0xb0855eb2a00d7dab,
 64        0xe875dd2da6751442,
 65        0x777594a243e25676,
 66        0x294e0f70376a85a8,
 67        0x83f431c7988e4f18,
 68        0x8e8fb6af3ca2f5f1,
 69        0x7297896b4b9e90f1,
 70        0xff38f54664d66123,
 71        0xb5ecf80bfff41e13,
 72        0x1662a3666bb8392a,
 73        0x07a0968e8742d3e1,
 74        0xf12927e564bcdfdc,
 75        0x5de9825a0e,
 76    ];
 77
 78    // NONRESIDUE^T % q
 79    #[rustfmt::skip]
 80    const QUADRATIC_NONRESIDUE_TO_T: (Fq, Fq, Fq) = (
 81        field_new!(Fq, BigInteger([
 82            0xf29a000000007ab6,
 83            0x8c391832e000739b,
 84            0x77738a6b6870f959,
 85            0xbe36179047832b03,
 86            0x84f3089e56574722,
 87            0xc5a3614ac0b1d984,
 88            0x5c81153f4906e9fe,
 89            0x4d28be3a9f55c815,
 90            0xd72c1d6f77d5f5c5,
 91            0x73a18e069ac04458,
 92            0xf9dfaa846595555f,
 93            0xd0f0a60a5be58c,
 94        ])),
 95        field_new!(Fq, BigInteger([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])),
 96        field_new!(Fq, BigInteger([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])),
 97    );
 98
 99    // NQR ^ (MODULUS^i - 1)/3, i=0,1,2 with NQR = u = (0,1,0)
100    #[rustfmt::skip]
101    const FROBENIUS_COEFF_FP3_C1: &'static [Fq] = &[
102        field_new!(Fq, BigInteger([
103            0x0202ffffffff85d5,
104            0x5a5826358fff8ce7,
105            0x9e996e43827faade,
106            0xda6aff320ee47df4,
107            0xece9cb3e1d94b80b,
108            0xc0e667a25248240b,
109            0xa74da5bfdcad3905,
110            0x2352e7fe462f2103,
111            0x7b56588008b1c87c,
112            0x45848a63e711022f,
113            0xd7a81ebb9f65a9df,
114            0x51f77ef127e87d,
115        ])),
116        field_new!(Fq, BigInteger([
117            0x7f96b51bd840c549,
118            0xd59782096496171f,
119            0x49b046fd9ce14bbc,
120            0x4b6163bba7527a56,
121            0xef6c92fb771d59f1,
122            0x0425bedbac1dfdc7,
123            0xd3ac39de759c0ffd,
124            0x9f43ed0e063a81d0,
125            0x5bd7d20b4f9a3ce2,
126            0x0411f03c36cf5c3c,
127            0x2d658fd49661c472,
128            0x1100249ae760b93,
129        ])),
130        field_new!(Fq, BigInteger([
131            0x67a04ae427bfb5f8,
132            0x9d32d491eb6a5cff,
133            0x43d03c1cb68051d4,
134            0x0b75ca96f69859a5,
135            0x0763497f5325ec60,
136            0x48076b5c278dd94d,
137            0x8ca3965ff91efd06,
138            0x1e6077657ea02f5d,
139            0xcdd6c153a8c37724,
140            0x28b5b634e5c22ea4,
141            0x9e01e3efd42e902c,
142            0xe3d6815769a804,
143
144        ])),
145    ];
146
147    // NQR ^ (2*MODULUS^i - 2)/3, i=0,1,2 with NQR = u = (0,1,0)
148    #[rustfmt::skip]
149    const FROBENIUS_COEFF_FP3_C2: &'static [Fq] = &[
150        field_new!(Fq, BigInteger([
151            0x0202ffffffff85d5,
152            0x5a5826358fff8ce7,
153            0x9e996e43827faade,
154            0xda6aff320ee47df4,
155            0xece9cb3e1d94b80b,
156            0xc0e667a25248240b,
157            0xa74da5bfdcad3905,
158            0x2352e7fe462f2103,
159            0x7b56588008b1c87c,
160            0x45848a63e711022f,
161            0xd7a81ebb9f65a9df,
162            0x51f77ef127e87d,
163        ])),
164        field_new!(Fq, BigInteger([
165            0x67a04ae427bfb5f8,
166            0x9d32d491eb6a5cff,
167            0x43d03c1cb68051d4,
168            0x0b75ca96f69859a5,
169            0x0763497f5325ec60,
170            0x48076b5c278dd94d,
171            0x8ca3965ff91efd06,
172            0x1e6077657ea02f5d,
173            0xcdd6c153a8c37724,
174            0x28b5b634e5c22ea4,
175            0x9e01e3efd42e902c,
176            0xe3d6815769a804,
177        ])),
178        field_new!(Fq, BigInteger([
179            0x7f96b51bd840c549,
180            0xd59782096496171f,
181            0x49b046fd9ce14bbc,
182            0x4b6163bba7527a56,
183            0xef6c92fb771d59f1,
184            0x0425bedbac1dfdc7,
185            0xd3ac39de759c0ffd,
186            0x9f43ed0e063a81d0,
187            0x5bd7d20b4f9a3ce2,
188            0x0411f03c36cf5c3c,
189            0x2d658fd49661c472,
190            0x1100249ae760b93,
191        ])),
192    ];
193
194    #[inline(always)]
195    fn mul_fp_by_nonresidue(fe: &Self::Fp) -> Self::Fp {
196        let original = -(*fe);
197        let double = original + &original;
198        double + &double
199    }
200}