arnaucube
arnaucube/testudoPublic Self-hosted repository
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}