From 6006f7095f9aa5c737d15cc2f76eaa3e765ccf52 Mon Sep 17 00:00:00 2001 From: Rigidity Date: Fri, 12 Jul 2024 01:20:08 -0400 Subject: [PATCH] Improve modpow test generation --- Cargo.lock | 2 + op-tests/test-modpow.txt | 282 ++++++++++++++++++------- tools/Cargo.toml | 7 + tools/generate-modpow-tests.py | 34 --- tools/src/bin/generate-modpow-tests.rs | 85 ++++++++ 5 files changed, 295 insertions(+), 115 deletions(-) delete mode 100644 tools/generate-modpow-tests.py create mode 100644 tools/src/bin/generate-modpow-tests.rs diff --git a/Cargo.lock b/Cargo.lock index ae82e339..3db76508 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -287,7 +287,9 @@ dependencies = [ "hex-literal", "linreg", "num-bigint", + "num-integer", "rand", + "rand_chacha", "serde", "serde_json", "sha1", diff --git a/op-tests/test-modpow.txt b/op-tests/test-modpow.txt index 14a0fe5a..106bccdc 100644 --- a/op-tests/test-modpow.txt +++ b/op-tests/test-modpow.txt @@ -1,82 +1,202 @@ -; This file was generated by tools/generate-modpow-tests.py +; This file was generated by tools/src/bin/generate-modpow-tests.rs -modpow 1380167194925502624562918625332033329201340205025102037796963266546403466683 43187775536497761838602217139269872795469472629615329267056204436157181927004 84704352459471215801197405550957266388079405973940481569060522413255398520002 => 56613854429117121392432633463569166903610295857706477212473809013816818091865 | 44477 -modpow 63237234745769045037491568973096831260776671212598351065883915479916127034530 27935752826906670494048164600901710071754713092230940968155026099607790381539 26013851167196564452832205642553406644477293364254918869489188947702507474948 => 9716579725491271373908551938435070704814121613075813387204218778996885137400 | 43150 -modpow 104097548222824315130065745761953264838025133505355675475184669674950678271019 78848564920715543463126470735603678987138219996576387411943735344738392196762 65710867580403525875429988026222139705083036431759620887457247354061442542243 => 1474986000148552775438766476428959515231096357287196401242662726712809074534 | 44710 -modpow 92027137136105334313818169075466555156737000922160700231020196639851041029650 19881111216343532618634697093185291586769814232017901076346605163042890212100 85587063151193378036310482246216970588690484489496045721799144616776419165631 => 70915040788977393898902839687965844460022483236234078197479923023340298277373 | 44525 -modpow 55980133043412985443192132476510688715720365293199338694283452260827271386863 23948484297195310372519268045741742602495726148548563514143528295780626381579 37871757931037010615842281098998493155919739816375598133364041439298924393444 => 25579956637461692085416018714441013125122514802154920220963839658297308804535 | 43112 -modpow 72279402813738989603973159026208800985853814128198085391594206029480323275567 102428512300270761924123071395720318029345754860627578084591975368979750089109 52937439782886358560572705093380606925957079783324108027119201998863829685642 => 43694554230958616773001140999160664334350707842361182864594763656773013523825 | 43345 -modpow 105810388569811193459129833561301348374069911862092604461561344714856698045388 28217711051604066085115290085973274457800331671294102463508406645265700464114 28520583772492658279998433691807985068801711804386815744271481761000165965936 => 14727685950300053772795667139603037628244532714899291026231023199522179311904 | 43150 -modpow 114415507993171428226899008681754405111105515491523453913795304013396050600742 42300661387714616680011135566580828989019202729156634017339536759182943320074 78179562340373655342336750326968378065320799654365586488053388684310267369590 => 42980462627181915620828971871786840494824901482124875342474913438988820564074 | 44515 -modpow 114286572285192979105014485548619030635739994924726463679737493016771174124708 35981568538970534056954310665480069955227940697688245713659431397373272281444 57828853425554741202037030232811991930056605762611485912079625585180953987581 => 20114144125523547941188895306232489640472511057912501398958339188720743363726 | 43150 -modpow 24302497163452338646629714497700005603256338004179377025591906735131666754293 91531468170351522745440511881057123479366869731906766285591289645054808832415 85267333270122113403855787513429249918798204785238906307450761269698261102129 => 24763769353571170800746749790098505883231072139340898417431051803083911903865 | 44672 -modpow 104320259359868413532087222051796814538000598863890476118866422732514091641936 4796788117990827765356896914865615065137593280461692706170886693300806308324 12271915385469650301268392728639504102364946886186191809032859938395347724447 => 8969328070650175908232699656998529414163798281977987849271135821804158788444 | 43150 -modpow 12871500352303539261657890636324538961353301557855155126308103034120025429685 92289441840017595556611042543401451297524474021963271159023104814420219955182 20420254035599058432661686847017774850324436135308693255968442070322374384127 => 14299474033455119180772205785676016077649511939718843832270001563777485429732 | 43307 -modpow 10826742838975553515462255386652067777345485776564003679332062337385986068274 89004407671553144553868411079327924922732587436676836572855322695058754034813 45857540979540790871766111956994530854679579211106875606556440616961601034822 => 28600147492261709148678855140615566523918183957873672870533825020732430954902 | 43307 -modpow 4018642442784497937740968775447834899240082730828824894065662878840393960487 54522232925918346412273588985302445844641438658741248376280644166214444546191 38580951857304580129788346300080267728975435521866067460899124005830533419028 => 6521864423565971127066936447082188848043999650594821395192641287914461422855 | 43112 -modpow 89047842261087921448548137225336937891506942990740575964079089355971702497909 29130378443455459220592368197198687304386209024171987050108081906599211609916 1094504831640775433260892341105634891215390995687061334187346530552557915760 => 290682241593417579421268924539651006505004674820271856656016920400325776961 | 43150 -modpow 62595867920033051621116638859387386437691773890710048764414036808304389002576 37169893471860921058299520302610730223814323072595676505388823885574801650888 3884400647812379037841963276029426154389555058941394167040156251392097574312 => 886014160970406024689488358099774674544643681614513118290300086170264365496 | 43150 -modpow 17576372773875294519460900141470556426977616239359620577344727786486808105512 1632232283416130381499265427721423286434378992681153063809303462092924471788 29884581810889685712646396061797282893586856360953217802331409526822964652906 => 2106765123751758100449796905245564909662833531360493896735681754342918784970 | 43112 -modpow 79782057407488685064642475208837125427417283420243506526432143768875300022546 87206064026475649906340361345174145413818894101034377776665702770326471369797 9690373368043602041517126865194850003345812779281203372549555314937643642601 => 7432190350599575132790533658259053035082806623083304472740346020788133119671 | 43345 -modpow 106957411863536348216354916176757973796430343605442712076437429401910068861656 51999935511916490595931968369826073281882634018267848389086955182044227806698 9045347925678257204660045267301419591681489872782697940733156688970957984106 => 7555296384685274910643848679863965587111440675892843680808182457685970157740 | 43150 -modpow 6695717476989797091729117605129118479330417676889401636717408599257104665603 53317362291319856527673401882194437130086458587543578864915068202726388922321 97545913193212658975064847315547062776857939422392288897594984617327301435513 => 83586026856121694171905953132482949941776975835967518505602907528183947147093 | 44487 -modpow 31425978213132445378062964269743135439759028440879820713477291183017996485680 26938779511817595311175461626357869460331334934410149058170760951408128615045 6478716113222301737037130003464347719759323713972494187192859332708614275543 => 3848143939300859767121896611641475740862127299416763076880927651613950508036 | 43112 -modpow 35776162088806195335103784443723744393820741168168895992429734266017104975212 110445105897422953165954716088874563343463066729638979983403932336256835502006 77472088417796088895636224335578890675571533421484162940575012809171695606240 => 65730991319197215804603410253849745732750566727569821162158123949061460605984 | 44682 -modpow 40066062674630926514540469537082125527478544931011630236868456589017803545692 35737363939703275664666337542035359910313712673292622345154395187942280286437 4913356944293737053508984996975161714627230472588678835594300172318383690631 => 3867429452233277677343198081435998736847222565237146790258310262613869895338 | 43112 -modpow 25893084352151744676101770981015309656161319100056839962617424545943208844964 59831563737527334667288856848888068253810549866986817169191389423755111831317 87884677656180507539632597025475788115770402912757401540322360479329759844482 => 70312115824791599645223733845103201432668463374501212591686632017447778435296 | 44682 -modpow 114524997322749477869139243818232122169526219143445874478325466713224093197787 106835208313272447063411980760382178885443517941334876155139208714533200892443 20586213090623801361396603462834616888595479615241949839274523984961423647401 => 16275173793401896417677779100483632205600814186028097226955209549804672899465 | 43345 -modpow 7904272094098329219117708890610257148668691761552989119206276240628163759262 114970962371206464066223439546522763300707442725682763843893617954833841908429 4234238912985448278422606422918067889178291895391508207312696829801287955777 => 4051707281324017535037902279675275050453129218541297970265880264601037193133 | 43307 -modpow 42829650708688729256788867921757589999387699923851788873584283376920937442085 79851498453115517121753487930457054796303330559718978969141857886370855795726 106800143727751965438786223303997149524394713094721053853030228975574924991760 => 46554490210938391805676828268591095192051921075064319436096589945277183843225 | 44672 -modpow 43877995494384770286603370216690668469413517858372139307940810631251130574432 53922424430464187159067927292687563567927142860165786083460359102089080895927 99023142757896026521518401183342590307223078246174960746564746006584970602238 => 64484797431071844559524833920720158205083136785939612674418316198093592683398 | 44487 -modpow 94318628282206072192162141770368968759894434479949823249149771126783586781515 2951204370991123634221189693018651531138356854852221376307452540879220905227 86800201191328729041386137923642105003942010126826990944361905502938329543398 => 70912245199132343466567447152882844551483472934925701620865577045280556052507 | 44525 -modpow 62181535899339276781838352547341835124743821728940493765069059928224422631904 78355404261982778714964253853591548809510628350771006920986932284939591824767 37084276329180052558869211448501832219486745223838338597049474703368176726681 => 17958730170147522885351292991403421466806140031684813512779440354066918946920 | 43345 -modpow 27845795319991407763703973129016709207885499469491522047389811748479490170773 2509869690441037190043982594054939479063210751537403955496942926229321296949 1216155306164716523503367978056051755154435664655715473340148112993494764176 => 382276706323723256483194070027043795378915888659608394379998498187354666757 | 43112 -modpow 40195670305182485855225219126775925134013384083118063928856693633583035384767 88560313059721325604169464791650340508882034035489851462244433794915348621988 37221018447359289901090012352165872292451243916563829715200364691282124231839 => 16916323321194017787432448292091597036315959681207099046390468578651151448174 | 43307 -modpow 66759496323019832542218494592931571832754507119386193499656866743534710495263 42393167050647424801412148445030876678547084185352059694256175527800088088664 15052195774458787462853707734075709849812266664623372691100348707121632763671 => 9055293315227304496268200750823301339792923322235450814825620793889574786261 | 43150 -modpow 89419394112074650067536591681906620781263557892826455265388479018598150033671 68861450195219249792648703879727525078589768934024796440200008778130470291259 3299205248155701649358923493037291204870015938296166065719227723541436036607 => 1527121468947663597916790003681023274953247828900589375118766579618528956671 | 43345 -modpow 64550315433676340988904798479689669511816333939568895827038188511749482326661 63001408671883763340448226201991984212992489093334359450543431953031822146599 7537173682591287908970426670726486925631180399001898703887872670286353576013 => 2856755153342525666301450342480976684724283531783263995462148548786822869070 | 43345 -modpow 98821619389584729341656460233823514725666604968841840860633597442921136530895 45672760298969915997432074667562996467020364900044499188908200891692737222907 68726671260272602884938185813942166480580201142980336989272425950814087918394 => 15542615311971145808554235108095281189832187445657655788119434908507311364911 | 44515 -modpow 11192075122751618942986581908727283868904068795497088676091688830624421965495 11335245417108676208143204720257243160511942500690089484303190741987059314519 25049517443125201943192686138295534754125579285649372030687306699317716067139 => 4074725564061998978118972666704348991983338295094339545967590981700181728061 | 43112 -modpow 93555030466015978857199837971022806052194536327610740760030425172833379837830 49095762286698973398771518525894928574821025799216504731191131026972090858183 94926503541062196195977970492131293333404212271560991968558699896738308350934 => 39547977351377528390987982212264938397624596653913983958900225413352135849118 | 44515 -modpow 86203139287324910956329652410927760726967133691980794548822992346787626527418 696961212272996061423239532813867846793929063221425616262908785956545046025 90331911647478161215113464494607017628688127499405216982853266003615703008891 => 27947111625851487398241566656776658782241587811097323718250987087678014869654 | 44515 -modpow 34123059615725267244917202803009193961858890037821875351298061291201526526963 52867013130553253671078401720830458155671069866707562193244290752317316471260 90250308615184873764269453414519573007766960236827614372884115392188732568461 => 44112746116483404598926077018178552766042867811882291229792109595500916385220 | 44477 -% 54630852760214432035299819089615429708907363859946820600315302441296941217563 70655294875469077167628804546472171875 => 29652604148577235631032915018037858188 | 1340 -% 26946042020321317046780445683881192379720729462057339682954789609162229015614 170194206313368357212009514943729919531 => 155899756763375629389586074036299317956 | 1344 -% 70362362806713021219323635822270587255589447464493841204141710269325581944703 238060550019756090657222388588195190792 => 73937055937456638814982271032074514591 | 1348 -% 62341925713628261248287469556262640046612407375751531140158568279233342205242 299851334382703564443055615479296334703 => 208781632585666928229098694949999159101 | 1358 -% 37132855639972568527881968214038109663107398613126182445302183210978167973912 87008046058032729368292817417399218167 => 70288473706651540697146365130512512925 | 1340 -% 102911760549845485923884365034763217554125978305772734097464875985171653760442 103704771772981410143093919844425039076 => 44456956875237843126677975516657607842 | 1344 -% 35863736704380299312974697253930696689319820636616926533973411080718620556793 89391992669342170540533992447611321472 => 1313036795250273431456772267725010041 | 1340 -% 115410244115154297207851561762777120123806746447118859312351198866506660560330 185886666930479962577673376747935011284 => 138627138013479237956841078717679878354 | 1348 -% 110826158388359149670797692029474771292796454742727790912045125588505705401629 71374204047049683266132098702735505138 => 23958480306563664146409319286758876829 | 1344 -% 18684333177816463740545312286276098671159719470873067720748791659757922792981 283171885593975253188976361211529931834 => 268097463645850186398758321954762808361 | 1354 -% 104938762854617649356077714607252022358680185894217488031071509387214819940956 144847593283068190293719578282917897921 => 31171902760099090996296850294282248374 | 1344 -% 29754581614343146092494061186981554007805083029970311032461339610671085081152 82100180705398894379248865169613868721 => 79697943260476883378296605190713467790 | 1340 -% 96897087791208536403557775700604322082086957223312613617201814156805368119984 64639631217437783001096420289805671143 => 3378732039607432560057591510227157745 | 1344 -% 114988373372157553636265043904392016981190051849985335055095880353835634286845 10968474080335557880531383658323030737 => 4210170302775772927115201357500809789 | 1344 -% 25364277963535607675677273401581413272932744981108884964694468220029595413374 309538530818088257825984190212355004373 => 305664372837400268184907364917535367394 | 1354 -% 47984070273235321051244947327205844303866799333181478481156182362926727317926 33692427733972617795778782844306562179 => 7058454375081010028334340427435583130 | 1340 -% 29828694032907681259547499628583839740972754421690919394705060677298760214352 158293426594434215025063256056644265796 => 92923138901572417578342941554890609500 | 1340 -% 92242030047951818155761524651224813503023172846021910707644925755172867374533 175586279052231233758132516678084348123 => 95159975135362726725767766256302451888 | 1348 -% 58444269653638914656580769209346599278098487744541490766473781475358974838228 222525528801595992585566372251243398489 => 165570162602956809769745000784452224615 | 1348 -% 47451617087756653867991696325244355643901898614969856150422387234197540441459 59426281203644832334599748249479931335 => 43152592734087056794558418549517745464 | 1340 -% 26598071800573403330307886398269083758431088211689771023372438561878536346728 35116786169683670963648894316574462010 => 30595236622072498359706917105052043618 | 1340 -% 86337830541665031618309634170648601996917234956555089438254354625482333006924 135912744719066930437719319409468045946 => 91303786065071040306846681097241955762 | 1344 -% 24698179941519780587289573765928980261444182416399275743841849228635958328139 308937113248406259054809334922839717675 => 54690370121973323964547532258616243989 | 1344 -% 70766666339234093013947844342829893400652692189388656136887586070667786081037 210505706309144166156923508687281960170 => 137994163848173151276711148242109565267 | 1348 -% 35186620736019144396564930197050819439591033694653857030426832448755780988208 120087618508239384807059424954966644954 => 76811942099690748787681564494155029000 | 1340 -% 10214809282310703769448992948092339951317775289718935268304594748933942103813 90099958741644655582963659988842831449 => 72482441227759229353542872573809188091 | 1340 -% 89524042538336622803377682585832579300481949612941592289325414331049665134933 283527821321554415710976701181044591694 => 241392011788765104360751013881163465463 | 1358 -% 101064142885601063296932331857061748622928968461978082756219775041977287565684 146077144439773215294439892665077350481 => 5265655937301846938204811737145900095 | 1344 -% 22001171676677856639955819608272337698304662497191739054988150321208760802893 57490948886459357434008669647792828421 => 11988085837634373015195011442412275283 | 1340 -% 17921471085589008311184986123464689572944403716478826569057639297358044898234 52909208455401095188997771122601704866 => 30276583591041294026966721185405362008 | 1340 -% 13084621065493863811331618640530636770750034047690468011126017908583655519575 92612007623290531159278891751607828537 => 19543150945229226112773632948241945991 | 1340 -% 86895115363902182523579111668534273318272758725155672132703398385482734829223 81229977465100980914418069026672312094 => 32817813939730966332774155336576448797 | 1344 -% 112300106653370069587024782133584175562586823518751798606229484497262722013664 194509604140570532984756974012632311551 => 133528984571683656271394863139465168281 | 1348 -% 104872314931404902332703543150245823201566648836072437814298935033557101769676 271071170290003373183878989774864579706 => 156487208605975861679866935921781286200 | 1348 -% 90075555836256213666284688622001942934262660786486684446313097611160095287320 45291317379740091069523957435477397411 => 10052240545542047954334432988713429174 | 1344 -% 63660033061785534427647450473301553207863549961465936372783310034990245388903 144106029868931190367125959345748003981 => 127015022406631636195748533991811534477 | 1344 -% 54031972017064470573305710068011165128573049621550688055497280667591682439816 270756619093984415228733086101316957884 => 219815042366335664057480867050995831576 | 1354 -% 68026192923118954278989028844872556571917362618204157967772773688337514235533 1300419549525316295447524342749683378 => 640620709484182855215091528094393619 | 1334 -% 68901426716186475478951048292443303398164351974363678123122109677518925995233 240115621939669098667921546181085256842 => 101390597150733951412907204402661817861 | 1348 -% 89090744864732704591975450483858808534247088318047378491896086383622621052145 274463292552187597678295824083998950184 => 116437714710899640937762735810464944433 | 1348 +modpow 9341829497586649593865894363733490755438507694201597 556606291647424564814177367572458554425074604463581598568935778451121529 4373238041963667894698452839741832172073 => 645485963992042551624174571461937584879 | 26775 +modpow -476732895853059832558302 7430267589416313592667327913663122195977723920851401316336706748042 -26167714251475187590813905172573050731376766903667 => -7832564589158312925597206789179808084666064591837 | 29203 +modpow 3176338195276115163542008085847836908465426470485099431688135852834465 355738 1224041001 => 554112094 | 18505 +modpow 19 92 380280709006605916949985940193758631 => 347680718951591107801505629119257663 | 21916 +modpow -120920267493683383759156844 436966163512 8010894840926221885543822098627005424197901931579057857358777704072 => 4524530934640363873312233129004175691619967677468653353889781643248 | 34237 +modpow 1897595367258387458729 34702152440947713892141815856 62230553565297885500358019 => 30785909580253472213307463 | 20425 +modpow -30400433066974082485090271880 3103390276275710143455308261151950955814387224189582271330407363500 634413337097422449160106470279193260 => 79693557408633139094247309912860960 | 24683 +modpow -9453314410597358289935064437261122658011016 279652508 -440590092552209928903922868001141004 => -300044005983362999554342470883236884 | 22607 +modpow 2055922121462269081080035226670233042139818664405744228421 83291747601510668846010711489463143463 -1368536944400669038480367343580162103430726580490485450947602433122206 => -818309760516914871187479067326692341892495931127231657324784250087183 | 36631 +modpow -319532400143113171681849062932340882 388613076700957004231993 108610697402368 => 79147074609152 | 18686 +modpow 272121335863712254974348117699104848327443046245915591684558287895015935 1017744808981627175467121281944460 1285811470547643122103 => 107417850327975619453 | 20519 +modpow -11636540683832019721917271964271644846968060372608938100 1988651454847818503054173565699326937440527731 -469519461242 => -55698782578 | 19532 +modpow -39216272508398798502349496526650406359643571637126438413055767713 117268036971104422660551640755141580178 -1839038486931841387393192793326590298101736435 => -1210077912177725189345946798872385223162964746 | 26565 +modpow 11019779323414485884980307120007133736618442553873344 20502551282126045480870765599053506589865127614313145 8623519486327530178793824086704 => 1549836756547853475989826189232 | 22967 +modpow 9568296001419589505649118887381676967992 495437680773274413611541798759358875355495393192328923818314543966808712 681056404546131358982880922426 => 627532484555180543884943539002 | 24025 +modpow -20210200139652968214353172922139655268276 44520526032129438453058815998409255888911660462821140 -31 => -30 | 19129 +modpow -123306576588996994480705308725194131675597672843525 14509458069247667 84 => 51 | 17976 +modpow -139977492253643843815578476296854790857918956556164524962451384656929776791 5007069584326031186023882485069354118754887025633673203 -478470020404575948621768324210923331 => -112955385112581055693890589220207022 | 24640 +modpow -64791059622358908478686621053081647219908135162502 80909319458481885599580389165438283237 -628971748148499256891768906727879036694477620703795395915537 => -76329016345600002485554275462046175109318415701103097727930 | 31941 +modpow 243156859672519307321153581212021253 3260555702553945468884134968721480838704280527914072474823588572815815 -6448682941026310750680909931385071426263300630552724744641678647271286687166 => -3751211169313838089229611655755985482068309791863217518245299527773779575177 | 41917 +modpow 332990358763 5319908016577498551406650550098427701661334 -1418540 => -372931 | 18381 +modpow 2299905292354191513900875902563 141875065336 -359995929159108042289699858 => -117862348126845195613248329 | 20703 +modpow 5058552831645192517142546827814 141409045121590851424050383664983586242427877197317750668025268451131166 36454984700573552857817740498113823744702 => 23962121418473798618593707102387684183736 | 26433 +modpow -31058705335766256775673230807063961482065523947546630680590106305 540502993822042054673675089287998 -8582000119412484362352833588324729734580806960914559096388411045433 => -6040302398596929424132016848598338831574272609843737865312439063765 | 35358 +modpow 450185812621580731388660381102060832250262640606903284632422 639177811409739648718710971103596230617531539602876881335 -37215428319727867228492123498292592629393612796950462 => -8658180443230874923523824836612603492818855400192656 | 30062 +modpow -145160972129861106445703102507465589037742175677454 124785588168670701668598318914002314 490476952379857173846900864905598628109813484911 => 224284025754767503650515588566634710586983908242 | 27073 +modpow 14900447450068660502639555504585260221327972103936751 11990827323921805152935876162 -763927185089818535009220889480213408697433297618737015272998586932332195 => -548193401300666541184113198526976454504298297255311900659826864177726504 | 37468 +modpow 25891 28036138523148292690307127507194478609203106929224185950274460 2909513255560508821459738484023925099827690399901476555124360165927276 => 1894144191344909070509796443440327738743833538126812591492406272981469 | 37055 +modpow 41307950130866512177414748499853635907835185218669972808009565559037628450235 1287580913045529151393205181180348236208723138 1501757892 => 1297404549 | 19675 +modpow 84647271967992305728988965527532345194 14216733774722474 -1201891202879276439 => -3845101726434132 | 19169 +modpow 21022030067493390571638110 19 3985415524780515210882174439738 => 1676359633942413918978194501486 | 21100 +modpow -16121320513256377 122798613469119683696460684212838550475730845978283 646232262405045884006780874240087 => 148979182098512240211935817349550 | 22845 +modpow -497910514207506245119004766927772641 6812067747587075695746734586206054391240219 -18895 => -12531 | 18646 +modpow -45042160830367584437888590274500444458095213709979869898604841883 31284448460145775480751922158500475999252639551207627773276642275 33881409773617763466725026579 => 7048906115113633036478184470 | 23357 +modpow -222695427896 32634579984002805653822136187291281675895282788337321 2107839364582346862216167200209701614366099472236591123323 => 1370216355315947428903544001341088945497913298431783571048 | 30978 +modpow 349522504978587389691128535519397627948502341249 140147107477918 -24388799035691830948123625264990232606940242694126288570884791930903232947088 => -1648296291322202792621927114026463769681705038002357875185694024195339005375 | 39692 +modpow 395373886030 26711761331328296625555980546539894114961292899691804 -505059883498364527727 => -97501515076946998340 | 20433 +modpow -21208806673538363726799712017159877692322187608066968098621176850 1412083823851111946201229201633496241679815187887622753507786753358 949849158335274244510 => 467255654746174302090 | 22169 +modpow 2187097494224051361861682022282383 35356314838399485713681029677055871742640478000454763 -2677197097065677078601991589099350884393559453105069925076 => -1097070520450280631251017080447490682055185935961558066153 | 31320 +modpow -880943435642031162346365810939871128448747126273995235228388261288457003 163061405189328543258463495393992158999032919120937336406476760957478641558 -13 => -1 | 21054 +modpow 16804 29675 1 => 0 | 17109 +modpow -29266802130473256517648802151907615801121 8844966875039522515976657521287 1225182 => 238141 | 18372 +modpow -2521147352512965065562079108663271128230970503056281463210 0 -12036589568929727 => -12036589568929726 | 19011 +modpow 105837586171729199470400227234998962416778470834434774861087120464775998593 28078293973268922776862779420 18499006439208771529999986232688481048472799235897018528780818392401821642 => 12171491747814777956501631194108799586920015397887859900056945851522040007 | 39101 +modpow 0 8410866175793820679156946652188825469478503 -535830741188057205231809853135733813 => 0 | 22697 +modpow -2101408409170353056693406214837788400838850383773751031003 148676776591162894020595802 137437467293319177270021120639265599962059703189683350903118047515006002498 => 19306979843727088026682656439765439378005906016655686429226359207792605963 | 38766 +modpow -6834923916052042579592442345975496188967309410236449318474115003914867208562 22816 -34831066691124259 => -26961179491780916 | 19327 +modpow 2238808757102169696124755491832409587738505694836065499609453399775101 14669302852624075 -1184037686142548176744049443332120052102126211 => -419439233503463695637460728568489953618653771 | 26020 +modpow 19122244989422039462212531134757542194292 43092030317760146580863222295853973265523 25231082412015014190968267040381799856374403837298365225848277 => 17921801117027594824179078237819423877224458299843140550422560 | 32969 +modpow 28730735215185463122491807665 34684081401840169956086861836313141047480199439578439490165182275596264033804 13791455045232558 => 2519276773814077 | 21627 +modpow -1231896809978407204929623641632273 29244798 6578088425203394999670366462595472508621919576083272657 => 4219776548597043790706621877707419480878455320147570523 | 28919 +modpow 2685979064248344529970095922740325496982685803 189531787963074999872417017120181666284633774770740745576047652141759 414673301940229919241680839861152145312956393170 => 278225318362069572041941962453177102163399539547 | 28845 +modpow -6107397341423535862409001955860924107102764229348969800262098638280055710995 5143 1892887305122419093117 => 1490603504940180143306 | 20019 +modpow 9327269001805104201783831231869108640672160 151181716517717341445466515718312599723033633218745071661717290908758801074 -378370235446048088333269161012738612 => -288388478263718841109586780361067208 | 25442 +modpow 1788 328348035999299733936967721222170419267006591028766101207760333413 -1181114911067829001770499127126966 => -440227708687771376794772875109674 | 23684 +modpow -2088672468461047937671393658120552769957178222 58811566506236884831421560846289322247 -440359948039165830601779131763146952763014924 => -52662294815776389701579809028498412703409920 | 26261 +modpow -413554889550878109394427 17770482216643826 2685976723368638488172569973687889460886588084 => 1909622343708139741054383450442131811226054469 | 25298 +modpow 22503486042702 3649389308827170028245374703142714003988267689432493055654091418723654381 1872822 => 843402 | 20330 +modpow 16 81 18 => 10 | 17072 +modpow 105264707192472590460764606431723643173913108513272218434095816628988196397 561925103773649073828 -2011337710193729414458242846655738 => -1481226858421090197144233652850103 | 22677 +modpow -1556063180244785076730254370715253 886394114349939750260442380107925 21673600565554679413103836476648220636949938301018984732142353379 => 6612044475755744445157169012190514149900285446567802489274301883 | 33699 +modpow 11018719240679211400064280626176877151158 12785448599537988 -116850540263088960146291306847811352624803238504907211527138295500385968641 => -6758414731075208676043763946915437421045511364930855107171685490501465863 | 38284 +modpow 12427825052544284970857936507626889354412007436838474648998499819468821518195 512657913033070157655119 -41904548395284854631440219805703610431175 => -1559406221375566057616486141752353634700 | 24755 +modpow 204328576391261868990424914252320091898741895008053660216112503139737307706 138688377761200524300233816734100307912 -1960943074189674661514499705335955576846966327793302830316938131405977 => -137186383551909737202770933679114191732603792945662498547680246628216 | 36897 +modpow -6 30138465620737564 726928931209577062470827916633114366611111238684785264589368311 => 661176240160392645106434971039496513772304918821143036582895453 | 32764 +modpow -240479032143817459279536319357568617 3052041526079063130765795546614741084919945461296943492148307945978606 -1794701639765299254306715020962886497653805097955442750872504610304937 => -1647022723217388312573591829141149477446206964002042421934730284039218 | 38044 +modpow 44 5382155083578524 -18946 => -16446 | 17289 +modpow 2382491227351527824121904076036 2366553480930035916351834891416166 206084344072900994463538229219404962402416767984089901321116749017333 => 67943375914165129535273275193593217343143151412736498336095035970623 | 36033 +modpow 23258187105707320739278112614 7917922667604749725149180349721817446780686636843083519 1 => 0 | 19064 +modpow 8670863752535413128 1868257382503913533352 55075311331347915103890023176548556566482409408120877305150928892986889894658 => 33787765181624380116650016624306967311919517369622229111825127547407743502940 | 39371 +modpow 984206940936480543327909996514863176553036873731926353232 8270523329166451163026064574411 472571284609832441689410 => 138026865931375102233688 | 20619 +modpow -1354430444353840323286370383169814632912271012804023644116831698584986170141 108139643608966326896582205547706756268971939435648394629370736 1162433088218164 => 430526826401245 | 21343 +modpow 33786105728739852970036897571980297154428 0 45089358623573236161578682056206310549785050161612411 => 1 | 27820 +modpow 510918259215217773827404 2988888793133482134407311956698672082359846295077637375114 31835286396270615641169955733288714095333832445276181 => 27471949546721693024969506139885429680620279342680149 | 29492 +modpow -21763517261285168198304522403631449116302061329166893 48987287752474643027476841109859020152704603845238583224443396893665320441693 25491638648357 => 22793607330710 | 21724 +modpow 10123758058400610168643864507971741089684750710354199671 137951224006078384912187441092554157039521564500796 -836411821147741413765283278196305076075515487397557849751 => -512673022995469182702022922155921667678125132908826429833 | 31533 +modpow 10762 445599801321789027313490 -3151283992561367894431635059126621662380715304024871763380175840924019 => -2523004165020474520043505336741034272415896828724574953206863574640468 | 35327 +modpow -4308966843024579935015442371979092725243272 7802078821906207661390809784288609668563687907461378398864385745270 -110408218668101715627739605731232045029618165860046101668018398555026741 => -13000454049382211882274761633509979320220538994165789299568857423151733 | 39236 +modpow -165393788252323640232028048841451272473505570096101873312903731 88668425 -365186968029295825675051061047050288 => -64281662389497004117757772253201011 | 22911 +modpow 712677000565973058284944677081637470041783525252 132169728272455040473137631826004006300680083725 -751786394 => -663079926 | 19336 +modpow -144091525567649281811542156 3970058046654299831845768537288120180393479027509189 69565046683529034581878249711653242383645753726802900452245993087660969732 => 36699723862121918150955129075525593945428004199620543319736930453465798928 | 39361 +modpow -19518081325073017371106001092 0 -29039249998853041243814600013432890133232180307864374561387159015 => -29039249998853041243814600013432890133232180307864374561387159014 | 33035 +modpow -1686795998744384171078699640180316 10697027011083871481051626351394660371383136 -8196970237052878732109591494358498962857858669786 => -6003380352717069717533678866418494492209558134912 | 27975 +modpow 464185131013900743123541188050409486085298225019184585917893189378634461 101 -9479922881624255967936758049736327579022023 => -6277057721814217985777983990943243085016530 | 25127 +modpow 212 121997902378403719486162919 -751397167063598739926475911479263150619573292 => -464940708909182255488735424830269362067252228 | 25210 +modpow 11017884725758462464678677279249069075307947 2208263840608182118874111437673808716352821258875321596963752756242007 488506724319461348001335813868232607905166873 => 334094675097948608107483306076589768127991558 | 27978 +modpow -96 2194567477140854331776864636732647599186895072 -1198345849523374249319 => -673315108862000198734 | 19912 +modpow 149274197819683829092301700826802280221428550446213488814827 2432708850317871612590945612848367902306300123489220424092181509969687 -25264081665781874294767502093095153695983048503995777743137241506118 => -4943923426910753346367334978617166076057013570945737603629352430667 | 38414 +modpow 315740025680709282988 4239050100319945704459934077397825798773138647039100655180439919073583764717 -77333275175420263539831552 => -37739695297597363069313792 | 23065 +modpow 9942837946427862 539668802232935884452960966290047629606689719768290637950474 21475206879329467850583977827569277270763285430587565512159746506778353804304 => 10312064540474098848767660252352563298788273245585694027916102233539251632592 | 40965 +modpow 80693375499465459726065751 76046315686619 29880170441352637154183461256521444725588828 => 24414055950096265028132178586301463536165991 | 25297 +modpow 23699 744670906939376197160 -77427118040969712569445272614859580977 => -54785947393213069227146711882977457218 | 22855 +modpow 6055319393741373770 18236757081607999985627736326847549279059480797084992934293376083965723574157 -78036222958371430327672390510956343667153367657486 => -10530795840518438072974114014300918805753296909856 | 29847 +modpow -11591409428029140540304087043480200129329955291832962260490116 8425828709091229994 -32029127403376683267945349927621619868223356800741 => -20776274314970869757535187897458470062299152466450 | 27651 +modpow 1179851004250039019608327739190133438259325144959302175941 32761422093976943431678646539504790829888 -78748001118200482009042750723114980330414623979 => -66729720418573121476420304638821491319292982066 | 27379 +modpow 19042294903859697 5867850 -23700075345122183 => -18817788509551926 | 18392 +modpow 289522979948940146746954 121958 -10179294340966250348948035777 => -2984029956443741104695992008 | 20551 +modpow -558219413071622452365509205200044071724207098994032620079796 16099812995534856 41313693123402349702377041402941342064840262266693187796245988721071901989780 => 20055527661893958142519361451570306971653172747578901362009413767976656443796 | 39921 +modpow -32641103220461358401292230030270375427472 26961066701696287778912495504201614825456 724787930894581992722788204656928458012171243646899594961047 => 380974595144564940261743305320682796613543572048495414507908 | 31888 +modpow 19385541225271669114770353110736339651561266889394137252518593183 520276522171237561715100380258273598229066997385 -776 => -633 | 19330 +% -2777833415598132635999555067460663756559916135802403624351 1241919730821044 => 703909153829197 | 1182 +% -34007320058995675654250771529624835265870790388784086 -1619745159114927233711218850688617 => -143792764976801945537121687031709 | 1272 +% -45803017949387988614245337879339972536514995509698019914059209 -107617230305170 => -62404600612139 | 1176 +% -7083851562723411741964094892919 194825439716 => 64612059617 | 1110 +% -1568895194944286084405725926369090889986993470462823961 -573296302669350472504477939107159591 => -51105465527420725218462973507395118 | 1290 +% 66738536027972712297146182297470770803877100683 2031283392953391734729197114965269 => 1290756750098598210186225270655594 | 1264 +% -493116369669958637586767977800957031379230466855 461208613661182078883635 => 426923988828721715618535 | 1208 +% 45256810098776437444976181274258540189427135769437873230933785568921858463750 92 => 34 | 1130 +% -4117887 2209603 => 301319 | 1042 +% 2961643693747131533462406161439733123479038632222112161166469972865103 123520984562 => 118064925533 | 1174 +% 40 12459359284986194 => 40 | 1030 +% -49286067966919 -310111826943275203773242 => -49286067966919 | 1112 +% 117600908635103800731299739063253807182558027007303 302399070176 => 100456581127 | 1142 +% -3331858480289181029 -3328993092718357307 => -2865387570823722 | 1122 +% 27796877410095210015205619968 1284165313976816472725334416016264 => 27796877410095210015205619968 | 1212 +% 50277324294486349541928563985974251763095977211161504925188518017 -2099198247 => -1753544210 | 1152 +% 37584144728177580250996265511973981122588640004372558622002102178 1 => 0 | 1100 +% 4 1 => 0 | 996 +% 398532084 55862414718436 => 398532084 | 1068 +% -3091858474491190366342618296891381799957318001834659336308825755199795 -579428448632537405568508 => -531613841114837661746467 | 1244 +% -2182382493366724165527575057635447196725030662619892526 -382812157679 => -210484767456 | 1150 +% -32869242278705050659530886358129211942669497870731845 -4118387110791733337310557280631 => -692817401594310295817540318608 | 1258 +% -93337475191470034643260847844022789561 140768915629312560452355494431472539 => 133084786393505497103200458474976335 | 1262 +% -2083893130 -152584834948824323077289100 => -2083893130 | 1088 +% -81437381774261868524889755209403994266873669717548999582143548366306730252 77513595834162 => 42320962844790 | 1196 +% 1865292637660679976016458826902030 -1310488625 => -665629970 | 1100 +% -185175276547 1254701 => 1025239 | 1050 +% -4331965695039137922 -42582396062 => -35439688734 | 1090 +% -9605979951764129142211399262341 -156177804852665126455881763317010995839 => -9605979951764129142211399262341 | 1234 +% 31268800754441905817183982461126846866214085376958 7749692289156968539539305202886 => 5106229408352160465603497135184 | 1254 +% -9264735110548610217131308972717877834904559 48 => 17 | 1074 +% -436686430120748437327326028263997510192485369732724768151 9103516036165343887485177578969 => 7634512376401833508052034474982 | 1266 +% -85804500325796 1 => 0 | 1016 +% 2473604027479073342971924214700420668902590078255814083790019254949856 790844247765835706 => 671722626372110136 | 1216 +% -14854565829183843519768332597111072234506093368819180 -20677833100463610 => -17594734923836880 | 1174 +% -3048629847118595095952722108596 -19681607544620490 => -5406102559938876 | 1138 +% 27377133827456860 -16756188001199273164168084012 => -16756188001171896030340627152 | 1184 +% 1593022705773974171184212531219813777879165529303076649264 -69709935329316584624037538 => -58710113421625797167955058 | 1238 +% -18387621879410909580525383859857679921475246905928612717373837181 9766309290843195107347007094395 => 6745140129764816030746299372984 | 1278 +% -709027066799077891896 -9892014638863798133762881931864505543 => -709027066799077891896 | 1178 +% 329035793321767987023198136287850952516341807789092694164149334151099 2035637721990142828361022620056246 => 93095407052812847549823020749841 | 1300 +% -8461688467954000216043210198613515641702976648112228 -20073 => -19911 | 1104 +% -25403825958208214425290172345030706123178214968096135 130111829559988904613921784 => 96949038632394283590886913 | 1230 +% -33222419657165338567216037506944521448323935342593652032759500807 112458072879906 => 101344292379583 | 1180 +% 6803262 -25720145369944980933687093254 => -25720145369944980933680289992 | 1168 +% 33113474083213714505292457421732248253914 -232849045795431816483417 => -90255095074933357109123 | 1196 +% 12842187357481047156736007354024000463774498102798321108284342840610 -27104 => -10750 | 1128 +% 107086498 127120760945340220010060723324417239749 => 107086498 | 1108 +% -13602 -1332354098726946154630644697207 => -13602 | 1068 +% -5221639456501961844136772873487338957074422651440880290108238958588 2512025057370421398227368262266505 => 1115990793096569518565329607366962 | 1296 +% -8937615494654845197294880941627284309072883061700639266 -10087590968521868914946287545076 => -462969228976036014216220068342 | 1262 +% 4258 -129413453903536 => -129413453899278 | 1080 +% 41843682594115121385347458154422345902 502810203781567904340770 => 129013609385383055927032 | 1192 +% 2367508 20973199961908703617171935862352272324 => 2367508 | 1094 +% -10889491548560740590253605157547701815661372 97 => 39 | 1074 +% -119038130281536673186605321732535788394257787349961526199355235125209476 345524631538 => 198509441020 | 1178 +% 205082435740106082956938061686333064753878913327865414031487940 -16 => -12 | 1106 +% 1277132034256792701 -8355685054611516552 => -7078553020354723851 | 1132 +% 25637564916816461809746350398930503251032073069361516288449152548 -144375655581479961059460323773244484840 => -70818813948116560363368957718824377172 | 1320 +% 126 2063080827492683464866 => 126 | 1038 +% -37235174023143179519518682902450457007113895838576645 -69 => -31 | 1090 +% 1307950984714385198333909591914173178967008784796114599406140148202892 -148996258403758440741883586889869338965 => -76363000114604410909033570935449103718 | 1328 +% 21430627437061845698586023150 -31021625134567383 => -26534939914294186 | 1134 +% 971712411469058382125874975084998 134024518282939763365348528 => 75592028099268149887164774 | 1198 +% -1713329366992832114231910763035353348912509598420153648027602359296 -9698868812008694 => -5290700071457446 | 1198 +% 201097200757442971202675374086014428261330489051 -495451522555 => -177012071784 | 1138 +% -37746959123269236748737321399 699658334 => 676635 | 1082 +% 372242 -559552121582783800605738 => -559552121582783800233496 | 1140 +% -28090947594605594032971697167399929737413489253207096114 277524695629735697117967 => 180990866989463552420948 | 1224 +% -1578278638205700540638282799845872007592221027418978379127 -111989687725 => -91295970302 | 1154 +% -27159933422272052273566454672855870751637497958897035732355782654259077085479 -8284546968658216834 => -294122434108660363 | 1228 +% 2179656933232850444062972543506621 -3254845 => -2848514 | 1086 +% 1250677672614315359792807307603249 4333277850983808779 => 262042640755486557 | 1156 +% -2685598443172325808120327628139014259395021108355700406433 -2396520236262735533220546479 => -2128981506124116102505010854 | 1252 +% -3264184649480388811464629957825745753490187 -7310441 => -3060026 | 1102 +% -377083190472264460084426004193015378039993716039 1298102725 => 258899986 | 1124 +% -30 36304954920990684056672553548 => 36304954920990684056672553518 | 1160 +% 112527559877387025324154 -2949450830357107634197810310962 => -2949450717829547756810784986808 | 1210 +% -191091352032103347163930732407891582306920573349718596404701 -866377822 => -345123581 | 1144 +% 13813613821938929493176406752183011224 4593666326256877667448475101485 => 4405918198916269764722982569209 | 1234 +% -422338768275 -9760384743860978563053288875755 => -422338768275 | 1110 +% -1200568495291230641392525136777992966739999866758006531237514699508050 -6556793 => -4281615 | 1146 +% 52255671227355348694934566342010060785910436223575795401958842265961866509 -302784434752 => -298472153651 | 1182 +% 119464119291609069589811 4729709717353501314999905070831 => 119464119291609069589811 | 1180 +% -107602840960813362904559482551159633716325379069819153737356903555616668 -611118174677490611346135121905549216 => -571480753062638515253364052325747804 | 1318 +% 483150517653249868573747129386902516423010200 990933443329231364346717734915755 => 679641963905826229859722843895745 | 1260 +% -2105528901043711850001807831955158133722367901 -1542867129741172047126925082607096 => -474870401788391494889644494322997 | 1260 +% -14826957018759900300079892650582269801380 -35834371181870473 => -21331181403071945 | 1154 +% 37058398449974537454183239810 539002236838976008079483781659916 => 37058398449974537454183239810 | 1212 +% -20750 -16580825671170551 => -20750 | 1044 +% 1833007300889928037488 4372868516394046433 => 775392520822582061 | 1136 +% 140445069468471561646679318041172137 -85102383773542 => -80071388275283 | 1132 +% 1740804912288687440904143950729049045730896742 379273974283650499292214128442592199 => 217379082643479723788794706013309811 | 1274 +% 49 24670 => 49 | 1010 +% 7947953607373218984685188757963637131052873236927769325521419254378 -4595591745191411774 => -1918907866220532142 | 1212 +% 42842796796313121283892884198111057311538056781214740223135429746841788 133020927897447620370269308338696978396 => 116417654246404767059187542950218039220 | 1332 +% -349811757411544011413710022809602404655925986213141059 347050629127932553904985 => 16947815286557778052831 | 1220 +% -340457711425626606373493420365640993228533348072864846839451424781583 14322346582623 => 10434956470142 | 1188 +% -40 9826 => 9786 | 1020 +% -444849211946369251118539616791740111748328500619 1 => 0 | 1072 diff --git a/tools/Cargo.toml b/tools/Cargo.toml index d545190c..306c3a66 100644 --- a/tools/Cargo.toml +++ b/tools/Cargo.toml @@ -18,9 +18,11 @@ linreg = "0.2.0" clvmr = { path = ".." } chia-bls = "0.10.0" num-bigint = "0.4.6" +num-integer = "0.1.46" serde = { version = "1.0.204", features = ["derive"] } serde_json = "1.0.120" clap = { version = "4.5.9", features = ["derive"] } +rand_chacha = "0.3.1" [[bin]] name = "generate-fuzz-corpus" @@ -36,3 +38,8 @@ bench = false name = "verify-zksnark" test = false bench = false + +[[bin]] +name = "generate-modpow-tests" +test = false +bench = false diff --git a/tools/generate-modpow-tests.py b/tools/generate-modpow-tests.py deleted file mode 100644 index c8823415..00000000 --- a/tools/generate-modpow-tests.py +++ /dev/null @@ -1,34 +0,0 @@ -from random import randbytes, randint, seed, sample - -seed(1337) -SIZE = 40 - -def bytes_in_atom(atom: bytes) -> int: - while len(atom) > 1 and atom[0] == 0 and atom[1] < 128: - atom = atom[1:] - return len(atom) - -with open("../op-tests/test-modpow.txt", "w+") as f: - f.write("; This file was generated by tools/generate-modpow-tests.py\n\n") - - for i in range(0, SIZE): - base = int.from_bytes(randbytes(32)) - exponent = int.from_bytes(randbytes(32)) - mod = int.from_bytes(randbytes(32)) - blen = bytes_in_atom(base.to_bytes(33)) - elen = bytes_in_atom(exponent.to_bytes(33)) - mlen = bytes_in_atom(mod.to_bytes(33)) - result = pow(base, exponent, mod) - rlen = bytes_in_atom(result.to_bytes(33)) - cost = 17000 + blen * 38 + elen * elen * 3 + mlen * mlen * 21 + rlen * 10 - f.write(f"modpow {base} {exponent} {mod} => {result} | {cost}\n") - - for i in range(0, SIZE): - base = int.from_bytes(randbytes(32)) - mod = int.from_bytes(randbytes(16)) - blen = bytes_in_atom(base.to_bytes(33)) - mlen = bytes_in_atom(mod.to_bytes(17)) - result = base % mod - rlen = bytes_in_atom(result.to_bytes(17)) - cost = 988 + (blen + mlen) * 4 + rlen * 10 - f.write(f"% {base} {mod} => {result} | {cost}\n") diff --git a/tools/src/bin/generate-modpow-tests.rs b/tools/src/bin/generate-modpow-tests.rs new file mode 100644 index 00000000..6f17022a --- /dev/null +++ b/tools/src/bin/generate-modpow-tests.rs @@ -0,0 +1,85 @@ +use std::fs; + +use clvmr::Allocator; +use num_bigint::BigInt; +use num_integer::Integer; +use rand::{Rng, SeedableRng}; +use rand_chacha::ChaCha8Rng; + +fn main() { + // Seed the RNG with a fixed value for reproducibility. + let mut rng = ChaCha8Rng::seed_from_u64(1337); + + // Generate a random quantity (within a range) of random bytes. + let mut bytes = |min: usize, max: usize| { + let len = rng.gen_range(min..=max); + let mut bytes = vec![0; len]; + rng.fill(&mut bytes[..]); + bytes + }; + + let mut tests = + "; This file was generated by tools/src/bin/generate-modpow-tests.rs\n\n".to_string(); + + for _ in 0..100 { + let base = BigInt::from_signed_bytes_be(&bytes(0, 32)); + + // Generate a random exponent, but ensure it's positive. + let mut exponent = BigInt::from_signed_bytes_be(&bytes(0, 32)); + if exponent < BigInt::ZERO { + exponent = -exponent; + } + + // Generate a random modulus, but ensure it's non-zero. + let mut modulus = BigInt::from_signed_bytes_be(&bytes(0, 32)); + if modulus == BigInt::ZERO { + modulus += 1; + } + + let base_len = to_atom(base.clone()).len(); + let exponent_len = to_atom(exponent.clone()).len(); + let modulus_len = to_atom(modulus.clone()).len(); + + let result = base.modpow(&exponent, &modulus); + let result_len = to_atom(result.clone()).len(); + let cost = 17000 + + base_len * 38 + + exponent_len * exponent_len * 3 + + modulus_len * modulus_len * 21 + + result_len * 10; + + tests.push_str(&format!( + "modpow {base} {exponent} {modulus} => {result} | {cost}\n" + )); + } + + for _ in 0..100 { + let base = BigInt::from_signed_bytes_be(&bytes(0, 32)); + + // Generate a random exponent, but ensure it's positive. + let mut modulus = BigInt::from_signed_bytes_be(&bytes(0, 16)); + if modulus == BigInt::ZERO { + modulus += 1; + } + + let base_len = to_atom(base.clone()).len(); + let modulus_len = to_atom(modulus.clone()).len(); + + // CLVM uses neither `%` and `mod_euclid`, but rather `mod_floor`. + let result = base.mod_floor(&modulus); + let result_len = to_atom(result.clone()).len(); + let cost = 988 + base_len * 4 + modulus_len * 4 + result_len * 10; + + tests.push_str(&format!("% {base} {modulus} => {result} | {cost}\n")); + } + + fs::write("./op-tests/test-modpow.txt", tests).unwrap(); +} + +// Convert a `BigInt` to a CLVM atom. +fn to_atom(num: BigInt) -> Vec { + let mut allocator = Allocator::new(); + let ptr = allocator.new_number(num).unwrap(); + let atom = allocator.atom(ptr); + atom.as_ref().to_vec() +}