anemoi/bls12_381/sbox.rs
1use super::Felt;
2use super::MontFp;
3
4use ark_ff::Field;
5
6#[allow(unused)]
7/// Exponent of the Anemoi S-Box
8pub(crate) const ALPHA: u32 = 5;
9
10#[allow(unused)]
11/// Inverse exponent
12pub(crate) const INV_ALPHA: Felt = MontFp!("3201927644177333914734231860588723325245506255951206308265646508899225320392670291554150103303212531230315418047829");
13
14/// Multiplier of the Anemoi S-Box
15#[allow(unused)]
16pub(crate) const BETA: u32 = 2;
17
18/// First added constant of the Anemoi S-Box
19pub(crate) const DELTA: Felt = MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894");
20
21#[allow(unused)]
22/// Second added constant of the Anemoi S-Box
23pub(crate) const QUAD: u32 = 2;
24
25#[inline(always)]
26pub(crate) fn exp_by_inv_alpha(x: &Felt) -> Felt {
27 let t2 = x.square(); // 1: 2
28 let t0 = t2.square(); // 2: 4
29 let t26 = t0 * x; // 3: 5
30 let t6 = t0 * t2; // 4: 6
31 let t20 = t0.square(); // 5: 8
32 let t8 = t26.square(); // 6: 10
33 let t5 = t6 * t26; // 7: 11
34 let t19 = t8 * t26; // 8: 15
35 let t9 = t5 * t6; // 9: 17
36 let t1 = t5 * t8; // 10: 21
37 let t18 = t19 * t20; // 11: 23
38 let t10 = t9 * t8; // 12: 27
39 let t11 = t1 * t20; // 13: 29
40 let t14 = t11 * t8; // 14: 39
41 let t25 = t14 * t2; // 15: 41
42 let t12 = t14 * t20; // 16: 47
43 let t7 = t14 * t8; // 17: 49
44 let t4 = t25 * t8; // 18: 51
45 let t17 = t12 * t6; // 19: 53
46 let t13 = t12 * t8; // 20: 57
47 let t15 = t7 * t8; // 21: 59
48 let t27 = t17 * t8; // 22: 63
49 let t24 = t27 * t20; // 23: 71
50 let t22 = t27 * t8; // 24: 73
51 let mut t0 = t22 * t8; // 25: 83
52 let t2 = t0 * t2; // 26: 85
53 let t23 = t0 * t8; // 27: 93
54 let t3 = t23 * t20; // 28: 101
55 let t21 = t3 * t20; // 29: 109
56 let t6 = t21 * t6; // 30: 115
57 let t16 = t21 * t20; // 31: 117
58 let t8 = t21 * t8; // 32: 119
59 let t20 = t6 * t20; // 33: 123
60 t0 = t0.square(); // 34: 166
61 t0 = t0.square(); // 35: 332
62 t0 = t0.square(); // 36: 664
63 t0 = t0.square(); // 37: 1328
64 t0 = t0.square(); // 38: 2656
65 t0 = t0.square(); // 39: 5312
66 t0 = t0.square(); // 40: 10624
67 t0 = t0.square(); // 41: 21248
68 t0 = t0.square(); // 42: 42496
69 t0 *= t21; // 43: 42605
70 t0 = t0.square(); // 44: 85210
71 t0 = t0.square(); // 45: 170420
72 t0 = t0.square(); // 46: 340840
73 t0 = t0.square(); // 47: 681680
74 t0 = t0.square(); // 48: 1363360
75 t0 = t0.square(); // 49: 2726720
76 t0 = t0.square(); // 50: 5453440
77 t0 = t0.square(); // 51: 10906880
78 t0 *= t27; // 52: 10906943
79 t0 = t0.square(); // 53: 21813886
80 t0 = t0.square(); // 54: 43627772
81 t0 = t0.square(); // 55: 87255544
82 t0 = t0.square(); // 56: 174511088
83 t0 = t0.square(); // 57: 349022176
84 t0 = t0.square(); // 58: 698044352
85 t0 *= t11; // 59: 698044381
86 t0 = t0.square(); // 60: 1396088762
87 t0 = t0.square(); // 61: 2792177524
88 t0 = t0.square(); // 62: 5584355048
89 t0 = t0.square(); // 63: 11168710096
90 t0 = t0.square(); // 64: 22337420192
91 t0 *= t26; // 65: 22337420197
92 t0 = t0.square(); // 66: 44674840394
93 t0 = t0.square(); // 67: 89349680788
94 t0 = t0.square(); // 68: 178699361576
95 t0 = t0.square(); // 69: 357398723152
96 t0 = t0.square(); // 70: 714797446304
97 t0 = t0.square(); // 71: 1429594892608
98 t0 = t0.square(); // 72: 2859189785216
99 t0 = t0.square(); // 73: 5718379570432
100 t0 = t0.square(); // 74: 11436759140864
101 t0 *= t4; // 75: 11436759140915
102 t0 = t0.square(); // 76: 22873518281830
103 t0 = t0.square(); // 77: 45747036563660
104 t0 = t0.square(); // 78: 91494073127320
105 t0 = t0.square(); // 79: 182988146254640
106 t0 = t0.square(); // 80: 365976292509280
107 t0 = t0.square(); // 81: 731952585018560
108 t0 = t0.square(); // 82: 1463905170037120
109 t0 = t0.square(); // 83: 2927810340074240
110 t0 *= t25; // 84: 2927810340074281
111 t0 = t0.square(); // 85: 5855620680148562
112 t0 = t0.square(); // 86: 11711241360297124
113 t0 = t0.square(); // 87: 23422482720594248
114 t0 = t0.square(); // 88: 46844965441188496
115 t0 = t0.square(); // 89: 93689930882376992
116 t0 = t0.square(); // 90: 187379861764753984
117 t0 = t0.square(); // 91: 374759723529507968
118 t0 = t0.square(); // 92: 749519447059015936
119 t0 = t0.square(); // 93: 1499038894118031872
120 t0 *= t1; // 94: 1499038894118031893
121 t0 = t0.square(); // 95: 2998077788236063786
122 t0 = t0.square(); // 96: 5996155576472127572
123 t0 = t0.square(); // 97: 11992311152944255144
124 t0 = t0.square(); // 98: 23984622305888510288
125 t0 = t0.square(); // 99: 47969244611777020576
126 t0 = t0.square(); // 100: 95938489223554041152
127 t0 = t0.square(); // 101: 191876978447108082304
128 t0 = t0.square(); // 102: 383753956894216164608
129 t0 = t0.square(); // 103: 767507913788432329216
130 t0 = t0.square(); // 104: 1535015827576864658432
131 t0 = t0.square(); // 105: 3070031655153729316864
132 t0 *= t24; // 106: 3070031655153729316935
133 t0 = t0.square(); // 107: 6140063310307458633870
134 t0 = t0.square(); // 108: 12280126620614917267740
135 t0 = t0.square(); // 109: 24560253241229834535480
136 t0 = t0.square(); // 110: 49120506482459669070960
137 t0 = t0.square(); // 111: 98241012964919338141920
138 t0 = t0.square(); // 112: 196482025929838676283840
139 t0 = t0.square(); // 113: 392964051859677352567680
140 t0 = t0.square(); // 114: 785928103719354705135360
141 t0 = t0.square(); // 115: 1571856207438709410270720
142 t0 = t0.square(); // 116: 3143712414877418820541440
143 t0 *= t23; // 117: 3143712414877418820541533
144 t0 = t0.square(); // 118: 6287424829754837641083066
145 t0 = t0.square(); // 119: 12574849659509675282166132
146 t0 = t0.square(); // 120: 25149699319019350564332264
147 t0 = t0.square(); // 121: 50299398638038701128664528
148 t0 = t0.square(); // 122: 100598797276077402257329056
149 t0 = t0.square(); // 123: 201197594552154804514658112
150 t0 = t0.square(); // 124: 402395189104309609029316224
151 t0 *= t22; // 125: 402395189104309609029316297
152 t0 = t0.square(); // 126: 804790378208619218058632594
153 t0 = t0.square(); // 127: 1609580756417238436117265188
154 t0 = t0.square(); // 128: 3219161512834476872234530376
155 t0 = t0.square(); // 129: 6438323025668953744469060752
156 t0 = t0.square(); // 130: 12876646051337907488938121504
157 t0 = t0.square(); // 131: 25753292102675814977876243008
158 t0 = t0.square(); // 132: 51506584205351629955752486016
159 t0 = t0.square(); // 133: 103013168410703259911504972032
160 t0 = t0.square(); // 134: 206026336821406519823009944064
161 t0 = t0.square(); // 135: 412052673642813039646019888128
162 t0 *= t6; // 136: 412052673642813039646019888243
163 t0 = t0.square(); // 137: 824105347285626079292039776486
164 t0 = t0.square(); // 138: 1648210694571252158584079552972
165 t0 = t0.square(); // 139: 3296421389142504317168159105944
166 t0 = t0.square(); // 140: 6592842778285008634336318211888
167 t0 = t0.square(); // 141: 13185685556570017268672636423776
168 t0 = t0.square(); // 142: 26371371113140034537345272847552
169 t0 = t0.square(); // 143: 52742742226280069074690545695104
170 t0 *= t21; // 144: 52742742226280069074690545695213
171 t0 = t0.square(); // 145: 105485484452560138149381091390426
172 t0 = t0.square(); // 146: 210970968905120276298762182780852
173 t0 = t0.square(); // 147: 421941937810240552597524365561704
174 t0 = t0.square(); // 148: 843883875620481105195048731123408
175 t0 = t0.square(); // 149: 1687767751240962210390097462246816
176 t0 = t0.square(); // 150: 3375535502481924420780194924493632
177 t0 = t0.square(); // 151: 6751071004963848841560389848987264
178 t0 *= t20; // 152: 6751071004963848841560389848987387
179 t0 = t0.square(); // 153: 13502142009927697683120779697974774
180 t0 = t0.square(); // 154: 27004284019855395366241559395949548
181 t0 = t0.square(); // 155: 54008568039710790732483118791899096
182 t0 = t0.square(); // 156: 108017136079421581464966237583798192
183 t0 = t0.square(); // 157: 216034272158843162929932475167596384
184 t0 = t0.square(); // 158: 432068544317686325859864950335192768
185 t0 *= t17; // 159: 432068544317686325859864950335192821
186 t0 = t0.square(); // 160: 864137088635372651719729900670385642
187 t0 = t0.square(); // 161: 1728274177270745303439459801340771284
188 t0 = t0.square(); // 162: 3456548354541490606878919602681542568
189 t0 = t0.square(); // 163: 6913096709082981213757839205363085136
190 t0 = t0.square(); // 164: 13826193418165962427515678410726170272
191 t0 = t0.square(); // 165: 27652386836331924855031356821452340544
192 t0 *= t13; // 166: 27652386836331924855031356821452340601
193 t0 = t0.square(); // 167: 55304773672663849710062713642904681202
194 t0 = t0.square(); // 168: 110609547345327699420125427285809362404
195 t0 = t0.square(); // 169: 221219094690655398840250854571618724808
196 t0 = t0.square(); // 170: 442438189381310797680501709143237449616
197 t0 = t0.square(); // 171: 884876378762621595361003418286474899232
198 t0 = t0.square(); // 172: 1769752757525243190722006836572949798464
199 t0 = t0.square(); // 173: 3539505515050486381444013673145899596928
200 t0 = t0.square(); // 174: 7079011030100972762888027346291799193856
201 t0 *= t11; // 175: 7079011030100972762888027346291799193885
202 t0 = t0.square(); // 176: 14158022060201945525776054692583598387770
203 t0 = t0.square(); // 177: 28316044120403891051552109385167196775540
204 t0 = t0.square(); // 178: 56632088240807782103104218770334393551080
205 t0 = t0.square(); // 179: 113264176481615564206208437540668787102160
206 t0 = t0.square(); // 180: 226528352963231128412416875081337574204320
207 t0 = t0.square(); // 181: 453056705926462256824833750162675148408640
208 t0 *= t5; // 182: 453056705926462256824833750162675148408651
209 t0 = t0.square(); // 183: 906113411852924513649667500325350296817302
210 t0 = t0.square(); // 184: 1812226823705849027299335000650700593634604
211 t0 = t0.square(); // 185: 3624453647411698054598670001301401187269208
212 t0 = t0.square(); // 186: 7248907294823396109197340002602802374538416
213 t0 = t0.square(); // 187: 14497814589646792218394680005205604749076832
214 t0 = t0.square(); // 188: 28995629179293584436789360010411209498153664
215 t0 = t0.square(); // 189: 57991258358587168873578720020822418996307328
216 t0 = t0.square(); // 190: 115982516717174337747157440041644837992614656
217 t0 *= t19; // 191: 115982516717174337747157440041644837992614671
218 t0 = t0.square(); // 192: 231965033434348675494314880083289675985229342
219 t0 = t0.square(); // 193: 463930066868697350988629760166579351970458684
220 t0 = t0.square(); // 194: 927860133737394701977259520333158703940917368
221 t0 = t0.square(); // 195: 1855720267474789403954519040666317407881834736
222 t0 = t0.square(); // 196: 3711440534949578807909038081332634815763669472
223 t0 = t0.square(); // 197: 7422881069899157615818076162665269631527338944
224 t0 = t0.square(); // 198: 14845762139798315231636152325330539263054677888
225 t0 = t0.square(); // 199: 29691524279596630463272304650661078526109355776
226 t0 = t0.square(); // 200: 59383048559193260926544609301322157052218711552
227 t0 *= t17; // 201: 59383048559193260926544609301322157052218711605
228 t0 = t0.square(); // 202: 118766097118386521853089218602644314104437423210
229 t0 = t0.square(); // 203: 237532194236773043706178437205288628208874846420
230 t0 = t0.square(); // 204: 475064388473546087412356874410577256417749692840
231 t0 = t0.square(); // 205: 950128776947092174824713748821154512835499385680
232 t0 = t0.square(); // 206: 1900257553894184349649427497642309025670998771360
233 t0 = t0.square(); // 207: 3800515107788368699298854995284618051341997542720
234 t0 = t0.square(); // 208: 7601030215576737398597709990569236102683995085440
235 t0 *= t18; // 209: 7601030215576737398597709990569236102683995085463
236 t0 = t0.square(); // 210: 15202060431153474797195419981138472205367990170926
237 t0 = t0.square(); // 211: 30404120862306949594390839962276944410735980341852
238 t0 = t0.square(); // 212: 60808241724613899188781679924553888821471960683704
239 t0 = t0.square(); // 213: 121616483449227798377563359849107777642943921367408
240 t0 = t0.square(); // 214: 243232966898455596755126719698215555285887842734816
241 t0 = t0.square(); // 215: 486465933796911193510253439396431110571775685469632
242 t0 = t0.square(); // 216: 972931867593822387020506878792862221143551370939264
243 t0 = t0.square(); // 217: 1945863735187644774041013757585724442287102741878528
244 t0 = t0.square(); // 218: 3891727470375289548082027515171448884574205483757056
245 t0 *= t17; // 219: 3891727470375289548082027515171448884574205483757109
246 t0 = t0.square(); // 220: 7783454940750579096164055030342897769148410967514218
247 t0 = t0.square(); // 221: 15566909881501158192328110060685795538296821935028436
248 t0 = t0.square(); // 222: 31133819763002316384656220121371591076593643870056872
249 t0 = t0.square(); // 223: 62267639526004632769312440242743182153187287740113744
250 t0 = t0.square(); // 224: 124535279052009265538624880485486364306374575480227488
251 t0 = t0.square(); // 225: 249070558104018531077249760970972728612749150960454976
252 t0 = t0.square(); // 226: 498141116208037062154499521941945457225498301920909952
253 t0 = t0.square(); // 227: 996282232416074124308999043883890914450996603841819904
254 t0 = t0.square(); // 228: 1992564464832148248617998087767781828901993207683639808
255 t0 *= t16; // 229: 1992564464832148248617998087767781828901993207683639925
256 t0 = t0.square(); // 230: 3985128929664296497235996175535563657803986415367279850
257 t0 = t0.square(); // 231: 7970257859328592994471992351071127315607972830734559700
258 t0 = t0.square(); // 232: 15940515718657185988943984702142254631215945661469119400
259 t0 = t0.square(); // 233: 31881031437314371977887969404284509262431891322938238800
260 t0 = t0.square(); // 234: 63762062874628743955775938808569018524863782645876477600
261 t0 = t0.square(); // 235: 127524125749257487911551877617138037049727565291752955200
262 t0 = t0.square(); // 236: 255048251498514975823103755234276074099455130583505910400
263 t0 = t0.square(); // 237: 510096502997029951646207510468552148198910261167011820800
264 t0 *= t3; // 238: 510096502997029951646207510468552148198910261167011820901
265 t0 = t0.square(); // 239: 1020193005994059903292415020937104296397820522334023641802
266 t0 = t0.square(); // 240: 2040386011988119806584830041874208592795641044668047283604
267 t0 = t0.square(); // 241: 4080772023976239613169660083748417185591282089336094567208
268 t0 = t0.square(); // 242: 8161544047952479226339320167496834371182564178672189134416
269 t0 = t0.square(); // 243: 16323088095904958452678640334993668742365128357344378268832
270 t0 = t0.square(); // 244: 32646176191809916905357280669987337484730256714688756537664
271 t0 *= t15; // 245: 32646176191809916905357280669987337484730256714688756537723
272 t0 = t0.square(); // 246: 65292352383619833810714561339974674969460513429377513075446
273 t0 = t0.square(); // 247: 130584704767239667621429122679949349938921026858755026150892
274 t0 = t0.square(); // 248: 261169409534479335242858245359898699877842053717510052301784
275 t0 = t0.square(); // 249: 522338819068958670485716490719797399755684107435020104603568
276 t0 = t0.square(); // 250: 1044677638137917340971432981439594799511368214870040209207136
277 t0 = t0.square(); // 251: 2089355276275834681942865962879189599022736429740080418414272
278 t0 = t0.square(); // 252: 4178710552551669363885731925758379198045472859480160836828544
279 t0 = t0.square(); // 253: 8357421105103338727771463851516758396090945718960321673657088
280 t0 = t0.square(); // 254: 16714842210206677455542927703033516792181891437920643347314176
281 t0 = t0.square(); // 255: 33429684420413354911085855406067033584363782875841286694628352
282 t0 *= t14; // 256: 33429684420413354911085855406067033584363782875841286694628391
283 t0 = t0.square(); // 257: 66859368840826709822171710812134067168727565751682573389256782
284 t0 = t0.square(); // 258: 133718737681653419644343421624268134337455131503365146778513564
285 t0 = t0.square(); // 259: 267437475363306839288686843248536268674910263006730293557027128
286 t0 = t0.square(); // 260: 534874950726613678577373686497072537349820526013460587114054256
287 t0 = t0.square(); // 261: 1069749901453227357154747372994145074699641052026921174228108512
288 t0 = t0.square(); // 262: 2139499802906454714309494745988290149399282104053842348456217024
289 t0 = t0.square(); // 263: 4278999605812909428618989491976580298798564208107684696912434048
290 t0 = t0.square(); // 264: 8557999211625818857237978983953160597597128416215369393824868096
291 t0 = t0.square(); // 265: 17115998423251637714475957967906321195194256832430738787649736192
292 t0 = t0.square(); // 266: 34231996846503275428951915935812642390388513664861477575299472384
293 t0 = t0.square(); // 267: 68463993693006550857903831871625284780777027329722955150598944768
294 t0 *= t8; // 268: 68463993693006550857903831871625284780777027329722955150598944887
295 t0 = t0.square(); // 269: 136927987386013101715807663743250569561554054659445910301197889774
296 t0 = t0.square(); // 270: 273855974772026203431615327486501139123108109318891820602395779548
297 t0 = t0.square(); // 271: 547711949544052406863230654973002278246216218637783641204791559096
298 t0 = t0.square(); // 272: 1095423899088104813726461309946004556492432437275567282409583118192
299 t0 = t0.square(); // 273: 2190847798176209627452922619892009112984864874551134564819166236384
300 t0 = t0.square(); // 274: 4381695596352419254905845239784018225969729749102269129638332472768
301 t0 = t0.square(); // 275: 8763391192704838509811690479568036451939459498204538259276664945536
302 t0 = t0.square(); // 276: 17526782385409677019623380959136072903878918996409076518553329891072
303 t0 *= t13; // 277: 17526782385409677019623380959136072903878918996409076518553329891129
304 t0 = t0.square(); // 278: 35053564770819354039246761918272145807757837992818153037106659782258
305 t0 = t0.square(); // 279: 70107129541638708078493523836544291615515675985636306074213319564516
306 t0 = t0.square(); // 280: 140214259083277416156987047673088583231031351971272612148426639129032
307 t0 = t0.square(); // 281: 280428518166554832313974095346177166462062703942545224296853278258064
308 t0 = t0.square(); // 282: 560857036333109664627948190692354332924125407885090448593706556516128
309 t0 = t0.square(); // 283: 1121714072666219329255896381384708665848250815770180897187413113032256
310 t0 = t0.square(); // 284: 2243428145332438658511792762769417331696501631540361794374826226064512
311 t0 *= t12; // 285: 2243428145332438658511792762769417331696501631540361794374826226064559
312 t0 = t0.square(); // 286: 4486856290664877317023585525538834663393003263080723588749652452129118
313 t0 = t0.square(); // 287: 8973712581329754634047171051077669326786006526161447177499304904258236
314 t0 = t0.square(); // 288: 17947425162659509268094342102155338653572013052322894354998609808516472
315 t0 = t0.square(); // 289: 35894850325319018536188684204310677307144026104645788709997219617032944
316 t0 = t0.square(); // 290: 71789700650638037072377368408621354614288052209291577419994439234065888
317 t0 = t0.square(); // 291: 143579401301276074144754736817242709228576104418583154839988878468131776
318 t0 = t0.square(); // 292: 287158802602552148289509473634485418457152208837166309679977756936263552
319 t0 = t0.square(); // 293: 574317605205104296579018947268970836914304417674332619359955513872527104
320 t0 = t0.square(); // 294: 1148635210410208593158037894537941673828608835348665238719911027745054208
321 t0 = t0.square(); // 295: 2297270420820417186316075789075883347657217670697330477439822055490108416
322 t0 = t0.square(); // 296: 4594540841640834372632151578151766695314435341394660954879644110980216832
323 t0 = t0.square(); // 297: 9189081683281668745264303156303533390628870682789321909759288221960433664
324 t0 *= t7; // 298: 9189081683281668745264303156303533390628870682789321909759288221960433713
325 t0 = t0.square(); // 299: 18378163366563337490528606312607066781257741365578643819518576443920867426
326 t0 = t0.square(); // 300: 36756326733126674981057212625214133562515482731157287639037152887841734852
327 t0 = t0.square(); // 301: 73512653466253349962114425250428267125030965462314575278074305775683469704
328 t0 = t0.square(); // 302: 147025306932506699924228850500856534250061930924629150556148611551366939408
329 t0 = t0.square(); // 303: 294050613865013399848457701001713068500123861849258301112297223102733878816
330 t0 = t0.square(); // 304: 588101227730026799696915402003426137000247723698516602224594446205467757632
331 t0 = t0.square(); // 305: 1176202455460053599393830804006852274000495447397033204449188892410935515264
332 t0 *= t11; // 306: 1176202455460053599393830804006852274000495447397033204449188892410935515293
333 t0 = t0.square(); // 307: 2352404910920107198787661608013704548000990894794066408898377784821871030586
334 t0 = t0.square(); // 308: 4704809821840214397575323216027409096001981789588132817796755569643742061172
335 t0 = t0.square(); // 309: 9409619643680428795150646432054818192003963579176265635593511139287484122344
336 t0 = t0.square(); // 310: 18819239287360857590301292864109636384007927158352531271187022278574968244688
337 t0 = t0.square(); // 311: 37638478574721715180602585728219272768015854316705062542374044557149936489376
338 t0 = t0.square(); // 312: 75276957149443430361205171456438545536031708633410125084748089114299872978752
339 t0 = t0.square(); // 313: 150553914298886860722410342912877091072063417266820250169496178228599745957504
340 t0 *= t10; // 314: 150553914298886860722410342912877091072063417266820250169496178228599745957531
341 t0 = t0.square(); // 315: 301107828597773721444820685825754182144126834533640500338992356457199491915062
342 t0 = t0.square(); // 316: 602215657195547442889641371651508364288253669067281000677984712914398983830124
343 t0 = t0.square(); // 317: 1204431314391094885779282743303016728576507338134562001355969425828797967660248
344 t0 = t0.square(); // 318: 2408862628782189771558565486606033457153014676269124002711938851657595935320496
345 t0 = t0.square(); // 319: 4817725257564379543117130973212066914306029352538248005423877703315191870640992
346 t0 = t0.square(); // 320: 9635450515128759086234261946424133828612058705076496010847755406630383741281984
347 t0 = t0.square(); // 321: 19270901030257518172468523892848267657224117410152992021695510813260767482563968
348 t0 *= t9; // 322: 19270901030257518172468523892848267657224117410152992021695510813260767482563985
349 t0 = t0.square(); // 323: 38541802060515036344937047785696535314448234820305984043391021626521534965127970
350 t0 = t0.square(); // 324: 77083604121030072689874095571393070628896469640611968086782043253043069930255940
351 t0 = t0.square(); // 325: 154167208242060145379748191142786141257792939281223936173564086506086139860511880
352 t0 = t0.square(); // 326: 308334416484120290759496382285572282515585878562447872347128173012172279721023760
353 t0 = t0.square(); // 327: 616668832968240581518992764571144565031171757124895744694256346024344559442047520
354 t0 = t0.square(); // 328: 1233337665936481163037985529142289130062343514249791489388512692048689118884095040
355 t0 = t0.square(); // 329: 2466675331872962326075971058284578260124687028499582978777025384097378237768190080
356 t0 = t0.square(); // 330: 4933350663745924652151942116569156520249374056999165957554050768194756475536380160
357 t0 = t0.square(); // 331: 9866701327491849304303884233138313040498748113998331915108101536389512951072760320
358 t0 *= t4; // 332: 9866701327491849304303884233138313040498748113998331915108101536389512951072760371
359 t0 = t0.square(); // 333: 19733402654983698608607768466276626080997496227996663830216203072779025902145520742
360 t0 = t0.square(); // 334: 39466805309967397217215536932553252161994992455993327660432406145558051804291041484
361 t0 = t0.square(); // 335: 78933610619934794434431073865106504323989984911986655320864812291116103608582082968
362 t0 = t0.square(); // 336: 157867221239869588868862147730213008647979969823973310641729624582232207217164165936
363 t0 = t0.square(); // 337: 315734442479739177737724295460426017295959939647946621283459249164464414434328331872
364 t0 = t0.square(); // 338: 631468884959478355475448590920852034591919879295893242566918498328928828868656663744
365 t0 = t0.square(); // 339: 1262937769918956710950897181841704069183839758591786485133836996657857657737313327488
366 t0 = t0.square(); // 340: 2525875539837913421901794363683408138367679517183572970267673993315715315474626654976
367 t0 *= t4; // 341: 2525875539837913421901794363683408138367679517183572970267673993315715315474626655027
368 t0 = t0.square(); // 342: 5051751079675826843803588727366816276735359034367145940535347986631430630949253310054
369 t0 = t0.square(); // 343: 10103502159351653687607177454733632553470718068734291881070695973262861261898506620108
370 t0 = t0.square(); // 344: 20207004318703307375214354909467265106941436137468583762141391946525722523797013240216
371 t0 = t0.square(); // 345: 40414008637406614750428709818934530213882872274937167524282783893051445047594026480432
372 t0 = t0.square(); // 346: 80828017274813229500857419637869060427765744549874335048565567786102890095188052960864
373 t0 = t0.square(); // 347: 161656034549626459001714839275738120855531489099748670097131135572205780190376105921728
374 t0 = t0.square(); // 348: 323312069099252918003429678551476241711062978199497340194262271144411560380752211843456
375 t0 *= t9; // 349: 323312069099252918003429678551476241711062978199497340194262271144411560380752211843473
376 t0 = t0.square(); // 350: 646624138198505836006859357102952483422125956398994680388524542288823120761504423686946
377 t0 = t0.square(); // 351: 1293248276397011672013718714205904966844251912797989360777049084577646241523008847373892
378 t0 = t0.square(); // 352: 2586496552794023344027437428411809933688503825595978721554098169155292483046017694747784
379 t0 = t0.square(); // 353: 5172993105588046688054874856823619867377007651191957443108196338310584966092035389495568
380 t0 = t0.square(); // 354: 10345986211176093376109749713647239734754015302383914886216392676621169932184070778991136
381 t0 = t0.square(); // 355: 20691972422352186752219499427294479469508030604767829772432785353242339864368141557982272
382 t0 = t0.square(); // 356: 41383944844704373504438998854588958939016061209535659544865570706484679728736283115964544
383 t0 = t0.square(); // 357: 82767889689408747008877997709177917878032122419071319089731141412969359457472566231929088
384 t0 = t0.square(); // 358: 165535779378817494017755995418355835756064244838142638179462282825938718914945132463858176
385 t0 *= t8; // 359: 165535779378817494017755995418355835756064244838142638179462282825938718914945132463858295
386 t0 = t0.square(); // 360: 331071558757634988035511990836711671512128489676285276358924565651877437829890264927716590
387 t0 = t0.square(); // 361: 662143117515269976071023981673423343024256979352570552717849131303754875659780529855433180
388 t0 = t0.square(); // 362: 1324286235030539952142047963346846686048513958705141105435698262607509751319561059710866360
389 t0 = t0.square(); // 363: 2648572470061079904284095926693693372097027917410282210871396525215019502639122119421732720
390 t0 = t0.square(); // 364: 5297144940122159808568191853387386744194055834820564421742793050430039005278244238843465440
391 t0 = t0.square(); // 365: 10594289880244319617136383706774773488388111669641128843485586100860078010556488477686930880
392 t0 = t0.square(); // 366: 21188579760488639234272767413549546976776223339282257686971172201720156021112976955373861760
393 t0 *= t4; // 367: 21188579760488639234272767413549546976776223339282257686971172201720156021112976955373861811
394 t0 = t0.square(); // 368: 42377159520977278468545534827099093953552446678564515373942344403440312042225953910747723622
395 t0 = t0.square(); // 369: 84754319041954556937091069654198187907104893357129030747884688806880624084451907821495447244
396 t0 = t0.square(); // 370: 169508638083909113874182139308396375814209786714258061495769377613761248168903815642990894488
397 t0 = t0.square(); // 371: 339017276167818227748364278616792751628419573428516122991538755227522496337807631285981788976
398 t0 = t0.square(); // 372: 678034552335636455496728557233585503256839146857032245983077510455044992675615262571963577952
399 t0 = t0.square(); // 373: 1356069104671272910993457114467171006513678293714064491966155020910089985351230525143927155904
400 t0 = t0.square(); // 374: 2712138209342545821986914228934342013027356587428128983932310041820179970702461050287854311808
401 t0 = t0.square(); // 375: 5424276418685091643973828457868684026054713174856257967864620083640359941404922100575708623616
402 t0 *= t4; // 376: 5424276418685091643973828457868684026054713174856257967864620083640359941404922100575708623667
403 t0 = t0.square(); // 377: 10848552837370183287947656915737368052109426349712515935729240167280719882809844201151417247334
404 t0 = t0.square(); // 378: 21697105674740366575895313831474736104218852699425031871458480334561439765619688402302834494668
405 t0 = t0.square(); // 379: 43394211349480733151790627662949472208437705398850063742916960669122879531239376804605668989336
406 t0 = t0.square(); // 380: 86788422698961466303581255325898944416875410797700127485833921338245759062478753609211337978672
407 t0 = t0.square(); // 381: 173576845397922932607162510651797888833750821595400254971667842676491518124957507218422675957344
408 t0 = t0.square(); // 382: 347153690795845865214325021303595777667501643190800509943335685352983036249915014436845351914688
409 t0 = t0.square(); // 383: 694307381591691730428650042607191555335003286381601019886671370705966072499830028873690703829376
410 t0 = t0.square(); // 384: 1388614763183383460857300085214383110670006572763202039773342741411932144999660057747381407658752
411 t0 *= t7; // 385: 1388614763183383460857300085214383110670006572763202039773342741411932144999660057747381407658801
412 t0 = t0.square(); // 386: 2777229526366766921714600170428766221340013145526404079546685482823864289999320115494762815317602
413 t0 = t0.square(); // 387: 5554459052733533843429200340857532442680026291052808159093370965647728579998640230989525630635204
414 t0 = t0.square(); // 388: 11108918105467067686858400681715064885360052582105616318186741931295457159997280461979051261270408
415 t0 = t0.square(); // 389: 22217836210934135373716801363430129770720105164211232636373483862590914319994560923958102522540816
416 t0 = t0.square(); // 390: 44435672421868270747433602726860259541440210328422465272746967725181828639989121847916205045081632
417 t0 = t0.square(); // 391: 88871344843736541494867205453720519082880420656844930545493935450363657279978243695832410090163264
418 t0 = t0.square(); // 392: 177742689687473082989734410907441038165760841313689861090987870900727314559956487391664820180326528
419 t0 = t0.square(); // 393: 355485379374946165979468821814882076331521682627379722181975741801454629119912974783329640360653056
420 t0 *= t6; // 394: 355485379374946165979468821814882076331521682627379722181975741801454629119912974783329640360653171
421 t0 = t0.square(); // 395: 710970758749892331958937643629764152663043365254759444363951483602909258239825949566659280721306342
422 t0 = t0.square(); // 396: 1421941517499784663917875287259528305326086730509518888727902967205818516479651899133318561442612684
423 t0 = t0.square(); // 397: 2843883034999569327835750574519056610652173461019037777455805934411637032959303798266637122885225368
424 t0 = t0.square(); // 398: 5687766069999138655671501149038113221304346922038075554911611868823274065918607596533274245770450736
425 t0 = t0.square(); // 399: 11375532139998277311343002298076226442608693844076151109823223737646548131837215193066548491540901472
426 t0 = t0.square(); // 400: 22751064279996554622686004596152452885217387688152302219646447475293096263674430386133096983081802944
427 t0 *= t5; // 401: 22751064279996554622686004596152452885217387688152302219646447475293096263674430386133096983081802955
428 t0 = t0.square(); // 402: 45502128559993109245372009192304905770434775376304604439292894950586192527348860772266193966163605910
429 t0 = t0.square(); // 403: 91004257119986218490744018384609811540869550752609208878585789901172385054697721544532387932327211820
430 t0 = t0.square(); // 404: 182008514239972436981488036769219623081739101505218417757171579802344770109395443089064775864654423640
431 t0 = t0.square(); // 405: 364017028479944873962976073538439246163478203010436835514343159604689540218790886178129551729308847280
432 t0 = t0.square(); // 406: 728034056959889747925952147076878492326956406020873671028686319209379080437581772356259103458617694560
433 t0 = t0.square(); // 407: 1456068113919779495851904294153756984653912812041747342057372638418758160875163544712518206917235389120
434 t0 = t0.square(); // 408: 2912136227839558991703808588307513969307825624083494684114745276837516321750327089425036413834470778240
435 t0 = t0.square(); // 409: 5824272455679117983407617176615027938615651248166989368229490553675032643500654178850072827668941556480
436 t0 *= t4; // 410: 5824272455679117983407617176615027938615651248166989368229490553675032643500654178850072827668941556531
437 t0 = t0.square(); // 411: 11648544911358235966815234353230055877231302496333978736458981107350065287001308357700145655337883113062
438 t0 = t0.square(); // 412: 23297089822716471933630468706460111754462604992667957472917962214700130574002616715400291310675766226124
439 t0 = t0.square(); // 413: 46594179645432943867260937412920223508925209985335914945835924429400261148005233430800582621351532452248
440 t0 = t0.square(); // 414: 93188359290865887734521874825840447017850419970671829891671848858800522296010466861601165242703064904496
441 t0 = t0.square(); // 415: 186376718581731775469043749651680894035700839941343659783343697717601044592020933723202330485406129808992
442 t0 = t0.square(); // 416: 372753437163463550938087499303361788071401679882687319566687395435202089184041867446404660970812259617984
443 t0 = t0.square(); // 417: 745506874326927101876174998606723576142803359765374639133374790870404178368083734892809321941624519235968
444 t0 = t0.square(); // 418: 1491013748653854203752349997213447152285606719530749278266749581740808356736167469785618643883249038471936
445 t0 *= t4; // 419: 1491013748653854203752349997213447152285606719530749278266749581740808356736167469785618643883249038471987
446 t0 = t0.square(); // 420: 2982027497307708407504699994426894304571213439061498556533499163481616713472334939571237287766498076943974
447 t0 = t0.square(); // 421: 5964054994615416815009399988853788609142426878122997113066998326963233426944669879142474575532996153887948
448 t0 = t0.square(); // 422: 11928109989230833630018799977707577218284853756245994226133996653926466853889339758284949151065992307775896
449 t0 = t0.square(); // 423: 23856219978461667260037599955415154436569707512491988452267993307852933707778679516569898302131984615551792
450 t0 = t0.square(); // 424: 47712439956923334520075199910830308873139415024983976904535986615705867415557359033139796604263969231103584
451 t0 = t0.square(); // 425: 95424879913846669040150399821660617746278830049967953809071973231411734831114718066279593208527938462207168
452 t0 = t0.square(); // 426: 190849759827693338080300799643321235492557660099935907618143946462823469662229436132559186417055876924414336
453 t0 = t0.square(); // 427: 381699519655386676160601599286642470985115320199871815236287892925646939324458872265118372834111753848828672
454 t0 *= t4; // 428: 381699519655386676160601599286642470985115320199871815236287892925646939324458872265118372834111753848828723
455 t0 = t0.square(); // 429: 763399039310773352321203198573284941970230640399743630472575785851293878648917744530236745668223507697657446
456 t0 = t0.square(); // 430: 1526798078621546704642406397146569883940461280799487260945151571702587757297835489060473491336447015395314892
457 t0 = t0.square(); // 431: 3053596157243093409284812794293139767880922561598974521890303143405175514595670978120946982672894030790629784
458 t0 = t0.square(); // 432: 6107192314486186818569625588586279535761845123197949043780606286810351029191341956241893965345788061581259568
459 t0 = t0.square(); // 433: 12214384628972373637139251177172559071523690246395898087561212573620702058382683912483787930691576123162519136
460 t0 = t0.square(); // 434: 24428769257944747274278502354345118143047380492791796175122425147241404116765367824967575861383152246325038272
461 t0 = t0.square(); // 435: 48857538515889494548557004708690236286094760985583592350244850294482808233530735649935151722766304492650076544
462 t0 = t0.square(); // 436: 97715077031778989097114009417380472572189521971167184700489700588965616467061471299870303445532608985300153088
463 t0 = t0.square(); // 437: 195430154063557978194228018834760945144379043942334369400979401177931232934122942599740606891065217970600306176
464 t0 *= t3; // 438: 195430154063557978194228018834760945144379043942334369400979401177931232934122942599740606891065217970600306277
465 t0 = t0.square(); // 439: 390860308127115956388456037669521890288758087884668738801958802355862465868245885199481213782130435941200612554
466 t0 = t0.square(); // 440: 781720616254231912776912075339043780577516175769337477603917604711724931736491770398962427564260871882401225108
467 t0 = t0.square(); // 441: 1563441232508463825553824150678087561155032351538674955207835209423449863472983540797924855128521743764802450216
468 t0 = t0.square(); // 442: 3126882465016927651107648301356175122310064703077349910415670418846899726945967081595849710257043487529604900432
469 t0 = t0.square(); // 443: 6253764930033855302215296602712350244620129406154699820831340837693799453891934163191699420514086975059209800864
470 t0 = t0.square(); // 444: 12507529860067710604430593205424700489240258812309399641662681675387598907783868326383398841028173950118419601728
471 t0 = t0.square(); // 445: 25015059720135421208861186410849400978480517624618799283325363350775197815567736652766797682056347900236839203456
472 t0 = t0.square(); // 446: 50030119440270842417722372821698801956961035249237598566650726701550395631135473305533595364112695800473678406912
473 t0 *= t2; // 447: 50030119440270842417722372821698801956961035249237598566650726701550395631135473305533595364112695800473678406997
474 t0 = t0.square(); // 448: 100060238880541684835444745643397603913922070498475197133301453403100791262270946611067190728225391600947356813994
475 t0 = t0.square(); // 449: 200120477761083369670889491286795207827844140996950394266602906806201582524541893222134381456450783201894713627988
476 t0 = t0.square(); // 450: 400240955522166739341778982573590415655688281993900788533205813612403165049083786444268762912901566403789427255976
477 t0 = t0.square(); // 451: 800481911044333478683557965147180831311376563987801577066411627224806330098167572888537525825803132807578854511952
478 t0 = t0.square(); // 452: 1600963822088666957367115930294361662622753127975603154132823254449612660196335145777075051651606265615157709023904
479 t0 = t0.square(); // 453: 3201927644177333914734231860588723325245506255951206308265646508899225320392670291554150103303212531230315418047808
480 t0 * t1 // 454: 3201927644177333914734231860588723325245506255951206308265646508899225320392670291554150103303212531230315418047829
481}
482
483#[cfg(test)]
484mod tests {
485 use super::*;
486 use ark_ff::One;
487 use ark_ff::PrimeField;
488
489 #[test]
490 fn test_alpha() {
491 let mut a = -Felt::one();
492 for _ in 0..100 {
493 assert_eq!(exp_by_inv_alpha(&a), a.pow(INV_ALPHA.into_bigint()));
494 a += a;
495 }
496 }
497}