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}