use ark_bls12_377::Fr; use ark_crypto_primitives::sponge::poseidon::PoseidonConfig; use std::str::FromStr; // Copyright: https://github.com/nikkolasg/ark-dkg/blob/main/src/parameters.rs use json::JsonValue; use lazy_static::lazy_static; lazy_static! { // bls12377_rate2_constraints_fr: pub static ref FR: JsonValue = object! { "ark" => array![ array!["1370773116404421539888881648821194629032979299946048429076387284005101684675", "4673035637825817609038514733539555185313791666023633961663352080665830654830", "3476986714632640194314485873881082667866912997891863048915892042674874286264"], array!["1082495278266482754833562621758308632581366365108718780801560341752506567697", "4949432510532674124503328437030614426007112126335799011165573383397503068558", "1330731268421256836250705136567442317504087954921291231955447229193812596308"], array!["2649505161225663922316999879032136225486779063673300240621719420078616600331", "4969420587703679612645522006695883166296724515300508402438681500077273342102", "205635712587803026777585519450868615715404988831679984758308345484658244699"], array!["6145772648854219628629735661952781083869402744236565775495743574991105198727", "5694971131555029816374722311330556638260056256238039903705739439184187043937", "5741725876337992913741719090196370235271299497940404104226910654118627348231"], array!["6469638413629030129780219709477213488269112947492045389237429028620220258446", "3701595212702118832843766258638566924918883592466668319824165091176624488470", "3788264172113320071929375505654410621672880197708720070568683533593741188367"], array!["7440115096888436553805393179190448787187286166192882400220572931865568317182", "792346028642694686435936057983036575794551345818605100013220351237266490211", "3512073197867644095949820682768614757198377867832806840119595329029395413419"], array!["3327088580126882425803902509250293076948968718390152099056814690231480975540", "7158369207426751973498757672315193862013926247640641608613447343948389969907", "6576114422707630183258306285876174832535448513519868242206479550748199028650"], array!["1750441329216804285131573838407988974537000108919914117251383215390240334007", "6643642586767682146943021170325866479407987761019956931934065669737733844970", "4106833857706706417652949425395842926674588555313556065852954705212767334548"], array!["5196247641080157421214976259470019902011109253162446920598369271583914387912", "6360624992789526556614108772011303405529807087502693775123890278812066474754", "8425833359837698797187325575646708254811496588866812335451071326764069753553"], array!["7571765444928048488636382364785227388831860339901373587410494373985769122100", "1146560176939543249528183531911179059346379826648787355971780563762045417939", "7065673187452873657602174269205792331276819829797382751854008973390840650347"], array!["2996886232144394882237600400269759049381836612341075168714674419715424495381", "7668744387648470169368229696434415530109096020857128629089289952099341334341", "936627698981026919732496023789041288394375500602254911470718843646602645053"], array!["6199749224785668013863210092063343076018531979597999604829468825162260274190", "1653132234679858820482383205271489733007453315887823778464537322543673289375", "7939359542319254103812635759696217625861967838748888560647186882218141754398"], array!["5250147394211818178524181700154433748053992647055590962793825894928645733326", "235902753941634492088451291363018081809625358810315316265161104829935550542", "6608963137139961850002639926351347514621255004982055637993898513250013620207"], array!["686840635267965663175276645211808051025823527505028096239338481540935993835", "6836915689880452140045500520891176609600850753468429607484223074627863622754", "4411311036661487117682008390277121256586135166845650218368031395328640568455"], array!["7765580651637884064091086941299831107821005732883926779656422881469118342677", "332549754384827539552516583331436482626027168628972328124682073094327566178", "8438579169602499403531276834153862236681805902767396281885988675130427183942"], array!["4371224392051444141538216717830171873522813314722974453159288159086172590441", "4471819188266525256545603690402039960553559029943278641513107103995534212653", "7934285249368611074358220926618133755594116808280441387064776330233673680433"], array!["3296929004083914338419828203502973195235748568216135964056267831058260996338", "7828705062628438916991665037339807083733865061668384262916273779860279371794", "6313358380505257639005175768394745400256528068580776946435054333930810425918"], array!["7673091158517942236320201239127705985446414040558434294512441355493079388101", "3589839431787481799335476281766961640592432750884680804513596535388211513959", "3497309798506406648010286927425548038594271991920637549888387014860982947288"], array!["3598928531842189258027744661377220155690961099878644839237443661252156892627", "8323476545439527339398168929351847585459351691146904838200536423836775797722", "2525233425021205371462807301191193452372106809085080242885832543937723343824"], array!["1670123541208150697178760793866430341950571765422973242642698972122650175931", "2615994352824306042392204336460002628039562926557752567316988279659549764738", "3845612285742795068547496524855308821681721826554794539870518271238257264872"], array!["8111729937113136682593516470591971173110681064547090000686075778488505769131", "8396009887088699712099390488777898295472002649026341742255474271675851100167", "7414449034416524223782013238252312102346828190465700203171291370882467344947"], array!["3778308769422683143427677977866154704853508570989688082271648398982585170107", "2565370813801956884760401215151019368813258954878221563399238313359761598300", "7277843344904687178893605017520459777796065293383180828267621160222576167983"], array!["6533305346353864830435743885484797433819452357103761181561861553139604158691", "7023616807188225486961828699414844137821383541366139971758751915067616890468", "6455936034448761051686329703810283225146169133435552271890713431685063292826"], array!["2781819771186595572605878483518345975589831093852202671865373784050027047498", "7768920898267371999735782676903681841500678447293607126814923973294043875457", "6463549363657422809088424260159871142005366302883731565233242485772646214776"], array!["4269033939844383336636476360431731618619965524039119758847937142713481376709", "5618036788017776315188246458501777138795420885496187406031735668173200947333", "1128431213282240763420656004648057492974288942591424362188971631793337713791"], array!["6900739195883338461228609955335408882714240356250551921341894223851444718631", "3771335365721990684607605930021444592509300370948450043449389607062564762590", "4101659620264578558029808267598816776989279597141521237379858078563415422176"], array!["7265965499850925058171553371274334440963706378337393611300731052328159723420", "4766078774636290635629565607286497839044156826339894416138410680627572132174", "6432220484581857509344049161489739648526811837695982886809250552529276108059"], array!["6361365189519422980433504384140223138978192212838226387265114914908491362931", "7610377774980016354219333532677870219839779550900332138169496134065793623856", "363180943030113865942993953461474483659264066502549823448101062593623940092"], array!["3562244767885763851343292605940116818317029725206904934994049890929589055395", "7782549227482772885045540707357099585281118980712854335622177919009966444948", "1275552603578693917501370061277948491143012995771911804618466157236333967239"], array!["5104148721380689096094143534135757186465840305075873333902995773940524349076", "3827555903928560008785730325772720209567461775844698712063218244346202837926", "6537952092752701292661689328736100739363623229800800023575262375504637794811"], array!["2625555787287768315537311869809801184270047957788564515280996906803464172085", "2268046926631224821219360422346148209575446526490776085639666316914303207343", "8301985790233975096406293902798523168400755923104779849614021896827941122062"], array!["6186410907907226666421909877388154922245464592386712702411681535145025981542", "1570197114753247526703806268420919303949793186535455032181860083077073573260", "6433616921731463425493337442585921501113569311931762833956390491384184622184"], array!["3730715929874541583946502538607860277000019933547155277889700636306045698678", "4162712607911623590542516061947062496983700183068013598513127619182396118738", "4885581468925689451043482261642022591161185334411569876922526171563347772487"], array!["679010986662603253067780482929422410547319947222192616893132766589997651700", "7045332371454775389874918027434858274122123892961682451412342124928285105115", "796483939088841221822094384379289433804847199444006131260701274900329521826"], array!["6930777873598706215302735286927888271122111082058406024378887982572264481712", "3833261336312955683233981899122259611841384124139797023838966596495768744423", "6081952172694136481884686958014712088378824178559544670607383857565862846284"], array!["3816381396460078181431529965953560061945407168453302734314638292833792891390", "56734387980297685686110088096585973744605712015961903089771968507489169889", "1528381975769046861077120384272922840572114805411576866912148437940560430592"], array!["4051427337822729290390706006634045761150954597129823553613464074823819976689", "928801883926308717594921627141285880564599719525707838888160095066522021660", "2575814441780474908465005749689528467553680700052052921662671958906858409792"], array!["4188482005041843983756841875722811236284873807578170011114849822278345286775", "2055640774204777367415844703991682482137697203553277498227758201416424138567", "4575553062307433825409075011087260276527850105624870927391350382554634786094"], array!["1854996916655462786356197865726500413712215270951193953965916926815164398288", "4106990062567081635175461840146829007165341060131472749713325730182145598945", "4440684113159162228103294475409844107272920293202271745070427054893404635089"]], "mds" => array![array!["6093452032963406658309134825240609333033222270199073508119142384975416392638", "5968273173562867837210008744966745230923761158428968101807573098840850097286", "1100466639266852149977689148055725793531897994956807001704693611715839541982"], array!["3160983601532844171864802850648492289862147997874094785600836495095965353712", "2338351297827692414112631814274572996809824929139580588221558887342663769892", "3177005087903404343485399282920555615020488967881372266904325860698809358885"], array!["2285176219817854683696635383059984246218458246545520061123961933072089703485", "84377861777946561525373172505381054389617879929776365352216307785104476701", "8280884008678095605415834125731826663585461281789631237939546251146561093166"]], "rate" => 2, "alpha"=> 17, "full_rounds" => 8, "partial_rounds" => 31 }; } /// TODO pub fn poseidon_params() -> PoseidonConfig { let arks = FR["ark"] .members() .map(|ark| { ark .members() .map(|v| Fr::from_str(v.as_str().unwrap()).unwrap()) .collect::>() }) .collect::>(); let mds = FR["mds"] .members() .map(|m| { m.members() .map(|v| Fr::from_str(v.as_str().unwrap()).unwrap()) .collect::>() }) .collect::>(); PoseidonConfig::new( FR["full_rounds"].as_usize().unwrap(), FR["partial_rounds"].as_usize().unwrap(), FR["alpha"].as_u64().unwrap(), mds, arks, FR["rate"].as_usize().unwrap(), // TODO (nikkolasg): check out the concrete parameters for the capacity // so far taken from https://github.com/AleoHQ/snarkVM/blob/d6ce2d3540b9355b59ef580db998188c786f8599/fields/src/traits/poseidon_default.rs#L43 1, ) } // Generated from poseidon_transcript::test::poseidon_parameters_generation pub fn poseidon_params_bls12381() -> PoseidonConfig { use ark_ff::PrimeField; use poseidon_parameters::{ Alpha, ArcMatrix, Matrix, MatrixOperations, MdsMatrix, OptimizedArcMatrix, OptimizedMdsMatrices, PoseidonParameters, RoundNumbers, SquareMatrix, }; /// Parameters for the rate-1 instance of Poseidon. pub fn rate_1() -> PoseidonParameters { PoseidonParameters { M: 128, t: 2, arc: ArcMatrix::new( 64, 2, vec![ F::from_str( "35174739893055911104493616029378130908017657834702731071195911003169112450229", ) .map_err(|_| ()) .unwrap(), F::from_str( "40230473166484073181383530626136429631051240172158259323832118663695222064618", ) .map_err(|_| ()) .unwrap(), F::from_str( "44839971797550275719608927493602345619671796219131839128512847210863471539893", ) .map_err(|_| ()) .unwrap(), F::from_str( "48611564661854252146943435349048894917868766542696555144699929229862960415826", ) .map_err(|_| ()) .unwrap(), F::from_str( "40685922923883326639435460208454299274336241847181916712959630054792010757353", ) .map_err(|_| ()) .unwrap(), F::from_str( "15664326207051802832937062272185115402684860397390155009854115660846132411502", ) .map_err(|_| ()) .unwrap(), F::from_str( "20394588293088308460232807257084465383971903994422965392216628021702933756783", ) .map_err(|_| ()) .unwrap(), F::from_str( "38072899122370719412288433912125900148799524273752876684473712699262778897654", ) .map_err(|_| ()) .unwrap(), F::from_str( "49322204581160802920728528441668898478821361914594574984125707955891751339030", ) .map_err(|_| ()) .unwrap(), F::from_str( "50347305345520436535964839331484028706021264874956603553067798037836173651466", ) .map_err(|_| ()) .unwrap(), F::from_str( "40078972002964969619442410831168416589272403782380052533737439660325916494912", ) .map_err(|_| ()) .unwrap(), F::from_str( "16924481893633890556036089675091788745304335123156116162143840931183063196275", ) .map_err(|_| ()) .unwrap(), F::from_str( "15950945481350597658451757244282476321967934435937826665895833437077276040754", ) .map_err(|_| ()) .unwrap(), F::from_str( "45461282993637819573288749652453263783235945959670912694991729940283965985733", ) .map_err(|_| ()) .unwrap(), F::from_str( "28038644046234298370628400737789907143817173874662134250914598498795544431933", ) .map_err(|_| ()) .unwrap(), F::from_str( "11068658063110546729562922745621277134925014371838931507832785600289614789661", ) .map_err(|_| ()) .unwrap(), F::from_str( "52268179647931159024439236070026950641875512180000134500458099574638256905396", ) .map_err(|_| ()) .unwrap(), F::from_str( "20086107503624605748636970696926057193402564249603453473832198318657465264844", ) .map_err(|_| ()) .unwrap(), F::from_str( "43167135986193729211374724389523185950396183466709666189982348666853925219274", ) .map_err(|_| ()) .unwrap(), F::from_str( "17447884039561508187156464597183128324504945258768782636135974167343387840370", ) .map_err(|_| ()) .unwrap(), F::from_str( "38143921110340159188228723493420793611575037275078276538202087394517162729554", ) .map_err(|_| ()) .unwrap(), F::from_str( "16552274712964434889263219772539968802934308159216951923060313539515542031786", ) .map_err(|_| ()) .unwrap(), F::from_str( "21533690197859269486445042768281999749203728740955226853531960445800814390872", ) .map_err(|_| ()) .unwrap(), F::from_str( "21880324978302337713295482389160476412101864070449056420604485964938425631874", ) .map_err(|_| ()) .unwrap(), F::from_str( "21087213863282472584378891060158648179244240590829455065271622458534461188836", ) .map_err(|_| ()) .unwrap(), F::from_str( "45441431536584624993024537766051601076632677727170866925607963222280486713049", ) .map_err(|_| ()) .unwrap(), F::from_str( "30366589203056029534723552859270912699187398046791858542022387243548834105416", ) .map_err(|_| ()) .unwrap(), F::from_str( "16733270300941292512227942400499003353179417300568446496228472021958136869720", ) .map_err(|_| ()) .unwrap(), F::from_str( "47689344912249729511524931558254404476237521452234110431416696572010445584377", ) .map_err(|_| ()) .unwrap(), F::from_str( "51082398733030351856006960204664584892075227924560364715540908659573989781750", ) .map_err(|_| ()) .unwrap(), F::from_str( "43167631539924493632724725819354890041217481730115306669306358893967667398874", ) .map_err(|_| ()) .unwrap(), F::from_str( "26279180116818040201102703456273647693759458841914982758720296510206405428021", ) .map_err(|_| ()) .unwrap(), F::from_str( "46216367353381802394196440660508655919466089439065744128194487821032228754652", ) .map_err(|_| ()) .unwrap(), F::from_str( "7697386669681950056820540614309128742475760814776187777185453179049760288818", ) .map_err(|_| ()) .unwrap(), F::from_str( "21817782321868614563882198267973607652180292878221625474094565055913249527776", ) .map_err(|_| ()) .unwrap(), F::from_str( "32913105459022632076500291209667002113801444807962815598956143828295422498435", ) .map_err(|_| ()) .unwrap(), F::from_str( "8502502120080628515364514243099640525167810254369523636419786457595198827016", ) .map_err(|_| ()) .unwrap(), F::from_str( "30648576830725883184207011877575066156796295678736109722327320104219004516016", ) .map_err(|_| ()) .unwrap(), F::from_str( "45671339585608301452963125193632555070872004563546575584248952737167410364255", ) .map_err(|_| ()) .unwrap(), F::from_str( "2451562695720526255410159479987351458212942773001104345088347268337017907959", ) .map_err(|_| ()) .unwrap(), F::from_str( "7231969043003068614870036828648884326376597612869950504826116686399812612615", ) .map_err(|_| ()) .unwrap(), F::from_str( "47273307399297813289148635743141600935869642174900722409535446469272321692250", ) .map_err(|_| ()) .unwrap(), F::from_str( "27329929942264081140373255677952719498722443205980316837000158653641048193545", ) .map_err(|_| ()) .unwrap(), F::from_str( "34885886867965298185213628215610826501969641592969627478599392659366672373049", ) .map_err(|_| ()) .unwrap(), F::from_str( "25721535552417582691507498115295027536875255063383254204046680789623453672738", ) .map_err(|_| ()) .unwrap(), F::from_str( "33423368799112636093951957186824418831319616314165017049161108153912788138739", ) .map_err(|_| ()) .unwrap(), F::from_str( "25189833401427047672367010746537756277335149535290712725530069868987176912248", ) .map_err(|_| ()) .unwrap(), F::from_str( "47958321445457642291354706357838648199395839243428939094705320859005837779683", ) .map_err(|_| ()) .unwrap(), F::from_str( "31774563161791760397918769926476984438505538732495587514473389056037994152917", ) .map_err(|_| ()) .unwrap(), F::from_str( "47850858374935538132163048932011117808042772861034650362901884832239133015769", ) .map_err(|_| ()) .unwrap(), F::from_str( "12199128582337530870446335645513552144450426981759317374083089598580379977396", ) .map_err(|_| ()) .unwrap(), F::from_str( "47383053307574057321551022954108360871160286114060097754143644961632203800586", ) .map_err(|_| ()) .unwrap(), F::from_str( "13803873123545025453120373087635256640332504728831881021333511396025254579362", ) .map_err(|_| ()) .unwrap(), F::from_str( "23837178543685639949465643421241187863068824855019641916163779619876342616994", ) .map_err(|_| ()) .unwrap(), F::from_str( "31189587782086980076115943766865860302487147542493494232203123657276644861038", ) .map_err(|_| ()) .unwrap(), F::from_str( "46499582074722273407549664254855207560785631035023694347608062453482015876732", ) .map_err(|_| ()) .unwrap(), F::from_str( "26662253988013080389152043229142922449414668235746968994211290964651963062577", ) .map_err(|_| ()) .unwrap(), F::from_str( "7640762545216115926527336572554187073301504782874830986070234716899751469743", ) .map_err(|_| ()) .unwrap(), F::from_str( "34498963117721665288552413822781095260286143856801028464976598055529802364121", ) .map_err(|_| ()) .unwrap(), F::from_str( "36341838182182173408654982018067474537982027919615372559077851240339996099909", ) .map_err(|_| ()) .unwrap(), F::from_str( "48300815548868869899847665404889851174998730453507260888165473018017728774364", ) .map_err(|_| ()) .unwrap(), F::from_str( "32747300835280625438818285868260843662581362309780466961516941514877133787742", ) .map_err(|_| ()) .unwrap(), F::from_str( "45303055704904829718227319208556302736092241137651995389242696979297340573498", ) .map_err(|_| ()) .unwrap(), F::from_str( "4026222424264187292280393735543795340594832329968061359731987906507864963350", ) .map_err(|_| ()) .unwrap(), F::from_str( "31228142597140675203545792153829318135052985461159014806691885654670181871080", ) .map_err(|_| ()) .unwrap(), F::from_str( "16750970802520682106296025351756788120283612961882144708385294780405339907653", ) .map_err(|_| ()) .unwrap(), F::from_str( "20590763839978944194181943371062517541785283010773701162056751611994399836929", ) .map_err(|_| ()) .unwrap(), F::from_str( "37594126822410828138420253267022641722217448081718524151329800547846230255554", ) .map_err(|_| ()) .unwrap(), F::from_str( "2394917091132363277251637490654694317375647018617394697153359156851524846663", ) .map_err(|_| ()) .unwrap(), F::from_str( "19737567843628339977867209886872321409023634418218069475717765230353858108711", ) .map_err(|_| ()) .unwrap(), F::from_str( "42204066697221303743688912704913307336835691602781490921152392223146514657878", ) .map_err(|_| ()) .unwrap(), F::from_str( "38876322214460807353380405022935203128264986058834077654885314090533204762902", ) .map_err(|_| ()) .unwrap(), F::from_str( "40247991658021514679970964566577204929744204347802761928836742882323686245178", ) .map_err(|_| ()) .unwrap(), F::from_str( "39561906161264753200012194261000443020947453081833838411624410505039816555019", ) .map_err(|_| ()) .unwrap(), F::from_str( "11166460550589161376470931941636300531100498757195643048019370497750388675069", ) .map_err(|_| ()) .unwrap(), F::from_str( "24790565769125580275808568537357949817511203246184311136698467928472412457388", ) .map_err(|_| ()) .unwrap(), F::from_str( "11554811916664964398531930051533768691042015283409338870777253388332997487366", ) .map_err(|_| ()) .unwrap(), F::from_str( "29075039934313065791873216420662295250443756892492849722546053940305352208592", ) .map_err(|_| ()) .unwrap(), F::from_str( "39006987007077517708714677464659567763889315959219170058379373515871687446558", ) .map_err(|_| ()) .unwrap(), F::from_str( "10061028159773233365380812282944217591122833800994251428395880422048305719205", ) .map_err(|_| ()) .unwrap(), F::from_str( "25031744215108526550081827540392247511207429766528399786265447570055547629537", ) .map_err(|_| ()) .unwrap(), F::from_str( "10547501786444119997366494351393198125463151669258024373934193854191592243660", ) .map_err(|_| ()) .unwrap(), F::from_str( "41670235909630407351693051359364867863450981844765151303749913478896054145311", ) .map_err(|_| ()) .unwrap(), F::from_str( "1550363730816174450383908114106000535080436631518311072819950124158318191772", ) .map_err(|_| ()) .unwrap(), F::from_str( "45637974422753200101239746614094187617113326582060147125507840703682309645118", ) .map_err(|_| ()) .unwrap(), F::from_str( "6370060789642013553710100441744454816236009933679880713369392969145674474801", ) .map_err(|_| ()) .unwrap(), F::from_str( "35620803994636505121581975698616513950631274399330479421894994077745439358719", ) .map_err(|_| ()) .unwrap(), F::from_str( "16067112068611935345405777398473590697557771847332060708439576094222338198471", ) .map_err(|_| ()) .unwrap(), F::from_str( "30951410852793823879089954146089097398960021512400590702302072057244085482851", ) .map_err(|_| ()) .unwrap(), F::from_str( "12276812530571706718883327429408937606433993990196477479137283768845651925632", ) .map_err(|_| ()) .unwrap(), F::from_str( "1005720997907928078270582364714493795153874104882338052955430808063076949858", ) .map_err(|_| ()) .unwrap(), F::from_str( "9432539242737555038548151091729061683667954775317685872580932218706555557193", ) .map_err(|_| ()) .unwrap(), F::from_str( "48144091886915459055979584468520005030090312584666359911350135788203438616374", ) .map_err(|_| ()) .unwrap(), F::from_str( "22450925011805294935671299553107487783565275020715623196582033415826118494250", ) .map_err(|_| ()) .unwrap(), F::from_str( "28149684753511832845415363706857286714650553416094912809755106801999479476946", ) .map_err(|_| ()) .unwrap(), F::from_str( "18984416380626314263255929984317834766173910658882331424593963038930830788043", ) .map_err(|_| ()) .unwrap(), F::from_str( "48109900230700383470215980955557162221434150244334962594952526792484549956555", ) .map_err(|_| ()) .unwrap(), F::from_str( "40552374456316069085238865117122876015343906448762540220517521948829052005624", ) .map_err(|_| ()) .unwrap(), F::from_str( "11526656751459710456216830286109707102065783384712439837497260759522383867216", ) .map_err(|_| ()) .unwrap(), F::from_str( "49248089956591852389575948260598336493822205882486787578128339029114849462975", ) .map_err(|_| ()) .unwrap(), F::from_str( "39372448145844604168126556278211607335704246721513006643620494230495045549807", ) .map_err(|_| ()) .unwrap(), F::from_str( "47966243235447948688248399775419397863458889989786324048551282844713998917659", ) .map_err(|_| ()) .unwrap(), F::from_str( "10668975765352037241237726978611677229760273562923261307501184329169652545894", ) .map_err(|_| ()) .unwrap(), F::from_str( "39507142063581063677057438880300974612179697912640172055190488555355094497813", ) .map_err(|_| ()) .unwrap(), F::from_str( "15638468735129173771932513149618051284064233358516491068231561062569214055646", ) .map_err(|_| ()) .unwrap(), F::from_str( "17353431924571233181583986362517131255570540171642397316569828436646526591477", ) .map_err(|_| ()) .unwrap(), F::from_str( "1113151614126806805734456303419241558692549524321573289125509096780876830226", ) .map_err(|_| ()) .unwrap(), F::from_str( "9984420714488068655842637440690086256585448839019918893900233218326556751996", ) .map_err(|_| ()) .unwrap(), F::from_str( "35272971102390074745676114574216945810721613586667868556864593470832260078394", ) .map_err(|_| ()) .unwrap(), F::from_str( "41799703040810741398331928206395151226132289978178889483708245720764196041488", ) .map_err(|_| ()) .unwrap(), F::from_str( "23792232833587856422363054609833448590404370086820676679702830143363402049151", ) .map_err(|_| ()) .unwrap(), F::from_str( "23400519399894650768950735628474893615670522380725820954092838104223338024750", ) .map_err(|_| ()) .unwrap(), F::from_str( "27249609507238299376315178191811683563055616067419555246827701486258799476504", ) .map_err(|_| ()) .unwrap(), F::from_str( "31460888976162844111664970745263960397533358231300142520392677905396078538854", ) .map_err(|_| ()) .unwrap(), F::from_str( "50541111392701415266654707208995846306449617779331389560072929586596066181460", ) .map_err(|_| ()) .unwrap(), F::from_str( "16849402175596403120072436766532798469469816167994479896578935023255475833387", ) .map_err(|_| ()) .unwrap(), F::from_str( "42001541432800637111202252596131403836308927391584450209899896684682298556999", ) .map_err(|_| ()) .unwrap(), F::from_str( "7555678132801484327842862804202549162661136010229184979905673538160644182471", ) .map_err(|_| ()) .unwrap(), F::from_str( "16973896084242861113146860522670036493260039473958217656803484585799718732593", ) .map_err(|_| ()) .unwrap(), F::from_str( "42770539705351951841624093062193706601998280964803890045059967451602239435405", ) .map_err(|_| ()) .unwrap(), F::from_str( "32967596628774896802370445267419978233370846153035552840999780942126744328522", ) .map_err(|_| ()) .unwrap(), F::from_str( "29885680756072762644563275495535410002799284565481770605563275267677242393534", ) .map_err(|_| ()) .unwrap(), F::from_str( "6767565503770123230340610856538459014642791435134695578527084133222911388089", ) .map_err(|_| ()) .unwrap(), F::from_str( "38034555907959016273994483610140537209819290169171432036495630086575144181148", ) .map_err(|_| ()) .unwrap(), F::from_str( "35085508904879414050180652811899618801153816228166027426392174635054369363148", ) .map_err(|_| ()) .unwrap(), F::from_str( "36657441819968029240636827111992013950645228690585008802597958876784513528202", ) .map_err(|_| ()) .unwrap(), F::from_str( "1322579115549556048043817488502303168290944210869541203532619083870097554885", ) .map_err(|_| ()) .unwrap(), F::from_str( "16882844793625225132625646093399829180269843611668936510323341639265456546672", ) .map_err(|_| ()) .unwrap(), ], ), mds: MdsMatrix::from_elements(vec![ F::from_str( "26217937587563095239723870254092982918845276250263818911301829349969290592257", ) .map_err(|_| ()) .unwrap(), F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap(), F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap(), F::from_str( "39326906381344642859585805381139474378267914375395728366952744024953935888385", ) .map_err(|_| ()) .unwrap(), ]), alpha: Alpha::Exponent(5), rounds: RoundNumbers { r_P: 56, r_F: 8 }, optimized_mds: OptimizedMdsMatrices { M_hat: SquareMatrix::new( 1, 1, vec![F::from_str( "39326906381344642859585805381139474378267914375395728366952744024953935888385", ) .map_err(|_| ()) .unwrap()], ), v: Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap()], ), w: Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap()], ), M_prime: SquareMatrix::new( 2, 2, vec![ F::from_str("1").map_err(|_| ()).unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "39326906381344642859585805381139474378267914375395728366952744024953935888385", ) .map_err(|_| ()) .unwrap(), ], ), M_doubleprime: SquareMatrix::new( 2, 2, vec![ F::from_str( "26217937587563095239723870254092982918845276250263818911301829349969290592257", ) .map_err(|_| ()) .unwrap(), F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap(), F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123010", ) .map_err(|_| ()) .unwrap(), F::from_str("1").map_err(|_| ()).unwrap(), ], ), M_inverse: SquareMatrix::new( 2, 2, vec![ F::from_str("18").map_err(|_| ()).unwrap(), F::from_str( "52435875175126190479447740508185965837690552500527637822603658699938581184489", ) .map_err(|_| ()) .unwrap(), F::from_str( "52435875175126190479447740508185965837690552500527637822603658699938581184489", ) .map_err(|_| ()) .unwrap(), F::from_str("36").map_err(|_| ()).unwrap(), ], ), M_hat_inverse: SquareMatrix::new(1, 1, vec![F::from_str("4").map_err(|_| ()).unwrap()]), M_00: F::from_str( "26217937587563095239723870254092982918845276250263818911301829349969290592257", ) .map_err(|_| ()) .unwrap(), M_i: Matrix::new( 2, 2, vec![ F::from_str("1").map_err(|_| ()).unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "18844142621030738849315867221324380626272463491487726140277535101490822753350", ) .map_err(|_| ()) .unwrap(), ], ), v_collection: vec![ Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123009", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "48066218910532341272827095465837135351216339792150334670720020474943699419137", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "51343461108977728177792579247598758216071999323433312034632749143689860743169", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52162771658589074904033950193039163932285914206254056375610931310876401074177", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52367599295991911585594292929399265361339392926959242460855476852673036156929", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52418806205342620755984378613489290718602762607135538982166613238122194927617", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52431607932680298048581900034511797057918605027179613112494397334484484620289", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52434808364514717371731280389767423642747565632190631645076343358575057043457", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435608472473322202518625478581330288954805783443386278221829864597700149249", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435808499462973410215461750784806950506615821256574936508201491103360925697", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435858506210386212139670818835676115894568330709872101079794397729776119809", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435871007897239412620723085848393407241556458073196392222692624386379918337", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435874133318952712740986152601572730078303489914027465008417181050530867969", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435874914674381037771051919289867560787490247874235233204848320216568605377", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435875110013238119028568360961941268464786937364287175253956105008078039729", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435875158847952389342947471379959695384111109736800160766233051205955398317", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435875171056630956921542248984464302113942152829928407144302287755424737964", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "13108968792764157739230385562246116075528485538207482101786075571938856184491", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "16386210991972587054669531517608020478304759509683779981097433567969359342251", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17205521541774694383529318006448496578998828002552854450925273066976985131691", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17410349179225221215744264628658615604172345125770123068382232941728891579051", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17461556088587852923798001284211145360465724406574440222746472910416868190891", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17474357815928510850811435448099277799539069226775519511337532902588862343851", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17477558247763675332564793989071310909307405431825789333485297900631860882091", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478358355722466453003133624314319186749489483088356789022239150142610516651", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478558382712164233112718533125071256110010495903998652906474462520297925291", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478608389459588678140114760327759273450140749107909118877533290614719777451", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478620891146444789396963817128431277785173312408886735370297997638325240491", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478624016568158817211176081328599278868931453234131139493489174394226606251", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478624797923587324164729147378641279139870988440442240524286968583201947691", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478624993262444450903117413891151779207605872242020015781986417130445783051", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478625042097158732587714480519279404224539593192414459596411279267256741891", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "17478625054305837303008863747176311310478773023430013070550017494801459481601", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "43696562644921102185338021317933552205887607631253231634590248398654300758785", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "50251047042574918405920310710622862429739816283209036275600306124617511078081", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "51889668141988372461065883058795189985702868446197987435852820556108313657905", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52299323416841735974852276145838271874693631486945225225915949163981014302861", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52401737235555076853298874417599042346941322247132034673431731315949189464100", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "13100434308888769213324718604399760586735330561783008668357932828987297366025", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "42602014958566835162916985032239414524951747015841480534042227232200760229891", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "23759472533423256410591181385106345090660574879092279589161471483034835353601", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "45266774514700456962233600727416060650933058095168798264243111895712644726785", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "50643600010019757100144205562993489541001178899187927933013521998882097070081", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "51987806383849582134621856771887846763518209100192710350206124524674460155905", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52323857977307038393241269574111436069147466650443905954504275156122550927361", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52407870875671402457896122774667333395554781038006704855578812813984573620225", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52428874100262493474059836074806307727156609634897404580847447228450079293441", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52434124906410266228100764399841051310057066784120079512164605832066455711745", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435437607947209416610996481099737205782181071425748244993895482970549816321", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435765783331445213738554501414408679713459643252165428201217895696573342465", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435847827177504163020444006493076548196279286208769724003048498878079224001", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435868338139018900340916382762743515316984196947920797953506149673455694385", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435873465879397584671034476830160257097160424632708566441120562372299811981", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "52435874747814492255753564000347014442542204481553905508563024165547010841380", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "13108968686953623063938391000086753610635551120388476377140756041386752710345", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "42604148553083048625570403131161162780926802155492847461237933035300624065971", ) .map_err(|_| ()) .unwrap()], ), ], w_hat_collection: vec![ Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123010", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123014", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123030", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123094", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054123350", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054124374", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054128470", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054144854", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054210390", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959054472534", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959055521110", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959059715414", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959076492630", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959143601494", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799959412036950", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799960485778774", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799964780746070", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105799981960615254", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105800050680091990", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105800325557998934", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105801425069626710", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105805823116137814", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105823415302182230", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069105893784046359894", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069106175259023070550", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069107301158929913174", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069111804758557283670", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069129819157066765654", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069201876751104693590", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215069490107127256405334", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215070643028631863252310", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215075254714650290640214", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215093701458724000191830", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215167488435018838398294", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425215462636340198191224150", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425216643227960915602527574", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425221365594443785247741270", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425240255060375263828596054", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425315812924101178152015190", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018425618044379004835445691734", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018426826970198619464620397910", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018431662673477077981319222614", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018451005486590912048114521430", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018528376739046248315295716694", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667018837861748867593384020497750", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667020075801788152973658919621974", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667025027561945294494758516118870", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667044834602573860579156902106454", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667124062765088124916750446056790", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701667440975415145182267124621858134", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701668708626015373411668621325063510", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701673779228416286329274608137885014", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701694061638019937999698555389171030", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793701775191276434544681394344394315094", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793702099709830092971408177500414891350", ) .map_err(|_| ()) .unwrap()], ), Matrix::new( 1, 1, vec![F::from_str( "34957250116750793652965160338790643891793703397784044726678315310124497196374", ) .map_err(|_| ()) .unwrap()], ), ], }, optimized_arc: OptimizedArcMatrix::new( 64, 2, vec![ F::from_str( "35174739893055911104493616029378130908017657834702731071195911003169112450229", ) .map_err(|_| ()) .unwrap(), F::from_str( "40230473166484073181383530626136429631051240172158259323832118663695222064618", ) .map_err(|_| ()) .unwrap(), F::from_str( "44839971797550275719608927493602345619671796219131839128512847210863471539893", ) .map_err(|_| ()) .unwrap(), F::from_str( "48611564661854252146943435349048894917868766542696555144699929229862960415826", ) .map_err(|_| ()) .unwrap(), F::from_str( "40685922923883326639435460208454299274336241847181916712959630054792010757353", ) .map_err(|_| ()) .unwrap(), F::from_str( "15664326207051802832937062272185115402684860397390155009854115660846132411502", ) .map_err(|_| ()) .unwrap(), F::from_str( "20394588293088308460232807257084465383971903994422965392216628021702933756783", ) .map_err(|_| ()) .unwrap(), F::from_str( "38072899122370719412288433912125900148799524273752876684473712699262778897654", ) .map_err(|_| ()) .unwrap(), F::from_str( "49322204581160802920728528441668898478821361914594574984125707955891751339030", ) .map_err(|_| ()) .unwrap(), F::from_str( "11546720471100324356589604343765555296510298649382063718189403564461171492863", ) .map_err(|_| ()) .unwrap(), F::from_str( "36110500355375093385871324309901194334631381714439614527255597369650392849542", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "3756733109852649396584228778466872196362658360207834645541184763961143083412", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "20251607517129761800297717300935980834606026680555472569470067927197814159058", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "5239353656737021436485173734268526002414965521861452100759532275936501964328", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "21300582910621453970075769970860650148943961329345636625818996955442242699131", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "21774765045116391148518722696232516163747969484119487964534360379873683242474", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "32722020057382082921329627018209709241475223852823289284428837414575534351309", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "33794442154315934695685025730187059000350644284482738453096808368436585150449", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "33356374759281451907993729503609407203078972387590420010346940719085856704600", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "16536766136174515568748693372704332161755684369233290734723311101392999671135", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "8155200347229826422648196061952312662995020845960673032039978897344425954944", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "41985238868657599524996779043300115443521336708491497391680518882421278207729", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "2063843216042971340057236348680603623021991141192327802421586125773152594966", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "19356199834277755257103978861422834427804178278770847736951931659601323041542", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "29407672119923084920129945390192575072371921764906862646182735700097611522286", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "23210564968750306632117638368081722417964237341952338866982652674742521848757", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "8919995046928353282196218782858660366384850716988440303338558248538040137799", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "19043131128131902196810002314394958855517905924691850071099334468401919991484", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "25372870640639931691894472507697938527971989245889491446494524936601040512930", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "28282246530559666639248292418150612779488812032571757345639609704112262688983", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "4783363587969676537071285052282175798266183157943408226768189618569177474295", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "8076640637611150676334686135767012090042738255090463961889429353861598391372", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "24983375671346681151260101878347553784741288686089866276697910000786751968362", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "31553063832521567697657525429909509843798042381162189406532027953053159867207", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "19397104375854813327815726265263423471142957336141256772200649485967743774458", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "16725724823339561221215536793048178667667680016815450011449579154320911341709", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "29033205376761356766961278958992230640915887129936846622211162138860547139883", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "38925727287210137779737577678032857716007633840925015412872642147337070197265", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "13054654952792030513819618373016885831657266413665857293819158146045635067324", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "11180520252272331206279504788346032423267894347729733535225909704781507388571", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "7829946038227950055107016972108651685558876858831437098551135271673396051934", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "12701392201570649781537742561621512715498088373227761999475504609950261026304", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "23110137476929231098068588344230895315869860683132386592399445163537587938902", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "34695385667367102489869345055605545198093190593541852158466006956870675273759", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "12473323874126447804974523548032043130473262290187841938491511255009575125315", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "33244171987325668610688838482180693579479913109349074619790699084518395114481", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "27800393704277881477423349646564407645504532574407056486674972536299508573197", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "38745941841134632283836831790084585919738726247813020052320436485069697160134", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "4222833134514534672312302121120063621259334942025065036721108691056782902710", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "2485253499287676466887039925919700883876238304552596149921625457687783981441", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "25376906928048350822232005681485535724988673469685171030423527493301156576940", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "50342721676243810030803571465468547773052568618511402750629061381943937849683", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "50049567928418632800795449103016632592486776140307034477479632433833610837266", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "23363897037620979716239578483167524838213385084153054827737272694281707133655", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "42704349801891305094989489174556449021777358796153454937762648266288696875551", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "15237078269491179837022602841512824373125754318519659312626032716476523314968", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "7834537534669842390771199937679522681049234016864851395164092776167283317372", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "40845753633682491334484157504358463583021595599904903653237711863475293554700", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "30415461155839336041159980430244598228679743472933918944484463593999625263250", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "45446374854682768122749806214133032507584129094447282144188920433140420665338", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "44511327229393971496561348546051674374277199034903648290060869960535543887325", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "31765384944890114175945271689093192004082637054270389724882306488698748316643", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "11724725910654336698843657420057198898582989110234170277283715189016057454856", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "35333898667082217702239272910553250687762082480432049530115838213528273162930", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "13139429039691322549933623030015220158389702383341486257474725505081327320136", ) .map_err(|_| ()) .unwrap(), F::from_str("0").map_err(|_| ()).unwrap(), F::from_str( "32967596628774896802370445267419978233370846153035552840999780942126744328522", ) .map_err(|_| ()) .unwrap(), F::from_str( "29885680756072762644563275495535410002799284565481770605563275267677242393534", ) .map_err(|_| ()) .unwrap(), F::from_str( "6767565503770123230340610856538459014642791435134695578527084133222911388089", ) .map_err(|_| ()) .unwrap(), F::from_str( "38034555907959016273994483610140537209819290169171432036495630086575144181148", ) .map_err(|_| ()) .unwrap(), F::from_str( "35085508904879414050180652811899618801153816228166027426392174635054369363148", ) .map_err(|_| ()) .unwrap(), F::from_str( "36657441819968029240636827111992013950645228690585008802597958876784513528202", ) .map_err(|_| ()) .unwrap(), F::from_str( "1322579115549556048043817488502303168290944210869541203532619083870097554885", ) .map_err(|_| ()) .unwrap(), F::from_str( "16882844793625225132625646093399829180269843611668936510323341639265456546672", ) .map_err(|_| ()) .unwrap(), ], ), } } let rate1_config = rate_1::(); let arkwork_mds = (0..rate1_config.mds.0 .0.n_rows) .map(|i| rate1_config.mds.0 .0.row_vector(i).elements) .collect::>>(); let arkwork_ark = (0..rate1_config.arc.0.n_rows) .map(|i| rate1_config.arc.0.row_vector(i).elements) .collect::>>(); PoseidonConfig { full_rounds: rate1_config.rounds.r_F, partial_rounds: rate1_config.rounds.r_P, alpha: match rate1_config.alpha { poseidon_parameters::Alpha::Exponent(alpha) => alpha as u64, _ => panic!("Alpha is not exponent"), }, ark: arkwork_ark, mds: arkwork_mds, rate: 1, // only hash one at a time capacity: 1, // ?? } } pub trait PoseidonConfiguration: ark_ff::PrimeField { fn poseidon_params() -> PoseidonConfig; } impl PoseidonConfiguration for ark_bls12_381::Fr { fn poseidon_params() -> PoseidonConfig { poseidon_params_bls12381() } } impl PoseidonConfiguration for ark_bls12_377::Fr { fn poseidon_params() -> PoseidonConfig { poseidon_params() } } impl PoseidonConfiguration for ark_blst::Scalar { fn poseidon_params() -> PoseidonConfig { let config = poseidon_params_bls12381(); let arks = config .ark .iter() .map(|v| { v.iter() .map(|&e| ark_blst::Scalar::from(e)) .collect::>() }) .collect(); let mdss = config .mds .iter() .map(|v| { v.iter() .map(|&e| ark_blst::Scalar::from(e)) .collect::>() }) .collect(); PoseidonConfig { full_rounds: config.full_rounds, partial_rounds: config.partial_rounds, alpha: config.alpha, ark: arks, mds: mdss, rate: config.rate, capacity: config.capacity, } } } lazy_static! { pub static ref POSEIDON_PARAMETERS_FR_377: PoseidonConfig = poseidon_params(); }