testudo/src/parameters.rs
src/parameters.rsRaw
1use ark_bls12_377::Fr;
2use ark_crypto_primitives::sponge::poseidon::PoseidonConfig;
3use std::str::FromStr;
4// Copyright: https://github.com/nikkolasg/ark-dkg/blob/main/src/parameters.rs
5use json::JsonValue;
6use lazy_static::lazy_static;
7
8lazy_static! {
9 // bls12377_rate2_constraints_fr:
10pub static ref FR: JsonValue = object! {
11 "ark" => array![
12 array!["1370773116404421539888881648821194629032979299946048429076387284005101684675",
13"4673035637825817609038514733539555185313791666023633961663352080665830654830",
14"3476986714632640194314485873881082667866912997891863048915892042674874286264"],
15array!["1082495278266482754833562621758308632581366365108718780801560341752506567697",
16"4949432510532674124503328437030614426007112126335799011165573383397503068558",
17"1330731268421256836250705136567442317504087954921291231955447229193812596308"],
18array!["2649505161225663922316999879032136225486779063673300240621719420078616600331",
19"4969420587703679612645522006695883166296724515300508402438681500077273342102",
20"205635712587803026777585519450868615715404988831679984758308345484658244699"],
21array!["6145772648854219628629735661952781083869402744236565775495743574991105198727",
22"5694971131555029816374722311330556638260056256238039903705739439184187043937",
23"5741725876337992913741719090196370235271299497940404104226910654118627348231"],
24array!["6469638413629030129780219709477213488269112947492045389237429028620220258446",
25"3701595212702118832843766258638566924918883592466668319824165091176624488470",
26"3788264172113320071929375505654410621672880197708720070568683533593741188367"],
27array!["7440115096888436553805393179190448787187286166192882400220572931865568317182",
28"792346028642694686435936057983036575794551345818605100013220351237266490211",
29"3512073197867644095949820682768614757198377867832806840119595329029395413419"],
30array!["3327088580126882425803902509250293076948968718390152099056814690231480975540",
31"7158369207426751973498757672315193862013926247640641608613447343948389969907",
32"6576114422707630183258306285876174832535448513519868242206479550748199028650"],
33array!["1750441329216804285131573838407988974537000108919914117251383215390240334007",
34"6643642586767682146943021170325866479407987761019956931934065669737733844970",
35"4106833857706706417652949425395842926674588555313556065852954705212767334548"],
36array!["5196247641080157421214976259470019902011109253162446920598369271583914387912",
37"6360624992789526556614108772011303405529807087502693775123890278812066474754",
38"8425833359837698797187325575646708254811496588866812335451071326764069753553"],
39array!["7571765444928048488636382364785227388831860339901373587410494373985769122100",
40"1146560176939543249528183531911179059346379826648787355971780563762045417939",
41"7065673187452873657602174269205792331276819829797382751854008973390840650347"],
42array!["2996886232144394882237600400269759049381836612341075168714674419715424495381",
43"7668744387648470169368229696434415530109096020857128629089289952099341334341",
44"936627698981026919732496023789041288394375500602254911470718843646602645053"],
45array!["6199749224785668013863210092063343076018531979597999604829468825162260274190",
46"1653132234679858820482383205271489733007453315887823778464537322543673289375",
47"7939359542319254103812635759696217625861967838748888560647186882218141754398"],
48array!["5250147394211818178524181700154433748053992647055590962793825894928645733326",
49"235902753941634492088451291363018081809625358810315316265161104829935550542",
50"6608963137139961850002639926351347514621255004982055637993898513250013620207"],
51array!["686840635267965663175276645211808051025823527505028096239338481540935993835",
52"6836915689880452140045500520891176609600850753468429607484223074627863622754",
53"4411311036661487117682008390277121256586135166845650218368031395328640568455"],
54array!["7765580651637884064091086941299831107821005732883926779656422881469118342677",
55"332549754384827539552516583331436482626027168628972328124682073094327566178",
56"8438579169602499403531276834153862236681805902767396281885988675130427183942"],
57array!["4371224392051444141538216717830171873522813314722974453159288159086172590441",
58"4471819188266525256545603690402039960553559029943278641513107103995534212653",
59"7934285249368611074358220926618133755594116808280441387064776330233673680433"],
60array!["3296929004083914338419828203502973195235748568216135964056267831058260996338",
61"7828705062628438916991665037339807083733865061668384262916273779860279371794",
62"6313358380505257639005175768394745400256528068580776946435054333930810425918"],
63array!["7673091158517942236320201239127705985446414040558434294512441355493079388101",
64"3589839431787481799335476281766961640592432750884680804513596535388211513959",
65"3497309798506406648010286927425548038594271991920637549888387014860982947288"],
66array!["3598928531842189258027744661377220155690961099878644839237443661252156892627",
67"8323476545439527339398168929351847585459351691146904838200536423836775797722",
68"2525233425021205371462807301191193452372106809085080242885832543937723343824"],
69array!["1670123541208150697178760793866430341950571765422973242642698972122650175931",
70"2615994352824306042392204336460002628039562926557752567316988279659549764738",
71"3845612285742795068547496524855308821681721826554794539870518271238257264872"],
72array!["8111729937113136682593516470591971173110681064547090000686075778488505769131",
73"8396009887088699712099390488777898295472002649026341742255474271675851100167",
74"7414449034416524223782013238252312102346828190465700203171291370882467344947"],
75array!["3778308769422683143427677977866154704853508570989688082271648398982585170107",
76"2565370813801956884760401215151019368813258954878221563399238313359761598300",
77"7277843344904687178893605017520459777796065293383180828267621160222576167983"],
78array!["6533305346353864830435743885484797433819452357103761181561861553139604158691",
79"7023616807188225486961828699414844137821383541366139971758751915067616890468",
80"6455936034448761051686329703810283225146169133435552271890713431685063292826"],
81array!["2781819771186595572605878483518345975589831093852202671865373784050027047498",
82"7768920898267371999735782676903681841500678447293607126814923973294043875457",
83"6463549363657422809088424260159871142005366302883731565233242485772646214776"],
84array!["4269033939844383336636476360431731618619965524039119758847937142713481376709",
85"5618036788017776315188246458501777138795420885496187406031735668173200947333",
86"1128431213282240763420656004648057492974288942591424362188971631793337713791"],
87array!["6900739195883338461228609955335408882714240356250551921341894223851444718631",
88"3771335365721990684607605930021444592509300370948450043449389607062564762590",
89"4101659620264578558029808267598816776989279597141521237379858078563415422176"],
90array!["7265965499850925058171553371274334440963706378337393611300731052328159723420",
91"4766078774636290635629565607286497839044156826339894416138410680627572132174",
92"6432220484581857509344049161489739648526811837695982886809250552529276108059"],
93array!["6361365189519422980433504384140223138978192212838226387265114914908491362931",
94"7610377774980016354219333532677870219839779550900332138169496134065793623856",
95"363180943030113865942993953461474483659264066502549823448101062593623940092"],
96array!["3562244767885763851343292605940116818317029725206904934994049890929589055395",
97"7782549227482772885045540707357099585281118980712854335622177919009966444948",
98"1275552603578693917501370061277948491143012995771911804618466157236333967239"],
99array!["5104148721380689096094143534135757186465840305075873333902995773940524349076",
100"3827555903928560008785730325772720209567461775844698712063218244346202837926",
101"6537952092752701292661689328736100739363623229800800023575262375504637794811"],
102array!["2625555787287768315537311869809801184270047957788564515280996906803464172085",
103"2268046926631224821219360422346148209575446526490776085639666316914303207343",
104"8301985790233975096406293902798523168400755923104779849614021896827941122062"],
105array!["6186410907907226666421909877388154922245464592386712702411681535145025981542",
106"1570197114753247526703806268420919303949793186535455032181860083077073573260",
107"6433616921731463425493337442585921501113569311931762833956390491384184622184"],
108array!["3730715929874541583946502538607860277000019933547155277889700636306045698678",
109"4162712607911623590542516061947062496983700183068013598513127619182396118738",
110"4885581468925689451043482261642022591161185334411569876922526171563347772487"],
111array!["679010986662603253067780482929422410547319947222192616893132766589997651700",
112"7045332371454775389874918027434858274122123892961682451412342124928285105115",
113"796483939088841221822094384379289433804847199444006131260701274900329521826"],
114array!["6930777873598706215302735286927888271122111082058406024378887982572264481712",
115"3833261336312955683233981899122259611841384124139797023838966596495768744423",
116"6081952172694136481884686958014712088378824178559544670607383857565862846284"],
117array!["3816381396460078181431529965953560061945407168453302734314638292833792891390",
118"56734387980297685686110088096585973744605712015961903089771968507489169889",
119"1528381975769046861077120384272922840572114805411576866912148437940560430592"],
120array!["4051427337822729290390706006634045761150954597129823553613464074823819976689",
121"928801883926308717594921627141285880564599719525707838888160095066522021660",
122"2575814441780474908465005749689528467553680700052052921662671958906858409792"],
123array!["4188482005041843983756841875722811236284873807578170011114849822278345286775",
124"2055640774204777367415844703991682482137697203553277498227758201416424138567",
125"4575553062307433825409075011087260276527850105624870927391350382554634786094"],
126array!["1854996916655462786356197865726500413712215270951193953965916926815164398288",
127"4106990062567081635175461840146829007165341060131472749713325730182145598945",
128"4440684113159162228103294475409844107272920293202271745070427054893404635089"]],
129"mds" => array![array!["6093452032963406658309134825240609333033222270199073508119142384975416392638",
130"5968273173562867837210008744966745230923761158428968101807573098840850097286",
131"1100466639266852149977689148055725793531897994956807001704693611715839541982"],
132array!["3160983601532844171864802850648492289862147997874094785600836495095965353712",
133"2338351297827692414112631814274572996809824929139580588221558887342663769892",
134"3177005087903404343485399282920555615020488967881372266904325860698809358885"],
135array!["2285176219817854683696635383059984246218458246545520061123961933072089703485",
136"84377861777946561525373172505381054389617879929776365352216307785104476701",
137"8280884008678095605415834125731826663585461281789631237939546251146561093166"]],
138
139 "rate" => 2,
140 "alpha"=> 17,
141 "full_rounds" => 8,
142 "partial_rounds" => 31
143 };
144}
145
146/// TODO
147pub fn poseidon_params() -> PoseidonConfig<Fr> {
148 let arks = FR["ark"]
149 .members()
150 .map(|ark| {
151 ark
152 .members()
153 .map(|v| Fr::from_str(v.as_str().unwrap()).unwrap())
154 .collect::<Vec<_>>()
155 })
156 .collect::<Vec<_>>();
157 let mds = FR["mds"]
158 .members()
159 .map(|m| {
160 m.members()
161 .map(|v| Fr::from_str(v.as_str().unwrap()).unwrap())
162 .collect::<Vec<_>>()
163 })
164 .collect::<Vec<_>>();
165 PoseidonConfig::new(
166 FR["full_rounds"].as_usize().unwrap(),
167 FR["partial_rounds"].as_usize().unwrap(),
168 FR["alpha"].as_u64().unwrap(),
169 mds,
170 arks,
171 FR["rate"].as_usize().unwrap(),
172 // TODO (nikkolasg): check out the concrete parameters for the capacity
173 // so far taken from https://github.com/AleoHQ/snarkVM/blob/d6ce2d3540b9355b59ef580db998188c786f8599/fields/src/traits/poseidon_default.rs#L43
174 1,
175 )
176}
177
178// Generated from poseidon_transcript::test::poseidon_parameters_generation
179pub fn poseidon_params_bls12381() -> PoseidonConfig<ark_bls12_381::Fr> {
180 use ark_ff::PrimeField;
181
182 use poseidon_parameters::{
183 Alpha, ArcMatrix, Matrix, MatrixOperations, MdsMatrix, OptimizedArcMatrix,
184 OptimizedMdsMatrices, PoseidonParameters, RoundNumbers, SquareMatrix,
185 };
186
187 /// Parameters for the rate-1 instance of Poseidon.
188 pub fn rate_1<F: PrimeField>() -> PoseidonParameters<F> {
189 PoseidonParameters {
190 M: 128,
191 t: 2,
192 arc: ArcMatrix::new(
193 64,
194 2,
195 vec![
196 F::from_str(
197 "35174739893055911104493616029378130908017657834702731071195911003169112450229",
198 )
199 .map_err(|_| ())
200 .unwrap(),
201 F::from_str(
202 "40230473166484073181383530626136429631051240172158259323832118663695222064618",
203 )
204 .map_err(|_| ())
205 .unwrap(),
206 F::from_str(
207 "44839971797550275719608927493602345619671796219131839128512847210863471539893",
208 )
209 .map_err(|_| ())
210 .unwrap(),
211 F::from_str(
212 "48611564661854252146943435349048894917868766542696555144699929229862960415826",
213 )
214 .map_err(|_| ())
215 .unwrap(),
216 F::from_str(
217 "40685922923883326639435460208454299274336241847181916712959630054792010757353",
218 )
219 .map_err(|_| ())
220 .unwrap(),
221 F::from_str(
222 "15664326207051802832937062272185115402684860397390155009854115660846132411502",
223 )
224 .map_err(|_| ())
225 .unwrap(),
226 F::from_str(
227 "20394588293088308460232807257084465383971903994422965392216628021702933756783",
228 )
229 .map_err(|_| ())
230 .unwrap(),
231 F::from_str(
232 "38072899122370719412288433912125900148799524273752876684473712699262778897654",
233 )
234 .map_err(|_| ())
235 .unwrap(),
236 F::from_str(
237 "49322204581160802920728528441668898478821361914594574984125707955891751339030",
238 )
239 .map_err(|_| ())
240 .unwrap(),
241 F::from_str(
242 "50347305345520436535964839331484028706021264874956603553067798037836173651466",
243 )
244 .map_err(|_| ())
245 .unwrap(),
246 F::from_str(
247 "40078972002964969619442410831168416589272403782380052533737439660325916494912",
248 )
249 .map_err(|_| ())
250 .unwrap(),
251 F::from_str(
252 "16924481893633890556036089675091788745304335123156116162143840931183063196275",
253 )
254 .map_err(|_| ())
255 .unwrap(),
256 F::from_str(
257 "15950945481350597658451757244282476321967934435937826665895833437077276040754",
258 )
259 .map_err(|_| ())
260 .unwrap(),
261 F::from_str(
262 "45461282993637819573288749652453263783235945959670912694991729940283965985733",
263 )
264 .map_err(|_| ())
265 .unwrap(),
266 F::from_str(
267 "28038644046234298370628400737789907143817173874662134250914598498795544431933",
268 )
269 .map_err(|_| ())
270 .unwrap(),
271 F::from_str(
272 "11068658063110546729562922745621277134925014371838931507832785600289614789661",
273 )
274 .map_err(|_| ())
275 .unwrap(),
276 F::from_str(
277 "52268179647931159024439236070026950641875512180000134500458099574638256905396",
278 )
279 .map_err(|_| ())
280 .unwrap(),
281 F::from_str(
282 "20086107503624605748636970696926057193402564249603453473832198318657465264844",
283 )
284 .map_err(|_| ())
285 .unwrap(),
286 F::from_str(
287 "43167135986193729211374724389523185950396183466709666189982348666853925219274",
288 )
289 .map_err(|_| ())
290 .unwrap(),
291 F::from_str(
292 "17447884039561508187156464597183128324504945258768782636135974167343387840370",
293 )
294 .map_err(|_| ())
295 .unwrap(),
296 F::from_str(
297 "38143921110340159188228723493420793611575037275078276538202087394517162729554",
298 )
299 .map_err(|_| ())
300 .unwrap(),
301 F::from_str(
302 "16552274712964434889263219772539968802934308159216951923060313539515542031786",
303 )
304 .map_err(|_| ())
305 .unwrap(),
306 F::from_str(
307 "21533690197859269486445042768281999749203728740955226853531960445800814390872",
308 )
309 .map_err(|_| ())
310 .unwrap(),
311 F::from_str(
312 "21880324978302337713295482389160476412101864070449056420604485964938425631874",
313 )
314 .map_err(|_| ())
315 .unwrap(),
316 F::from_str(
317 "21087213863282472584378891060158648179244240590829455065271622458534461188836",
318 )
319 .map_err(|_| ())
320 .unwrap(),
321 F::from_str(
322 "45441431536584624993024537766051601076632677727170866925607963222280486713049",
323 )
324 .map_err(|_| ())
325 .unwrap(),
326 F::from_str(
327 "30366589203056029534723552859270912699187398046791858542022387243548834105416",
328 )
329 .map_err(|_| ())
330 .unwrap(),
331 F::from_str(
332 "16733270300941292512227942400499003353179417300568446496228472021958136869720",
333 )
334 .map_err(|_| ())
335 .unwrap(),
336 F::from_str(
337 "47689344912249729511524931558254404476237521452234110431416696572010445584377",
338 )
339 .map_err(|_| ())
340 .unwrap(),
341 F::from_str(
342 "51082398733030351856006960204664584892075227924560364715540908659573989781750",
343 )
344 .map_err(|_| ())
345 .unwrap(),
346 F::from_str(
347 "43167631539924493632724725819354890041217481730115306669306358893967667398874",
348 )
349 .map_err(|_| ())
350 .unwrap(),
351 F::from_str(
352 "26279180116818040201102703456273647693759458841914982758720296510206405428021",
353 )
354 .map_err(|_| ())
355 .unwrap(),
356 F::from_str(
357 "46216367353381802394196440660508655919466089439065744128194487821032228754652",
358 )
359 .map_err(|_| ())
360 .unwrap(),
361 F::from_str(
362 "7697386669681950056820540614309128742475760814776187777185453179049760288818",
363 )
364 .map_err(|_| ())
365 .unwrap(),
366 F::from_str(
367 "21817782321868614563882198267973607652180292878221625474094565055913249527776",
368 )
369 .map_err(|_| ())
370 .unwrap(),
371 F::from_str(
372 "32913105459022632076500291209667002113801444807962815598956143828295422498435",
373 )
374 .map_err(|_| ())
375 .unwrap(),
376 F::from_str(
377 "8502502120080628515364514243099640525167810254369523636419786457595198827016",
378 )
379 .map_err(|_| ())
380 .unwrap(),
381 F::from_str(
382 "30648576830725883184207011877575066156796295678736109722327320104219004516016",
383 )
384 .map_err(|_| ())
385 .unwrap(),
386 F::from_str(
387 "45671339585608301452963125193632555070872004563546575584248952737167410364255",
388 )
389 .map_err(|_| ())
390 .unwrap(),
391 F::from_str(
392 "2451562695720526255410159479987351458212942773001104345088347268337017907959",
393 )
394 .map_err(|_| ())
395 .unwrap(),
396 F::from_str(
397 "7231969043003068614870036828648884326376597612869950504826116686399812612615",
398 )
399 .map_err(|_| ())
400 .unwrap(),
401 F::from_str(
402 "47273307399297813289148635743141600935869642174900722409535446469272321692250",
403 )
404 .map_err(|_| ())
405 .unwrap(),
406 F::from_str(
407 "27329929942264081140373255677952719498722443205980316837000158653641048193545",
408 )
409 .map_err(|_| ())
410 .unwrap(),
411 F::from_str(
412 "34885886867965298185213628215610826501969641592969627478599392659366672373049",
413 )
414 .map_err(|_| ())
415 .unwrap(),
416 F::from_str(
417 "25721535552417582691507498115295027536875255063383254204046680789623453672738",
418 )
419 .map_err(|_| ())
420 .unwrap(),
421 F::from_str(
422 "33423368799112636093951957186824418831319616314165017049161108153912788138739",
423 )
424 .map_err(|_| ())
425 .unwrap(),
426 F::from_str(
427 "25189833401427047672367010746537756277335149535290712725530069868987176912248",
428 )
429 .map_err(|_| ())
430 .unwrap(),
431 F::from_str(
432 "47958321445457642291354706357838648199395839243428939094705320859005837779683",
433 )
434 .map_err(|_| ())
435 .unwrap(),
436 F::from_str(
437 "31774563161791760397918769926476984438505538732495587514473389056037994152917",
438 )
439 .map_err(|_| ())
440 .unwrap(),
441 F::from_str(
442 "47850858374935538132163048932011117808042772861034650362901884832239133015769",
443 )
444 .map_err(|_| ())
445 .unwrap(),
446 F::from_str(
447 "12199128582337530870446335645513552144450426981759317374083089598580379977396",
448 )
449 .map_err(|_| ())
450 .unwrap(),
451 F::from_str(
452 "47383053307574057321551022954108360871160286114060097754143644961632203800586",
453 )
454 .map_err(|_| ())
455 .unwrap(),
456 F::from_str(
457 "13803873123545025453120373087635256640332504728831881021333511396025254579362",
458 )
459 .map_err(|_| ())
460 .unwrap(),
461 F::from_str(
462 "23837178543685639949465643421241187863068824855019641916163779619876342616994",
463 )
464 .map_err(|_| ())
465 .unwrap(),
466 F::from_str(
467 "31189587782086980076115943766865860302487147542493494232203123657276644861038",
468 )
469 .map_err(|_| ())
470 .unwrap(),
471 F::from_str(
472 "46499582074722273407549664254855207560785631035023694347608062453482015876732",
473 )
474 .map_err(|_| ())
475 .unwrap(),
476 F::from_str(
477 "26662253988013080389152043229142922449414668235746968994211290964651963062577",
478 )
479 .map_err(|_| ())
480 .unwrap(),
481 F::from_str(
482 "7640762545216115926527336572554187073301504782874830986070234716899751469743",
483 )
484 .map_err(|_| ())
485 .unwrap(),
486 F::from_str(
487 "34498963117721665288552413822781095260286143856801028464976598055529802364121",
488 )
489 .map_err(|_| ())
490 .unwrap(),
491 F::from_str(
492 "36341838182182173408654982018067474537982027919615372559077851240339996099909",
493 )
494 .map_err(|_| ())
495 .unwrap(),
496 F::from_str(
497 "48300815548868869899847665404889851174998730453507260888165473018017728774364",
498 )
499 .map_err(|_| ())
500 .unwrap(),
501 F::from_str(
502 "32747300835280625438818285868260843662581362309780466961516941514877133787742",
503 )
504 .map_err(|_| ())
505 .unwrap(),
506 F::from_str(
507 "45303055704904829718227319208556302736092241137651995389242696979297340573498",
508 )
509 .map_err(|_| ())
510 .unwrap(),
511 F::from_str(
512 "4026222424264187292280393735543795340594832329968061359731987906507864963350",
513 )
514 .map_err(|_| ())
515 .unwrap(),
516 F::from_str(
517 "31228142597140675203545792153829318135052985461159014806691885654670181871080",
518 )
519 .map_err(|_| ())
520 .unwrap(),
521 F::from_str(
522 "16750970802520682106296025351756788120283612961882144708385294780405339907653",
523 )
524 .map_err(|_| ())
525 .unwrap(),
526 F::from_str(
527 "20590763839978944194181943371062517541785283010773701162056751611994399836929",
528 )
529 .map_err(|_| ())
530 .unwrap(),
531 F::from_str(
532 "37594126822410828138420253267022641722217448081718524151329800547846230255554",
533 )
534 .map_err(|_| ())
535 .unwrap(),
536 F::from_str(
537 "2394917091132363277251637490654694317375647018617394697153359156851524846663",
538 )
539 .map_err(|_| ())
540 .unwrap(),
541 F::from_str(
542 "19737567843628339977867209886872321409023634418218069475717765230353858108711",
543 )
544 .map_err(|_| ())
545 .unwrap(),
546 F::from_str(
547 "42204066697221303743688912704913307336835691602781490921152392223146514657878",
548 )
549 .map_err(|_| ())
550 .unwrap(),
551 F::from_str(
552 "38876322214460807353380405022935203128264986058834077654885314090533204762902",
553 )
554 .map_err(|_| ())
555 .unwrap(),
556 F::from_str(
557 "40247991658021514679970964566577204929744204347802761928836742882323686245178",
558 )
559 .map_err(|_| ())
560 .unwrap(),
561 F::from_str(
562 "39561906161264753200012194261000443020947453081833838411624410505039816555019",
563 )
564 .map_err(|_| ())
565 .unwrap(),
566 F::from_str(
567 "11166460550589161376470931941636300531100498757195643048019370497750388675069",
568 )
569 .map_err(|_| ())
570 .unwrap(),
571 F::from_str(
572 "24790565769125580275808568537357949817511203246184311136698467928472412457388",
573 )
574 .map_err(|_| ())
575 .unwrap(),
576 F::from_str(
577 "11554811916664964398531930051533768691042015283409338870777253388332997487366",
578 )
579 .map_err(|_| ())
580 .unwrap(),
581 F::from_str(
582 "29075039934313065791873216420662295250443756892492849722546053940305352208592",
583 )
584 .map_err(|_| ())
585 .unwrap(),
586 F::from_str(
587 "39006987007077517708714677464659567763889315959219170058379373515871687446558",
588 )
589 .map_err(|_| ())
590 .unwrap(),
591 F::from_str(
592 "10061028159773233365380812282944217591122833800994251428395880422048305719205",
593 )
594 .map_err(|_| ())
595 .unwrap(),
596 F::from_str(
597 "25031744215108526550081827540392247511207429766528399786265447570055547629537",
598 )
599 .map_err(|_| ())
600 .unwrap(),
601 F::from_str(
602 "10547501786444119997366494351393198125463151669258024373934193854191592243660",
603 )
604 .map_err(|_| ())
605 .unwrap(),
606 F::from_str(
607 "41670235909630407351693051359364867863450981844765151303749913478896054145311",
608 )
609 .map_err(|_| ())
610 .unwrap(),
611 F::from_str(
612 "1550363730816174450383908114106000535080436631518311072819950124158318191772",
613 )
614 .map_err(|_| ())
615 .unwrap(),
616 F::from_str(
617 "45637974422753200101239746614094187617113326582060147125507840703682309645118",
618 )
619 .map_err(|_| ())
620 .unwrap(),
621 F::from_str(
622 "6370060789642013553710100441744454816236009933679880713369392969145674474801",
623 )
624 .map_err(|_| ())
625 .unwrap(),
626 F::from_str(
627 "35620803994636505121581975698616513950631274399330479421894994077745439358719",
628 )
629 .map_err(|_| ())
630 .unwrap(),
631 F::from_str(
632 "16067112068611935345405777398473590697557771847332060708439576094222338198471",
633 )
634 .map_err(|_| ())
635 .unwrap(),
636 F::from_str(
637 "30951410852793823879089954146089097398960021512400590702302072057244085482851",
638 )
639 .map_err(|_| ())
640 .unwrap(),
641 F::from_str(
642 "12276812530571706718883327429408937606433993990196477479137283768845651925632",
643 )
644 .map_err(|_| ())
645 .unwrap(),
646 F::from_str(
647 "1005720997907928078270582364714493795153874104882338052955430808063076949858",
648 )
649 .map_err(|_| ())
650 .unwrap(),
651 F::from_str(
652 "9432539242737555038548151091729061683667954775317685872580932218706555557193",
653 )
654 .map_err(|_| ())
655 .unwrap(),
656 F::from_str(
657 "48144091886915459055979584468520005030090312584666359911350135788203438616374",
658 )
659 .map_err(|_| ())
660 .unwrap(),
661 F::from_str(
662 "22450925011805294935671299553107487783565275020715623196582033415826118494250",
663 )
664 .map_err(|_| ())
665 .unwrap(),
666 F::from_str(
667 "28149684753511832845415363706857286714650553416094912809755106801999479476946",
668 )
669 .map_err(|_| ())
670 .unwrap(),
671 F::from_str(
672 "18984416380626314263255929984317834766173910658882331424593963038930830788043",
673 )
674 .map_err(|_| ())
675 .unwrap(),
676 F::from_str(
677 "48109900230700383470215980955557162221434150244334962594952526792484549956555",
678 )
679 .map_err(|_| ())
680 .unwrap(),
681 F::from_str(
682 "40552374456316069085238865117122876015343906448762540220517521948829052005624",
683 )
684 .map_err(|_| ())
685 .unwrap(),
686 F::from_str(
687 "11526656751459710456216830286109707102065783384712439837497260759522383867216",
688 )
689 .map_err(|_| ())
690 .unwrap(),
691 F::from_str(
692 "49248089956591852389575948260598336493822205882486787578128339029114849462975",
693 )
694 .map_err(|_| ())
695 .unwrap(),
696 F::from_str(
697 "39372448145844604168126556278211607335704246721513006643620494230495045549807",
698 )
699 .map_err(|_| ())
700 .unwrap(),
701 F::from_str(
702 "47966243235447948688248399775419397863458889989786324048551282844713998917659",
703 )
704 .map_err(|_| ())
705 .unwrap(),
706 F::from_str(
707 "10668975765352037241237726978611677229760273562923261307501184329169652545894",
708 )
709 .map_err(|_| ())
710 .unwrap(),
711 F::from_str(
712 "39507142063581063677057438880300974612179697912640172055190488555355094497813",
713 )
714 .map_err(|_| ())
715 .unwrap(),
716 F::from_str(
717 "15638468735129173771932513149618051284064233358516491068231561062569214055646",
718 )
719 .map_err(|_| ())
720 .unwrap(),
721 F::from_str(
722 "17353431924571233181583986362517131255570540171642397316569828436646526591477",
723 )
724 .map_err(|_| ())
725 .unwrap(),
726 F::from_str(
727 "1113151614126806805734456303419241558692549524321573289125509096780876830226",
728 )
729 .map_err(|_| ())
730 .unwrap(),
731 F::from_str(
732 "9984420714488068655842637440690086256585448839019918893900233218326556751996",
733 )
734 .map_err(|_| ())
735 .unwrap(),
736 F::from_str(
737 "35272971102390074745676114574216945810721613586667868556864593470832260078394",
738 )
739 .map_err(|_| ())
740 .unwrap(),
741 F::from_str(
742 "41799703040810741398331928206395151226132289978178889483708245720764196041488",
743 )
744 .map_err(|_| ())
745 .unwrap(),
746 F::from_str(
747 "23792232833587856422363054609833448590404370086820676679702830143363402049151",
748 )
749 .map_err(|_| ())
750 .unwrap(),
751 F::from_str(
752 "23400519399894650768950735628474893615670522380725820954092838104223338024750",
753 )
754 .map_err(|_| ())
755 .unwrap(),
756 F::from_str(
757 "27249609507238299376315178191811683563055616067419555246827701486258799476504",
758 )
759 .map_err(|_| ())
760 .unwrap(),
761 F::from_str(
762 "31460888976162844111664970745263960397533358231300142520392677905396078538854",
763 )
764 .map_err(|_| ())
765 .unwrap(),
766 F::from_str(
767 "50541111392701415266654707208995846306449617779331389560072929586596066181460",
768 )
769 .map_err(|_| ())
770 .unwrap(),
771 F::from_str(
772 "16849402175596403120072436766532798469469816167994479896578935023255475833387",
773 )
774 .map_err(|_| ())
775 .unwrap(),
776 F::from_str(
777 "42001541432800637111202252596131403836308927391584450209899896684682298556999",
778 )
779 .map_err(|_| ())
780 .unwrap(),
781 F::from_str(
782 "7555678132801484327842862804202549162661136010229184979905673538160644182471",
783 )
784 .map_err(|_| ())
785 .unwrap(),
786 F::from_str(
787 "16973896084242861113146860522670036493260039473958217656803484585799718732593",
788 )
789 .map_err(|_| ())
790 .unwrap(),
791 F::from_str(
792 "42770539705351951841624093062193706601998280964803890045059967451602239435405",
793 )
794 .map_err(|_| ())
795 .unwrap(),
796 F::from_str(
797 "32967596628774896802370445267419978233370846153035552840999780942126744328522",
798 )
799 .map_err(|_| ())
800 .unwrap(),
801 F::from_str(
802 "29885680756072762644563275495535410002799284565481770605563275267677242393534",
803 )
804 .map_err(|_| ())
805 .unwrap(),
806 F::from_str(
807 "6767565503770123230340610856538459014642791435134695578527084133222911388089",
808 )
809 .map_err(|_| ())
810 .unwrap(),
811 F::from_str(
812 "38034555907959016273994483610140537209819290169171432036495630086575144181148",
813 )
814 .map_err(|_| ())
815 .unwrap(),
816 F::from_str(
817 "35085508904879414050180652811899618801153816228166027426392174635054369363148",
818 )
819 .map_err(|_| ())
820 .unwrap(),
821 F::from_str(
822 "36657441819968029240636827111992013950645228690585008802597958876784513528202",
823 )
824 .map_err(|_| ())
825 .unwrap(),
826 F::from_str(
827 "1322579115549556048043817488502303168290944210869541203532619083870097554885",
828 )
829 .map_err(|_| ())
830 .unwrap(),
831 F::from_str(
832 "16882844793625225132625646093399829180269843611668936510323341639265456546672",
833 )
834 .map_err(|_| ())
835 .unwrap(),
836 ],
837 ),
838 mds: MdsMatrix::from_elements(vec![
839 F::from_str(
840 "26217937587563095239723870254092982918845276250263818911301829349969290592257",
841 )
842 .map_err(|_| ())
843 .unwrap(),
844 F::from_str(
845 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
846 )
847 .map_err(|_| ())
848 .unwrap(),
849 F::from_str(
850 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
851 )
852 .map_err(|_| ())
853 .unwrap(),
854 F::from_str(
855 "39326906381344642859585805381139474378267914375395728366952744024953935888385",
856 )
857 .map_err(|_| ())
858 .unwrap(),
859 ]),
860 alpha: Alpha::Exponent(5),
861 rounds: RoundNumbers { r_P: 56, r_F: 8 },
862 optimized_mds: OptimizedMdsMatrices {
863 M_hat: SquareMatrix::new(
864 1,
865 1,
866 vec![F::from_str(
867 "39326906381344642859585805381139474378267914375395728366952744024953935888385",
868 )
869 .map_err(|_| ())
870 .unwrap()],
871 ),
872 v: Matrix::new(
873 1,
874 1,
875 vec![F::from_str(
876 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
877 )
878 .map_err(|_| ())
879 .unwrap()],
880 ),
881 w: Matrix::new(
882 1,
883 1,
884 vec![F::from_str(
885 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
886 )
887 .map_err(|_| ())
888 .unwrap()],
889 ),
890 M_prime: SquareMatrix::new(
891 2,
892 2,
893 vec![
894 F::from_str("1").map_err(|_| ()).unwrap(),
895 F::from_str("0").map_err(|_| ()).unwrap(),
896 F::from_str("0").map_err(|_| ()).unwrap(),
897 F::from_str(
898 "39326906381344642859585805381139474378267914375395728366952744024953935888385",
899 )
900 .map_err(|_| ())
901 .unwrap(),
902 ],
903 ),
904 M_doubleprime: SquareMatrix::new(
905 2,
906 2,
907 vec![
908 F::from_str(
909 "26217937587563095239723870254092982918845276250263818911301829349969290592257",
910 )
911 .map_err(|_| ())
912 .unwrap(),
913 F::from_str(
914 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
915 )
916 .map_err(|_| ())
917 .unwrap(),
918 F::from_str(
919 "34957250116750793652965160338790643891793701667018425215069105799959054123010",
920 )
921 .map_err(|_| ())
922 .unwrap(),
923 F::from_str("1").map_err(|_| ()).unwrap(),
924 ],
925 ),
926 M_inverse: SquareMatrix::new(
927 2,
928 2,
929 vec![
930 F::from_str("18").map_err(|_| ()).unwrap(),
931 F::from_str(
932 "52435875175126190479447740508185965837690552500527637822603658699938581184489",
933 )
934 .map_err(|_| ())
935 .unwrap(),
936 F::from_str(
937 "52435875175126190479447740508185965837690552500527637822603658699938581184489",
938 )
939 .map_err(|_| ())
940 .unwrap(),
941 F::from_str("36").map_err(|_| ()).unwrap(),
942 ],
943 ),
944 M_hat_inverse: SquareMatrix::new(1, 1, vec![F::from_str("4").map_err(|_| ()).unwrap()]),
945 M_00: F::from_str(
946 "26217937587563095239723870254092982918845276250263818911301829349969290592257",
947 )
948 .map_err(|_| ())
949 .unwrap(),
950 M_i: Matrix::new(
951 2,
952 2,
953 vec![
954 F::from_str("1").map_err(|_| ()).unwrap(),
955 F::from_str("0").map_err(|_| ()).unwrap(),
956 F::from_str("0").map_err(|_| ()).unwrap(),
957 F::from_str(
958 "18844142621030738849315867221324380626272463491487726140277535101490822753350",
959 )
960 .map_err(|_| ())
961 .unwrap(),
962 ],
963 ),
964 v_collection: vec![
965 Matrix::new(
966 1,
967 1,
968 vec![F::from_str(
969 "34957250116750793652965160338790643891793701667018425215069105799959054123009",
970 )
971 .map_err(|_| ())
972 .unwrap()],
973 ),
974 Matrix::new(
975 1,
976 1,
977 vec![F::from_str(
978 "48066218910532341272827095465837135351216339792150334670720020474943699419137",
979 )
980 .map_err(|_| ())
981 .unwrap()],
982 ),
983 Matrix::new(
984 1,
985 1,
986 vec![F::from_str(
987 "51343461108977728177792579247598758216071999323433312034632749143689860743169",
988 )
989 .map_err(|_| ())
990 .unwrap()],
991 ),
992 Matrix::new(
993 1,
994 1,
995 vec![F::from_str(
996 "52162771658589074904033950193039163932285914206254056375610931310876401074177",
997 )
998 .map_err(|_| ())
999 .unwrap()],
1000 ),
1001 Matrix::new(
1002 1,
1003 1,
1004 vec![F::from_str(
1005 "52367599295991911585594292929399265361339392926959242460855476852673036156929",
1006 )
1007 .map_err(|_| ())
1008 .unwrap()],
1009 ),
1010 Matrix::new(
1011 1,
1012 1,
1013 vec![F::from_str(
1014 "52418806205342620755984378613489290718602762607135538982166613238122194927617",
1015 )
1016 .map_err(|_| ())
1017 .unwrap()],
1018 ),
1019 Matrix::new(
1020 1,
1021 1,
1022 vec![F::from_str(
1023 "52431607932680298048581900034511797057918605027179613112494397334484484620289",
1024 )
1025 .map_err(|_| ())
1026 .unwrap()],
1027 ),
1028 Matrix::new(
1029 1,
1030 1,
1031 vec![F::from_str(
1032 "52434808364514717371731280389767423642747565632190631645076343358575057043457",
1033 )
1034 .map_err(|_| ())
1035 .unwrap()],
1036 ),
1037 Matrix::new(
1038 1,
1039 1,
1040 vec![F::from_str(
1041 "52435608472473322202518625478581330288954805783443386278221829864597700149249",
1042 )
1043 .map_err(|_| ())
1044 .unwrap()],
1045 ),
1046 Matrix::new(
1047 1,
1048 1,
1049 vec![F::from_str(
1050 "52435808499462973410215461750784806950506615821256574936508201491103360925697",
1051 )
1052 .map_err(|_| ())
1053 .unwrap()],
1054 ),
1055 Matrix::new(
1056 1,
1057 1,
1058 vec![F::from_str(
1059 "52435858506210386212139670818835676115894568330709872101079794397729776119809",
1060 )
1061 .map_err(|_| ())
1062 .unwrap()],
1063 ),
1064 Matrix::new(
1065 1,
1066 1,
1067 vec![F::from_str(
1068 "52435871007897239412620723085848393407241556458073196392222692624386379918337",
1069 )
1070 .map_err(|_| ())
1071 .unwrap()],
1072 ),
1073 Matrix::new(
1074 1,
1075 1,
1076 vec![F::from_str(
1077 "52435874133318952712740986152601572730078303489914027465008417181050530867969",
1078 )
1079 .map_err(|_| ())
1080 .unwrap()],
1081 ),
1082 Matrix::new(
1083 1,
1084 1,
1085 vec![F::from_str(
1086 "52435874914674381037771051919289867560787490247874235233204848320216568605377",
1087 )
1088 .map_err(|_| ())
1089 .unwrap()],
1090 ),
1091 Matrix::new(
1092 1,
1093 1,
1094 vec![F::from_str(
1095 "52435875110013238119028568360961941268464786937364287175253956105008078039729",
1096 )
1097 .map_err(|_| ())
1098 .unwrap()],
1099 ),
1100 Matrix::new(
1101 1,
1102 1,
1103 vec![F::from_str(
1104 "52435875158847952389342947471379959695384111109736800160766233051205955398317",
1105 )
1106 .map_err(|_| ())
1107 .unwrap()],
1108 ),
1109 Matrix::new(
1110 1,
1111 1,
1112 vec![F::from_str(
1113 "52435875171056630956921542248984464302113942152829928407144302287755424737964",
1114 )
1115 .map_err(|_| ())
1116 .unwrap()],
1117 ),
1118 Matrix::new(
1119 1,
1120 1,
1121 vec![F::from_str(
1122 "13108968792764157739230385562246116075528485538207482101786075571938856184491",
1123 )
1124 .map_err(|_| ())
1125 .unwrap()],
1126 ),
1127 Matrix::new(
1128 1,
1129 1,
1130 vec![F::from_str(
1131 "16386210991972587054669531517608020478304759509683779981097433567969359342251",
1132 )
1133 .map_err(|_| ())
1134 .unwrap()],
1135 ),
1136 Matrix::new(
1137 1,
1138 1,
1139 vec![F::from_str(
1140 "17205521541774694383529318006448496578998828002552854450925273066976985131691",
1141 )
1142 .map_err(|_| ())
1143 .unwrap()],
1144 ),
1145 Matrix::new(
1146 1,
1147 1,
1148 vec![F::from_str(
1149 "17410349179225221215744264628658615604172345125770123068382232941728891579051",
1150 )
1151 .map_err(|_| ())
1152 .unwrap()],
1153 ),
1154 Matrix::new(
1155 1,
1156 1,
1157 vec![F::from_str(
1158 "17461556088587852923798001284211145360465724406574440222746472910416868190891",
1159 )
1160 .map_err(|_| ())
1161 .unwrap()],
1162 ),
1163 Matrix::new(
1164 1,
1165 1,
1166 vec![F::from_str(
1167 "17474357815928510850811435448099277799539069226775519511337532902588862343851",
1168 )
1169 .map_err(|_| ())
1170 .unwrap()],
1171 ),
1172 Matrix::new(
1173 1,
1174 1,
1175 vec![F::from_str(
1176 "17477558247763675332564793989071310909307405431825789333485297900631860882091",
1177 )
1178 .map_err(|_| ())
1179 .unwrap()],
1180 ),
1181 Matrix::new(
1182 1,
1183 1,
1184 vec![F::from_str(
1185 "17478358355722466453003133624314319186749489483088356789022239150142610516651",
1186 )
1187 .map_err(|_| ())
1188 .unwrap()],
1189 ),
1190 Matrix::new(
1191 1,
1192 1,
1193 vec![F::from_str(
1194 "17478558382712164233112718533125071256110010495903998652906474462520297925291",
1195 )
1196 .map_err(|_| ())
1197 .unwrap()],
1198 ),
1199 Matrix::new(
1200 1,
1201 1,
1202 vec![F::from_str(
1203 "17478608389459588678140114760327759273450140749107909118877533290614719777451",
1204 )
1205 .map_err(|_| ())
1206 .unwrap()],
1207 ),
1208 Matrix::new(
1209 1,
1210 1,
1211 vec![F::from_str(
1212 "17478620891146444789396963817128431277785173312408886735370297997638325240491",
1213 )
1214 .map_err(|_| ())
1215 .unwrap()],
1216 ),
1217 Matrix::new(
1218 1,
1219 1,
1220 vec![F::from_str(
1221 "17478624016568158817211176081328599278868931453234131139493489174394226606251",
1222 )
1223 .map_err(|_| ())
1224 .unwrap()],
1225 ),
1226 Matrix::new(
1227 1,
1228 1,
1229 vec![F::from_str(
1230 "17478624797923587324164729147378641279139870988440442240524286968583201947691",
1231 )
1232 .map_err(|_| ())
1233 .unwrap()],
1234 ),
1235 Matrix::new(
1236 1,
1237 1,
1238 vec![F::from_str(
1239 "17478624993262444450903117413891151779207605872242020015781986417130445783051",
1240 )
1241 .map_err(|_| ())
1242 .unwrap()],
1243 ),
1244 Matrix::new(
1245 1,
1246 1,
1247 vec![F::from_str(
1248 "17478625042097158732587714480519279404224539593192414459596411279267256741891",
1249 )
1250 .map_err(|_| ())
1251 .unwrap()],
1252 ),
1253 Matrix::new(
1254 1,
1255 1,
1256 vec![F::from_str(
1257 "17478625054305837303008863747176311310478773023430013070550017494801459481601",
1258 )
1259 .map_err(|_| ())
1260 .unwrap()],
1261 ),
1262 Matrix::new(
1263 1,
1264 1,
1265 vec![F::from_str(
1266 "43696562644921102185338021317933552205887607631253231634590248398654300758785",
1267 )
1268 .map_err(|_| ())
1269 .unwrap()],
1270 ),
1271 Matrix::new(
1272 1,
1273 1,
1274 vec![F::from_str(
1275 "50251047042574918405920310710622862429739816283209036275600306124617511078081",
1276 )
1277 .map_err(|_| ())
1278 .unwrap()],
1279 ),
1280 Matrix::new(
1281 1,
1282 1,
1283 vec![F::from_str(
1284 "51889668141988372461065883058795189985702868446197987435852820556108313657905",
1285 )
1286 .map_err(|_| ())
1287 .unwrap()],
1288 ),
1289 Matrix::new(
1290 1,
1291 1,
1292 vec![F::from_str(
1293 "52299323416841735974852276145838271874693631486945225225915949163981014302861",
1294 )
1295 .map_err(|_| ())
1296 .unwrap()],
1297 ),
1298 Matrix::new(
1299 1,
1300 1,
1301 vec![F::from_str(
1302 "52401737235555076853298874417599042346941322247132034673431731315949189464100",
1303 )
1304 .map_err(|_| ())
1305 .unwrap()],
1306 ),
1307 Matrix::new(
1308 1,
1309 1,
1310 vec![F::from_str(
1311 "13100434308888769213324718604399760586735330561783008668357932828987297366025",
1312 )
1313 .map_err(|_| ())
1314 .unwrap()],
1315 ),
1316 Matrix::new(
1317 1,
1318 1,
1319 vec![F::from_str(
1320 "42602014958566835162916985032239414524951747015841480534042227232200760229891",
1321 )
1322 .map_err(|_| ())
1323 .unwrap()],
1324 ),
1325 Matrix::new(
1326 1,
1327 1,
1328 vec![F::from_str(
1329 "23759472533423256410591181385106345090660574879092279589161471483034835353601",
1330 )
1331 .map_err(|_| ())
1332 .unwrap()],
1333 ),
1334 Matrix::new(
1335 1,
1336 1,
1337 vec![F::from_str(
1338 "45266774514700456962233600727416060650933058095168798264243111895712644726785",
1339 )
1340 .map_err(|_| ())
1341 .unwrap()],
1342 ),
1343 Matrix::new(
1344 1,
1345 1,
1346 vec![F::from_str(
1347 "50643600010019757100144205562993489541001178899187927933013521998882097070081",
1348 )
1349 .map_err(|_| ())
1350 .unwrap()],
1351 ),
1352 Matrix::new(
1353 1,
1354 1,
1355 vec![F::from_str(
1356 "51987806383849582134621856771887846763518209100192710350206124524674460155905",
1357 )
1358 .map_err(|_| ())
1359 .unwrap()],
1360 ),
1361 Matrix::new(
1362 1,
1363 1,
1364 vec![F::from_str(
1365 "52323857977307038393241269574111436069147466650443905954504275156122550927361",
1366 )
1367 .map_err(|_| ())
1368 .unwrap()],
1369 ),
1370 Matrix::new(
1371 1,
1372 1,
1373 vec![F::from_str(
1374 "52407870875671402457896122774667333395554781038006704855578812813984573620225",
1375 )
1376 .map_err(|_| ())
1377 .unwrap()],
1378 ),
1379 Matrix::new(
1380 1,
1381 1,
1382 vec![F::from_str(
1383 "52428874100262493474059836074806307727156609634897404580847447228450079293441",
1384 )
1385 .map_err(|_| ())
1386 .unwrap()],
1387 ),
1388 Matrix::new(
1389 1,
1390 1,
1391 vec![F::from_str(
1392 "52434124906410266228100764399841051310057066784120079512164605832066455711745",
1393 )
1394 .map_err(|_| ())
1395 .unwrap()],
1396 ),
1397 Matrix::new(
1398 1,
1399 1,
1400 vec![F::from_str(
1401 "52435437607947209416610996481099737205782181071425748244993895482970549816321",
1402 )
1403 .map_err(|_| ())
1404 .unwrap()],
1405 ),
1406 Matrix::new(
1407 1,
1408 1,
1409 vec![F::from_str(
1410 "52435765783331445213738554501414408679713459643252165428201217895696573342465",
1411 )
1412 .map_err(|_| ())
1413 .unwrap()],
1414 ),
1415 Matrix::new(
1416 1,
1417 1,
1418 vec![F::from_str(
1419 "52435847827177504163020444006493076548196279286208769724003048498878079224001",
1420 )
1421 .map_err(|_| ())
1422 .unwrap()],
1423 ),
1424 Matrix::new(
1425 1,
1426 1,
1427 vec![F::from_str(
1428 "52435868338139018900340916382762743515316984196947920797953506149673455694385",
1429 )
1430 .map_err(|_| ())
1431 .unwrap()],
1432 ),
1433 Matrix::new(
1434 1,
1435 1,
1436 vec![F::from_str(
1437 "52435873465879397584671034476830160257097160424632708566441120562372299811981",
1438 )
1439 .map_err(|_| ())
1440 .unwrap()],
1441 ),
1442 Matrix::new(
1443 1,
1444 1,
1445 vec![F::from_str(
1446 "52435874747814492255753564000347014442542204481553905508563024165547010841380",
1447 )
1448 .map_err(|_| ())
1449 .unwrap()],
1450 ),
1451 Matrix::new(
1452 1,
1453 1,
1454 vec![F::from_str(
1455 "13108968686953623063938391000086753610635551120388476377140756041386752710345",
1456 )
1457 .map_err(|_| ())
1458 .unwrap()],
1459 ),
1460 Matrix::new(
1461 1,
1462 1,
1463 vec![F::from_str(
1464 "42604148553083048625570403131161162780926802155492847461237933035300624065971",
1465 )
1466 .map_err(|_| ())
1467 .unwrap()],
1468 ),
1469 ],
1470 w_hat_collection: vec![
1471 Matrix::new(
1472 1,
1473 1,
1474 vec![F::from_str(
1475 "34957250116750793652965160338790643891793701667018425215069105799959054123010",
1476 )
1477 .map_err(|_| ())
1478 .unwrap()],
1479 ),
1480 Matrix::new(
1481 1,
1482 1,
1483 vec![F::from_str(
1484 "34957250116750793652965160338790643891793701667018425215069105799959054123014",
1485 )
1486 .map_err(|_| ())
1487 .unwrap()],
1488 ),
1489 Matrix::new(
1490 1,
1491 1,
1492 vec![F::from_str(
1493 "34957250116750793652965160338790643891793701667018425215069105799959054123030",
1494 )
1495 .map_err(|_| ())
1496 .unwrap()],
1497 ),
1498 Matrix::new(
1499 1,
1500 1,
1501 vec![F::from_str(
1502 "34957250116750793652965160338790643891793701667018425215069105799959054123094",
1503 )
1504 .map_err(|_| ())
1505 .unwrap()],
1506 ),
1507 Matrix::new(
1508 1,
1509 1,
1510 vec![F::from_str(
1511 "34957250116750793652965160338790643891793701667018425215069105799959054123350",
1512 )
1513 .map_err(|_| ())
1514 .unwrap()],
1515 ),
1516 Matrix::new(
1517 1,
1518 1,
1519 vec![F::from_str(
1520 "34957250116750793652965160338790643891793701667018425215069105799959054124374",
1521 )
1522 .map_err(|_| ())
1523 .unwrap()],
1524 ),
1525 Matrix::new(
1526 1,
1527 1,
1528 vec![F::from_str(
1529 "34957250116750793652965160338790643891793701667018425215069105799959054128470",
1530 )
1531 .map_err(|_| ())
1532 .unwrap()],
1533 ),
1534 Matrix::new(
1535 1,
1536 1,
1537 vec![F::from_str(
1538 "34957250116750793652965160338790643891793701667018425215069105799959054144854",
1539 )
1540 .map_err(|_| ())
1541 .unwrap()],
1542 ),
1543 Matrix::new(
1544 1,
1545 1,
1546 vec![F::from_str(
1547 "34957250116750793652965160338790643891793701667018425215069105799959054210390",
1548 )
1549 .map_err(|_| ())
1550 .unwrap()],
1551 ),
1552 Matrix::new(
1553 1,
1554 1,
1555 vec![F::from_str(
1556 "34957250116750793652965160338790643891793701667018425215069105799959054472534",
1557 )
1558 .map_err(|_| ())
1559 .unwrap()],
1560 ),
1561 Matrix::new(
1562 1,
1563 1,
1564 vec![F::from_str(
1565 "34957250116750793652965160338790643891793701667018425215069105799959055521110",
1566 )
1567 .map_err(|_| ())
1568 .unwrap()],
1569 ),
1570 Matrix::new(
1571 1,
1572 1,
1573 vec![F::from_str(
1574 "34957250116750793652965160338790643891793701667018425215069105799959059715414",
1575 )
1576 .map_err(|_| ())
1577 .unwrap()],
1578 ),
1579 Matrix::new(
1580 1,
1581 1,
1582 vec![F::from_str(
1583 "34957250116750793652965160338790643891793701667018425215069105799959076492630",
1584 )
1585 .map_err(|_| ())
1586 .unwrap()],
1587 ),
1588 Matrix::new(
1589 1,
1590 1,
1591 vec![F::from_str(
1592 "34957250116750793652965160338790643891793701667018425215069105799959143601494",
1593 )
1594 .map_err(|_| ())
1595 .unwrap()],
1596 ),
1597 Matrix::new(
1598 1,
1599 1,
1600 vec![F::from_str(
1601 "34957250116750793652965160338790643891793701667018425215069105799959412036950",
1602 )
1603 .map_err(|_| ())
1604 .unwrap()],
1605 ),
1606 Matrix::new(
1607 1,
1608 1,
1609 vec![F::from_str(
1610 "34957250116750793652965160338790643891793701667018425215069105799960485778774",
1611 )
1612 .map_err(|_| ())
1613 .unwrap()],
1614 ),
1615 Matrix::new(
1616 1,
1617 1,
1618 vec![F::from_str(
1619 "34957250116750793652965160338790643891793701667018425215069105799964780746070",
1620 )
1621 .map_err(|_| ())
1622 .unwrap()],
1623 ),
1624 Matrix::new(
1625 1,
1626 1,
1627 vec![F::from_str(
1628 "34957250116750793652965160338790643891793701667018425215069105799981960615254",
1629 )
1630 .map_err(|_| ())
1631 .unwrap()],
1632 ),
1633 Matrix::new(
1634 1,
1635 1,
1636 vec![F::from_str(
1637 "34957250116750793652965160338790643891793701667018425215069105800050680091990",
1638 )
1639 .map_err(|_| ())
1640 .unwrap()],
1641 ),
1642 Matrix::new(
1643 1,
1644 1,
1645 vec![F::from_str(
1646 "34957250116750793652965160338790643891793701667018425215069105800325557998934",
1647 )
1648 .map_err(|_| ())
1649 .unwrap()],
1650 ),
1651 Matrix::new(
1652 1,
1653 1,
1654 vec![F::from_str(
1655 "34957250116750793652965160338790643891793701667018425215069105801425069626710",
1656 )
1657 .map_err(|_| ())
1658 .unwrap()],
1659 ),
1660 Matrix::new(
1661 1,
1662 1,
1663 vec![F::from_str(
1664 "34957250116750793652965160338790643891793701667018425215069105805823116137814",
1665 )
1666 .map_err(|_| ())
1667 .unwrap()],
1668 ),
1669 Matrix::new(
1670 1,
1671 1,
1672 vec![F::from_str(
1673 "34957250116750793652965160338790643891793701667018425215069105823415302182230",
1674 )
1675 .map_err(|_| ())
1676 .unwrap()],
1677 ),
1678 Matrix::new(
1679 1,
1680 1,
1681 vec![F::from_str(
1682 "34957250116750793652965160338790643891793701667018425215069105893784046359894",
1683 )
1684 .map_err(|_| ())
1685 .unwrap()],
1686 ),
1687 Matrix::new(
1688 1,
1689 1,
1690 vec![F::from_str(
1691 "34957250116750793652965160338790643891793701667018425215069106175259023070550",
1692 )
1693 .map_err(|_| ())
1694 .unwrap()],
1695 ),
1696 Matrix::new(
1697 1,
1698 1,
1699 vec![F::from_str(
1700 "34957250116750793652965160338790643891793701667018425215069107301158929913174",
1701 )
1702 .map_err(|_| ())
1703 .unwrap()],
1704 ),
1705 Matrix::new(
1706 1,
1707 1,
1708 vec![F::from_str(
1709 "34957250116750793652965160338790643891793701667018425215069111804758557283670",
1710 )
1711 .map_err(|_| ())
1712 .unwrap()],
1713 ),
1714 Matrix::new(
1715 1,
1716 1,
1717 vec![F::from_str(
1718 "34957250116750793652965160338790643891793701667018425215069129819157066765654",
1719 )
1720 .map_err(|_| ())
1721 .unwrap()],
1722 ),
1723 Matrix::new(
1724 1,
1725 1,
1726 vec![F::from_str(
1727 "34957250116750793652965160338790643891793701667018425215069201876751104693590",
1728 )
1729 .map_err(|_| ())
1730 .unwrap()],
1731 ),
1732 Matrix::new(
1733 1,
1734 1,
1735 vec![F::from_str(
1736 "34957250116750793652965160338790643891793701667018425215069490107127256405334",
1737 )
1738 .map_err(|_| ())
1739 .unwrap()],
1740 ),
1741 Matrix::new(
1742 1,
1743 1,
1744 vec![F::from_str(
1745 "34957250116750793652965160338790643891793701667018425215070643028631863252310",
1746 )
1747 .map_err(|_| ())
1748 .unwrap()],
1749 ),
1750 Matrix::new(
1751 1,
1752 1,
1753 vec![F::from_str(
1754 "34957250116750793652965160338790643891793701667018425215075254714650290640214",
1755 )
1756 .map_err(|_| ())
1757 .unwrap()],
1758 ),
1759 Matrix::new(
1760 1,
1761 1,
1762 vec![F::from_str(
1763 "34957250116750793652965160338790643891793701667018425215093701458724000191830",
1764 )
1765 .map_err(|_| ())
1766 .unwrap()],
1767 ),
1768 Matrix::new(
1769 1,
1770 1,
1771 vec![F::from_str(
1772 "34957250116750793652965160338790643891793701667018425215167488435018838398294",
1773 )
1774 .map_err(|_| ())
1775 .unwrap()],
1776 ),
1777 Matrix::new(
1778 1,
1779 1,
1780 vec![F::from_str(
1781 "34957250116750793652965160338790643891793701667018425215462636340198191224150",
1782 )
1783 .map_err(|_| ())
1784 .unwrap()],
1785 ),
1786 Matrix::new(
1787 1,
1788 1,
1789 vec![F::from_str(
1790 "34957250116750793652965160338790643891793701667018425216643227960915602527574",
1791 )
1792 .map_err(|_| ())
1793 .unwrap()],
1794 ),
1795 Matrix::new(
1796 1,
1797 1,
1798 vec![F::from_str(
1799 "34957250116750793652965160338790643891793701667018425221365594443785247741270",
1800 )
1801 .map_err(|_| ())
1802 .unwrap()],
1803 ),
1804 Matrix::new(
1805 1,
1806 1,
1807 vec![F::from_str(
1808 "34957250116750793652965160338790643891793701667018425240255060375263828596054",
1809 )
1810 .map_err(|_| ())
1811 .unwrap()],
1812 ),
1813 Matrix::new(
1814 1,
1815 1,
1816 vec![F::from_str(
1817 "34957250116750793652965160338790643891793701667018425315812924101178152015190",
1818 )
1819 .map_err(|_| ())
1820 .unwrap()],
1821 ),
1822 Matrix::new(
1823 1,
1824 1,
1825 vec![F::from_str(
1826 "34957250116750793652965160338790643891793701667018425618044379004835445691734",
1827 )
1828 .map_err(|_| ())
1829 .unwrap()],
1830 ),
1831 Matrix::new(
1832 1,
1833 1,
1834 vec![F::from_str(
1835 "34957250116750793652965160338790643891793701667018426826970198619464620397910",
1836 )
1837 .map_err(|_| ())
1838 .unwrap()],
1839 ),
1840 Matrix::new(
1841 1,
1842 1,
1843 vec![F::from_str(
1844 "34957250116750793652965160338790643891793701667018431662673477077981319222614",
1845 )
1846 .map_err(|_| ())
1847 .unwrap()],
1848 ),
1849 Matrix::new(
1850 1,
1851 1,
1852 vec![F::from_str(
1853 "34957250116750793652965160338790643891793701667018451005486590912048114521430",
1854 )
1855 .map_err(|_| ())
1856 .unwrap()],
1857 ),
1858 Matrix::new(
1859 1,
1860 1,
1861 vec![F::from_str(
1862 "34957250116750793652965160338790643891793701667018528376739046248315295716694",
1863 )
1864 .map_err(|_| ())
1865 .unwrap()],
1866 ),
1867 Matrix::new(
1868 1,
1869 1,
1870 vec![F::from_str(
1871 "34957250116750793652965160338790643891793701667018837861748867593384020497750",
1872 )
1873 .map_err(|_| ())
1874 .unwrap()],
1875 ),
1876 Matrix::new(
1877 1,
1878 1,
1879 vec![F::from_str(
1880 "34957250116750793652965160338790643891793701667020075801788152973658919621974",
1881 )
1882 .map_err(|_| ())
1883 .unwrap()],
1884 ),
1885 Matrix::new(
1886 1,
1887 1,
1888 vec![F::from_str(
1889 "34957250116750793652965160338790643891793701667025027561945294494758516118870",
1890 )
1891 .map_err(|_| ())
1892 .unwrap()],
1893 ),
1894 Matrix::new(
1895 1,
1896 1,
1897 vec![F::from_str(
1898 "34957250116750793652965160338790643891793701667044834602573860579156902106454",
1899 )
1900 .map_err(|_| ())
1901 .unwrap()],
1902 ),
1903 Matrix::new(
1904 1,
1905 1,
1906 vec![F::from_str(
1907 "34957250116750793652965160338790643891793701667124062765088124916750446056790",
1908 )
1909 .map_err(|_| ())
1910 .unwrap()],
1911 ),
1912 Matrix::new(
1913 1,
1914 1,
1915 vec![F::from_str(
1916 "34957250116750793652965160338790643891793701667440975415145182267124621858134",
1917 )
1918 .map_err(|_| ())
1919 .unwrap()],
1920 ),
1921 Matrix::new(
1922 1,
1923 1,
1924 vec![F::from_str(
1925 "34957250116750793652965160338790643891793701668708626015373411668621325063510",
1926 )
1927 .map_err(|_| ())
1928 .unwrap()],
1929 ),
1930 Matrix::new(
1931 1,
1932 1,
1933 vec![F::from_str(
1934 "34957250116750793652965160338790643891793701673779228416286329274608137885014",
1935 )
1936 .map_err(|_| ())
1937 .unwrap()],
1938 ),
1939 Matrix::new(
1940 1,
1941 1,
1942 vec![F::from_str(
1943 "34957250116750793652965160338790643891793701694061638019937999698555389171030",
1944 )
1945 .map_err(|_| ())
1946 .unwrap()],
1947 ),
1948 Matrix::new(
1949 1,
1950 1,
1951 vec![F::from_str(
1952 "34957250116750793652965160338790643891793701775191276434544681394344394315094",
1953 )
1954 .map_err(|_| ())
1955 .unwrap()],
1956 ),
1957 Matrix::new(
1958 1,
1959 1,
1960 vec![F::from_str(
1961 "34957250116750793652965160338790643891793702099709830092971408177500414891350",
1962 )
1963 .map_err(|_| ())
1964 .unwrap()],
1965 ),
1966 Matrix::new(
1967 1,
1968 1,
1969 vec![F::from_str(
1970 "34957250116750793652965160338790643891793703397784044726678315310124497196374",
1971 )
1972 .map_err(|_| ())
1973 .unwrap()],
1974 ),
1975 ],
1976 },
1977 optimized_arc: OptimizedArcMatrix::new(
1978 64,
1979 2,
1980 vec![
1981 F::from_str(
1982 "35174739893055911104493616029378130908017657834702731071195911003169112450229",
1983 )
1984 .map_err(|_| ())
1985 .unwrap(),
1986 F::from_str(
1987 "40230473166484073181383530626136429631051240172158259323832118663695222064618",
1988 )
1989 .map_err(|_| ())
1990 .unwrap(),
1991 F::from_str(
1992 "44839971797550275719608927493602345619671796219131839128512847210863471539893",
1993 )
1994 .map_err(|_| ())
1995 .unwrap(),
1996 F::from_str(
1997 "48611564661854252146943435349048894917868766542696555144699929229862960415826",
1998 )
1999 .map_err(|_| ())
2000 .unwrap(),
2001 F::from_str(
2002 "40685922923883326639435460208454299274336241847181916712959630054792010757353",
2003 )
2004 .map_err(|_| ())
2005 .unwrap(),
2006 F::from_str(
2007 "15664326207051802832937062272185115402684860397390155009854115660846132411502",
2008 )
2009 .map_err(|_| ())
2010 .unwrap(),
2011 F::from_str(
2012 "20394588293088308460232807257084465383971903994422965392216628021702933756783",
2013 )
2014 .map_err(|_| ())
2015 .unwrap(),
2016 F::from_str(
2017 "38072899122370719412288433912125900148799524273752876684473712699262778897654",
2018 )
2019 .map_err(|_| ())
2020 .unwrap(),
2021 F::from_str(
2022 "49322204581160802920728528441668898478821361914594574984125707955891751339030",
2023 )
2024 .map_err(|_| ())
2025 .unwrap(),
2026 F::from_str(
2027 "11546720471100324356589604343765555296510298649382063718189403564461171492863",
2028 )
2029 .map_err(|_| ())
2030 .unwrap(),
2031 F::from_str(
2032 "36110500355375093385871324309901194334631381714439614527255597369650392849542",
2033 )
2034 .map_err(|_| ())
2035 .unwrap(),
2036 F::from_str("0").map_err(|_| ()).unwrap(),
2037 F::from_str(
2038 "3756733109852649396584228778466872196362658360207834645541184763961143083412",
2039 )
2040 .map_err(|_| ())
2041 .unwrap(),
2042 F::from_str("0").map_err(|_| ()).unwrap(),
2043 F::from_str(
2044 "20251607517129761800297717300935980834606026680555472569470067927197814159058",
2045 )
2046 .map_err(|_| ())
2047 .unwrap(),
2048 F::from_str("0").map_err(|_| ()).unwrap(),
2049 F::from_str(
2050 "5239353656737021436485173734268526002414965521861452100759532275936501964328",
2051 )
2052 .map_err(|_| ())
2053 .unwrap(),
2054 F::from_str("0").map_err(|_| ()).unwrap(),
2055 F::from_str(
2056 "21300582910621453970075769970860650148943961329345636625818996955442242699131",
2057 )
2058 .map_err(|_| ())
2059 .unwrap(),
2060 F::from_str("0").map_err(|_| ()).unwrap(),
2061 F::from_str(
2062 "21774765045116391148518722696232516163747969484119487964534360379873683242474",
2063 )
2064 .map_err(|_| ())
2065 .unwrap(),
2066 F::from_str("0").map_err(|_| ()).unwrap(),
2067 F::from_str(
2068 "32722020057382082921329627018209709241475223852823289284428837414575534351309",
2069 )
2070 .map_err(|_| ())
2071 .unwrap(),
2072 F::from_str("0").map_err(|_| ()).unwrap(),
2073 F::from_str(
2074 "33794442154315934695685025730187059000350644284482738453096808368436585150449",
2075 )
2076 .map_err(|_| ())
2077 .unwrap(),
2078 F::from_str("0").map_err(|_| ()).unwrap(),
2079 F::from_str(
2080 "33356374759281451907993729503609407203078972387590420010346940719085856704600",
2081 )
2082 .map_err(|_| ())
2083 .unwrap(),
2084 F::from_str("0").map_err(|_| ()).unwrap(),
2085 F::from_str(
2086 "16536766136174515568748693372704332161755684369233290734723311101392999671135",
2087 )
2088 .map_err(|_| ())
2089 .unwrap(),
2090 F::from_str("0").map_err(|_| ()).unwrap(),
2091 F::from_str(
2092 "8155200347229826422648196061952312662995020845960673032039978897344425954944",
2093 )
2094 .map_err(|_| ())
2095 .unwrap(),
2096 F::from_str("0").map_err(|_| ()).unwrap(),
2097 F::from_str(
2098 "41985238868657599524996779043300115443521336708491497391680518882421278207729",
2099 )
2100 .map_err(|_| ())
2101 .unwrap(),
2102 F::from_str("0").map_err(|_| ()).unwrap(),
2103 F::from_str(
2104 "2063843216042971340057236348680603623021991141192327802421586125773152594966",
2105 )
2106 .map_err(|_| ())
2107 .unwrap(),
2108 F::from_str("0").map_err(|_| ()).unwrap(),
2109 F::from_str(
2110 "19356199834277755257103978861422834427804178278770847736951931659601323041542",
2111 )
2112 .map_err(|_| ())
2113 .unwrap(),
2114 F::from_str("0").map_err(|_| ()).unwrap(),
2115 F::from_str(
2116 "29407672119923084920129945390192575072371921764906862646182735700097611522286",
2117 )
2118 .map_err(|_| ())
2119 .unwrap(),
2120 F::from_str("0").map_err(|_| ()).unwrap(),
2121 F::from_str(
2122 "23210564968750306632117638368081722417964237341952338866982652674742521848757",
2123 )
2124 .map_err(|_| ())
2125 .unwrap(),
2126 F::from_str("0").map_err(|_| ()).unwrap(),
2127 F::from_str(
2128 "8919995046928353282196218782858660366384850716988440303338558248538040137799",
2129 )
2130 .map_err(|_| ())
2131 .unwrap(),
2132 F::from_str("0").map_err(|_| ()).unwrap(),
2133 F::from_str(
2134 "19043131128131902196810002314394958855517905924691850071099334468401919991484",
2135 )
2136 .map_err(|_| ())
2137 .unwrap(),
2138 F::from_str("0").map_err(|_| ()).unwrap(),
2139 F::from_str(
2140 "25372870640639931691894472507697938527971989245889491446494524936601040512930",
2141 )
2142 .map_err(|_| ())
2143 .unwrap(),
2144 F::from_str("0").map_err(|_| ()).unwrap(),
2145 F::from_str(
2146 "28282246530559666639248292418150612779488812032571757345639609704112262688983",
2147 )
2148 .map_err(|_| ())
2149 .unwrap(),
2150 F::from_str("0").map_err(|_| ()).unwrap(),
2151 F::from_str(
2152 "4783363587969676537071285052282175798266183157943408226768189618569177474295",
2153 )
2154 .map_err(|_| ())
2155 .unwrap(),
2156 F::from_str("0").map_err(|_| ()).unwrap(),
2157 F::from_str(
2158 "8076640637611150676334686135767012090042738255090463961889429353861598391372",
2159 )
2160 .map_err(|_| ())
2161 .unwrap(),
2162 F::from_str("0").map_err(|_| ()).unwrap(),
2163 F::from_str(
2164 "24983375671346681151260101878347553784741288686089866276697910000786751968362",
2165 )
2166 .map_err(|_| ())
2167 .unwrap(),
2168 F::from_str("0").map_err(|_| ()).unwrap(),
2169 F::from_str(
2170 "31553063832521567697657525429909509843798042381162189406532027953053159867207",
2171 )
2172 .map_err(|_| ())
2173 .unwrap(),
2174 F::from_str("0").map_err(|_| ()).unwrap(),
2175 F::from_str(
2176 "19397104375854813327815726265263423471142957336141256772200649485967743774458",
2177 )
2178 .map_err(|_| ())
2179 .unwrap(),
2180 F::from_str("0").map_err(|_| ()).unwrap(),
2181 F::from_str(
2182 "16725724823339561221215536793048178667667680016815450011449579154320911341709",
2183 )
2184 .map_err(|_| ())
2185 .unwrap(),
2186 F::from_str("0").map_err(|_| ()).unwrap(),
2187 F::from_str(
2188 "29033205376761356766961278958992230640915887129936846622211162138860547139883",
2189 )
2190 .map_err(|_| ())
2191 .unwrap(),
2192 F::from_str("0").map_err(|_| ()).unwrap(),
2193 F::from_str(
2194 "38925727287210137779737577678032857716007633840925015412872642147337070197265",
2195 )
2196 .map_err(|_| ())
2197 .unwrap(),
2198 F::from_str("0").map_err(|_| ()).unwrap(),
2199 F::from_str(
2200 "13054654952792030513819618373016885831657266413665857293819158146045635067324",
2201 )
2202 .map_err(|_| ())
2203 .unwrap(),
2204 F::from_str("0").map_err(|_| ()).unwrap(),
2205 F::from_str(
2206 "11180520252272331206279504788346032423267894347729733535225909704781507388571",
2207 )
2208 .map_err(|_| ())
2209 .unwrap(),
2210 F::from_str("0").map_err(|_| ()).unwrap(),
2211 F::from_str(
2212 "7829946038227950055107016972108651685558876858831437098551135271673396051934",
2213 )
2214 .map_err(|_| ())
2215 .unwrap(),
2216 F::from_str("0").map_err(|_| ()).unwrap(),
2217 F::from_str(
2218 "12701392201570649781537742561621512715498088373227761999475504609950261026304",
2219 )
2220 .map_err(|_| ())
2221 .unwrap(),
2222 F::from_str("0").map_err(|_| ()).unwrap(),
2223 F::from_str(
2224 "23110137476929231098068588344230895315869860683132386592399445163537587938902",
2225 )
2226 .map_err(|_| ())
2227 .unwrap(),
2228 F::from_str("0").map_err(|_| ()).unwrap(),
2229 F::from_str(
2230 "34695385667367102489869345055605545198093190593541852158466006956870675273759",
2231 )
2232 .map_err(|_| ())
2233 .unwrap(),
2234 F::from_str("0").map_err(|_| ()).unwrap(),
2235 F::from_str(
2236 "12473323874126447804974523548032043130473262290187841938491511255009575125315",
2237 )
2238 .map_err(|_| ())
2239 .unwrap(),
2240 F::from_str("0").map_err(|_| ()).unwrap(),
2241 F::from_str(
2242 "33244171987325668610688838482180693579479913109349074619790699084518395114481",
2243 )
2244 .map_err(|_| ())
2245 .unwrap(),
2246 F::from_str("0").map_err(|_| ()).unwrap(),
2247 F::from_str(
2248 "27800393704277881477423349646564407645504532574407056486674972536299508573197",
2249 )
2250 .map_err(|_| ())
2251 .unwrap(),
2252 F::from_str("0").map_err(|_| ()).unwrap(),
2253 F::from_str(
2254 "38745941841134632283836831790084585919738726247813020052320436485069697160134",
2255 )
2256 .map_err(|_| ())
2257 .unwrap(),
2258 F::from_str("0").map_err(|_| ()).unwrap(),
2259 F::from_str(
2260 "4222833134514534672312302121120063621259334942025065036721108691056782902710",
2261 )
2262 .map_err(|_| ())
2263 .unwrap(),
2264 F::from_str("0").map_err(|_| ()).unwrap(),
2265 F::from_str(
2266 "2485253499287676466887039925919700883876238304552596149921625457687783981441",
2267 )
2268 .map_err(|_| ())
2269 .unwrap(),
2270 F::from_str("0").map_err(|_| ()).unwrap(),
2271 F::from_str(
2272 "25376906928048350822232005681485535724988673469685171030423527493301156576940",
2273 )
2274 .map_err(|_| ())
2275 .unwrap(),
2276 F::from_str("0").map_err(|_| ()).unwrap(),
2277 F::from_str(
2278 "50342721676243810030803571465468547773052568618511402750629061381943937849683",
2279 )
2280 .map_err(|_| ())
2281 .unwrap(),
2282 F::from_str("0").map_err(|_| ()).unwrap(),
2283 F::from_str(
2284 "50049567928418632800795449103016632592486776140307034477479632433833610837266",
2285 )
2286 .map_err(|_| ())
2287 .unwrap(),
2288 F::from_str("0").map_err(|_| ()).unwrap(),
2289 F::from_str(
2290 "23363897037620979716239578483167524838213385084153054827737272694281707133655",
2291 )
2292 .map_err(|_| ())
2293 .unwrap(),
2294 F::from_str("0").map_err(|_| ()).unwrap(),
2295 F::from_str(
2296 "42704349801891305094989489174556449021777358796153454937762648266288696875551",
2297 )
2298 .map_err(|_| ())
2299 .unwrap(),
2300 F::from_str("0").map_err(|_| ()).unwrap(),
2301 F::from_str(
2302 "15237078269491179837022602841512824373125754318519659312626032716476523314968",
2303 )
2304 .map_err(|_| ())
2305 .unwrap(),
2306 F::from_str("0").map_err(|_| ()).unwrap(),
2307 F::from_str(
2308 "7834537534669842390771199937679522681049234016864851395164092776167283317372",
2309 )
2310 .map_err(|_| ())
2311 .unwrap(),
2312 F::from_str("0").map_err(|_| ()).unwrap(),
2313 F::from_str(
2314 "40845753633682491334484157504358463583021595599904903653237711863475293554700",
2315 )
2316 .map_err(|_| ())
2317 .unwrap(),
2318 F::from_str("0").map_err(|_| ()).unwrap(),
2319 F::from_str(
2320 "30415461155839336041159980430244598228679743472933918944484463593999625263250",
2321 )
2322 .map_err(|_| ())
2323 .unwrap(),
2324 F::from_str("0").map_err(|_| ()).unwrap(),
2325 F::from_str(
2326 "45446374854682768122749806214133032507584129094447282144188920433140420665338",
2327 )
2328 .map_err(|_| ())
2329 .unwrap(),
2330 F::from_str("0").map_err(|_| ()).unwrap(),
2331 F::from_str(
2332 "44511327229393971496561348546051674374277199034903648290060869960535543887325",
2333 )
2334 .map_err(|_| ())
2335 .unwrap(),
2336 F::from_str("0").map_err(|_| ()).unwrap(),
2337 F::from_str(
2338 "31765384944890114175945271689093192004082637054270389724882306488698748316643",
2339 )
2340 .map_err(|_| ())
2341 .unwrap(),
2342 F::from_str("0").map_err(|_| ()).unwrap(),
2343 F::from_str(
2344 "11724725910654336698843657420057198898582989110234170277283715189016057454856",
2345 )
2346 .map_err(|_| ())
2347 .unwrap(),
2348 F::from_str("0").map_err(|_| ()).unwrap(),
2349 F::from_str(
2350 "35333898667082217702239272910553250687762082480432049530115838213528273162930",
2351 )
2352 .map_err(|_| ())
2353 .unwrap(),
2354 F::from_str("0").map_err(|_| ()).unwrap(),
2355 F::from_str(
2356 "13139429039691322549933623030015220158389702383341486257474725505081327320136",
2357 )
2358 .map_err(|_| ())
2359 .unwrap(),
2360 F::from_str("0").map_err(|_| ()).unwrap(),
2361 F::from_str(
2362 "32967596628774896802370445267419978233370846153035552840999780942126744328522",
2363 )
2364 .map_err(|_| ())
2365 .unwrap(),
2366 F::from_str(
2367 "29885680756072762644563275495535410002799284565481770605563275267677242393534",
2368 )
2369 .map_err(|_| ())
2370 .unwrap(),
2371 F::from_str(
2372 "6767565503770123230340610856538459014642791435134695578527084133222911388089",
2373 )
2374 .map_err(|_| ())
2375 .unwrap(),
2376 F::from_str(
2377 "38034555907959016273994483610140537209819290169171432036495630086575144181148",
2378 )
2379 .map_err(|_| ())
2380 .unwrap(),
2381 F::from_str(
2382 "35085508904879414050180652811899618801153816228166027426392174635054369363148",
2383 )
2384 .map_err(|_| ())
2385 .unwrap(),
2386 F::from_str(
2387 "36657441819968029240636827111992013950645228690585008802597958876784513528202",
2388 )
2389 .map_err(|_| ())
2390 .unwrap(),
2391 F::from_str(
2392 "1322579115549556048043817488502303168290944210869541203532619083870097554885",
2393 )
2394 .map_err(|_| ())
2395 .unwrap(),
2396 F::from_str(
2397 "16882844793625225132625646093399829180269843611668936510323341639265456546672",
2398 )
2399 .map_err(|_| ())
2400 .unwrap(),
2401 ],
2402 ),
2403 }
2404 }
2405 let rate1_config = rate_1::<ark_bls12_381::Fr>();
2406 let arkwork_mds = (0..rate1_config.mds.0 .0.n_rows)
2407 .map(|i| rate1_config.mds.0 .0.row_vector(i).elements)
2408 .collect::<Vec<Vec<_>>>();
2409 let arkwork_ark = (0..rate1_config.arc.0.n_rows)
2410 .map(|i| rate1_config.arc.0.row_vector(i).elements)
2411 .collect::<Vec<Vec<_>>>();
2412 PoseidonConfig {
2413 full_rounds: rate1_config.rounds.r_F,
2414 partial_rounds: rate1_config.rounds.r_P,
2415 alpha: match rate1_config.alpha {
2416 poseidon_parameters::Alpha::Exponent(alpha) => alpha as u64,
2417 _ => panic!("Alpha is not exponent"),
2418 },
2419 ark: arkwork_ark,
2420 mds: arkwork_mds,
2421 rate: 1, // only hash one at a time
2422 capacity: 1, // ??
2423 }
2424}
2425
2426pub trait PoseidonConfiguration: ark_ff::PrimeField {
2427 fn poseidon_params() -> PoseidonConfig<Self>;
2428}
2429
2430impl PoseidonConfiguration for ark_bls12_381::Fr {
2431 fn poseidon_params() -> PoseidonConfig<Self> {
2432 poseidon_params_bls12381()
2433 }
2434}
2435
2436impl PoseidonConfiguration for ark_bls12_377::Fr {
2437 fn poseidon_params() -> PoseidonConfig<Self> {
2438 poseidon_params()
2439 }
2440}
2441
2442impl PoseidonConfiguration for ark_blst::Scalar {
2443 fn poseidon_params() -> PoseidonConfig<Self> {
2444 let config = poseidon_params_bls12381();
2445 let arks = config
2446 .ark
2447 .iter()
2448 .map(|v| {
2449 v.iter()
2450 .map(|&e| ark_blst::Scalar::from(e))
2451 .collect::<Vec<_>>()
2452 })
2453 .collect();
2454 let mdss = config
2455 .mds
2456 .iter()
2457 .map(|v| {
2458 v.iter()
2459 .map(|&e| ark_blst::Scalar::from(e))
2460 .collect::<Vec<_>>()
2461 })
2462 .collect();
2463 PoseidonConfig {
2464 full_rounds: config.full_rounds,
2465 partial_rounds: config.partial_rounds,
2466 alpha: config.alpha,
2467 ark: arks,
2468 mds: mdss,
2469 rate: config.rate,
2470 capacity: config.capacity,
2471 }
2472 }
2473}
2474lazy_static! {
2475 pub static ref POSEIDON_PARAMETERS_FR_377: PoseidonConfig<Fr> = poseidon_params();
2476}