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}