gmp_test_impl.inc 154 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848
  1. {$ifopt c-}
  2. {$error 'Must enable assertions'}
  3. {$endif}
  4. const
  5. BASE10 = 10;
  6. BASE16 = 16;
  7. Z_FMT = '%Zd';
  8. Q_FMT = '%Qd';
  9. function alloc_func(alloc_size: sizeuint): pointer; cdecl;
  10. begin
  11. result := getmem(alloc_size);
  12. end;
  13. procedure free_proc(p: pointer; size: sizeuint); cdecl;
  14. begin
  15. assert(size = size); // hint off
  16. freemem(p);
  17. end;
  18. function reallocate_func(p: pointer; old_size, new_size: sizeuint): pointer; cdecl;
  19. begin
  20. assert(old_size = old_size); // hint off
  21. result := reallocmem(p, new_size);
  22. end;
  23. function rnd_test(var state: randstate_t): boolean;
  24. const N = 1000000;
  25. var r1, r2, r3: valuint;
  26. begin
  27. r1 := mp_urandomm_ui(state, N);
  28. r2 := mp_urandomm_ui(state, N);
  29. r3 := mp_urandomm_ui(state, N);
  30. result := (r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3));
  31. end;
  32. { TTestGmpBinding }
  33. procedure TTestGmpBinding.mp_set_memory_functions_test;
  34. var
  35. af0, af: alloc_func_t;
  36. rf0, rf: reallocate_func_t;
  37. fp0, fp: free_proc_t;
  38. begin
  39. mp_get_memory_functions(@af0, @rf0, @fp0);
  40. try
  41. mp_set_memory_functions(@alloc_func, @reallocate_func, @free_proc);
  42. mp_get_memory_functions(@af, @rf, @fp);
  43. assert(af = @alloc_func);
  44. assert(rf = @reallocate_func);
  45. assert(fp = @free_proc);
  46. finally
  47. mp_set_memory_functions(af0, rf0, fp0);
  48. mp_get_memory_functions(@af, @rf, @fp);
  49. assert(af = af0);
  50. assert(rf = rf0);
  51. assert(fp = fp0);
  52. end;
  53. end;
  54. procedure TTestGmpBinding.mp_get_memory_functions_test;
  55. var
  56. af: alloc_func_t;
  57. fp: free_proc_t;
  58. rf: reallocate_func_t;
  59. begin
  60. af := nil;
  61. fp := nil;
  62. rf := nil;
  63. mp_get_memory_functions(nil, nil, nil);
  64. assert(af = nil);
  65. assert(fp = nil);
  66. assert(rf = nil);
  67. mp_get_memory_functions(@af, nil, nil);
  68. assert(af <> nil);
  69. assert(fp = nil);
  70. assert(rf = nil);
  71. af := nil;
  72. mp_get_memory_functions(nil, @rf, nil);
  73. assert(af = nil);
  74. assert(fp = nil);
  75. assert(rf <> nil);
  76. rf := nil;
  77. mp_get_memory_functions(nil, nil, @fp);
  78. assert(af = nil);
  79. assert(fp <> nil);
  80. assert(rf = nil);
  81. end;
  82. procedure TTestGmpBinding.mp_randinit_default_test;
  83. var state: randstate_t;
  84. begin
  85. mp_randinit_default(state);
  86. assert(rnd_test(state));
  87. mp_randclear(state);
  88. end;
  89. procedure TTestGmpBinding.mp_randinit_mt_test;
  90. var state: randstate_t;
  91. begin
  92. mp_randinit_mt(state);
  93. assert(rnd_test(state));
  94. mp_randclear(state);
  95. end;
  96. procedure TTestGmpBinding.mp_randinit_lc_2exp_test;
  97. const
  98. A_ = 3;
  99. C = 5;
  100. M2EXP = 8;
  101. var
  102. state: randstate_t;
  103. a: mpz_t;
  104. begin
  105. mpz_init_set_ui(a, A_);
  106. mp_randinit_lc_2exp(state, a, C, M2EXP);
  107. assert(rnd_test(state));
  108. mp_randclear(state);
  109. mpz_clear(a);
  110. end;
  111. procedure TTestGmpBinding.mp_randinit_lc_2exp_size_test;
  112. var state: randstate_t;
  113. begin
  114. assert(longbool(mp_randinit_lc_2exp_size(state, 0)));
  115. assert(rnd_test(state));
  116. mp_randclear(state);
  117. end;
  118. procedure TTestGmpBinding.mp_randinit_set_test;
  119. var rop, op: randstate_t;
  120. begin
  121. mp_randinit_default(op);
  122. mp_randinit_set(rop, op);
  123. assert(rnd_test(rop));
  124. mp_randclear(rop);
  125. mp_randclear(op);
  126. end;
  127. procedure TTestGmpBinding.mp_randclear_test;
  128. var state: randstate_t;
  129. begin
  130. mp_randinit_default(state);
  131. mp_randclear(state);
  132. end;
  133. procedure TTestGmpBinding.mp_randseed_test;
  134. var
  135. state: randstate_t;
  136. seed: mpz_t;
  137. begin
  138. mp_randinit_default(state);
  139. mpz_init_set_ui(seed, 0);
  140. mp_randseed(state, seed);
  141. mp_randclear(state);
  142. mpz_clear(seed);
  143. end;
  144. procedure TTestGmpBinding.mp_randseed_ui_test;
  145. var state: randstate_t;
  146. begin
  147. mp_randinit_default(state);
  148. mp_randseed_ui(state, 0);
  149. mp_randclear(state);
  150. end;
  151. procedure TTestGmpBinding.mp_urandomb_ui_test;
  152. const
  153. B = 8 * (sizeof(valuint) - 1);
  154. N = 1 shl B;
  155. var
  156. state: randstate_t;
  157. r1, r2, r3: valuint;
  158. begin
  159. mp_randinit_default(state);
  160. r1 := mp_urandomb_ui(state, B);
  161. r2 := mp_urandomb_ui(state, B);
  162. r3 := mp_urandomb_ui(state, B);
  163. assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
  164. mp_randclear(state);
  165. end;
  166. procedure TTestGmpBinding.mp_urandomm_ui_test;
  167. const N = high(valuint);
  168. var
  169. state: randstate_t;
  170. r1, r2, r3: valuint;
  171. begin
  172. mp_randinit_default(state);
  173. r1 := mp_urandomm_ui(state, N);
  174. r2 := mp_urandomm_ui(state, N);
  175. r3 := mp_urandomm_ui(state, N);
  176. assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
  177. mp_randclear(state);
  178. end;
  179. procedure TTestGmpBinding.mp_asprintf_test;
  180. const
  181. N = 123456;
  182. S = '123456';
  183. var
  184. z: mpz_t;
  185. p: pchar;
  186. begin
  187. mpz_init_set_ui(z, N);
  188. assert(mp_asprintf(p, Z_FMT, [@z]) = length(S));
  189. assert(p = S);
  190. freemem(p);
  191. mpz_clear(z);
  192. end;
  193. procedure TTestGmpBinding.mp_asprintf_test2;
  194. const
  195. N = 123456;
  196. S = '123456';
  197. var
  198. z: mpz_t;
  199. p: pchar;
  200. begin
  201. mpz_init_set_ui(z, N);
  202. assert(mp_asprintf(p, Z_FMT, @z) = length(S));
  203. assert(p = S);
  204. freemem(p);
  205. mpz_clear(z);
  206. end;
  207. procedure TTestGmpBinding.mp_snprintf_test;
  208. const
  209. N = 123456;
  210. S = '123456';
  211. var
  212. z: mpz_t;
  213. buf: pchar;
  214. begin
  215. mpz_init_set_ui(z, N);
  216. getmem(buf, length(S) + 1);
  217. assert(mp_snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
  218. assert(buf = S);
  219. freemem(buf);
  220. mpz_clear(z);
  221. end;
  222. procedure TTestGmpBinding.mp_snprintf_test2;
  223. const
  224. N = 123456;
  225. S = '123456';
  226. var
  227. z: mpz_t;
  228. buf: pchar;
  229. begin
  230. mpz_init_set_ui(z, N);
  231. getmem(buf, length(S) + 1);
  232. assert(mp_snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
  233. assert(buf = S);
  234. freemem(buf);
  235. mpz_clear(z);
  236. end;
  237. procedure TTestGmpBinding.mp_sprintf_test;
  238. const
  239. N = 123456;
  240. S = '123456';
  241. var
  242. z: mpz_t;
  243. buf: pchar;
  244. begin
  245. mpz_init_set_ui(z, N);
  246. getmem(buf, length(S) + 1);
  247. assert(mp_sprintf(buf, Z_FMT, [@z]) = length(S));
  248. assert(buf = S);
  249. freemem(buf);
  250. mpz_clear(z);
  251. end;
  252. procedure TTestGmpBinding.mp_sprintf_test2;
  253. const
  254. N = 123456;
  255. S = '123456';
  256. var
  257. z: mpz_t;
  258. buf: pchar;
  259. begin
  260. mpz_init_set_ui(z, N);
  261. getmem(buf, length(S) + 1);
  262. assert(mp_sprintf(buf, Z_FMT, @z) = length(S));
  263. assert(buf = S);
  264. freemem(buf);
  265. mpz_clear(z);
  266. end;
  267. procedure TTestGmpBinding.mp_sscanf_test;
  268. const
  269. N = 3;
  270. D = 2;
  271. var q: mpq_t;
  272. begin
  273. mpq_init(q);
  274. assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
  275. assert(mpq_cmp_ui(q, N, D) = 0);
  276. mpq_clear(q);
  277. end;
  278. procedure TTestGmpBinding.mp_sscanf_test2;
  279. const
  280. N = 3;
  281. D = 2;
  282. var q: mpq_t;
  283. begin
  284. mpq_init(q);
  285. assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
  286. assert(mpq_cmp_ui(q, N, D) = 0);
  287. mpq_clear(q);
  288. end;
  289. procedure TTestGmpBinding.mpz_init_test;
  290. var integer_: mpz_t;
  291. begin
  292. mpz_init(integer_);
  293. assert(mpz_get_si(integer_) = 0);
  294. mpz_clear(integer_);
  295. end;
  296. procedure TTestGmpBinding.mpz_clear_test;
  297. const N = 1000000;
  298. var integer_: mpz_t;
  299. begin
  300. mpz_init2(integer_, N);
  301. assert(mpz_get_si(integer_) = 0);
  302. mpz_clear(integer_);
  303. end;
  304. procedure TTestGmpBinding.mpz_init2_test;
  305. const N = 1000000;
  306. var integer_: mpz_t;
  307. begin
  308. mpz_init2(integer_, N);
  309. assert(mpz_get_si(integer_) = 0);
  310. mpz_clear(integer_);
  311. end;
  312. procedure TTestGmpBinding.mpz_init_set_si_test;
  313. const N = -1000000;
  314. var rop: mpz_t;
  315. begin
  316. mpz_init_set_si(rop, N);
  317. assert(mpz_get_si(rop) = N);
  318. mpz_clear(rop);
  319. end;
  320. procedure TTestGmpBinding.mpz_init_set_ui_test;
  321. const N = 1000000;
  322. var rop: mpz_t;
  323. begin
  324. mpz_init_set_ui(rop, N);
  325. assert(mpz_get_ui(rop) = N);
  326. mpz_clear(rop);
  327. end;
  328. procedure TTestGmpBinding.mpz_init_set_d_test;
  329. const N = -1000000;
  330. var rop: mpz_t;
  331. begin
  332. mpz_init_set_d(rop, N);
  333. assert(mpz_get_si(rop) = N);
  334. mpz_clear(rop);
  335. end;
  336. procedure TTestGmpBinding.mpz_init_set_test;
  337. const N = -1000000;
  338. var rop, op: mpz_t;
  339. begin
  340. mpz_init_set_si(op, N);
  341. mpz_init_set(rop, op);
  342. assert(mpz_get_si(rop) = N);
  343. mpz_clear(rop);
  344. mpz_clear(op);
  345. end;
  346. procedure TTestGmpBinding.mpz_init_set_str_test;
  347. const N = 1000000;
  348. var rop: mpz_t;
  349. begin
  350. assert(mpz_init_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
  351. assert(mpz_get_si(rop) = N);
  352. mpz_clear(rop);
  353. end;
  354. procedure TTestGmpBinding.mpz_realloc_test;
  355. const N = 1000;
  356. var integer_: mpz_t;
  357. begin
  358. mpz_init(integer_);
  359. mpz_realloc(integer_, N);
  360. mpz_clear(integer_)
  361. end;
  362. procedure TTestGmpBinding.mpz_realloc2_test;
  363. const N = 1000;
  364. var integer_: mpz_t;
  365. begin
  366. mpz_init(integer_);
  367. mpz_realloc2(integer_, N);
  368. mpz_clear(integer_)
  369. end;
  370. procedure TTestGmpBinding.mpz_getlimbn_test;
  371. const N = 1234;
  372. var op: mpz_t;
  373. begin
  374. mpz_init_set_ui(op, N);
  375. assert(mpz_getlimbn(op, 0) = N);
  376. mpz_clear(op);
  377. end;
  378. procedure TTestGmpBinding.mpz_export_test;
  379. type t = word;
  380. const
  381. N = 1000000;
  382. BUF_HIGH = sizeof(N) div sizeof(t);
  383. var
  384. export_op, import_op: mpz_t;
  385. buf: array[0..BUF_HIGH] of t;
  386. count: sizeuint;
  387. begin
  388. mpz_init_set_si(export_op, N);
  389. mpz_init(import_op);
  390. mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
  391. mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
  392. assert(mpz_get_si(export_op) =mpz_get_si(import_op));
  393. mpz_clear(export_op);
  394. mpz_clear(import_op);
  395. end;
  396. procedure TTestGmpBinding.mpz_import_test;
  397. type t = word;
  398. const
  399. N = 1000000;
  400. BUF_HIGH = sizeof(N) div sizeof(t);
  401. var
  402. export_op, import_op: mpz_t;
  403. buf: array[0..BUF_HIGH] of t;
  404. count: sizeuint;
  405. begin
  406. mpz_init_set_si(export_op, N);
  407. mpz_init(import_op);
  408. mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
  409. mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
  410. assert(mpz_get_si(export_op) =mpz_get_si(import_op));
  411. mpz_clear(export_op);
  412. mpz_clear(import_op);
  413. end;
  414. procedure TTestGmpBinding.mpz_swap_test;
  415. const
  416. ROP_1 = -1000;
  417. ROP_2 = 1000000;
  418. var rop1, rop2: mpz_t;
  419. begin
  420. mpz_init_set_si(rop1, ROP_1);
  421. mpz_init_set_si(rop2, ROP_2);
  422. mpz_swap(rop1, rop2);
  423. assert(mpz_get_si(rop1) = ROP_2);
  424. assert(mpz_get_si(rop2) = ROP_1);
  425. mpz_clear(rop1);
  426. mpz_clear(rop2);
  427. end;
  428. procedure TTestGmpBinding.mpz_set_test;
  429. const OP_ = 1000000;
  430. var rop, op: mpz_t;
  431. begin
  432. mpz_init(rop);
  433. mpz_init_set_si(op, OP_);
  434. mpz_set(rop, op);
  435. assert(mpz_get_si(rop) = OP_);
  436. mpz_clear(rop);
  437. mpz_clear(op);
  438. end;
  439. procedure TTestGmpBinding.mpz_set_d_test;
  440. const OP_ = 1000000;
  441. var rop: mpz_t;
  442. begin
  443. mpz_init(rop);
  444. mpz_set_d(rop, OP_);
  445. assert(mpz_get_si(rop) = OP_);
  446. mpz_clear(rop);
  447. end;
  448. procedure TTestGmpBinding.mpz_set_f_test;
  449. const OP_ = -10;
  450. var
  451. op: mpf_t;
  452. rop: mpz_t;
  453. begin
  454. mpf_init_set_si(op, OP_);
  455. mpz_init(rop);
  456. mpz_set_f(rop, op);
  457. assert(mpz_get_si(rop) = OP_);
  458. mpz_clear(rop);
  459. mpf_clear(op);
  460. end;
  461. procedure TTestGmpBinding.mpz_set_q_test;
  462. const OP_ = -10;
  463. var
  464. op: mpq_t;
  465. rop: mpz_t;
  466. begin
  467. mpq_init(op);
  468. mpz_init(rop);
  469. mpq_set_si(op, OP_, 1);
  470. mpz_set_q(rop, op);
  471. assert(mpz_get_si(rop) = OP_);
  472. mpz_clear(rop);
  473. mpq_clear(op);
  474. end;
  475. procedure TTestGmpBinding.mpz_set_si_test;
  476. const OP_ = -1000000;
  477. var rop: mpz_t;
  478. begin
  479. mpz_init(rop);
  480. mpz_set_si(rop, OP_);
  481. assert(mpz_get_si(rop) = OP_);
  482. mpz_clear(rop);
  483. end;
  484. procedure TTestGmpBinding.mpz_set_str_test;
  485. const OP_ = -1000000;
  486. var rop: mpz_t;
  487. begin
  488. mpz_init(rop);
  489. assert(mpz_set_str(rop, pchar(inttostr(OP_)), BASE10) = 0);
  490. assert(mpz_get_si(rop) = OP_);
  491. mpz_clear(rop);
  492. end;
  493. procedure TTestGmpBinding.mpz_set_ui_test;
  494. const OP_ = 1000000;
  495. var rop: mpz_t;
  496. begin
  497. mpz_init(rop);
  498. mpz_set_ui(rop, OP_);
  499. assert(mpz_get_si(rop) = OP_);
  500. mpz_clear(rop);
  501. end;
  502. procedure TTestGmpBinding.mpz_get_d_test;
  503. const N = -1000;
  504. var op: mpz_t;
  505. begin
  506. mpz_init_set_si(op, N);
  507. assert(mpz_get_d(op) = N);
  508. mpz_clear(op)
  509. end;
  510. procedure TTestGmpBinding.mpz_get_d_2exp_test;
  511. const
  512. N_LG2 = 4;
  513. N = 1 shl N_LG2;
  514. var
  515. op: mpz_t;
  516. exp: mp_exp_t;
  517. begin
  518. mpz_init_set_si(op, N);
  519. assert(mpz_get_d_2exp(exp, op) = 1 / 2);
  520. assert(exp = N_LG2 + 1);
  521. mpz_clear(op)
  522. end;
  523. procedure TTestGmpBinding.mpz_get_si_test;
  524. const N = -1000000;
  525. var op: mpz_t;
  526. begin
  527. mpz_init_set_si(op, N);
  528. assert(mpz_get_si(op) = N);
  529. mpz_clear(op)
  530. end;
  531. procedure TTestGmpBinding.mpz_get_str_test;
  532. const N = -1000000;
  533. var
  534. op: mpz_t;
  535. p: pchar;
  536. s0, s1: string;
  537. begin
  538. mpz_init_set_si(op, N);
  539. s0 := inttostr(N);
  540. p :=mpz_get_str(nil, BASE10, op);
  541. assert(s0 = p);
  542. freemem(p);
  543. setlength(s1, length(s0));
  544. assert(pointer(mpz_get_str(pchar(s1), BASE10, op)) = pointer(s1));
  545. assert(s0 = s1);
  546. mpz_clear(op)
  547. end;
  548. procedure TTestGmpBinding.mpz_get_ui_test;
  549. const N = 1000000;
  550. var op: mpz_t;
  551. begin
  552. mpz_init_set_ui(op, N);
  553. assert(mpz_get_ui(op) = N);
  554. mpz_clear(op)
  555. end;
  556. procedure TTestGmpBinding.mpz_add_test;
  557. const
  558. OP_1 = -1000;
  559. OP_2 = 1000000;
  560. var rop, op1, op2: mpz_t;
  561. begin
  562. mpz_init(rop);
  563. mpz_init_set_si(op1, OP_1);
  564. mpz_init_set_si(op2, OP_2);
  565. mpz_add(rop, op1, op2);
  566. assert(mpz_get_si(rop) = OP_1 + OP_2);
  567. mpz_clear(rop);
  568. mpz_clear(op1);
  569. mpz_clear(op2);
  570. end;
  571. procedure TTestGmpBinding.mpz_add_ui_test;
  572. const
  573. OP_1 = -1000;
  574. OP_2 = 1000000;
  575. var rop, op1: mpz_t;
  576. begin
  577. mpz_init(rop);
  578. mpz_init_set_si(op1, OP_1);
  579. mpz_add_ui(rop, op1, OP_2);
  580. assert(mpz_get_si(rop) = OP_1 + OP_2);
  581. mpz_clear(rop);
  582. mpz_clear(op1);
  583. end;
  584. procedure TTestGmpBinding.mpz_sub_test;
  585. const
  586. OP_1 = -1000;
  587. OP_2 = 1000000;
  588. var rop, op1, op2: mpz_t;
  589. begin
  590. mpz_init(rop);
  591. mpz_init_set_si(op1, OP_1);
  592. mpz_init_set_si(op2, OP_2);
  593. mpz_sub(rop, op1, op2);
  594. assert(mpz_get_si(rop) = OP_1 - OP_2);
  595. mpz_clear(rop);
  596. mpz_clear(op1);
  597. mpz_clear(op2);
  598. end;
  599. procedure TTestGmpBinding.mpz_sub_ui_test;
  600. const
  601. OP_1 = -1000;
  602. OP_2 = 1000000;
  603. var rop, op1: mpz_t;
  604. begin
  605. mpz_init(rop);
  606. mpz_init_set_si(op1, OP_1);
  607. mpz_sub_ui(rop, op1, OP_2);
  608. assert(mpz_get_si(rop) = OP_1 - OP_2);
  609. mpz_clear(rop);
  610. mpz_clear(op1);
  611. end;
  612. procedure TTestGmpBinding.mpz_ui_sub_test;
  613. const
  614. OP_1 = 1000;
  615. OP_2 = 1000000;
  616. var rop, op2: mpz_t;
  617. begin
  618. mpz_init(rop);
  619. mpz_init_set_si(op2, OP_2);
  620. mpz_ui_sub(rop, OP_1, op2);
  621. assert(mpz_get_si(rop) = OP_1 - OP_2);
  622. mpz_clear(rop);
  623. mpz_clear(op2);
  624. end;
  625. procedure TTestGmpBinding.mpz_mul_test;
  626. const
  627. OP_1 = -10;
  628. OP_2 = 1000;
  629. var rop, op1, op2: mpz_t;
  630. begin
  631. mpz_init(rop);
  632. mpz_init_set_si(op1, OP_1);
  633. mpz_init_set_si(op2, OP_2);
  634. mpz_mul(rop, op1, op2);
  635. assert(mpz_get_si(rop) = OP_1 * OP_2);
  636. mpz_clear(rop);
  637. mpz_clear(op1);
  638. mpz_clear(op2);
  639. end;
  640. procedure TTestGmpBinding.mpz_mul_si_test;
  641. const
  642. OP_1 = 10;
  643. OP_2 = -1000;
  644. var rop, op1: mpz_t;
  645. begin
  646. mpz_init(rop);
  647. mpz_init_set_si(op1, OP_1);
  648. mpz_mul_si(rop, op1, OP_2);
  649. assert(mpz_get_si(rop) = OP_1 * OP_2);
  650. mpz_clear(rop);
  651. mpz_clear(op1);
  652. end;
  653. procedure TTestGmpBinding.mpz_mul_ui_test;
  654. const
  655. OP_1 = -10;
  656. OP_2 = 1000;
  657. var rop, op1: mpz_t;
  658. begin
  659. mpz_init(rop);
  660. mpz_init_set_si(op1, OP_1);
  661. mpz_mul_ui(rop, op1, OP_2);
  662. assert(mpz_get_si(rop) = OP_1 * OP_2);
  663. mpz_clear(rop);
  664. mpz_clear(op1);
  665. end;
  666. procedure TTestGmpBinding.mpz_addmul_test;
  667. const
  668. ROP_ = 10;
  669. OP_1 = -100;
  670. OP_2 = 1000;
  671. var rop, op1, op2: mpz_t;
  672. begin
  673. mpz_init_set_si(rop, ROP_);
  674. mpz_init_set_si(op1, OP_1);
  675. mpz_init_set_si(op2, OP_2);
  676. mpz_addmul(rop, op1, op2);
  677. assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
  678. mpz_clear(rop);
  679. mpz_clear(op1);
  680. mpz_clear(op2);
  681. end;
  682. procedure TTestGmpBinding.mpz_addmul_ui_test;
  683. const
  684. ROP_ = 10;
  685. OP_1 = -100;
  686. OP_2 = 1000;
  687. var rop, op1: mpz_t;
  688. begin
  689. mpz_init_set_si(rop, ROP_);
  690. mpz_init_set_si(op1, OP_1);
  691. mpz_addmul_ui(rop, op1, OP_2);
  692. assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
  693. mpz_clear(rop);
  694. mpz_clear(op1);
  695. end;
  696. procedure TTestGmpBinding.mpz_submul_test;
  697. const
  698. ROP_ = 10;
  699. OP_1 = -100;
  700. OP_2 = 1000;
  701. var rop, op1, op2: mpz_t;
  702. begin
  703. mpz_init_set_si(rop, ROP_);
  704. mpz_init_set_si(op1, OP_1);
  705. mpz_init_set_si(op2, OP_2);
  706. mpz_submul(rop, op1, op2);
  707. assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
  708. mpz_clear(rop);
  709. mpz_clear(op1);
  710. mpz_clear(op2);
  711. end;
  712. procedure TTestGmpBinding.mpz_submul_ui_test;
  713. const
  714. ROP_ = 10;
  715. OP_1 = -100;
  716. OP_2 = 1000;
  717. var rop, op1: mpz_t;
  718. begin
  719. mpz_init_set_si(rop, ROP_);
  720. mpz_init_set_si(op1, OP_1);
  721. mpz_submul_ui(rop, op1, OP_2);
  722. assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
  723. mpz_clear(rop);
  724. mpz_clear(op1);
  725. end;
  726. procedure TTestGmpBinding.mpz_mul_2exp_test;
  727. const
  728. OP_1 = 10;
  729. OP_2 = 10;
  730. var rop, op1: mpz_t;
  731. begin
  732. mpz_init(rop);
  733. mpz_init_set_si(op1, OP_1);
  734. mpz_mul_2exp(rop, op1, OP_2);
  735. assert(mpz_get_si(rop) = OP_1 * (1 shl OP_2));
  736. mpz_clear(rop);
  737. mpz_clear(op1);
  738. end;
  739. procedure TTestGmpBinding.mpz_neg_test;
  740. const OP_ = 1000;
  741. var rop, op: mpz_t;
  742. begin
  743. mpz_init(rop);
  744. mpz_init_set_si(op, OP_);
  745. mpz_neg(rop, op);
  746. assert(mpz_get_si(rop) = -OP_);
  747. mpz_clear(rop);
  748. mpz_clear(op);
  749. end;
  750. procedure TTestGmpBinding.mpz_abs_test;
  751. const OP_ = -1000;
  752. var rop, op: mpz_t;
  753. begin
  754. mpz_init(rop);
  755. mpz_init_set_si(op, OP_);
  756. mpz_abs(rop, op);
  757. assert(mpz_get_si(rop) = abs(OP_));
  758. mpz_clear(rop);
  759. mpz_clear(op);
  760. end;
  761. procedure TTestGmpBinding.mpz_cdiv_q_test;
  762. const
  763. N_ = -17;
  764. D_ = 4;
  765. var q, n, d: mpz_t;
  766. begin
  767. mpz_init(q);
  768. mpz_init_set_si(n, N_);
  769. mpz_init_set_si(d, D_);
  770. mpz_cdiv_q(q, n, d);
  771. assert(mpz_get_si(q) = ceil(N_ / D_));
  772. mpz_clear(q);
  773. mpz_clear(n);
  774. mpz_clear(d);
  775. end;
  776. procedure TTestGmpBinding.mpz_fdiv_q_test;
  777. const
  778. N_ = -17;
  779. D_ = 4;
  780. var q, n, d: mpz_t;
  781. begin
  782. mpz_init(q);
  783. mpz_init_set_si(n, N_);
  784. mpz_init_set_si(d, D_);
  785. mpz_fdiv_q(q, n, d);
  786. assert(mpz_get_si(q) = floor(N_ / D_));
  787. mpz_clear(q);
  788. mpz_clear(n);
  789. mpz_clear(d);
  790. end;
  791. procedure TTestGmpBinding.mpz_tdiv_q_test;
  792. const
  793. N_ = -17;
  794. D_ = 4;
  795. var q, n, d: mpz_t;
  796. begin
  797. mpz_init(q);
  798. mpz_init_set_si(n, N_);
  799. mpz_init_set_si(d, D_);
  800. mpz_tdiv_q(q, n, d);
  801. assert(mpz_get_si(q) = trunc(N_ / D_));
  802. mpz_clear(q);
  803. mpz_clear(n);
  804. mpz_clear(d);
  805. end;
  806. procedure TTestGmpBinding.mpz_cdiv_q_2exp_test;
  807. const
  808. N_ = -17;
  809. B_ = 2;
  810. D_ = 1 shl B_;
  811. var q, n: mpz_t;
  812. begin
  813. mpz_init(q);
  814. mpz_init_set_si(n, N_);
  815. mpz_cdiv_q_2exp(q, n, B_);
  816. assert(mpz_get_si(q) = ceil(N_ / D_));
  817. mpz_clear(q);
  818. mpz_clear(n);
  819. end;
  820. procedure TTestGmpBinding.mpz_fdiv_q_2exp_test;
  821. const
  822. N_ = -17;
  823. B_ = 2;
  824. D_ = 1 shl B_;
  825. var q, n: mpz_t;
  826. begin
  827. mpz_init(q);
  828. mpz_init_set_si(n, N_);
  829. mpz_fdiv_q_2exp(q, n, B_);
  830. assert(mpz_get_si(q) = floor(N_ / D_));
  831. mpz_clear(q);
  832. mpz_clear(n);
  833. end;
  834. procedure TTestGmpBinding.mpz_tdiv_q_2exp_test;
  835. const
  836. N_ = -17;
  837. B_ = 2;
  838. D_ = 1 shl B_;
  839. var q, n: mpz_t;
  840. begin
  841. mpz_init(q);
  842. mpz_init_set_si(n, N_);
  843. mpz_tdiv_q_2exp(q, n, B_);
  844. assert(mpz_get_si(q) = trunc(N_ / D_));
  845. mpz_clear(q);
  846. mpz_clear(n);
  847. end;
  848. procedure TTestGmpBinding.mpz_cdiv_q_ui_test;
  849. const
  850. N_ = -17;
  851. D_ = 4;
  852. var
  853. q, n: mpz_t;
  854. ur: valuint;
  855. begin
  856. mpz_init(q);
  857. mpz_init_set_si(n, N_);
  858. ur :=mpz_cdiv_q_ui(q, n, D_);
  859. assert(mpz_get_si(q) = ceil(N_ / D_));
  860. assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
  861. mpz_clear(q);
  862. mpz_clear(n);
  863. end;
  864. procedure TTestGmpBinding.mpz_fdiv_q_ui_test;
  865. const
  866. N_ = -17;
  867. D_ = 4;
  868. var
  869. q, n: mpz_t;
  870. ur: valuint;
  871. begin
  872. mpz_init(q);
  873. mpz_init_set_si(n, N_);
  874. ur :=mpz_fdiv_q_ui(q, n, D_);
  875. assert(mpz_get_si(q) = floor(N_ / D_));
  876. assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
  877. mpz_clear(q);
  878. mpz_clear(n);
  879. end;
  880. procedure TTestGmpBinding.mpz_tdiv_q_ui_test;
  881. const
  882. N_ = -17;
  883. D_ = 4;
  884. var
  885. q, n: mpz_t;
  886. ur: valuint;
  887. begin
  888. mpz_init(q);
  889. mpz_init_set_si(n, N_);
  890. ur :=mpz_tdiv_q_ui(q, n, D_);
  891. assert(mpz_get_si(q) = trunc(N_ / D_));
  892. assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
  893. mpz_clear(q);
  894. mpz_clear(n);
  895. end;
  896. procedure TTestGmpBinding.mpz_cdiv_qr_test;
  897. const
  898. N_ = -17;
  899. D_ = 4;
  900. var q, r, n, d: mpz_t;
  901. begin
  902. mpz_init(q);
  903. mpz_init(r);
  904. mpz_init_set_si(n, N_);
  905. mpz_init_set_si(d, D_);
  906. mpz_cdiv_qr(q, r, n, d);
  907. assert(mpz_get_si(q) = ceil(N_ / D_));
  908. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  909. mpz_clear(q);
  910. mpz_clear(r);
  911. mpz_clear(n);
  912. mpz_clear(d);
  913. end;
  914. procedure TTestGmpBinding.mpz_fdiv_qr_test;
  915. const
  916. N_ = -17;
  917. D_ = 4;
  918. var q, r, n, d: mpz_t;
  919. begin
  920. mpz_init(q);
  921. mpz_init(r);
  922. mpz_init_set_si(n, N_);
  923. mpz_init_set_si(d, D_);
  924. mpz_fdiv_qr(q, r, n, d);
  925. assert(mpz_get_si(q) = floor(N_ / D_));
  926. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  927. mpz_clear(q);
  928. mpz_clear(r);
  929. mpz_clear(n);
  930. mpz_clear(d);
  931. end;
  932. procedure TTestGmpBinding.mpz_tdiv_qr_test;
  933. const
  934. N_ = -17;
  935. D_ = 4;
  936. var q, r, n, d: mpz_t;
  937. begin
  938. mpz_init(q);
  939. mpz_init(r);
  940. mpz_init_set_si(n, N_);
  941. mpz_init_set_si(d, D_);
  942. mpz_tdiv_qr(q, r, n, d);
  943. assert(mpz_get_si(q) = trunc(N_ / D_));
  944. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  945. mpz_clear(q);
  946. mpz_clear(r);
  947. mpz_clear(n);
  948. mpz_clear(d);
  949. end;
  950. procedure TTestGmpBinding.mpz_cdiv_qr_ui_test;
  951. const
  952. N_ = -17;
  953. D_ = 4;
  954. var
  955. q, r, n: mpz_t;
  956. ur: valuint;
  957. begin
  958. mpz_init(q);
  959. mpz_init(r);
  960. mpz_init_set_si(n, N_);
  961. ur :=mpz_cdiv_qr_ui(q, r, n, D_);
  962. assert(mpz_get_si(q) = ceil(N_ / D_));
  963. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  964. assert(ur - abs(mpz_get_si(r)) = 0);
  965. mpz_clear(q);
  966. mpz_clear(r);
  967. mpz_clear(n);
  968. end;
  969. procedure TTestGmpBinding.mpz_fdiv_qr_ui_test;
  970. const
  971. N_ = -17;
  972. D_ = 4;
  973. var
  974. q, r, n: mpz_t;
  975. ur: valuint;
  976. begin
  977. mpz_init(q);
  978. mpz_init(r);
  979. mpz_init_set_si(n, N_);
  980. ur :=mpz_fdiv_qr_ui(q, r, n, D_);
  981. assert(mpz_get_si(q) = floor(N_ / D_));
  982. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  983. assert(ur - abs(mpz_get_si(r)) = 0);
  984. mpz_clear(q);
  985. mpz_clear(r);
  986. mpz_clear(n);
  987. end;
  988. procedure TTestGmpBinding.mpz_tdiv_qr_ui_test;
  989. const
  990. N_ = -17;
  991. D_ = 4;
  992. var
  993. q, r, n: mpz_t;
  994. ur: valuint;
  995. begin
  996. mpz_init(q);
  997. mpz_init(r);
  998. mpz_init_set_si(n, N_);
  999. ur :=mpz_tdiv_qr_ui(q, r, n, D_);
  1000. assert(mpz_get_si(q) = trunc(N_ / D_));
  1001. assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
  1002. assert(ur - abs(mpz_get_si(r)) = 0);
  1003. mpz_clear(q);
  1004. mpz_clear(r);
  1005. mpz_clear(n);
  1006. end;
  1007. procedure TTestGmpBinding.mpz_cdiv_r_test;
  1008. const
  1009. N_ = -17;
  1010. D_ = 4;
  1011. var r, n, d: mpz_t;
  1012. begin
  1013. mpz_init(r);
  1014. mpz_init_set_si(n, N_);
  1015. mpz_init_set_si(d, D_);
  1016. mpz_cdiv_r(r, n, d);
  1017. assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1018. mpz_clear(r);
  1019. mpz_clear(n);
  1020. mpz_clear(d);
  1021. end;
  1022. procedure TTestGmpBinding.mpz_fdiv_r_test;
  1023. const
  1024. N_ = -17;
  1025. D_ = 4;
  1026. var r, n, d: mpz_t;
  1027. begin
  1028. mpz_init(r);
  1029. mpz_init_set_si(n, N_);
  1030. mpz_init_set_si(d, D_);
  1031. mpz_fdiv_r(r, n, d);
  1032. assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1033. mpz_clear(r);
  1034. mpz_clear(n);
  1035. mpz_clear(d);
  1036. end;
  1037. procedure TTestGmpBinding.mpz_tdiv_r_test;
  1038. const
  1039. N_ = -17;
  1040. D_ = 4;
  1041. var r, n, d: mpz_t;
  1042. begin
  1043. mpz_init(r);
  1044. mpz_init_set_si(n, N_);
  1045. mpz_init_set_si(d, D_);
  1046. mpz_tdiv_r(r, n, d);
  1047. assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1048. mpz_clear(r);
  1049. mpz_clear(n);
  1050. mpz_clear(d);
  1051. end;
  1052. procedure TTestGmpBinding.mpz_cdiv_r_2exp_test;
  1053. const
  1054. N_ = -17;
  1055. B_ = 2;
  1056. D_ = 1 shl B_;
  1057. var r, n: mpz_t;
  1058. begin
  1059. mpz_init(r);
  1060. mpz_init_set_si(n, N_);
  1061. mpz_cdiv_r_2exp(r, n, B_);
  1062. assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1063. mpz_clear(r);
  1064. mpz_clear(n);
  1065. end;
  1066. procedure TTestGmpBinding.mpz_fdiv_r_2exp_test;
  1067. const
  1068. N_ = -17;
  1069. B_ = 2;
  1070. D_ = 1 shl B_;
  1071. var r, n: mpz_t;
  1072. begin
  1073. mpz_init(r);
  1074. mpz_init_set_si(n, N_);
  1075. mpz_fdiv_r_2exp(r, n, B_);
  1076. assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1077. mpz_clear(r);
  1078. mpz_clear(n);
  1079. end;
  1080. procedure TTestGmpBinding.mpz_tdiv_r_2exp_test;
  1081. const
  1082. N_ = -17;
  1083. B_ = 2;
  1084. D_ = 1 shl B_;
  1085. var r, n: mpz_t;
  1086. begin
  1087. mpz_init(r);
  1088. mpz_init_set_si(n, N_);
  1089. mpz_tdiv_r_2exp(r, n, B_);
  1090. assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1091. mpz_clear(r);
  1092. mpz_clear(n);
  1093. end;
  1094. procedure TTestGmpBinding.mpz_cdiv_r_ui_test;
  1095. const
  1096. N_ = -17;
  1097. D_ = 4;
  1098. var
  1099. r, n: mpz_t;
  1100. ur: valuint;
  1101. begin
  1102. mpz_init(r);
  1103. mpz_init_set_si(n, N_);
  1104. ur :=mpz_cdiv_r_ui(r, n, D_);
  1105. assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1106. assert(ur - abs(mpz_get_si(r)) = 0);
  1107. mpz_clear(r);
  1108. mpz_clear(n);
  1109. end;
  1110. procedure TTestGmpBinding.mpz_fdiv_r_ui_test;
  1111. const
  1112. N_ = -17;
  1113. D_ = 4;
  1114. var
  1115. r, n: mpz_t;
  1116. ur: valuint;
  1117. begin
  1118. mpz_init(r);
  1119. mpz_init_set_si(n, N_);
  1120. ur :=mpz_fdiv_r_ui(r, n, D_);
  1121. assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1122. assert(ur - abs(mpz_get_si(r)) = 0);
  1123. mpz_clear(r);
  1124. mpz_clear(n);
  1125. end;
  1126. procedure TTestGmpBinding.mpz_tdiv_r_ui_test;
  1127. const
  1128. N_ = -17;
  1129. D_ = 4;
  1130. var
  1131. r, n: mpz_t;
  1132. ur: valuint;
  1133. begin
  1134. mpz_init(r);
  1135. mpz_init_set_si(n, N_);
  1136. ur :=mpz_tdiv_r_ui(r, n, D_);
  1137. assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
  1138. assert(ur - abs(mpz_get_si(r)) = 0);
  1139. mpz_clear(r);
  1140. mpz_clear(n);
  1141. end;
  1142. procedure TTestGmpBinding.mpz_cdiv_ui_test;
  1143. const
  1144. N_ = -17;
  1145. D_ = 4;
  1146. var n: mpz_t;
  1147. begin
  1148. mpz_init_set_si(n, N_);
  1149. assert(mpz_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
  1150. mpz_clear(n);
  1151. end;
  1152. procedure TTestGmpBinding.mpz_fdiv_ui_test;
  1153. const
  1154. N_ = -17;
  1155. D_ = 4;
  1156. var n: mpz_t;
  1157. begin
  1158. mpz_init_set_si(n, N_);
  1159. assert(mpz_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
  1160. mpz_clear(n);
  1161. end;
  1162. procedure TTestGmpBinding.mpz_tdiv_ui_test;
  1163. const
  1164. N_ = -17;
  1165. D_ = 4;
  1166. var n: mpz_t;
  1167. begin
  1168. mpz_init_set_si(n, N_);
  1169. assert(mpz_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
  1170. mpz_clear(n);
  1171. end;
  1172. procedure TTestGmpBinding.mpz_mod_test;
  1173. const
  1174. N_ = 17;
  1175. D_ = -4;
  1176. var r, n, d: mpz_t;
  1177. begin
  1178. mpz_init(r);
  1179. mpz_init_set_si(n, N_);
  1180. mpz_init_set_si(d, D_);
  1181. mpz_mod(r, n, d);
  1182. assert(mpz_get_si(r) = N_ mod abs(D_));
  1183. mpz_clear(r);
  1184. mpz_clear(n);
  1185. mpz_clear(d);
  1186. end;
  1187. procedure TTestGmpBinding.mpz_divexact_test;
  1188. const
  1189. N_ = -16;
  1190. D_ = 4;
  1191. var q, n, d: mpz_t;
  1192. begin
  1193. mpz_init(q);
  1194. mpz_init_set_si(n, N_);
  1195. mpz_init_set_si(d, D_);
  1196. mpz_divexact(q, n, d);
  1197. assert(mpz_get_si(q) * D_ = N_);
  1198. mpz_clear(q);
  1199. mpz_clear(n);
  1200. mpz_clear(d);
  1201. end;
  1202. procedure TTestGmpBinding.mpz_divexact_ui_test;
  1203. const
  1204. N_ = -16;
  1205. D_ = 4;
  1206. var q, n: mpz_t;
  1207. begin
  1208. mpz_init(q);
  1209. mpz_init_set_si(n, N_);
  1210. mpz_divexact_ui(q, n, D_);
  1211. assert(mpz_get_si(q) * D_ = N_);
  1212. mpz_clear(q);
  1213. mpz_clear(n);
  1214. end;
  1215. procedure TTestGmpBinding.mpz_divisible_p_test;
  1216. const
  1217. N_ = -16;
  1218. D_ = 4;
  1219. var n, d: mpz_t;
  1220. begin
  1221. mpz_init_set_si(n, N_);
  1222. mpz_init_set_si(d, D_);
  1223. assert(mpz_divisible_p(n, d) <> 0);
  1224. mpz_set_si(n,mpz_get_si(n) + 1);
  1225. assert(mpz_divisible_p(n, d) = 0);
  1226. mpz_clear(n);
  1227. mpz_clear(d);
  1228. end;
  1229. procedure TTestGmpBinding.mpz_divisible_ui_p_test;
  1230. const
  1231. N_ = -16;
  1232. D_ = 4;
  1233. var n: mpz_t;
  1234. begin
  1235. mpz_init_set_si(n, N_);
  1236. assert(mpz_divisible_ui_p(n, D_) <> 0);
  1237. mpz_set_si(n,mpz_get_si(n) + 1);
  1238. assert(mpz_divisible_ui_p(n, D_) = 0);
  1239. mpz_clear(n);
  1240. end;
  1241. procedure TTestGmpBinding.mpz_divisible_2exp_p_test;
  1242. const
  1243. N_ = -16;
  1244. B_ = 2;
  1245. var n: mpz_t;
  1246. begin
  1247. mpz_init_set_si(n, N_);
  1248. assert(mpz_divisible_2exp_p(n, B_) <> 0);
  1249. mpz_set_si(n,mpz_get_si(n) + 1);
  1250. assert(mpz_divisible_ui_p(n, B_) = 0);
  1251. mpz_clear(n);
  1252. end;
  1253. procedure TTestGmpBinding.mpz_congruent_p_test;
  1254. const
  1255. N_ = 23;
  1256. C_ = 6;
  1257. D_ = 17;
  1258. var n, c, d: mpz_t;
  1259. begin
  1260. mpz_init_set_si(n, N_);
  1261. mpz_init_set_si(c, C_);
  1262. mpz_init_set_si(d, D_);
  1263. assert(mpz_congruent_p(n, c, d) <> 0);
  1264. mpz_set_si(n,mpz_get_si(n) + 1);
  1265. assert(mpz_congruent_p(n, c, d) = 0);
  1266. mpz_clear(n);
  1267. mpz_clear(c);
  1268. mpz_clear(d);
  1269. end;
  1270. procedure TTestGmpBinding.mpz_congruent_2exp_p_test;
  1271. const
  1272. N_ = 23;
  1273. C_ = 7;
  1274. B_ = 4;
  1275. var n, c: mpz_t;
  1276. begin
  1277. mpz_init_set_si(n, N_);
  1278. mpz_init_set_si(c, C_);
  1279. assert(mpz_congruent_2exp_p(n, c, B_) <> 0);
  1280. mpz_set_si(n,mpz_get_si(n) + 1);
  1281. assert(mpz_congruent_2exp_p(n, c, B_) = 0);
  1282. mpz_clear(n);
  1283. mpz_clear(c);
  1284. end;
  1285. procedure TTestGmpBinding.mpz_congruent_ui_p_test;
  1286. const
  1287. N_ = 23;
  1288. C_ = 6;
  1289. D_ = 17;
  1290. var n: mpz_t;
  1291. begin
  1292. mpz_init_set_si(n, N_);
  1293. assert(mpz_congruent_ui_p(n, C_, D_) <> 0);
  1294. mpz_set_si(n,mpz_get_si(n) + 1);
  1295. assert(mpz_congruent_ui_p(n, C_, D_) = 0);
  1296. mpz_clear(n);
  1297. end;
  1298. procedure TTestGmpBinding.mpz_powm_test;
  1299. const
  1300. N_EXP = 3;
  1301. N_MOD = 16;
  1302. ROP_ = 8;
  1303. var rop, base, exp, mod_: mpz_t;
  1304. begin
  1305. mpz_init(rop);
  1306. mpz_init_set_si(base, BASE10);
  1307. mpz_init_set_si(exp, N_EXP);
  1308. mpz_init_set_si(mod_, N_MOD);
  1309. mpz_powm(rop, base, exp, mod_);
  1310. assert(mpz_get_si(rop) = ROP_);
  1311. mpz_clear(rop);
  1312. mpz_clear(base);
  1313. mpz_clear(exp);
  1314. mpz_clear(mod_);
  1315. end;
  1316. procedure TTestGmpBinding.mpz_powm_ui_test;
  1317. const
  1318. N_EXP = 3;
  1319. N_MOD = 16;
  1320. ROP_ = 8;
  1321. var rop, base, mod_: mpz_t;
  1322. begin
  1323. mpz_init(rop);
  1324. mpz_init_set_si(base, BASE10);
  1325. mpz_init_set_si(mod_, N_MOD);
  1326. mpz_powm_ui(rop, base, N_EXP, mod_);
  1327. assert(mpz_get_si(rop) = ROP_);
  1328. mpz_clear(rop);
  1329. mpz_clear(base);
  1330. mpz_clear(mod_);
  1331. end;
  1332. procedure TTestGmpBinding.mpz_pow_ui_test;
  1333. const
  1334. BASE_ = 10;
  1335. EXP = 3;
  1336. var rop, base: mpz_t;
  1337. begin
  1338. mpz_init(rop);
  1339. mpz_init_set_si(base, BASE_);
  1340. mpz_pow_ui(rop, base, EXP);
  1341. assert(mpz_get_si(rop) = BASE_ ** EXP);
  1342. mpz_clear(rop);
  1343. mpz_clear(base);
  1344. end;
  1345. procedure TTestGmpBinding.mpz_ui_pow_ui_test;
  1346. const
  1347. BASE_ = 10;
  1348. EXP = 3;
  1349. var rop: mpz_t;
  1350. begin
  1351. mpz_init(rop);
  1352. mpz_ui_pow_ui(rop, BASE_, EXP);
  1353. assert(mpz_get_si(rop) = BASE_ ** EXP);
  1354. mpz_clear(rop);
  1355. end;
  1356. procedure TTestGmpBinding.mpz_root_test;
  1357. const
  1358. ROOT = 5;
  1359. N_ = 3;
  1360. var rop, op: mpz_t;
  1361. begin
  1362. mpz_init(rop);
  1363. mpz_init_set_si(op, ROOT ** N_);
  1364. assert(mpz_root(rop, op, N_) <> 0);
  1365. assert(mpz_get_si(rop) = ROOT);
  1366. mpz_set_si(op, ROOT ** N_ + 1);
  1367. assert(mpz_root(rop, op, N_) = 0);
  1368. assert(mpz_get_si(rop) = ROOT);
  1369. mpz_clear(rop);
  1370. mpz_clear(op);
  1371. end;
  1372. procedure TTestGmpBinding.mpz_rootrem_test;
  1373. const
  1374. ROOT_ = 5;
  1375. N_ = 3;
  1376. REM_ = 1;
  1377. var root, rem, u: mpz_t;
  1378. begin
  1379. assert(REM_ < ROOT_);
  1380. mpz_init(root);
  1381. mpz_init(rem);
  1382. mpz_init_set_si(u, ROOT_ ** N_);
  1383. mpz_rootrem(root, rem, u, N_);
  1384. assert(mpz_get_si(root) = ROOT_);
  1385. assert(mpz_get_si(rem) = 0);
  1386. mpz_set_si(u, ROOT_ ** N_ + REM_);
  1387. mpz_rootrem(root, rem, u, N_);
  1388. assert(mpz_get_si(root) = ROOT_);
  1389. assert(mpz_get_si(rem) = REM_);
  1390. mpz_clear(root);
  1391. mpz_clear(rem);
  1392. mpz_clear(u);
  1393. end;
  1394. procedure TTestGmpBinding.mpz_sqrt_test;
  1395. const ROOT = 5;
  1396. var rop, op: mpz_t;
  1397. begin
  1398. mpz_init(rop);
  1399. mpz_init_set_si(op, ROOT ** 2);
  1400. mpz_sqrt(rop, op);
  1401. assert(mpz_get_si(rop) = ROOT);
  1402. mpz_clear(rop);
  1403. mpz_clear(op);
  1404. end;
  1405. procedure TTestGmpBinding.mpz_sqrtrem_test;
  1406. const
  1407. ROOT = 5;
  1408. REM = 1;
  1409. var rop1, rop2, op: mpz_t;
  1410. begin
  1411. mpz_init(rop1);
  1412. mpz_init(rop2);
  1413. mpz_init_set_si(op, ROOT ** 2 + REM);
  1414. mpz_sqrtrem(rop1, rop2, op);
  1415. assert(mpz_get_si(rop1) = ROOT);
  1416. assert(mpz_get_si(rop2) = REM);
  1417. mpz_clear(rop1);
  1418. mpz_clear(rop2);
  1419. mpz_clear(op);
  1420. end;
  1421. procedure TTestGmpBinding.mpz_perfect_power_p_test;
  1422. const
  1423. ROOT = 3;
  1424. EXP = 3;
  1425. var op: mpz_t;
  1426. begin
  1427. mpz_init_set_si(op, ROOT ** EXP);
  1428. assert(mpz_perfect_power_p(op) <> 0);
  1429. mpz_set_si(op, ROOT ** EXP + 1);
  1430. assert(mpz_perfect_power_p(op) = 0);
  1431. mpz_clear(op);
  1432. end;
  1433. procedure TTestGmpBinding.mpz_perfect_square_p_test;
  1434. const ROOT = 3;
  1435. var op: mpz_t;
  1436. begin
  1437. mpz_init_set_si(op, ROOT ** 2);
  1438. assert(mpz_perfect_square_p(op) <> 0);
  1439. mpz_set_si(op, ROOT ** 2 or 2);
  1440. assert(mpz_perfect_square_p(op) = 0);
  1441. mpz_clear(op);
  1442. end;
  1443. procedure TTestGmpBinding.mpz_probab_prime_p_test;
  1444. const
  1445. N_ = 127;
  1446. REPS = 5;
  1447. var n: mpz_t;
  1448. begin
  1449. mpz_init_set_si(n, N_);
  1450. assert(mpz_probab_prime_p(n, REPS) = 2);
  1451. mpz_set_si(n, N_ + 1);
  1452. assert(mpz_probab_prime_p(n, REPS) = 0);
  1453. mpz_clear(n);
  1454. end;
  1455. procedure TTestGmpBinding.mpz_nextprime_test;
  1456. const
  1457. PRIME3 = 5;
  1458. PRIME4 = 7;
  1459. var rop, op: mpz_t;
  1460. begin
  1461. mpz_init(rop);
  1462. mpz_init_set_si(op, PRIME3);
  1463. mpz_nextprime(rop, op);
  1464. assert(mpz_get_si(rop) = PRIME4);
  1465. mpz_clear(rop);
  1466. mpz_clear(op);
  1467. end;
  1468. procedure TTestGmpBinding.mpz_gcd_test;
  1469. const
  1470. OP_1 = 42;
  1471. OP_2 = 56;
  1472. ROP_ = 14;
  1473. var rop, op1, op2: mpz_t;
  1474. begin
  1475. mpz_init(rop);
  1476. mpz_init_set_si(op1, OP_1);
  1477. mpz_init_set_si(op2, OP_2);
  1478. mpz_gcd(rop, op1, op2);
  1479. assert(mpz_get_si(rop) = ROP_);
  1480. mpz_clear(rop);
  1481. mpz_clear(op1);
  1482. mpz_clear(op2);
  1483. end;
  1484. procedure TTestGmpBinding.mpz_gcd_ui_test;
  1485. const
  1486. OP_1 = 42;
  1487. OP_2 = 56;
  1488. ROP_ = 14;
  1489. var rop, op1: mpz_t;
  1490. begin
  1491. mpz_init(rop);
  1492. mpz_init_set_si(op1, OP_1);
  1493. assert(mpz_gcd_ui(rop, op1, OP_2) = ROP_);
  1494. assert(mpz_get_si(rop) = ROP_);
  1495. mpz_clear(rop);
  1496. mpz_clear(op1);
  1497. end;
  1498. procedure TTestGmpBinding.mpz_gcdext_test;
  1499. const
  1500. A_ = 42;
  1501. B_ = 56;
  1502. G_ = 14;
  1503. var g, s, t, a, b: mpz_t;
  1504. begin
  1505. mpz_init(g);
  1506. mpz_init(s);
  1507. mpz_init(t);
  1508. mpz_init_set_si(a, A_);
  1509. mpz_init_set_si(b, B_);
  1510. mpz_gcdext(g, s, t, a, b);
  1511. assert(mpz_get_si(g) = G_);
  1512. assert(A_ *mpz_get_si(s) + B_ *mpz_get_si(t) = G_);
  1513. mpz_clear(g);
  1514. mpz_clear(s);
  1515. mpz_clear(t);
  1516. mpz_clear(a);
  1517. mpz_clear(b);
  1518. end;
  1519. procedure TTestGmpBinding.mpz_lcm_test;
  1520. const
  1521. OP_1 = 21;
  1522. OP_2 = 6;
  1523. ROP_ = 42;
  1524. var rop, op1, op2: mpz_t;
  1525. begin
  1526. mpz_init(rop);
  1527. mpz_init_set_si(op1, OP_1);
  1528. mpz_init_set_si(op2, OP_2);
  1529. mpz_lcm(rop, op1, op2);
  1530. assert(mpz_get_si(rop) = ROP_);
  1531. mpz_clear(rop);
  1532. mpz_clear(op1);
  1533. mpz_clear(op2);
  1534. end;
  1535. procedure TTestGmpBinding.mpz_lcm_ui_test;
  1536. const
  1537. OP_1 = 21;
  1538. OP_2 = 6;
  1539. ROP_ = 42;
  1540. var rop, op1: mpz_t;
  1541. begin
  1542. mpz_init(rop);
  1543. mpz_init_set_si(op1, OP_1);
  1544. mpz_lcm_ui(rop, op1, OP_2);
  1545. assert(mpz_get_si(rop) = ROP_);
  1546. mpz_clear(rop);
  1547. mpz_clear(op1);
  1548. end;
  1549. procedure TTestGmpBinding.mpz_invert_test;
  1550. const
  1551. OP_1 = 256;
  1552. OP_2 = 337;
  1553. ROP_ = 104;
  1554. var rop, op1, op2: mpz_t;
  1555. begin
  1556. mpz_init(rop);
  1557. mpz_init_set_si(op1, OP_1);
  1558. mpz_init_set_si(op2, OP_2);
  1559. assert(mpz_invert(rop, op1, op2) <> 0);
  1560. assert(mpz_get_si(rop) = ROP_);
  1561. mpz_clear(rop);
  1562. mpz_clear(op1);
  1563. mpz_clear(op2);
  1564. end;
  1565. procedure TTestGmpBinding.mpz_jacobi_test;
  1566. const
  1567. B0 = 11;
  1568. A0 = 13 * B0;
  1569. AM1 = 1001;
  1570. BM1 = 9907;
  1571. A1 = 4;
  1572. B1 = 7;
  1573. var a, b: mpz_t;
  1574. begin
  1575. mpz_init_set_si(a, A0);
  1576. mpz_init_set_si(b, B0);
  1577. assert(mpz_jacobi(a, b) = 0);
  1578. mpz_set_si(a, AM1);
  1579. mpz_set_si(b, BM1);
  1580. assert(mpz_jacobi(a, b) = -1);
  1581. mpz_set_si(a, A1);
  1582. mpz_set_si(b, B1);
  1583. assert(mpz_jacobi(a, b) = 1);
  1584. mpz_clear(a);
  1585. mpz_clear(b);
  1586. end;
  1587. procedure TTestGmpBinding.mpz_kronecker_si_test;
  1588. const
  1589. A_ = 8;
  1590. B0 = 6;
  1591. BM1 = 5;
  1592. B1 = 7;
  1593. var a: mpz_t;
  1594. begin
  1595. mpz_init_set_si(a, A_);
  1596. assert(mpz_kronecker_si(a, B1) = 1);
  1597. assert(mpz_kronecker_si(a, B0) = 0);
  1598. assert(mpz_kronecker_si(a, BM1) = -1);
  1599. mpz_clear(a);
  1600. end;
  1601. procedure TTestGmpBinding.mpz_kronecker_ui_test;
  1602. const
  1603. A_ = 8;
  1604. B0 = 6;
  1605. BM1 = 5;
  1606. B1 = 7;
  1607. var a: mpz_t;
  1608. begin
  1609. mpz_init_set_si(a, A_);
  1610. assert(mpz_kronecker_ui(a, B1) = 1);
  1611. assert(mpz_kronecker_ui(a, B0) = 0);
  1612. assert(mpz_kronecker_ui(a, BM1) = -1);
  1613. mpz_clear(a);
  1614. end;
  1615. procedure TTestGmpBinding.mpz_si_kronecker_test;
  1616. const
  1617. A_ = 8;
  1618. B0 = 6;
  1619. BM1 = 5;
  1620. B1 = 7;
  1621. var b: mpz_t;
  1622. begin
  1623. mpz_init_set_si(b, B1);
  1624. assert(mpz_si_kronecker(A_, b) = 1);
  1625. mpz_set_si(b, B0);
  1626. assert(mpz_si_kronecker(A_, b) = 0);
  1627. mpz_set_si(b, BM1);
  1628. assert(mpz_si_kronecker(A_, b) = -1);
  1629. mpz_clear(b);
  1630. end;
  1631. procedure TTestGmpBinding.mpz_ui_kronecker_test;
  1632. const
  1633. A_ = 8;
  1634. B0 = 6;
  1635. BM1 = 5;
  1636. B1 = 7;
  1637. var b: mpz_t;
  1638. begin
  1639. mpz_init_set_si(b, B1);
  1640. assert(mpz_ui_kronecker(A_, b) = 1);
  1641. mpz_set_si(b, B0);
  1642. assert(mpz_ui_kronecker(A_, b) = 0);
  1643. mpz_set_si(b, BM1);
  1644. assert(mpz_ui_kronecker(A_, b) = -1);
  1645. mpz_clear(b);
  1646. end;
  1647. procedure TTestGmpBinding.mpz_remove_test;
  1648. const
  1649. F_ = 5;
  1650. OP_ = 3 * F_ * 7;
  1651. ROP_ = OP_ div F_;
  1652. var rop, op, f: mpz_t;
  1653. begin
  1654. mpz_init(rop);
  1655. mpz_init_set_si(op, OP_);
  1656. mpz_init_set_si(f, F_);
  1657. assert(mpz_remove(rop, op, f) = 1);
  1658. assert(mpz_get_si(rop) = ROP_);
  1659. mpz_clear(rop);
  1660. mpz_clear(op);
  1661. mpz_clear(f);
  1662. end;
  1663. procedure TTestGmpBinding.mpz_fac_ui_test;
  1664. const
  1665. OP = 4;
  1666. ROP_ = 2 * 3 * 4;
  1667. var rop: mpz_t;
  1668. begin
  1669. mpz_init(rop);
  1670. mpz_fac_ui(rop, OP);
  1671. assert(mpz_get_si(rop) = ROP_);
  1672. mpz_clear(rop);
  1673. end;
  1674. procedure TTestGmpBinding.mpz_bin_ui_test;
  1675. const
  1676. N_ = 7;
  1677. K = 3;
  1678. ROP_ = 35;
  1679. var rop, n: mpz_t;
  1680. begin
  1681. mpz_init(rop);
  1682. mpz_init_set_si(n, N_);
  1683. mpz_bin_ui(rop, n, K);
  1684. assert(mpz_get_si(rop) = ROP_);
  1685. mpz_clear(rop);
  1686. mpz_clear(n);
  1687. end;
  1688. procedure TTestGmpBinding.mpz_bin_uiui_test;
  1689. const
  1690. N = 7;
  1691. K = 3;
  1692. ROP_ = 35;
  1693. var rop: mpz_t;
  1694. begin
  1695. mpz_init(rop);
  1696. mpz_bin_uiui(rop, N, K);
  1697. assert(mpz_get_si(rop) = ROP_);
  1698. mpz_clear(rop);
  1699. end;
  1700. procedure TTestGmpBinding.mpz_fib_ui_test;
  1701. const
  1702. N = 10;
  1703. FN_ = 55;
  1704. var fn: mpz_t;
  1705. begin
  1706. mpz_init(fn);
  1707. mpz_fib_ui(fn, N);
  1708. assert(mpz_get_si(fn) = FN_);
  1709. mpz_clear(fn);
  1710. end;
  1711. procedure TTestGmpBinding.mpz_fib2_ui_test;
  1712. const
  1713. N = 10;
  1714. FN_ = 55;
  1715. FNSUB1_ = 34;
  1716. var fn, fnsub1: mpz_t;
  1717. begin
  1718. mpz_init(fn);
  1719. mpz_init(fnsub1);
  1720. mpz_fib2_ui(fn, fnsub1, N);
  1721. assert(mpz_get_si(fn) = FN_);
  1722. assert(mpz_get_si(fnsub1) = FNSUB1_);
  1723. mpz_clear(fn);
  1724. mpz_clear(fnsub1);
  1725. end;
  1726. procedure TTestGmpBinding.mpz_lucnum_ui_test;
  1727. const
  1728. N = 10;
  1729. LN_ = 123;
  1730. var ln: mpz_t;
  1731. begin
  1732. mpz_init(ln);
  1733. mpz_lucnum_ui(ln, N);
  1734. assert(mpz_get_si(ln) = LN_);
  1735. mpz_clear(ln);
  1736. end;
  1737. procedure TTestGmpBinding.mpz_lucnum2_ui_test;
  1738. const
  1739. N = 10;
  1740. LN_ = 123;
  1741. LNSUB1_ = 76;
  1742. var ln, lnsub1: mpz_t;
  1743. begin
  1744. mpz_init(ln);
  1745. mpz_init(lnsub1);
  1746. mpz_lucnum2_ui(ln, lnsub1, N);
  1747. assert(mpz_get_si(ln) = LN_);
  1748. assert(mpz_get_si(lnsub1) = LNSUB1_);
  1749. mpz_clear(ln);
  1750. mpz_clear(lnsub1);
  1751. end;
  1752. procedure TTestGmpBinding.mpz_cmp_test;
  1753. const
  1754. OP_1 = -10;
  1755. OP_2 = OP_1 - 1;
  1756. var op1, op2: mpz_t;
  1757. begin
  1758. mpz_init_set_si(op1, OP_1);
  1759. mpz_init_set_si(op2, OP_2);
  1760. assert(mpz_cmp(op1, op2) > 0);
  1761. mpz_set_si(op2, OP_1);
  1762. assert(mpz_cmp(op1, op2) = 0);
  1763. mpz_set_si(op2, OP_1 + 1);
  1764. assert(mpz_cmp(op1, op2) < 0);
  1765. mpz_clear(op1);
  1766. mpz_clear(op2);
  1767. end;
  1768. procedure TTestGmpBinding.mpz_cmp_d_test;
  1769. const
  1770. OP_1 = -10;
  1771. var op1: mpz_t;
  1772. begin
  1773. mpz_init_set_si(op1, OP_1);
  1774. assert(mpz_cmp_d(op1, OP_1 - 1) > 0);
  1775. assert(mpz_cmp_d(op1, OP_1) = 0);
  1776. assert(mpz_cmp_d(op1, OP_1 + 1) < 0);
  1777. mpz_clear(op1);
  1778. end;
  1779. procedure TTestGmpBinding.mpz_cmp_si_test;
  1780. const
  1781. OP_1 = -10;
  1782. var op1: mpz_t;
  1783. begin
  1784. mpz_init_set_si(op1, OP_1);
  1785. assert(mpz_cmp_si(op1, OP_1 - 1) > 0);
  1786. assert(mpz_cmp_si(op1, OP_1) = 0);
  1787. assert(mpz_cmp_si(op1, OP_1 + 1) < 0);
  1788. mpz_clear(op1);
  1789. end;
  1790. procedure TTestGmpBinding.mpz_cmp_ui_test;
  1791. const
  1792. OP_1 = 10;
  1793. var op1: mpz_t;
  1794. begin
  1795. mpz_init_set_si(op1, OP_1);
  1796. assert(mpz_cmp_ui(op1, OP_1 - 1) > 0);
  1797. assert(mpz_cmp_ui(op1, OP_1) = 0);
  1798. assert(mpz_cmp_ui(op1, OP_1 + 1) < 0);
  1799. mpz_clear(op1);
  1800. end;
  1801. procedure TTestGmpBinding.mpz_cmpabs_test;
  1802. const
  1803. OP_1 = -10;
  1804. OP_2 = -OP_1 - 1;
  1805. var op1, op2: mpz_t;
  1806. begin
  1807. mpz_init_set_si(op1, OP_1);
  1808. mpz_init_set_si(op2, -OP_2);
  1809. assert(mpz_cmpabs(op1, op2) > 0);
  1810. mpz_set_si(op2, -OP_1);
  1811. assert(mpz_cmpabs(op1, op2) = 0);
  1812. mpz_set_si(op2, -OP_1 + 1);
  1813. assert(mpz_cmpabs(op1, op2) < 0);
  1814. mpz_clear(op1);
  1815. mpz_clear(op2);
  1816. end;
  1817. procedure TTestGmpBinding.mpz_cmpabs_d_test;
  1818. const OP_1 = -10;
  1819. var op1: mpz_t;
  1820. begin
  1821. mpz_init_set_si(op1, OP_1);
  1822. assert(mpz_cmpabs_d(op1, -OP_1 - 1) > 0);
  1823. assert(mpz_cmpabs_d(op1, -OP_1) = 0);
  1824. assert(mpz_cmpabs_d(op1, -OP_1 + 1) < 0);
  1825. mpz_clear(op1);
  1826. end;
  1827. procedure TTestGmpBinding.mpz_cmpabs_ui_test;
  1828. const OP_1 = -10;
  1829. var op1: mpz_t;
  1830. begin
  1831. mpz_init_set_si(op1, OP_1);
  1832. assert(mpz_cmpabs_ui(op1, -OP_1 - 1) > 0);
  1833. assert(mpz_cmpabs_ui(op1, -OP_1) = 0);
  1834. assert(mpz_cmpabs_ui(op1, -OP_1 + 1) < 0);
  1835. mpz_clear(op1);
  1836. end;
  1837. procedure TTestGmpBinding.mpz_and_test;
  1838. const
  1839. OP_1 = $c;
  1840. OP_2 = $a;
  1841. var rop, op1, op2: mpz_t;
  1842. begin
  1843. mpz_init(rop);
  1844. mpz_init_set_si(op1, OP_1);
  1845. mpz_init_set_si(op2, OP_2);
  1846. mpz_and(rop, op1, op2);
  1847. assert(mpz_get_si(rop) = OP_1 and OP_2);
  1848. mpz_clear(rop);
  1849. mpz_clear(op1);
  1850. mpz_clear(op2);
  1851. end;
  1852. procedure TTestGmpBinding.mpz_ior_test;
  1853. const
  1854. OP_1 = $c;
  1855. OP_2 = $a;
  1856. var rop, op1, op2: mpz_t;
  1857. begin
  1858. mpz_init(rop);
  1859. mpz_init_set_si(op1, OP_1);
  1860. mpz_init_set_si(op2, OP_2);
  1861. mpz_ior(rop, op1, op2);
  1862. assert(mpz_get_si(rop) = OP_1 or OP_2);
  1863. mpz_clear(rop);
  1864. mpz_clear(op1);
  1865. mpz_clear(op2);
  1866. end;
  1867. procedure TTestGmpBinding.mpz_xor_test;
  1868. const
  1869. OP_1 = $c;
  1870. OP_2 = $a;
  1871. var rop, op1, op2: mpz_t;
  1872. begin
  1873. mpz_init(rop);
  1874. mpz_init_set_si(op1, OP_1);
  1875. mpz_init_set_si(op2, OP_2);
  1876. mpz_xor(rop, op1, op2);
  1877. assert(mpz_get_si(rop) = OP_1 xor OP_2);
  1878. mpz_clear(rop);
  1879. mpz_clear(op1);
  1880. mpz_clear(op2);
  1881. end;
  1882. procedure TTestGmpBinding.mpz_com_test;
  1883. const
  1884. OP_1 = 2;
  1885. var rop, op1: mpz_t;
  1886. begin
  1887. mpz_init(rop);
  1888. mpz_init_set_si(op1, OP_1);
  1889. mpz_com(rop, op1);
  1890. assert(mpz_get_si(rop) = not OP_1 );
  1891. mpz_clear(rop);
  1892. mpz_clear(op1);
  1893. end;
  1894. procedure TTestGmpBinding.mpz_popcount_test;
  1895. const
  1896. OP_ = $55AA;
  1897. N = 8;
  1898. var op: mpz_t;
  1899. begin
  1900. mpz_init_set_si(op, OP_);
  1901. assert(mpz_popcount(op) = N);
  1902. mpz_clear(op);
  1903. end;
  1904. procedure TTestGmpBinding.mpz_hamdist_test;
  1905. const
  1906. OP_1 = $55;
  1907. OP_2 = $7A;
  1908. N = 5;
  1909. var op1, op2: mpz_t;
  1910. begin
  1911. mpz_init_set_si(op1, OP_1);
  1912. mpz_init_set_si(op2, OP_2);
  1913. assert(mpz_hamdist(op1, op2) = N);
  1914. mpz_clear(op1);
  1915. mpz_clear(op2);
  1916. end;
  1917. procedure TTestGmpBinding.mpz_scan0_test;
  1918. const
  1919. OP_ = $F75;
  1920. STARTING_BIT = 4;
  1921. N = 7;
  1922. var op: mpz_t;
  1923. begin
  1924. mpz_init_set_si(op, OP_);
  1925. assert(mpz_scan0(op, STARTING_BIT) = N);
  1926. mpz_clear(op);
  1927. end;
  1928. procedure TTestGmpBinding.mpz_scan1_test;
  1929. const
  1930. OP_ = $85;
  1931. STARTING_BIT = 4;
  1932. N = 7;
  1933. var op: mpz_t;
  1934. begin
  1935. mpz_init_set_si(op, OP_);
  1936. assert(mpz_scan1(op, STARTING_BIT) = N);
  1937. mpz_clear(op);
  1938. end;
  1939. procedure TTestGmpBinding.mpz_setbit_test;
  1940. const
  1941. ROP_ = $F75;
  1942. BIT_INDEX = 7;
  1943. var rop: mpz_t;
  1944. begin
  1945. mpz_init_set_ui(rop, ROP_);
  1946. mpz_setbit(rop, BIT_INDEX);
  1947. assert(mpz_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
  1948. mpz_clear(rop);
  1949. end;
  1950. procedure TTestGmpBinding.mpz_clrbit_test;
  1951. const
  1952. ROP_ = $F75;
  1953. BIT_INDEX = 9;
  1954. var rop: mpz_t;
  1955. begin
  1956. mpz_init_set_ui(rop, ROP_);
  1957. mpz_clrbit(rop, BIT_INDEX);
  1958. assert(mpz_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
  1959. mpz_clear(rop);
  1960. end;
  1961. procedure TTestGmpBinding.mpz_combit_test;
  1962. const
  1963. ROP_ = $F75;
  1964. BIT_INDEX = 7;
  1965. var rop: mpz_t;
  1966. begin
  1967. mpz_init_set_ui(rop, ROP_);
  1968. mpz_combit(rop, BIT_INDEX);
  1969. assert(mpz_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
  1970. mpz_clear(rop);
  1971. end;
  1972. procedure TTestGmpBinding.mpz_tstbit_test;
  1973. const
  1974. ROP_ = $F75;
  1975. BIT_INDEX1 = 7;
  1976. BIT_INDEX2 = 8;
  1977. var rop: mpz_t;
  1978. begin
  1979. mpz_init_set_ui(rop, ROP_);
  1980. assert(longbool(mpz_tstbit(rop, BIT_INDEX1)) = longbool(ROP_ and (1 shl BIT_INDEX1)));
  1981. assert(longbool(mpz_tstbit(rop, BIT_INDEX2)) = longbool(ROP_ and (1 shl BIT_INDEX2)));
  1982. mpz_clear(rop);
  1983. end;
  1984. procedure TTestGmpBinding.mpz_urandomb_test;
  1985. const
  1986. B = 8 * (sizeof(valuint) - 1);
  1987. N = 1 shl B;
  1988. var
  1989. rop: mpz_t;
  1990. state: randstate_t;
  1991. begin
  1992. mp_randinit_default(state);
  1993. mpz_init(rop);
  1994. mpz_urandomb(rop, state, B);
  1995. assert(mpz_cmp_ui(rop, N) < 0);
  1996. mpz_clear(rop);
  1997. mp_randclear(state);
  1998. end;
  1999. procedure TTestGmpBinding.mpz_urandomm_test;
  2000. const
  2001. N_ = 1000000;
  2002. var
  2003. rop, n: mpz_t;
  2004. state: randstate_t;
  2005. begin
  2006. mp_randinit_default(state);
  2007. mpz_init(rop);
  2008. mpz_init_set_ui(n, N_);
  2009. mpz_urandomm(rop, state, n);
  2010. assert(mpz_cmp_ui(rop, N_) < 0);
  2011. mpz_clear(rop);
  2012. mpz_clear(n);
  2013. mp_randclear(state);
  2014. end;
  2015. procedure TTestGmpBinding.mpz_rrandomb_test;
  2016. const
  2017. B = 8 * sizeof(valuint) - 2;
  2018. N = 1 shl B;
  2019. var
  2020. rop: mpz_t;
  2021. state: randstate_t;
  2022. begin
  2023. mp_randinit_default(state);
  2024. mpz_init(rop);
  2025. mpz_rrandomb(rop, state, B);
  2026. assert(mpz_cmp_ui(rop, N) < 0);
  2027. mpz_clear(rop);
  2028. mp_randclear(state);
  2029. end;
  2030. procedure TTestGmpBinding.mpz_fits_ushort_p_test;
  2031. var op: mpz_t;
  2032. begin
  2033. mpz_init_set_ui(op, high(word));
  2034. assert(longbool(mpz_fits_ushort_p(op)));
  2035. mpz_add_ui(op, op, 1);
  2036. assert(not longbool(mpz_fits_ushort_p(op)));
  2037. mpz_clear(op);
  2038. end;
  2039. procedure TTestGmpBinding.mpz_fits_sshort_p_test;
  2040. var op: mpz_t;
  2041. begin
  2042. mpz_init_set_si(op, high(smallint));
  2043. assert(longbool(mpz_fits_sshort_p(op)));
  2044. mpz_add_ui(op, op, 1);
  2045. assert(not longbool(mpz_fits_sshort_p(op)));
  2046. mpz_clear(op);
  2047. end;
  2048. procedure TTestGmpBinding.mpz_fits_uint_p_test;
  2049. var op: mpz_t;
  2050. begin
  2051. mpz_init_set_ui(op, high(cardinal));
  2052. assert(longbool(mpz_fits_uint_p(op)));
  2053. mpz_add_ui(op, op, 1);
  2054. assert(not longbool(mpz_fits_uint_p(op)));
  2055. mpz_clear(op);
  2056. end;
  2057. procedure TTestGmpBinding.mpz_fits_sint_p_test;
  2058. var op: mpz_t;
  2059. begin
  2060. mpz_init_set_si(op, high(integer));
  2061. assert(longbool(mpz_fits_sint_p(op)));
  2062. mpz_add_ui(op, op, 1);
  2063. assert(not longbool(mpz_fits_sint_p(op)));
  2064. mpz_clear(op);
  2065. end;
  2066. procedure TTestGmpBinding.mpz_fits_ulong_p_test;
  2067. var op: mpz_t;
  2068. begin
  2069. mpz_init_set_ui(op, high(valuint));
  2070. assert(longbool(mpz_fits_ulong_p(op)));
  2071. mpz_add_ui(op, op, 1);
  2072. assert(not longbool(mpz_fits_ulong_p(op)));
  2073. mpz_clear(op);
  2074. end;
  2075. procedure TTestGmpBinding.mpz_fits_slong_p_test;
  2076. var op: mpz_t;
  2077. begin
  2078. mpz_init_set_si(op, high(valsint));
  2079. assert(longbool(mpz_fits_slong_p(op)));
  2080. mpz_add_ui(op, op, 1);
  2081. assert(not longbool(mpz_fits_slong_p(op)));
  2082. mpz_clear(op);
  2083. end;
  2084. procedure TTestGmpBinding.mpz_sizeinbase_test;
  2085. const
  2086. OP_ = 1000000;
  2087. var rop: mpz_t;
  2088. begin
  2089. mpz_init_set_ui(rop, OP_);
  2090. assert(mpz_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
  2091. mpz_clear(rop);
  2092. end;
  2093. procedure TTestGmpBinding.mpz_size_test;
  2094. var rop: mpz_t;
  2095. begin
  2096. mpz_init(rop);
  2097. assert(mpz_size(rop) = 0);
  2098. mpz_add_ui(rop, rop, 1);
  2099. assert(mpz_size(rop) = 1);
  2100. mpz_clear(rop);
  2101. end;
  2102. procedure TTestGmpBinding.mpq_init_test;
  2103. var rational: mpq_t;
  2104. begin
  2105. mpq_init(rational);
  2106. assert(mpq_cmp_ui(rational, 0, 1) = 0);
  2107. mpq_clear(rational);
  2108. end;
  2109. procedure TTestGmpBinding.mpq_clear_test;
  2110. var rational: mpq_t;
  2111. begin
  2112. mpq_init(rational);
  2113. mpq_clear(rational);
  2114. end;
  2115. procedure TTestGmpBinding.mpq_set_ui_test;
  2116. const
  2117. OP_1 = 13;
  2118. OP_2 = 17;
  2119. var rational: mpq_t;
  2120. begin
  2121. mpq_init(rational);
  2122. mpq_set_ui(rational, OP_1, OP_2);
  2123. assert(mpq_cmp_ui(rational, OP_1, OP_2) = 0);
  2124. mpq_clear(rational);
  2125. end;
  2126. procedure TTestGmpBinding.mpq_set_si_test;
  2127. const
  2128. OP_1 = -13;
  2129. OP_2 = 17;
  2130. var rational: mpq_t;
  2131. begin
  2132. mpq_init(rational);
  2133. mpq_set_si(rational, OP_1, OP_2);
  2134. assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
  2135. mpq_clear(rational);
  2136. end;
  2137. procedure TTestGmpBinding.mpq_canonicalize_test;
  2138. const
  2139. OP_1 = -13;
  2140. OP_2 = 17;
  2141. CF = 11;
  2142. var rational: mpq_t;
  2143. begin
  2144. mpq_init(rational);
  2145. mpq_set_si(rational, CF * OP_1, CF * OP_2);
  2146. mpq_canonicalize(rational);
  2147. assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
  2148. mpq_clear(rational);
  2149. end;
  2150. procedure TTestGmpBinding.mpq_set_test;
  2151. const
  2152. OP_1 = -13;
  2153. OP_2 = 17;
  2154. var rational1, rational2: mpq_t;
  2155. begin
  2156. mpq_init(rational1);
  2157. mpq_init(rational2);
  2158. mpq_set_si(rational2, OP_1, OP_2);
  2159. mpq_set(rational1, rational2);
  2160. assert(mpq_cmp_si(rational1, OP_1, OP_2) = 0);
  2161. mpq_clear(rational1);
  2162. mpq_clear(rational2);
  2163. end;
  2164. procedure TTestGmpBinding.mpq_setmpz_test;
  2165. const
  2166. OP_1 = -13;
  2167. var
  2168. rational: mpq_t;
  2169. op: mpz_t;
  2170. begin
  2171. mpq_init(rational);
  2172. mpz_init_set_si(op, OP_1);
  2173. mpq_set_z(rational, op);
  2174. assert(mpq_cmp_si(rational, OP_1, 1) = 0);
  2175. mpq_clear(rational);
  2176. mpz_clear(op);
  2177. end;
  2178. procedure TTestGmpBinding.mpq_set_str_test;
  2179. const
  2180. OP_1 = -13;
  2181. OP_2 = 17;
  2182. var rational: mpq_t;
  2183. begin
  2184. mpq_init(rational);
  2185. assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10) = 0);
  2186. assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
  2187. assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10) <> 0);
  2188. mpq_clear(rational);
  2189. end;
  2190. procedure TTestGmpBinding.mpq_swap_test;
  2191. const
  2192. ROP_1N = -13;
  2193. ROP_1D = 17;
  2194. ROP_2N = -23;
  2195. ROP_2D = 31;
  2196. var rop1, rop2: mpq_t;
  2197. begin
  2198. mpq_init(rop1);
  2199. mpq_init(rop2);
  2200. mpq_set_si(rop1, ROP_1N, ROP_1D);
  2201. mpq_set_si(rop2, ROP_2N, ROP_2D);
  2202. mpq_swap(rop1, rop2);
  2203. assert(mpq_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
  2204. assert(mpq_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
  2205. mpq_clear(rop1);
  2206. mpq_clear(rop2);
  2207. end;
  2208. procedure TTestGmpBinding.mpq_get_d_test;
  2209. const
  2210. OP_1 = -1;
  2211. OP_2 = 2;
  2212. var op: mpq_t;
  2213. begin
  2214. mpq_init(op);
  2215. mpq_set_si(op, OP_1, OP_2);
  2216. assert(mpq_get_d(op) = OP_1 / OP_2);
  2217. mpq_clear(op);
  2218. end;
  2219. procedure TTestGmpBinding.mpq_set_d_test;
  2220. const
  2221. OP_1 = -1;
  2222. OP_2 = 2;
  2223. var rop: mpq_t;
  2224. begin
  2225. mpq_init(rop);
  2226. mpq_set_d(rop, OP_1 / OP_2);
  2227. assert(mpq_cmp_si(rop, OP_1, OP_2) = 0);
  2228. mpq_clear(rop);
  2229. end;
  2230. procedure TTestGmpBinding.mpq_set_f_test;
  2231. const OP_ = -10;
  2232. var
  2233. op: mpf_t;
  2234. rop: mpq_t;
  2235. begin
  2236. mpf_init_set_si(op, OP_);
  2237. mpq_init(rop);
  2238. mpq_set_f(rop, op);
  2239. assert(mpq_get_d(rop) = OP_);
  2240. mpq_clear(rop);
  2241. mpf_clear(op);
  2242. end;
  2243. procedure TTestGmpBinding.mpq_get_str_test;
  2244. const
  2245. OP_1 = -1;
  2246. OP_2 = 2;
  2247. var
  2248. op: mpq_t;
  2249. p: pchar;
  2250. begin
  2251. mpq_init(op);
  2252. mpq_set_si(op, OP_1, OP_2);
  2253. p := mpq_get_str(nil, BASE10, op);
  2254. assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
  2255. freemem(p);
  2256. mpq_clear(op);
  2257. end;
  2258. procedure TTestGmpBinding.mpq_add_test;
  2259. const
  2260. N1 = 5;
  2261. D1 = 2;
  2262. N2 = -7;
  2263. D2 = 3;
  2264. var sum, addend1, addend2: mpq_t;
  2265. begin
  2266. mpq_init(sum);
  2267. mpq_init(addend1);
  2268. mpq_init(addend2);
  2269. mpq_set_si(addend1, N1, D1);
  2270. mpq_set_si(addend2, N2, D2);
  2271. mpq_add(sum, addend1, addend2);
  2272. assert(mpq_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
  2273. mpq_clear(sum);
  2274. mpq_clear(addend1);
  2275. mpq_clear(addend2);
  2276. end;
  2277. procedure TTestGmpBinding.mpq_sub_test;
  2278. const
  2279. N1 = 5;
  2280. D1 = 2;
  2281. N2 = -7;
  2282. D2 = 3;
  2283. var difference, minuend, subtrahend: mpq_t;
  2284. begin
  2285. mpq_init(difference);
  2286. mpq_init(minuend);
  2287. mpq_init(subtrahend);
  2288. mpq_set_si(minuend, N1, D1);
  2289. mpq_set_si(subtrahend, N2, D2);
  2290. mpq_sub(difference, minuend, subtrahend);
  2291. assert(mpq_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
  2292. mpq_clear(difference);
  2293. mpq_clear(minuend);
  2294. mpq_clear(subtrahend);
  2295. end;
  2296. procedure TTestGmpBinding.mpq_mul_test;
  2297. const
  2298. N1 = 5;
  2299. D1 = 2;
  2300. N2 = -7;
  2301. D2 = 3;
  2302. var product, multiplier, multiplicant: mpq_t;
  2303. begin
  2304. mpq_init(product);
  2305. mpq_init(multiplier);
  2306. mpq_init(multiplicant);
  2307. mpq_set_si(multiplier, N1, D1);
  2308. mpq_set_si(multiplicant, N2, D2);
  2309. mpq_mul(product, multiplier, multiplicant);
  2310. assert(mpq_cmp_si(product, N1 * N2, D1 * D2) = 0);
  2311. mpq_clear(product);
  2312. mpq_clear(multiplier);
  2313. mpq_clear(multiplicant);
  2314. end;
  2315. procedure TTestGmpBinding.mpq_mul_2exp_test;
  2316. const
  2317. N1 = 5;
  2318. D1 = 3;
  2319. OP_2 = 2;
  2320. var rop, op1: mpq_t;
  2321. begin
  2322. mpq_init(rop);
  2323. mpq_init(op1);
  2324. mpq_set_si(op1, N1, D1);
  2325. mpq_mul_2exp(rop, op1, OP_2);
  2326. assert(mpq_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
  2327. mpq_clear(rop);
  2328. mpq_clear(op1);
  2329. end;
  2330. procedure TTestGmpBinding.mpq_div_test;
  2331. const
  2332. N1 = 5;
  2333. D1 = 2;
  2334. N2 = -7;
  2335. D2 = 3;
  2336. var quotient, dividend, divisor: mpq_t;
  2337. begin
  2338. mpq_init(quotient);
  2339. mpq_init(dividend);
  2340. mpq_init(divisor);
  2341. mpq_set_si(dividend, N1, D1);
  2342. mpq_set_si(divisor, N2, D2);
  2343. mpq_div(quotient, dividend, divisor);
  2344. assert(mpq_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
  2345. mpq_clear(quotient);
  2346. mpq_clear(dividend);
  2347. mpq_clear(divisor);
  2348. end;
  2349. procedure TTestGmpBinding.mpq_div_2exp_test;
  2350. const
  2351. N1 = 5;
  2352. D1 = 3;
  2353. OP_2 = 2;
  2354. var rop, op1: mpq_t;
  2355. begin
  2356. mpq_init(rop);
  2357. mpq_init(op1);
  2358. mpq_set_si(op1, N1, D1);
  2359. mpq_div_2exp(rop, op1, OP_2);
  2360. assert(mpq_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
  2361. mpq_clear(rop);
  2362. mpq_clear(op1);
  2363. end;
  2364. procedure TTestGmpBinding.mpq_neg_test;
  2365. const
  2366. N1 = -5;
  2367. D1 = 3;
  2368. var negated_operand, operand: mpq_t;
  2369. begin
  2370. mpq_init(negated_operand);
  2371. mpq_init(operand);
  2372. mpq_set_si(operand, N1, D1);
  2373. mpq_neg(negated_operand, operand);
  2374. assert(mpq_cmp_si(negated_operand, -N1, D1) = 0);
  2375. mpq_clear(negated_operand);
  2376. mpq_clear(operand);
  2377. end;
  2378. procedure TTestGmpBinding.mpq_abs_test;
  2379. const
  2380. N1 = 5;
  2381. D1 = 3;
  2382. var rop, op: mpq_t;
  2383. begin
  2384. mpq_init(rop);
  2385. mpq_init(op);
  2386. mpq_set_si(op, -N1, D1);
  2387. mpq_abs(rop, op);
  2388. assert(mpq_cmp_si(rop, N1, D1) = 0);
  2389. mpq_clear(rop);
  2390. mpq_clear(op);
  2391. end;
  2392. procedure TTestGmpBinding.mpq_inv_test;
  2393. const
  2394. N1 = -5;
  2395. D1 = 3;
  2396. var inverted_number, number: mpq_t;
  2397. begin
  2398. mpq_init(inverted_number);
  2399. mpq_init(number);
  2400. mpq_set_si(number, N1, D1);
  2401. mpq_inv(inverted_number, number);
  2402. assert(mpq_cmp_si(inverted_number, -D1, -N1) = 0);
  2403. mpq_clear(inverted_number);
  2404. mpq_clear(number);
  2405. end;
  2406. procedure TTestGmpBinding.mpq_cmp_test;
  2407. const
  2408. N1 = -7;
  2409. D1 = 5;
  2410. var op1, op2: mpq_t;
  2411. begin
  2412. mpq_init(op1);
  2413. mpq_init(op2);
  2414. mpq_set_si(op1, N1, D1);
  2415. mpq_set_si(op2, N1, D1);
  2416. assert(mpq_cmp(op1, op2) = 0);
  2417. mpq_set_si(op1, N1 + 1, D1);
  2418. assert(mpq_cmp(op1, op2) > 0);
  2419. mpq_set_si(op1, N1 - 1, D1);
  2420. assert(mpq_cmp(op1, op2) < 0);
  2421. mpq_clear(op1);
  2422. mpq_clear(op2);
  2423. end;
  2424. procedure TTestGmpBinding.mpq_cmp_si_test;
  2425. const
  2426. N1 = -7;
  2427. D1 = 5;
  2428. var op1: mpq_t;
  2429. begin
  2430. mpq_init(op1);
  2431. mpq_set_si(op1, N1, D1);
  2432. assert(mpq_cmp_si(op1, N1, D1) = 0);
  2433. assert(mpq_cmp_si(op1, N1 - 1, D1) > 0);
  2434. assert(mpq_cmp_si(op1, N1 + 1, D1) < 0);
  2435. mpq_clear(op1);
  2436. end;
  2437. procedure TTestGmpBinding.mpq_cmp_ui_test;
  2438. const
  2439. N1 = 7;
  2440. D1 = 5;
  2441. var op1: mpq_t;
  2442. begin
  2443. mpq_init(op1);
  2444. mpq_set_si(op1, N1, D1);
  2445. assert(mpq_cmp_ui(op1, N1, D1) = 0);
  2446. assert(mpq_cmp_ui(op1, N1 - 1, D1) > 0);
  2447. assert(mpq_cmp_ui(op1, N1 + 1, D1) < 0);
  2448. mpq_clear(op1);
  2449. end;
  2450. procedure TTestGmpBinding.mpq_equal_test;
  2451. const
  2452. N1 = -7;
  2453. D1 = 5;
  2454. var op1, op2: mpq_t;
  2455. begin
  2456. mpq_init(op1);
  2457. mpq_init(op2);
  2458. mpq_set_si(op1, N1, D1);
  2459. mpq_set_si(op2, N1, D1);
  2460. assert(longbool(mpq_equal(op1, op2)));
  2461. mpq_set_si(op1, N1 + 1, D1);
  2462. assert(not longbool(mpq_equal(op1, op2)));
  2463. mpq_set_si(op1, N1 - 1, D1);
  2464. assert(not longbool(mpq_equal(op1, op2)));
  2465. mpq_clear(op1);
  2466. mpq_clear(op2);
  2467. end;
  2468. procedure TTestGmpBinding.mpq_get_num_test;
  2469. const
  2470. N1 = -7;
  2471. D1 = 5;
  2472. var
  2473. rational: mpq_t;
  2474. numerator: mpz_t;
  2475. begin
  2476. mpq_init(rational);
  2477. mpz_init(numerator);
  2478. mpq_set_si(rational, N1, D1);
  2479. mpq_get_num(numerator, rational);
  2480. assert(mpz_get_si(numerator) = N1);
  2481. mpq_clear(rational);
  2482. mpz_clear(numerator);
  2483. end;
  2484. procedure TTestGmpBinding.mpq_get_den_test;
  2485. const
  2486. N1 = -7;
  2487. D1 = 5;
  2488. var
  2489. rational: mpq_t;
  2490. denominator: mpz_t;
  2491. begin
  2492. mpq_init(rational);
  2493. mpz_init(denominator);
  2494. mpq_set_si(rational, N1, D1);
  2495. mpq_get_den(denominator, rational);
  2496. assert(mpz_get_si(denominator) = D1);
  2497. mpq_clear(rational);
  2498. mpz_clear(denominator);
  2499. end;
  2500. procedure TTestGmpBinding.mpq_set_num_test;
  2501. const
  2502. N1 = -7;
  2503. D1 = 5;
  2504. N2 = 3;
  2505. var
  2506. rational: mpq_t;
  2507. numerator: mpz_t;
  2508. begin
  2509. mpq_init(rational);
  2510. mpz_init_set_si(numerator, N2);
  2511. mpq_set_si(rational, N1, D1);
  2512. mpq_set_num(rational, numerator);
  2513. assert(mpq_cmp_si(rational, N2, D1) = 0);
  2514. mpq_clear(rational);
  2515. mpz_clear(numerator);
  2516. end;
  2517. procedure TTestGmpBinding.mpq_set_den_test;
  2518. const
  2519. N1 = -7;
  2520. D1 = 5;
  2521. D2 = 3;
  2522. var
  2523. rational: mpq_t;
  2524. denominator: mpz_t;
  2525. begin
  2526. mpq_init(rational);
  2527. mpz_init_set_si(denominator, D2);
  2528. mpq_set_si(rational, N1, D1);
  2529. mpq_set_den(rational, denominator);
  2530. assert(mpq_cmp_si(rational, N1, D2) = 0);
  2531. mpq_clear(rational);
  2532. mpz_clear(denominator);
  2533. end;
  2534. procedure TTestGmpBinding.mpf_get_default_prec_test;
  2535. begin
  2536. assert(mpf_get_default_prec > 0);
  2537. end;
  2538. procedure TTestGmpBinding.mpf_set_default_prec_test;
  2539. var prec: valuint;
  2540. begin
  2541. prec := mpf_get_default_prec;
  2542. mpf_set_default_prec(2 * prec);
  2543. assert(mpf_get_default_prec = 2 * prec);
  2544. mpf_set_default_prec(prec);
  2545. end;
  2546. procedure TTestGmpBinding.mpf_init_test;
  2547. var x: mpf_t;
  2548. begin
  2549. mpf_init(x);
  2550. assert(mpf_get_prec(x) = mpf_get_default_prec);
  2551. mpf_clear(x);
  2552. end;
  2553. procedure TTestGmpBinding.mpf_init2_test;
  2554. var x: mpf_t;
  2555. begin
  2556. mpf_init2(x, 2 * mpf_get_default_prec);
  2557. assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
  2558. mpf_clear(x);
  2559. end;
  2560. procedure TTestGmpBinding.mpf_clear_test;
  2561. var x: mpf_t;
  2562. begin
  2563. mpf_init(x);
  2564. mpf_clear(x);
  2565. end;
  2566. procedure TTestGmpBinding.mpf_get_prec_test;
  2567. var x: mpf_t;
  2568. begin
  2569. mpf_init(x);
  2570. mpf_set_prec(x, 2 * mpf_get_default_prec);
  2571. assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
  2572. mpf_clear(x);
  2573. end;
  2574. procedure TTestGmpBinding.mpf_set_prec_test;
  2575. var x: mpf_t;
  2576. begin
  2577. mpf_init(x);
  2578. mpf_set_prec(x, 2 * mpf_get_default_prec);
  2579. assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
  2580. mpf_clear(x);
  2581. end;
  2582. procedure TTestGmpBinding.mpf_set_prec_raw_test;
  2583. const N = 10;
  2584. var x: mpf_t;
  2585. begin
  2586. mpf_init2(x, N * mpf_get_default_prec);
  2587. mpf_set_prec_raw(x, mpf_get_default_prec);
  2588. mpf_set_prec_raw(x, N * mpf_get_default_prec);
  2589. mpf_clear(x);
  2590. end;
  2591. procedure TTestGmpBinding.mpf_set_q_test;
  2592. const OP_ = -10;
  2593. var
  2594. op: mpq_t;
  2595. rop: mpf_t;
  2596. begin
  2597. mpq_init(op);
  2598. mpf_init(rop);
  2599. mpq_set_si(op, OP_, 1);
  2600. mpf_set_q(rop, op);
  2601. assert(mpf_get_si(rop) = OP_);
  2602. mpf_clear(rop);
  2603. mpq_clear(op);
  2604. end;
  2605. procedure TTestGmpBinding.mpf_set_ui_test;
  2606. const OP = 1000000;
  2607. var rop: mpf_t;
  2608. begin
  2609. mpf_init(rop);
  2610. mpf_set_ui(rop, OP);
  2611. assert(mpf_get_ui(rop) = OP);
  2612. mpf_clear(rop);
  2613. end;
  2614. procedure TTestGmpBinding.mpf_get_ui_test;
  2615. const OP = 1000000;
  2616. var rop: mpf_t;
  2617. begin
  2618. mpf_init(rop);
  2619. mpf_set_ui(rop, OP);
  2620. assert(mpf_get_ui(rop) = OP);
  2621. mpf_clear(rop);
  2622. end;
  2623. procedure TTestGmpBinding.mpf_set_si_test;
  2624. const OP = -1000000;
  2625. var rop: mpf_t;
  2626. begin
  2627. mpf_init(rop);
  2628. mpf_set_si(rop, OP);
  2629. assert(mpf_get_si(rop) = OP);
  2630. mpf_clear(rop);
  2631. end;
  2632. procedure TTestGmpBinding.mpf_get_si_test;
  2633. const OP = -1000000;
  2634. var rop: mpf_t;
  2635. begin
  2636. mpf_init(rop);
  2637. mpf_set_si(rop, OP);
  2638. assert(mpf_get_si(rop) = OP);
  2639. mpf_clear(rop);
  2640. end;
  2641. procedure TTestGmpBinding.mpf_set_test;
  2642. const N = -1000000;
  2643. var rop, op: mpf_t;
  2644. begin
  2645. mpf_init(rop);
  2646. mpf_init_set_si(op, N);
  2647. mpf_set(rop, op);
  2648. assert(mpf_get_si(rop) = N);
  2649. mpf_clear(rop);
  2650. mpf_clear(op);
  2651. end;
  2652. procedure TTestGmpBinding.mpf_set_str_test;
  2653. const N = -123;
  2654. var rop: mpf_t;
  2655. begin
  2656. mpf_init(rop);
  2657. assert(mpf_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
  2658. assert(mpf_get_si(rop) = N);
  2659. mpf_clear(rop);
  2660. end;
  2661. procedure TTestGmpBinding.mpf_swap_test;
  2662. const
  2663. ROP_1 = -13;
  2664. ROP_2 = -23;
  2665. var rop1, rop2: mpf_t;
  2666. begin
  2667. mpf_init_set_si(rop1, ROP_1);
  2668. mpf_init_set_si(rop2, ROP_2);
  2669. mpf_swap(rop1, rop2);
  2670. assert(mpf_get_si(rop1) = ROP_2);
  2671. assert(mpf_get_si(rop2) = ROP_1);
  2672. mpf_clear(rop1);
  2673. mpf_clear(rop2);
  2674. end;
  2675. procedure TTestGmpBinding.mpf_get_d_test;
  2676. const N = -1.5;
  2677. var rop: mpf_t;
  2678. begin
  2679. mpf_init_set_d(rop, N);
  2680. assert(mpf_get_d(rop) = N);
  2681. mpf_clear(rop);
  2682. end;
  2683. procedure TTestGmpBinding.mpf_set_d_test;
  2684. const N = -1.5;
  2685. var rop: mpf_t;
  2686. begin
  2687. mpf_init(rop);
  2688. mpf_set_d(rop, N);
  2689. assert(mpf_get_d(rop) = N);
  2690. mpf_clear(rop);
  2691. end;
  2692. procedure TTestGmpBinding.mpf_setmpz_test;
  2693. const
  2694. OP_1 = -13;
  2695. var
  2696. rop: mpf_t;
  2697. op: mpz_t;
  2698. begin
  2699. mpf_init(rop);
  2700. mpz_init_set_si(op, OP_1);
  2701. mpf_set_z(rop, op);
  2702. assert(mpf_get_si(rop) = OP_1);
  2703. mpf_clear(rop);
  2704. mpz_clear(op);
  2705. end;
  2706. procedure TTestGmpBinding.mpf_get_d_2exp_test;
  2707. const
  2708. M = 0.5;
  2709. E = 4;
  2710. N = (1 shl E) div 2;
  2711. var
  2712. rop: mpf_t;
  2713. exp: valsint;
  2714. begin
  2715. mpf_init_set_d(rop, N);
  2716. exp := -1;
  2717. assert(mpf_get_d_2exp(exp, rop) = M);
  2718. assert(exp = E);
  2719. mpf_clear(rop);
  2720. end;
  2721. procedure TTestGmpBinding.mpf_get_str_test;
  2722. const
  2723. N = 3.1416;
  2724. S = '31416';
  2725. E = 1;
  2726. var
  2727. op: mpf_t;
  2728. p: pchar;
  2729. exp: mp_exp_t;
  2730. begin
  2731. mpf_init_set_d(op, N);
  2732. p := mpf_get_str(nil, exp, BASE10, length(S), op);
  2733. assert(p = S);
  2734. assert(exp = E);
  2735. freemem(p);
  2736. mpf_clear(op);
  2737. end;
  2738. procedure TTestGmpBinding.mpf_add_test;
  2739. const
  2740. OP1_ = 1;
  2741. OP2_ = 2;
  2742. var rop, op1, op2: mpf_t;
  2743. begin
  2744. mpf_init(rop);
  2745. mpf_init_set_d(op1, OP1_);
  2746. mpf_init_set_d(op2, OP2_);
  2747. mpf_add(rop, op1, op2);
  2748. assert(mpf_get_d(rop) = OP1_ + OP2_);
  2749. mpf_clear(rop);
  2750. mpf_clear(op1);
  2751. mpf_clear(op2);
  2752. end;
  2753. procedure TTestGmpBinding.mpf_add_ui_test;
  2754. const
  2755. OP1_ = 1;
  2756. OP2_ = 2;
  2757. var rop, op1: mpf_t;
  2758. begin
  2759. mpf_init(rop);
  2760. mpf_init_set_d(op1, OP1_);
  2761. mpf_add_ui(rop, op1, OP2_);
  2762. assert(mpf_get_d(rop) = OP1_ + OP2_);
  2763. mpf_clear(rop);
  2764. mpf_clear(op1);
  2765. end;
  2766. procedure TTestGmpBinding.mpf_sub_test;
  2767. const
  2768. OP1_ = 3;
  2769. OP2_ = 1;
  2770. var rop, op1, op2: mpf_t;
  2771. begin
  2772. mpf_init(rop);
  2773. mpf_init_set_d(op1, OP1_);
  2774. mpf_init_set_d(op2, OP2_);
  2775. mpf_sub(rop, op1, op2);
  2776. assert(mpf_get_d(rop) = OP1_ - OP2_);
  2777. mpf_clear(rop);
  2778. mpf_clear(op1);
  2779. mpf_clear(op2);
  2780. end;
  2781. procedure TTestGmpBinding.mpf_sub_ui_test;
  2782. const
  2783. OP1_ = 3;
  2784. OP2_ = 1;
  2785. var rop, op1: mpf_t;
  2786. begin
  2787. mpf_init(rop);
  2788. mpf_init_set_d(op1, OP1_);
  2789. mpf_sub_ui(rop, op1, OP2_);
  2790. assert(mpf_get_d(rop) = OP1_ - OP2_);
  2791. mpf_clear(rop);
  2792. mpf_clear(op1);
  2793. end;
  2794. procedure TTestGmpBinding.mpf_ui_sub_test;
  2795. const
  2796. OP1_ = 3;
  2797. OP2_ = 1;
  2798. var rop, op2: mpf_t;
  2799. begin
  2800. mpf_init(rop);
  2801. mpf_init_set_d(op2, OP2_);
  2802. mpf_ui_sub(rop, OP1_, op2);
  2803. assert(mpf_get_d(rop) = OP1_ - OP2_);
  2804. mpf_clear(rop);
  2805. mpf_clear(op2);
  2806. end;
  2807. procedure TTestGmpBinding.mpf_mul_test;
  2808. const
  2809. OP1_ = 2;
  2810. OP2_ = 3;
  2811. var rop, op1, op2: mpf_t;
  2812. begin
  2813. mpf_init(rop);
  2814. mpf_init_set_d(op1, OP1_);
  2815. mpf_init_set_d(op2, OP2_);
  2816. mpf_mul(rop, op1, op2);
  2817. assert(mpf_get_d(rop) = OP1_ * OP2_);
  2818. mpf_clear(rop);
  2819. mpf_clear(op1);
  2820. mpf_clear(op2);
  2821. end;
  2822. procedure TTestGmpBinding.mpf_mul_ui_test;
  2823. const
  2824. OP1_ = 2;
  2825. OP2_ = 3;
  2826. var rop, op1: mpf_t;
  2827. begin
  2828. mpf_init(rop);
  2829. mpf_init_set_d(op1, OP1_);
  2830. mpf_mul_ui(rop, op1, OP2_);
  2831. assert(mpf_get_d(rop) = OP1_ * OP2_);
  2832. mpf_clear(rop);
  2833. mpf_clear(op1);
  2834. end;
  2835. procedure TTestGmpBinding.mpf_mul_2exp_test;
  2836. const
  2837. OP1_ = 3;
  2838. OP2_ = 4;
  2839. var rop, op1: mpf_t;
  2840. begin
  2841. mpf_init(rop);
  2842. mpf_init_set_d(op1, OP1_);
  2843. mpf_mul_2exp(rop, op1, OP2_);
  2844. assert(mpf_get_d(rop) = OP1_ * (1 shl OP2_));
  2845. mpf_clear(rop);
  2846. mpf_clear(op1);
  2847. end;
  2848. procedure TTestGmpBinding.mpf_div_test;
  2849. const
  2850. OP1_ = 6;
  2851. OP2_ = 2;
  2852. var rop, op1, op2: mpf_t;
  2853. begin
  2854. mpf_init(rop);
  2855. mpf_init_set_d(op1, OP1_);
  2856. mpf_init_set_d(op2, OP2_);
  2857. mpf_div(rop, op1, op2);
  2858. assert(mpf_get_d(rop) = OP1_ / OP2_);
  2859. mpf_clear(rop);
  2860. mpf_clear(op1);
  2861. mpf_clear(op2);
  2862. end;
  2863. procedure TTestGmpBinding.mpf_div_ui_test;
  2864. const
  2865. OP1_ = 6;
  2866. OP2_ = 2;
  2867. var rop, op1: mpf_t;
  2868. begin
  2869. mpf_init(rop);
  2870. mpf_init_set_d(op1, OP1_);
  2871. mpf_div_ui(rop, op1, OP2_);
  2872. assert(mpf_get_d(rop) = OP1_ / OP2_);
  2873. mpf_clear(rop);
  2874. mpf_clear(op1);
  2875. end;
  2876. procedure TTestGmpBinding.mpf_ui_div_test;
  2877. const
  2878. OP1_ = 6;
  2879. OP2_ = 2;
  2880. var rop, op2: mpf_t;
  2881. begin
  2882. mpf_init(rop);
  2883. mpf_init_set_si(op2, OP2_);
  2884. mpf_ui_div(rop, OP1_, op2);
  2885. assert(mpf_get_d(rop) = OP1_ / OP2_);
  2886. mpf_clear(rop);
  2887. mpf_clear(op2);
  2888. end;
  2889. procedure TTestGmpBinding.mpf_div_2exp_test;
  2890. const
  2891. OP1_ = 16;
  2892. OP2_ = 2;
  2893. var rop, op1: mpf_t;
  2894. begin
  2895. mpf_init(rop);
  2896. mpf_init_set_d(op1, OP1_);
  2897. mpf_div_2exp(rop, op1, OP2_);
  2898. assert(mpf_get_d(rop) = OP1_ / (1 shl OP2_));
  2899. mpf_clear(rop);
  2900. mpf_clear(op1);
  2901. end;
  2902. procedure TTestGmpBinding.mpf_sqrt_test;
  2903. const
  2904. OP_ = 4;
  2905. var rop, op: mpf_t;
  2906. begin
  2907. mpf_init(rop);
  2908. mpf_init_set_d(op, OP_);
  2909. mpf_sqrt(rop, op);
  2910. assert(mpf_get_d(rop) = sqrt(OP_));
  2911. mpf_clear(rop);
  2912. mpf_clear(op);
  2913. end;
  2914. procedure TTestGmpBinding.mpf_sqrt_ui_test;
  2915. const
  2916. OP_ = 4;
  2917. var rop: mpf_t;
  2918. begin
  2919. mpf_init(rop);
  2920. mpf_sqrt_ui(rop, OP_);
  2921. assert(mpf_get_d(rop) = sqrt(OP_));
  2922. mpf_clear(rop);
  2923. end;
  2924. procedure TTestGmpBinding.mpf_pow_ui_test;
  2925. const
  2926. OP1_ = 3;
  2927. OP2_ = 2;
  2928. var rop, op1: mpf_t;
  2929. begin
  2930. mpf_init(rop);
  2931. mpf_init_set_d(op1, OP1_);
  2932. mpf_pow_ui(rop, op1, OP2_);
  2933. assert(mpf_get_d(rop) = OP1_ ** OP2_);
  2934. mpf_clear(rop);
  2935. mpf_clear(op1);
  2936. end;
  2937. procedure TTestGmpBinding.mpf_neg_test;
  2938. const
  2939. OP_ = 4;
  2940. var rop, op: mpf_t;
  2941. begin
  2942. mpf_init(rop);
  2943. mpf_init_set_d(op, OP_);
  2944. mpf_neg(rop, op);
  2945. assert(mpf_get_d(rop) = -OP_);
  2946. mpf_clear(rop);
  2947. mpf_clear(op);
  2948. end;
  2949. procedure TTestGmpBinding.mpf_abs_test;
  2950. const OP_ = -4;
  2951. var rop, op: mpf_t;
  2952. begin
  2953. mpf_init(rop);
  2954. mpf_init_set_d(op, OP_);
  2955. mpf_abs(rop, op);
  2956. assert(mpf_get_d(rop) = -OP_);
  2957. mpf_clear(rop);
  2958. mpf_clear(op);
  2959. end;
  2960. procedure TTestGmpBinding.mpf_cmp_test;
  2961. const OP_1 = -10;
  2962. var op1, op2: mpf_t;
  2963. begin
  2964. mpf_init_set_si(op1, OP_1);
  2965. mpf_init_set_si(op2, OP_1);
  2966. assert(mpf_cmp(op1, op2) = 0);
  2967. mpf_set_si(op2, OP_1 + 1);
  2968. assert(mpf_cmp(op1, op2) < 0);
  2969. mpf_set_si(op2, OP_1 - 1);
  2970. assert(mpf_cmp(op1, op2) > 0);
  2971. mpf_clear(op1);
  2972. mpf_clear(op2);
  2973. end;
  2974. procedure TTestGmpBinding.mpf_cmp_d_test;
  2975. const OP_ = -10;
  2976. var op: mpf_t;
  2977. begin
  2978. mpf_init_set_si(op, OP_);
  2979. assert(mpf_cmp_d(op, OP_) = 0);
  2980. assert(mpf_cmp_d(op, OP_ + 1) < 0);
  2981. assert(mpf_cmp_d(op, OP_ - 1) > 0);
  2982. mpf_clear(op);
  2983. end;
  2984. procedure TTestGmpBinding.mpf_cmp_si_test;
  2985. const OP_ = -10;
  2986. var op: mpf_t;
  2987. begin
  2988. mpf_init_set_si(op, OP_);
  2989. assert(mpf_cmp_si(op, OP_) = 0);
  2990. assert(mpf_cmp_si(op, OP_ + 1) < 0);
  2991. assert(mpf_cmp_si(op, OP_ - 1) > 0);
  2992. mpf_clear(op);
  2993. end;
  2994. procedure TTestGmpBinding.mpf_cmp_ui_test;
  2995. const OP_ = 10;
  2996. var op: mpf_t;
  2997. begin
  2998. mpf_init_set_si(op, OP_);
  2999. assert(mpf_cmp_ui(op, OP_) = 0);
  3000. assert(mpf_cmp_ui(op, OP_ + 1) < 0);
  3001. assert(mpf_cmp_ui(op, OP_ - 1) > 0);
  3002. mpf_clear(op);
  3003. end;
  3004. procedure TTestGmpBinding.mpf_eq_test;
  3005. const
  3006. OP_1 = 10;
  3007. OP_3 = 8;
  3008. var op1, op2: mpf_t;
  3009. begin
  3010. mpf_init_set_si(op1, OP_1);
  3011. mpf_init_set_si(op2, OP_1);
  3012. assert(mpf_eq(op1, op2, OP_3) <> 0);
  3013. mpf_clear(op1);
  3014. mpf_clear(op2);
  3015. end;
  3016. procedure TTestGmpBinding.mpf_reldiff_test;
  3017. const
  3018. OP1_ = 4;
  3019. OP2_ = 2;
  3020. var rop, op1, op2: mpf_t;
  3021. begin
  3022. mpf_init(rop);
  3023. mpf_init_set_d(op1, OP1_);
  3024. mpf_init_set_d(op2, OP2_);
  3025. mpf_reldiff(rop, op1, op2);
  3026. assert(mpf_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
  3027. mpf_clear(rop);
  3028. mpf_clear(op1);
  3029. mpf_clear(op2);
  3030. end;
  3031. procedure TTestGmpBinding.mpf_ceil_test;
  3032. const N = 3.1;
  3033. var rop, op: mpf_t;
  3034. begin
  3035. mpf_init(rop);
  3036. mpf_init_set_d(op, N);
  3037. mpf_ceil(rop, op);
  3038. assert(mpf_get_d(rop) = ceil(N));
  3039. mpf_clear(rop);
  3040. mpf_clear(op);
  3041. end;
  3042. procedure TTestGmpBinding.mpf_floor_test;
  3043. const N = 3.9;
  3044. var rop, op: mpf_t;
  3045. begin
  3046. mpf_init(rop);
  3047. mpf_init_set_d(op, N);
  3048. mpf_floor(rop, op);
  3049. assert(mpf_get_d(rop) = floor(N));
  3050. mpf_clear(rop);
  3051. mpf_clear(op);
  3052. end;
  3053. procedure TTestGmpBinding.mpf_trunc_test;
  3054. const N = -3.9;
  3055. var rop, op: mpf_t;
  3056. begin
  3057. mpf_init(rop);
  3058. mpf_init_set_d(op, N);
  3059. mpf_trunc(rop, op);
  3060. assert(mpf_get_d(rop) = trunc(N));
  3061. mpf_clear(rop);
  3062. mpf_clear(op);
  3063. end;
  3064. procedure TTestGmpBinding.mpf_integer_p_test;
  3065. const
  3066. N1 = 10;
  3067. N2 = 10.1;
  3068. var op: mpf_t;
  3069. begin
  3070. mpf_init_set_si(op, N1);
  3071. assert(longbool(mpf_integer_p(op)));
  3072. mpf_set_d(op, N2);
  3073. assert(not longbool(mpf_integer_p(op)));
  3074. mpf_clear(op);
  3075. end;
  3076. procedure TTestGmpBinding.mpf_fits_ushort_p_test;
  3077. var op: mpf_t;
  3078. begin
  3079. mpf_init_set_ui(op, high(word));
  3080. assert(longbool(mpf_fits_ushort_p(op)));
  3081. mpf_add_ui(op, op, 1);
  3082. assert(not longbool(mpf_fits_ushort_p(op)));
  3083. mpf_clear(op);
  3084. end;
  3085. procedure TTestGmpBinding.mpf_fits_sshort_p_test;
  3086. var op: mpf_t;
  3087. begin
  3088. mpf_init_set_ui(op, high(smallint));
  3089. assert(longbool(mpf_fits_sshort_p(op)));
  3090. mpf_add_ui(op, op, 1);
  3091. assert(not longbool(mpf_fits_sshort_p(op)));
  3092. mpf_clear(op);
  3093. end;
  3094. procedure TTestGmpBinding.mpf_fits_uint_p_test;
  3095. var op: mpf_t;
  3096. begin
  3097. mpf_init_set_ui(op, high(cardinal));
  3098. assert(longbool(mpf_fits_uint_p(op)));
  3099. mpf_add_ui(op, op, 1);
  3100. assert(not longbool(mpf_fits_uint_p(op)));
  3101. mpf_clear(op);
  3102. end;
  3103. procedure TTestGmpBinding.mpf_fits_sint_p_test;
  3104. var op: mpf_t;
  3105. begin
  3106. mpf_init_set_ui(op, high(integer));
  3107. assert(longbool(mpf_fits_sint_p(op)));
  3108. mpf_add_ui(op, op, 1);
  3109. assert(not longbool(mpf_fits_sint_p(op)));
  3110. mpf_clear(op);
  3111. end;
  3112. procedure TTestGmpBinding.mpf_fits_ulong_p_test;
  3113. var op: mpf_t;
  3114. begin
  3115. mpf_init_set_ui(op, high(valuint));
  3116. assert(longbool(mpf_fits_ulong_p(op)));
  3117. mpf_add_ui(op, op, 1);
  3118. assert(not longbool(mpf_fits_ulong_p(op)));
  3119. mpf_clear(op);
  3120. end;
  3121. procedure TTestGmpBinding.mpf_fits_slong_p_test;
  3122. var op: mpf_t;
  3123. begin
  3124. mpf_init_set_ui(op, high(valsint));
  3125. assert(longbool(mpf_fits_slong_p(op)));
  3126. mpf_add_ui(op, op, 1);
  3127. assert(not longbool(mpf_fits_slong_p(op)));
  3128. mpf_clear(op);
  3129. end;
  3130. procedure TTestGmpBinding.mpf_urandomb_test;
  3131. const NBITS = 100;
  3132. var
  3133. rop: mpf_t;
  3134. state: randstate_t;
  3135. cmp: longint;
  3136. begin
  3137. mp_randinit_default(state);
  3138. mpf_init(rop);
  3139. mpf_urandomb(rop, state, NBITS);
  3140. cmp := mpf_cmp_ui(rop, 0);
  3141. assert(cmp >= 0);
  3142. assert(mpf_cmp_ui(rop, 1) < 0);
  3143. mpf_clear(rop);
  3144. mp_randclear(state);
  3145. end;
  3146. procedure TTestGmpBinding.mpf_random2_test;
  3147. var
  3148. rop: mpf_t;
  3149. begin
  3150. mpf_init(rop);
  3151. mpf_random2(rop, 1, 1);
  3152. mpf_clear(rop);
  3153. end;
  3154. procedure TTestGmpBinding.mpf_init_set_test;
  3155. const N = -1000000;
  3156. var rop, op: mpf_t;
  3157. begin
  3158. mpf_init_set_si(op, N);
  3159. mpf_init_set(rop, op);
  3160. assert(mpf_get_si(rop) = N);
  3161. mpf_clear(rop);
  3162. mpf_clear(op);
  3163. end;
  3164. procedure TTestGmpBinding.mpf_init_set_d_test;
  3165. const N = -1.5;
  3166. var rop: mpf_t;
  3167. begin
  3168. mpf_init_set_d(rop, N);
  3169. assert(mpf_get_d(rop) = N);
  3170. mpf_clear(rop);
  3171. end;
  3172. procedure TTestGmpBinding.mpf_init_set_si_test;
  3173. const N = -5;
  3174. var rop: mpf_t;
  3175. begin
  3176. mpf_init_set_si(rop, N);
  3177. assert(mpf_get_si(rop) = N);
  3178. mpf_clear(rop);
  3179. end;
  3180. procedure TTestGmpBinding.mpf_init_set_str_test;
  3181. const N = -123;
  3182. var rop: mpf_t;
  3183. begin
  3184. mpf_init_set_str(rop, pchar(inttostr(N)), BASE10);
  3185. assert(mpf_get_si(rop) = N);
  3186. mpf_clear(rop);
  3187. end;
  3188. procedure TTestGmpBinding.mpf_init_set_ui_test;
  3189. const N = 5;
  3190. var rop: mpf_t;
  3191. begin
  3192. mpf_init_set_ui(rop, N);
  3193. assert(mpf_get_ui(rop) = N);
  3194. mpf_clear(rop);
  3195. end;
  3196. procedure TTestGmpBinding.mpn_add_n_test;
  3197. var
  3198. rop, s1, s2: mp_limb_t;
  3199. begin
  3200. s1 := high(mp_limb_t);
  3201. s2 := s1;
  3202. rop := 2;
  3203. assert(mpn_add_n(@rop, @s1, @s2, 1) = 1);
  3204. assert(rop = high(mp_limb_t) - 1);
  3205. end;
  3206. procedure TTestGmpBinding.mpn_add_1_test;
  3207. var
  3208. rop, s1: mp_limb_t;
  3209. begin
  3210. s1 := high(mp_limb_t);
  3211. rop := 2;
  3212. assert(mpn_add_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
  3213. assert(rop = high(mp_limb_t) - 1);
  3214. end;
  3215. procedure TTestGmpBinding.mpn_add_test;
  3216. var
  3217. rop, s1, s2: mp_limb_t;
  3218. begin
  3219. s1 := high(mp_limb_t);
  3220. s2 := s1;
  3221. rop := 2;
  3222. assert(mpn_add(@rop, @s1, 1, @s2, 1) = 1);
  3223. assert(rop = high(mp_limb_t) - 1);
  3224. end;
  3225. procedure TTestGmpBinding.mpn_sub_n_test;
  3226. var
  3227. rop, s1, s2: mp_limb_t;
  3228. begin
  3229. s1 := 0;
  3230. s2 := high(mp_limb_t);
  3231. rop := 2;
  3232. assert(mpn_sub_n(@rop, @s1, @s2, 1) = 1);
  3233. assert(rop = 1);
  3234. end;
  3235. procedure TTestGmpBinding.mpn_sub_1_test;
  3236. var
  3237. rop, s1: mp_limb_t;
  3238. begin
  3239. s1 := 0;
  3240. rop := 2;
  3241. assert(mpn_sub_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
  3242. assert(rop = 1);
  3243. end;
  3244. procedure TTestGmpBinding.mpn_sub_test;
  3245. var
  3246. rop, s1, s2: mp_limb_t;
  3247. begin
  3248. s1 := 0;
  3249. s2 := high(mp_limb_t);
  3250. rop := 2;
  3251. assert(mpn_sub(@rop, @s1, 1, @s2, 1) = 1);
  3252. assert(rop = 1);
  3253. end;
  3254. procedure TTestGmpBinding.mpn_mul_n_test;
  3255. var
  3256. rop: array[0..1] of mp_limb_t;
  3257. s1, s2: mp_limb_t;
  3258. begin
  3259. s1 := high(mp_limb_t);
  3260. s2 := s1;
  3261. mpn_mul_n(@rop, @s1, @s2, 1);
  3262. assert(rop[0] = 1);
  3263. assert(rop[1] = high(mp_limb_t) - 1);
  3264. end;
  3265. procedure TTestGmpBinding.mpn_mul_1_test;
  3266. var
  3267. rop: array[0..1] of mp_limb_t;
  3268. s1: mp_limb_t;
  3269. begin
  3270. s1 := high(mp_limb_t);
  3271. assert(mpn_mul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
  3272. assert(rop[0] = 1);
  3273. end;
  3274. procedure TTestGmpBinding.mpn_mul_test;
  3275. var
  3276. rop: array[0..1] of mp_limb_t;
  3277. s1, s2: mp_limb_t;
  3278. begin
  3279. s1 := high(mp_limb_t);
  3280. s2 := s1;
  3281. assert(mpn_mul(@rop, @s1, 1, @s2, 1) = high(mp_limb_t) - 1);
  3282. assert(rop[0] = 1);
  3283. assert(rop[1] = high(mp_limb_t) - 1);
  3284. end;
  3285. procedure TTestGmpBinding.mpn_addmul_1_test;
  3286. var
  3287. rop: array[0..1] of mp_limb_t;
  3288. s1: mp_limb_t;
  3289. begin
  3290. rop[0] := 1;
  3291. rop[1] := 0;
  3292. s1 := high(mp_limb_t);
  3293. assert(mpn_addmul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
  3294. assert(rop[0] = 2);
  3295. end;
  3296. procedure TTestGmpBinding.mpn_submul_1_test;
  3297. var
  3298. rop: array[0..1] of mp_limb_t;
  3299. s1: mp_limb_t;
  3300. begin
  3301. rop[0] := 1;
  3302. rop[1] := 0;
  3303. s1 := high(mp_limb_t);
  3304. assert(mpn_submul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
  3305. assert(rop[0] = 0);
  3306. end;
  3307. procedure TTestGmpBinding.mpn_tdiv_qr_test;
  3308. const
  3309. N_ = 19;
  3310. D_ = 4;
  3311. var
  3312. q, r: array[0..1] of mp_limb_t;
  3313. n, d: mp_limb_t;
  3314. begin
  3315. n := N_;
  3316. d := D_;
  3317. q[0] := 0;
  3318. q[1] := 0;
  3319. r[0] := 0;
  3320. r[1] := 0;
  3321. mpn_tdiv_qr(@q, @r, 0, @n, 1, @d, 1);
  3322. assert(q[0] = N_ div D_);
  3323. assert(r[0] = N_ mod D_);
  3324. end;
  3325. procedure TTestGmpBinding.mpn_divrem_1_test;
  3326. const
  3327. N_ = 19;
  3328. D_ = 4;
  3329. var r1, s2: mp_limb_t;
  3330. begin
  3331. r1 := 0;
  3332. s2 := N_;
  3333. assert(mpn_divrem_1(@r1, 0, @s2, 1, D_) = N_ mod D_);
  3334. assert(r1 = N_ div D_);
  3335. end;
  3336. procedure TTestGmpBinding.mpn_divexact_by3c_test;
  3337. const
  3338. K = 3;
  3339. N_ = 17;
  3340. var r, s: mp_limb_t;
  3341. begin
  3342. r := 0;
  3343. s := K * N_;
  3344. assert(mpn_divexact_by3c(@r, @s, 1, 0) = 0);
  3345. assert(r = N_);
  3346. s := K * N_ + 1;
  3347. assert(mpn_divexact_by3c(@r, @s, 1, 0) <> 0);
  3348. end;
  3349. procedure TTestGmpBinding.mpn_mod_1_test;
  3350. const
  3351. N_ = 19;
  3352. D_ = 4;
  3353. var s1: mp_limb_t;
  3354. begin
  3355. s1 := N_;
  3356. assert(mpn_mod_1(@s1, 1, D_) = N_ mod D_);
  3357. end;
  3358. procedure TTestGmpBinding.mpn_lshift_test;
  3359. var r, s: mp_limb_t;
  3360. begin
  3361. r := 0;
  3362. s := high(mp_limb_t);
  3363. assert(mpn_lshift(@r, @s, 1, 1) = 1);
  3364. assert(r = high(mp_limb_t) - 1);
  3365. end;
  3366. procedure TTestGmpBinding.mpn_rshift_test;
  3367. var r, s: mp_limb_t;
  3368. begin
  3369. r := 0;
  3370. s := high(mp_limb_t);
  3371. assert(mpn_rshift(@r, @s, 1, 1) = valuint(1) shl (bits_per_limb - 1));
  3372. assert(r = high(mp_limb_t) shr 1);
  3373. end;
  3374. procedure TTestGmpBinding.mpn_cmp_test;
  3375. const S1_ = 10;
  3376. var s1, s2: mp_limb_t;
  3377. begin
  3378. s1 := S1_;
  3379. S2 := S1_;
  3380. assert(mpn_cmp(@s1, @s2, 1) = 0);
  3381. S2 := S1_ - 1;
  3382. assert(mpn_cmp(@s1, @s2, 1) > 0);
  3383. S2 := S1_ + 1;
  3384. assert(mpn_cmp(@s1, @s2, 1) < 0);
  3385. end;
  3386. procedure TTestGmpBinding.mpn_gcd_test;
  3387. const
  3388. S1_ = 30;
  3389. S2_ = 105;
  3390. RP_ = 15;
  3391. var r, s1, s2: mp_limb_t;
  3392. begin
  3393. s1 := S1_;
  3394. s2 := S2_;
  3395. r := 0;
  3396. assert(mpn_gcd(@r, @s1, 1, @s2, 1) = 1);
  3397. assert(r = RP_);
  3398. end;
  3399. procedure TTestGmpBinding.mpn_gcd_1_test;
  3400. const
  3401. S1_ = 30;
  3402. S2_ = 105;
  3403. R_ = 15;
  3404. var s1: mp_limb_t;
  3405. begin
  3406. s1 := S1_;
  3407. assert(mpn_gcd_1(@s1, 1, S2_) = R_);
  3408. end;
  3409. procedure TTestGmpBinding.mpn_gcdext_test;
  3410. const
  3411. S1_ = 3 * 5;
  3412. S2_ = 2 * 3;
  3413. R1_ = 3;
  3414. var
  3415. r1, r2, s1, s2: array[0..1] of mp_limb_t;
  3416. r2n: mp_size_t;
  3417. k: valsint;
  3418. begin
  3419. s1[0] := S1_;
  3420. s1[1] := 0;
  3421. s2[0] := S2_;
  3422. s2[1] := 0;
  3423. assert(mpn_gcdext(@r1, @r2, r2n, @s1, 1, @s2, 1) = 1);
  3424. assert(r2n = 1);
  3425. assert(r1[0] = R1_);
  3426. k := (valsint(r1[0]) - valsint(r2[0]) * valsint(s1[0])) div valsint(s2[0]);
  3427. assert(valsint(r1[0]) = valsint(r2[0]) * valsint(s1[0]) + k * valsint(s2[0]));
  3428. end;
  3429. procedure TTestGmpBinding.mpn_sqrtrem_test;
  3430. const
  3431. ROOT = 3;
  3432. var r1, r2, s: mp_limb_t;
  3433. begin
  3434. s := ROOT ** 2 + ROOT - 1;
  3435. assert(mpn_sqrtrem(@r1, @r2, @s, 1) = 1);
  3436. assert(r1 = ROOT);
  3437. assert(r2 = ROOT - 1);
  3438. end;
  3439. procedure TTestGmpBinding.mpn_get_str_test;
  3440. const N = uint64($FEDCBA9876543210);
  3441. var
  3442. str: array[0..2 * sizeof(mp_limb_t)] of byte;
  3443. s1: mp_limb_t;
  3444. i: integer;
  3445. begin
  3446. s1 := N and (high(mp_limb_t) - 1);
  3447. assert(mpn_get_str(@str, BASE16, @s1, 1) = high(str));
  3448. for i := 0 to high(str) - 1 do
  3449. assert(str[i] = high(str) - i - 1);
  3450. end;
  3451. procedure TTestGmpBinding.mpn_set_str_test;
  3452. const N = uint64($FEDCBA9876543210);
  3453. var
  3454. r: mp_limb_t;
  3455. str: array[0..2 * sizeof(mp_limb_t)] of byte;
  3456. i: integer;
  3457. begin
  3458. for i := 0 to high(str) - 1 do
  3459. str[i] := high(str) - i - 1;
  3460. assert(mpn_set_str(@r, @str, high(str), BASE16) = 1);
  3461. assert(r = N and (high(mp_limb_t) - 1));
  3462. end;
  3463. procedure TTestGmpBinding.mpn_scan0_test;
  3464. const
  3465. S1_ = $F75;
  3466. STARTING_BIT = 4;
  3467. N = 7;
  3468. var s1: mp_limb_t;
  3469. begin
  3470. s1 := S1_;
  3471. assert(mpn_scan0(@s1, STARTING_BIT) = N);
  3472. end;
  3473. procedure TTestGmpBinding.mpn_scan1_test;
  3474. const
  3475. S1_ = $85;
  3476. STARTING_BIT = 4;
  3477. N = 7;
  3478. var s1: mp_limb_t;
  3479. begin
  3480. s1 := S1_;
  3481. assert(mpn_scan1(@s1, STARTING_BIT) = N);
  3482. end;
  3483. procedure TTestGmpBinding.mpn_popcount_test;
  3484. const
  3485. S1_ = $55AA;
  3486. N = 8;
  3487. var s1: mp_limb_t;
  3488. begin
  3489. s1 := S1_;
  3490. assert(mpn_popcount(@s1, 1) = N);
  3491. end;
  3492. procedure TTestGmpBinding.mpn_hamdist_test;
  3493. const
  3494. S1_ = $55;
  3495. S2_ = $7A;
  3496. N = 5;
  3497. var s1, s2: mp_limb_t;
  3498. begin
  3499. s1 := S1_;
  3500. s2 := S2_;
  3501. assert(mpn_hamdist(@s1, @s2, 1) = N);
  3502. end;
  3503. procedure TTestGmpBinding.mpn_perfect_square_p_test;
  3504. const ROOT = 3;
  3505. var s1: mp_limb_t;
  3506. begin
  3507. s1 := ROOT ** 2;
  3508. assert(mpn_perfect_square_p(@s1, 1) <> 0);
  3509. s1 := s1 or 2;
  3510. assert(mpn_perfect_square_p(@s1, 1) = 0);
  3511. end;
  3512. procedure TTestGmpBinding.mpn_random_test;
  3513. var r1: array[0..2] of mp_limb_t;
  3514. begin
  3515. mpn_random(@r1, high(r1) + 1);
  3516. assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
  3517. end;
  3518. procedure TTestGmpBinding.mpn_random2_test;
  3519. var r1: array[0..2] of mp_limb_t;
  3520. begin
  3521. mpn_random2(@r1, high(r1) + 1);
  3522. assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
  3523. end;
  3524. procedure TTestGmpBinding.bits_per_limb_test;
  3525. begin
  3526. assert(bits_per_limb = 8 * sizeof(mp_limb_t));
  3527. end;
  3528. procedure TTestGmpBinding.version_test;
  3529. function isvernum(s: string; first, last: integer): boolean;
  3530. var i: integer;
  3531. begin
  3532. i := strtointdef(copy(s, first, last - first + 1), -1);
  3533. result := i >= 0;
  3534. end;
  3535. const DOT = '.';
  3536. var
  3537. v: string;
  3538. dot1, dot2: integer;
  3539. begin
  3540. v := version;
  3541. dot1 := pos(DOT, v);
  3542. assert(dot1 <> 0);
  3543. dot2 := posex(DOT, v, dot1 + 1);
  3544. assert(dot2 <> 0);
  3545. assert(isvernum(v, 1, dot1 - 1));
  3546. assert(isvernum(v, dot1 + 1, dot2 - 1));
  3547. assert(isvernum(v, dot2 + 1, length(v)));
  3548. end;
  3549. { TTestGmpExtensions }
  3550. procedure TTestGmpExtensions.randinit_default_test;
  3551. var state: MPRandState;
  3552. begin
  3553. randinit_default(state);
  3554. assert(rnd_test(state.Ptr^));
  3555. end;
  3556. procedure TTestGmpExtensions.randinit_mt_test;
  3557. var state: MPRandState;
  3558. begin
  3559. randinit_mt(state);
  3560. assert(rnd_test(state.Ptr^));
  3561. end;
  3562. procedure TTestGmpExtensions.randinit_lc_2exp_test;
  3563. const
  3564. A_ = 3;
  3565. C = 5;
  3566. M2EXP = 8;
  3567. var
  3568. state: MPRandState;
  3569. a: MPInteger;
  3570. begin
  3571. z_init_set_ui(a, A_);
  3572. randinit_lc_2exp(state, a, C, M2EXP);
  3573. assert(rnd_test(state.Ptr^));
  3574. end;
  3575. procedure TTestGmpExtensions.randinit_lc_2exp_size_test;
  3576. var state: MPRandState;
  3577. begin
  3578. assert(randinit_lc_2exp_size(state, 0));
  3579. assert(rnd_test(state.Ptr^));
  3580. end;
  3581. procedure TTestGmpExtensions.randinit_set_test;
  3582. var rop, op: MPRandState;
  3583. begin
  3584. randinit_default(op);
  3585. randinit_set(rop, op);
  3586. assert(rnd_test(rop.Ptr^));
  3587. end;
  3588. procedure TTestGmpExtensions.randclear_test;
  3589. var state: MPRandState;
  3590. begin
  3591. randinit_default(state);
  3592. randclear(state);
  3593. end;
  3594. procedure TTestGmpExtensions.randseed_test;
  3595. var
  3596. state: MPRandState;
  3597. seed: MPInteger;
  3598. begin
  3599. randinit_default(state);
  3600. z_init_set_ui(seed, 0);
  3601. randseed(state, seed);
  3602. end;
  3603. procedure TTestGmpExtensions.randseed_ui_test;
  3604. var state: MPRandState;
  3605. begin
  3606. randinit_default(state);
  3607. randseed_ui(state, 0);
  3608. end;
  3609. procedure TTestGmpExtensions.urandomb_ui_test;
  3610. const
  3611. B = 8 * (sizeof(valuint) - 1);
  3612. N = 1 shl B;
  3613. var
  3614. state: MPRandState;
  3615. r1, r2, r3: valuint;
  3616. begin
  3617. randinit_default(state);
  3618. r1 := urandomb_ui(state, B);
  3619. r2 := urandomb_ui(state, B);
  3620. r3 := urandomb_ui(state, B);
  3621. assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
  3622. end;
  3623. procedure TTestGmpExtensions.urandomm_ui_test;
  3624. const N = high(valuint);
  3625. var
  3626. state: MPRandState;
  3627. r1, r2, r3: valuint;
  3628. begin
  3629. randinit_default(state);
  3630. r1 := urandomm_ui(state, N);
  3631. r2 := urandomm_ui(state, N);
  3632. r3 := urandomm_ui(state, N);
  3633. assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
  3634. end;
  3635. //procedure TTestGmpExtensions.asprintf_test;
  3636. //const
  3637. // N = 123456;
  3638. // S = '123456';
  3639. //var
  3640. // z: MPInteger;
  3641. // p: pchar;
  3642. //begin
  3643. // z_init_set_ui(z, N);
  3644. // assert(asprintf(p, Z_FMT, [@z]) = length(S));
  3645. // assert(p = S);
  3646. // freemem(p);
  3647. // z_clear(z);
  3648. //end;
  3649. //
  3650. //procedure TTestGmpExtensions.asprintf_test2;
  3651. //const
  3652. // N = 123456;
  3653. // S = '123456';
  3654. //var
  3655. // z: MPInteger;
  3656. // p: pchar;
  3657. //begin
  3658. // z_init_set_ui(z, N);
  3659. // assert(asprintf(p, Z_FMT, @z) = length(S));
  3660. // assert(p = S);
  3661. // freemem(p);
  3662. // z_clear(z);
  3663. //end;
  3664. //
  3665. //procedure TTestGmpExtensions.snprintf_test;
  3666. //const
  3667. // N = 123456;
  3668. // S = '123456';
  3669. //var
  3670. // z: MPInteger;
  3671. // buf: pchar;
  3672. //begin
  3673. // z_init_set_ui(z, N);
  3674. // getmem(buf, length(S) + 1);
  3675. // assert(snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
  3676. // assert(buf = S);
  3677. // freemem(buf);
  3678. // z_clear(z);
  3679. //end;
  3680. //
  3681. //procedure TTestGmpExtensions.snprintf_test2;
  3682. //const
  3683. // N = 123456;
  3684. // S = '123456';
  3685. //var
  3686. // z: MPInteger;
  3687. // buf: pchar;
  3688. //begin
  3689. // z_init_set_ui(z, N);
  3690. // getmem(buf, length(S) + 1);
  3691. // assert(snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
  3692. // assert(buf = S);
  3693. // freemem(buf);
  3694. // z_clear(z);
  3695. //end;
  3696. //
  3697. //procedure TTestGmpExtensions.sprintf_test;
  3698. //const
  3699. // N = 123456;
  3700. // S = '123456';
  3701. //var
  3702. // z: MPInteger;
  3703. // buf: pchar;
  3704. //begin
  3705. // z_init_set_ui(z, N);
  3706. // getmem(buf, length(S) + 1);
  3707. // assert(sprintf(buf, Z_FMT, [@z]) = length(S));
  3708. // assert(buf = S);
  3709. // freemem(buf);
  3710. // z_clear(z);
  3711. //end;
  3712. //
  3713. //procedure TTestGmpExtensions.sprintf_test2;
  3714. //const
  3715. // N = 123456;
  3716. // S = '123456';
  3717. //var
  3718. // z: MPInteger;
  3719. // buf: pchar;
  3720. //begin
  3721. // z_init_set_ui(z, N);
  3722. // getmem(buf, length(S) + 1);
  3723. // assert(sprintf(buf, Z_FMT, @z) = length(S));
  3724. // assert(buf = S);
  3725. // freemem(buf);
  3726. // z_clear(z);
  3727. //end;
  3728. //
  3729. //procedure TTestGmpExtensions.sscanf_test;
  3730. //const
  3731. // N = 3;
  3732. // D = 2;
  3733. //var q: mpq_t;
  3734. //begin
  3735. // q_init(q);
  3736. // assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
  3737. // assert(q_cmp_ui(q, N, D) = 0);
  3738. // q_clear(q);
  3739. //end;
  3740. //
  3741. //procedure TTestGmpExtensions.sscanf_test2;
  3742. //const
  3743. // N = 3;
  3744. // D = 2;
  3745. //var q: mpq_t;
  3746. //begin
  3747. // q_init(q);
  3748. // assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
  3749. // assert(q_cmp_ui(q, N, D) = 0);
  3750. // q_clear(q);
  3751. //end;
  3752. procedure TTestGmpExtensions.z_init_test;
  3753. var integer_: MPInteger;
  3754. begin
  3755. z_init(integer_);
  3756. assert(z_get_si(integer_) = 0);
  3757. end;
  3758. procedure TTestGmpExtensions.z_clear_test;
  3759. const N = 1000000;
  3760. var integer_: MPInteger;
  3761. begin
  3762. z_init2(integer_, N);
  3763. z_clear(integer_);
  3764. assert(z_get_si(integer_) = 0);
  3765. end;
  3766. procedure TTestGmpExtensions.z_init2_test;
  3767. const N = 1000000;
  3768. var integer_: MPInteger;
  3769. begin
  3770. z_init2(integer_, N);
  3771. assert(z_get_si(integer_) = 0);
  3772. end;
  3773. procedure TTestGmpExtensions.z_init_set_si_test;
  3774. const N = -1000000;
  3775. var rop: MPInteger;
  3776. begin
  3777. z_init_set_si(rop, N);
  3778. assert(z_get_si(rop) = N);
  3779. end;
  3780. procedure TTestGmpExtensions.z_init_set_ui_test;
  3781. const N = 1000000;
  3782. var rop: MPInteger;
  3783. begin
  3784. z_init_set_ui(rop, N);
  3785. assert(z_get_ui(rop) = N);
  3786. end;
  3787. procedure TTestGmpExtensions.z_init_set_d_test;
  3788. const N = -1000000;
  3789. var rop: MPInteger;
  3790. begin
  3791. z_init_set_d(rop, N);
  3792. assert(z_get_si(rop) = N);
  3793. end;
  3794. procedure TTestGmpExtensions.z_init_set_test;
  3795. const N = -1000000;
  3796. var rop, op: MPInteger;
  3797. begin
  3798. z_init_set_si(op, N);
  3799. z_init_set(rop, op);
  3800. assert(z_get_si(rop) = N);
  3801. end;
  3802. procedure TTestGmpExtensions.z_init_set_str_test;
  3803. const N = 1000000;
  3804. var rop: MPInteger;
  3805. begin
  3806. assert(z_init_set_str(rop, IntToStr(N), BASE10));
  3807. assert(z_get_si(rop) = N);
  3808. end;
  3809. procedure TTestGmpExtensions.z_realloc_test;
  3810. const N = 1000;
  3811. var integer_: MPInteger;
  3812. begin
  3813. z_init(integer_);
  3814. z_realloc(integer_, N);
  3815. end;
  3816. procedure TTestGmpExtensions.z_realloc2_test;
  3817. const N = 1000;
  3818. var integer_: MPInteger;
  3819. begin
  3820. z_init(integer_);
  3821. z_realloc2(integer_, N);
  3822. end;
  3823. procedure TTestGmpExtensions.z_getlimbn_test;
  3824. const N = 1234;
  3825. var op: MPInteger;
  3826. begin
  3827. z_init_set_ui(op, N);
  3828. assert(z_getlimbn(op, 0) = N);
  3829. end;
  3830. procedure TTestGmpExtensions.z_export_test;
  3831. type t = word;
  3832. const
  3833. N = 1000000;
  3834. BUF_HIGH = sizeof(N) div sizeof(t);
  3835. var
  3836. export_op, import_op: MPInteger;
  3837. buf: array[0..BUF_HIGH] of t;
  3838. count: sizeuint;
  3839. begin
  3840. z_init_set_si(export_op, N);
  3841. z_init(import_op);
  3842. z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
  3843. z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
  3844. assert(z_get_si(export_op) = z_get_si(import_op));
  3845. end;
  3846. procedure TTestGmpExtensions.z_import_test;
  3847. type t = word;
  3848. const
  3849. N = 1000000;
  3850. BUF_HIGH = sizeof(N) div sizeof(t);
  3851. var
  3852. export_op, import_op: MPInteger;
  3853. buf: array[0..BUF_HIGH] of t;
  3854. count: sizeuint;
  3855. begin
  3856. z_init_set_si(export_op, N);
  3857. z_init(import_op);
  3858. z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
  3859. z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
  3860. assert(z_get_si(export_op) = z_get_si(import_op));
  3861. end;
  3862. procedure TTestGmpExtensions.z_swap_test;
  3863. const
  3864. ROP_1 = -1000;
  3865. ROP_2 = 1000000;
  3866. var rop1, rop2: MPInteger;
  3867. begin
  3868. z_init_set_si(rop1, ROP_1);
  3869. z_init_set_si(rop2, ROP_2);
  3870. z_swap(rop1, rop2);
  3871. assert(z_get_si(rop1) = ROP_2);
  3872. assert(z_get_si(rop2) = ROP_1);
  3873. end;
  3874. procedure TTestGmpExtensions.z_set_test;
  3875. const OP_ = 1000000;
  3876. var rop, op: MPInteger;
  3877. begin
  3878. z_init(rop);
  3879. z_init_set_si(op, OP_);
  3880. z_set(rop, op);
  3881. assert(z_get_si(rop) = OP_);
  3882. end;
  3883. procedure TTestGmpExtensions.z_set_d_test;
  3884. const OP_ = 1000000;
  3885. var rop: MPInteger;
  3886. begin
  3887. z_init(rop);
  3888. z_set_d(rop, OP_);
  3889. assert(z_get_si(rop) = OP_);
  3890. end;
  3891. procedure TTestGmpExtensions.z_set_f_test;
  3892. const OP_ = -10;
  3893. var
  3894. op: MPFloat;
  3895. rop: MPInteger;
  3896. begin
  3897. f_init_set_si(op, OP_);
  3898. z_init(rop);
  3899. z_set_f(rop, op);
  3900. assert(z_get_si(rop) = OP_);
  3901. end;
  3902. procedure TTestGmpExtensions.z_set_q_test;
  3903. const OP_ = -10;
  3904. var
  3905. op: MPRational;
  3906. rop: MPInteger;
  3907. begin
  3908. q_init(op);
  3909. z_init(rop);
  3910. q_set_si(op, OP_, 1);
  3911. z_set_q(rop, op);
  3912. assert(z_get_si(rop) = OP_);
  3913. end;
  3914. procedure TTestGmpExtensions.z_set_si_test;
  3915. const OP_ = -1000000;
  3916. var rop: MPInteger;
  3917. begin
  3918. z_init(rop);
  3919. z_set_si(rop, OP_);
  3920. assert(z_get_si(rop) = OP_);
  3921. end;
  3922. procedure TTestGmpExtensions.z_set_str_test;
  3923. const OP_ = -1000000;
  3924. var rop: MPInteger;
  3925. begin
  3926. z_init(rop);
  3927. assert(z_set_str(rop, IntToStr(OP_), BASE10));
  3928. assert(z_get_si(rop) = OP_);
  3929. end;
  3930. procedure TTestGmpExtensions.z_set_ui_test;
  3931. const OP_ = 1000000;
  3932. var rop: MPInteger;
  3933. begin
  3934. z_init(rop);
  3935. z_set_ui(rop, OP_);
  3936. assert(z_get_si(rop) = OP_);
  3937. end;
  3938. procedure TTestGmpExtensions.z_get_d_test;
  3939. const N = -1000;
  3940. var op: MPInteger;
  3941. begin
  3942. z_init_set_si(op, N);
  3943. assert(z_get_d(op) = N);
  3944. end;
  3945. procedure TTestGmpExtensions.z_get_d_2exp_test;
  3946. const
  3947. N_LG2 = 4;
  3948. N = 1 shl N_LG2;
  3949. var
  3950. op: MPInteger;
  3951. exp: mp_exp_t;
  3952. begin
  3953. z_init_set_si(op, N);
  3954. assert(z_get_d_2exp(exp, op) = 1 / 2);
  3955. assert(exp = N_LG2 + 1);
  3956. end;
  3957. procedure TTestGmpExtensions.z_get_si_test;
  3958. const N = -1000000;
  3959. var op: MPInteger;
  3960. begin
  3961. z_init_set_si(op, N);
  3962. assert(z_get_si(op) = N);
  3963. end;
  3964. procedure TTestGmpExtensions.z_get_str_test;
  3965. const N = -1000000;
  3966. var
  3967. op: MPInteger;
  3968. p: pchar;
  3969. s, s0, s1: String;
  3970. begin
  3971. z_init_set_si(op, N);
  3972. s0 := inttostr(N);
  3973. s := z_get_str(BASE10, op);
  3974. assert(s = s0);
  3975. p := z_get_str(nil, BASE10, op);
  3976. assert(p = s0);
  3977. freemem(p);
  3978. setlength(s1, length(s0));
  3979. assert(pointer(z_get_str(pchar(s1), BASE10, op)) = pointer(s1));
  3980. assert(s1 = s0);
  3981. end;
  3982. procedure TTestGmpExtensions.z_get_ui_test;
  3983. const N = 1000000;
  3984. var op: MPInteger;
  3985. begin
  3986. z_init_set_ui(op, N);
  3987. assert(z_get_ui(op) = N);
  3988. end;
  3989. procedure TTestGmpExtensions.z_add_test;
  3990. const
  3991. OP_1 = -1000;
  3992. OP_2 = 1000000;
  3993. var rop, op1, op2, sum: MPInteger;
  3994. begin
  3995. z_init(rop);
  3996. z_init_set_si(op1, OP_1);
  3997. z_init_set_si(op2, OP_2);
  3998. z_add(rop, op1, op2);
  3999. assert(z_get_si(rop) = OP_1 + OP_2);
  4000. sum := z_add(op1, op2);
  4001. assert(z_get_si(sum) = OP_1 + OP_2);
  4002. end;
  4003. procedure TTestGmpExtensions.z_add_ui_test;
  4004. const
  4005. OP_1 = -1000;
  4006. OP_2 = 1000000;
  4007. var rop, op1, sum: MPInteger;
  4008. begin
  4009. z_init(rop);
  4010. z_init_set_si(op1, OP_1);
  4011. z_add_ui(rop, op1, OP_2);
  4012. assert(z_get_si(rop) = OP_1 + OP_2);
  4013. sum := z_add_ui(op1, OP_2);
  4014. assert(z_get_si(sum) = OP_1 + OP_2);
  4015. end;
  4016. procedure TTestGmpExtensions.z_sub_test;
  4017. const
  4018. OP_1 = -1000;
  4019. OP_2 = 1000000;
  4020. var rop, op1, op2, diff: MPInteger;
  4021. begin
  4022. z_init(rop);
  4023. z_init_set_si(op1, OP_1);
  4024. z_init_set_si(op2, OP_2);
  4025. z_sub(rop, op1, op2);
  4026. assert(z_get_si(rop) = OP_1 - OP_2);
  4027. diff := z_sub(op1, op2);
  4028. assert(z_get_si(diff) = OP_1 - OP_2);
  4029. end;
  4030. procedure TTestGmpExtensions.z_sub_ui_test;
  4031. const
  4032. OP_1 = -1000;
  4033. OP_2 = 1000000;
  4034. var rop, op1, diff: MPInteger;
  4035. begin
  4036. z_init(rop);
  4037. z_init_set_si(op1, OP_1);
  4038. z_sub_ui(rop, op1, OP_2);
  4039. assert(z_get_si(rop) = OP_1 - OP_2);
  4040. diff := z_sub_ui(op1, OP_2);
  4041. assert(z_get_si(diff) = OP_1 - OP_2);
  4042. end;
  4043. procedure TTestGmpExtensions.z_ui_sub_test;
  4044. const
  4045. OP_1 = 1000;
  4046. OP_2 = 1000000;
  4047. var rop, op2, diff: MPInteger;
  4048. begin
  4049. z_init(rop);
  4050. z_init_set_si(op2, OP_2);
  4051. z_ui_sub(rop, OP_1, op2);
  4052. assert(z_get_si(rop) = OP_1 - OP_2);
  4053. diff := z_ui_sub(OP_1, op2);
  4054. assert(z_get_si(diff) = OP_1 - OP_2);
  4055. end;
  4056. procedure TTestGmpExtensions.z_mul_test;
  4057. const
  4058. OP_1 = -10;
  4059. OP_2 = 1000;
  4060. var rop, op1, op2, prod: MPInteger;
  4061. begin
  4062. z_init(rop);
  4063. z_init_set_si(op1, OP_1);
  4064. z_init_set_si(op2, OP_2);
  4065. z_mul(rop, op1, op2);
  4066. assert(z_get_si(rop) = OP_1 * OP_2);
  4067. prod := z_mul(op1, op2);
  4068. assert(z_get_si(prod) = OP_1 * OP_2);
  4069. end;
  4070. procedure TTestGmpExtensions.z_mul_si_test;
  4071. const
  4072. OP_1 = 10;
  4073. OP_2 = -1000;
  4074. var rop, op1, prod: MPInteger;
  4075. begin
  4076. z_init(rop);
  4077. z_init_set_si(op1, OP_1);
  4078. z_mul_si(rop, op1, OP_2);
  4079. assert(z_get_si(rop) = OP_1 * OP_2);
  4080. prod := z_mul_si(op1, OP_2);
  4081. assert(z_get_si(prod) = OP_1 * OP_2);
  4082. end;
  4083. procedure TTestGmpExtensions.z_mul_ui_test;
  4084. const
  4085. OP_1 = -10;
  4086. OP_2 = 1000;
  4087. var rop, op1, prod: MPInteger;
  4088. begin
  4089. z_init(rop);
  4090. z_init_set_si(op1, OP_1);
  4091. z_mul_ui(rop, op1, OP_2);
  4092. assert(z_get_si(rop) = OP_1 * OP_2);
  4093. prod := z_mul_ui(op1, OP_2);
  4094. assert(z_get_si(prod) = OP_1 * OP_2);
  4095. end;
  4096. procedure TTestGmpExtensions.z_addmul_test;
  4097. const
  4098. ROP_ = 10;
  4099. OP_1 = -100;
  4100. OP_2 = 1000;
  4101. var rop, op1, op2: MPInteger;
  4102. begin
  4103. z_init_set_si(rop, ROP_);
  4104. z_init_set_si(op1, OP_1);
  4105. z_init_set_si(op2, OP_2);
  4106. z_addmul(rop, op1, op2);
  4107. assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
  4108. end;
  4109. procedure TTestGmpExtensions.z_addmul_ui_test;
  4110. const
  4111. ROP_ = 10;
  4112. OP_1 = -100;
  4113. OP_2 = 1000;
  4114. var rop, op1: MPInteger;
  4115. begin
  4116. z_init_set_si(rop, ROP_);
  4117. z_init_set_si(op1, OP_1);
  4118. z_addmul_ui(rop, op1, OP_2);
  4119. assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
  4120. end;
  4121. procedure TTestGmpExtensions.z_submul_test;
  4122. const
  4123. ROP_ = 10;
  4124. OP_1 = -100;
  4125. OP_2 = 1000;
  4126. var rop, op1, op2: MPInteger;
  4127. begin
  4128. z_init_set_si(rop, ROP_);
  4129. z_init_set_si(op1, OP_1);
  4130. z_init_set_si(op2, OP_2);
  4131. z_submul(rop, op1, op2);
  4132. assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
  4133. end;
  4134. procedure TTestGmpExtensions.z_submul_ui_test;
  4135. const
  4136. ROP_ = 10;
  4137. OP_1 = -100;
  4138. OP_2 = 1000;
  4139. var rop, op1: MPInteger;
  4140. begin
  4141. z_init_set_si(rop, ROP_);
  4142. z_init_set_si(op1, OP_1);
  4143. z_submul_ui(rop, op1, OP_2);
  4144. assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
  4145. end;
  4146. procedure TTestGmpExtensions.z_mul_2exp_test;
  4147. const
  4148. OP_1 = 10;
  4149. OP_2 = 10;
  4150. var rop, op1, x: MPInteger;
  4151. begin
  4152. z_init(rop);
  4153. z_init_set_si(op1, OP_1);
  4154. z_mul_2exp(rop, op1, OP_2);
  4155. assert(z_get_si(rop) = OP_1 * (1 shl OP_2));
  4156. x := z_mul_2exp(op1, OP_2);
  4157. assert(z_get_si(x) = OP_1 * (1 shl OP_2));
  4158. end;
  4159. procedure TTestGmpExtensions.z_neg_test;
  4160. const OP_ = 1000;
  4161. var rop, op, x: MPInteger;
  4162. begin
  4163. z_init(rop);
  4164. z_init_set_si(op, OP_);
  4165. z_neg(rop, op);
  4166. assert(z_get_si(rop) = -OP_);
  4167. x := z_neg(op);
  4168. assert(z_get_si(x) = -OP_);
  4169. end;
  4170. procedure TTestGmpExtensions.z_abs_test;
  4171. const OP_ = -1000;
  4172. var rop, op, x: MPInteger;
  4173. begin
  4174. z_init(rop);
  4175. z_init_set_si(op, OP_);
  4176. z_abs(rop, op);
  4177. assert(z_get_si(rop) = abs(OP_));
  4178. x := z_abs(op);
  4179. assert(z_get_si(x) = abs(OP_));
  4180. end;
  4181. procedure TTestGmpExtensions.z_cdiv_q_test;
  4182. const
  4183. N_ = -17;
  4184. D_ = 4;
  4185. var q, n, d, q2: MPInteger;
  4186. begin
  4187. z_init(q);
  4188. z_init_set_si(n, N_);
  4189. z_init_set_si(d, D_);
  4190. z_cdiv_q(q, n, d);
  4191. assert(z_get_si(q) = ceil(N_ / D_));
  4192. q2 := z_cdiv_q(n, d);
  4193. assert(z_get_si(q2) = ceil(N_ / D_));
  4194. end;
  4195. procedure TTestGmpExtensions.z_fdiv_q_test;
  4196. const
  4197. N_ = -17;
  4198. D_ = 4;
  4199. var q, n, d, q2: MPInteger;
  4200. begin
  4201. z_init(q);
  4202. z_init_set_si(n, N_);
  4203. z_init_set_si(d, D_);
  4204. z_fdiv_q(q, n, d);
  4205. assert(z_get_si(q) = floor(N_ / D_));
  4206. q2 := z_fdiv_q(n, d);
  4207. assert(z_get_si(q2) = floor(N_ / D_));
  4208. end;
  4209. procedure TTestGmpExtensions.z_tdiv_q_test;
  4210. const
  4211. N_ = -17;
  4212. D_ = 4;
  4213. var q, n, d, q2: MPInteger;
  4214. begin
  4215. z_init(q);
  4216. z_init_set_si(n, N_);
  4217. z_init_set_si(d, D_);
  4218. z_tdiv_q(q, n, d);
  4219. assert(z_get_si(q) = trunc(N_ / D_));
  4220. q2 := z_tdiv_q(n, d);
  4221. assert(z_get_si(q2) = trunc(N_ / D_));
  4222. end;
  4223. procedure TTestGmpExtensions.z_cdiv_q_2exp_test;
  4224. const
  4225. N_ = -17;
  4226. B_ = 2;
  4227. D_ = 1 shl B_;
  4228. var q, n, q2: MPInteger;
  4229. begin
  4230. z_init(q);
  4231. z_init_set_si(n, N_);
  4232. z_cdiv_q_2exp(q, n, B_);
  4233. assert(z_get_si(q) = ceil(N_ / D_));
  4234. q2 := z_cdiv_q_2exp(n, B_);
  4235. assert(z_get_si(q2) = ceil(N_ / D_));
  4236. end;
  4237. procedure TTestGmpExtensions.z_fdiv_q_2exp_test;
  4238. const
  4239. N_ = -17;
  4240. B_ = 2;
  4241. D_ = 1 shl B_;
  4242. var q, n, q2: MPInteger;
  4243. begin
  4244. z_init(q);
  4245. z_init_set_si(n, N_);
  4246. z_fdiv_q_2exp(q, n, B_);
  4247. assert(z_get_si(q) = floor(N_ / D_));
  4248. q2 := z_fdiv_q_2exp(n, B_);
  4249. assert(z_get_si(q2) = floor(N_ / D_));
  4250. end;
  4251. procedure TTestGmpExtensions.z_tdiv_q_2exp_test;
  4252. const
  4253. N_ = -17;
  4254. B_ = 2;
  4255. D_ = 1 shl B_;
  4256. var q, n, q2: MPInteger;
  4257. begin
  4258. z_init(q);
  4259. z_init_set_si(n, N_);
  4260. z_tdiv_q_2exp(q, n, B_);
  4261. assert(z_get_si(q) = trunc(N_ / D_));
  4262. q2 := z_tdiv_q_2exp(n, B_);
  4263. assert(z_get_si(q2) = trunc(N_ / D_));
  4264. end;
  4265. procedure TTestGmpExtensions.z_cdiv_q_ui_test;
  4266. const
  4267. N_ = -17;
  4268. D_ = 4;
  4269. var
  4270. q, n: MPInteger;
  4271. ur: valuint;
  4272. begin
  4273. z_init(q);
  4274. z_init_set_si(n, N_);
  4275. ur := z_cdiv_q_ui(q, n, D_);
  4276. assert(z_get_si(q) = ceil(N_ / D_));
  4277. assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
  4278. end;
  4279. procedure TTestGmpExtensions.z_fdiv_q_ui_test;
  4280. const
  4281. N_ = -17;
  4282. D_ = 4;
  4283. var
  4284. q, n: MPInteger;
  4285. ur: valuint;
  4286. begin
  4287. z_init(q);
  4288. z_init_set_si(n, N_);
  4289. ur := z_fdiv_q_ui(q, n, D_);
  4290. assert(z_get_si(q) = floor(N_ / D_));
  4291. assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
  4292. end;
  4293. procedure TTestGmpExtensions.z_tdiv_q_ui_test;
  4294. const
  4295. N_ = -17;
  4296. D_ = 4;
  4297. var
  4298. q, n: MPInteger;
  4299. ur: valuint;
  4300. begin
  4301. z_init(q);
  4302. z_init_set_si(n, N_);
  4303. ur := z_tdiv_q_ui(q, n, D_);
  4304. assert(z_get_si(q) = trunc(N_ / D_));
  4305. assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
  4306. end;
  4307. procedure TTestGmpExtensions.z_cdiv_qr_test;
  4308. const
  4309. N_ = -17;
  4310. D_ = 4;
  4311. var q, r, n, d: MPInteger;
  4312. begin
  4313. z_init(q);
  4314. z_init(r);
  4315. z_init_set_si(n, N_);
  4316. z_init_set_si(d, D_);
  4317. z_cdiv_qr(q, r, n, d);
  4318. assert(z_get_si(q) = ceil(N_ / D_));
  4319. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4320. end;
  4321. procedure TTestGmpExtensions.z_fdiv_qr_test;
  4322. const
  4323. N_ = -17;
  4324. D_ = 4;
  4325. var q, r, n, d: MPInteger;
  4326. begin
  4327. z_init(q);
  4328. z_init(r);
  4329. z_init_set_si(n, N_);
  4330. z_init_set_si(d, D_);
  4331. z_fdiv_qr(q, r, n, d);
  4332. assert(z_get_si(q) = floor(N_ / D_));
  4333. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4334. end;
  4335. procedure TTestGmpExtensions.z_tdiv_qr_test;
  4336. const
  4337. N_ = -17;
  4338. D_ = 4;
  4339. var q, r, n, d: MPInteger;
  4340. begin
  4341. z_init(q);
  4342. z_init(r);
  4343. z_init_set_si(n, N_);
  4344. z_init_set_si(d, D_);
  4345. z_tdiv_qr(q, r, n, d);
  4346. assert(z_get_si(q) = trunc(N_ / D_));
  4347. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4348. end;
  4349. procedure TTestGmpExtensions.z_cdiv_qr_ui_test;
  4350. const
  4351. N_ = -17;
  4352. D_ = 4;
  4353. var
  4354. q, r, n: MPInteger;
  4355. ur: valuint;
  4356. begin
  4357. z_init(q);
  4358. z_init(r);
  4359. z_init_set_si(n, N_);
  4360. ur := z_cdiv_qr_ui(q, r, n, D_);
  4361. assert(z_get_si(q) = ceil(N_ / D_));
  4362. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4363. assert(ur - abs(z_get_si(r)) = 0);
  4364. end;
  4365. procedure TTestGmpExtensions.z_fdiv_qr_ui_test;
  4366. const
  4367. N_ = -17;
  4368. D_ = 4;
  4369. var
  4370. q, r, n: MPInteger;
  4371. ur: valuint;
  4372. begin
  4373. z_init(q);
  4374. z_init(r);
  4375. z_init_set_si(n, N_);
  4376. ur := z_fdiv_qr_ui(q, r, n, D_);
  4377. assert(z_get_si(q) = floor(N_ / D_));
  4378. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4379. assert(ur - abs(z_get_si(r)) = 0);
  4380. end;
  4381. procedure TTestGmpExtensions.z_tdiv_qr_ui_test;
  4382. const
  4383. N_ = -17;
  4384. D_ = 4;
  4385. var
  4386. q, r, n: MPInteger;
  4387. ur: valuint;
  4388. begin
  4389. z_init(q);
  4390. z_init(r);
  4391. z_init_set_si(n, N_);
  4392. ur := z_tdiv_qr_ui(q, r, n, D_);
  4393. assert(z_get_si(q) = trunc(N_ / D_));
  4394. assert(z_get_si(q) * D_ + z_get_si(r) = N_);
  4395. assert(ur - abs(z_get_si(r)) = 0);
  4396. end;
  4397. procedure TTestGmpExtensions.z_cdiv_r_test;
  4398. const
  4399. N_ = -17;
  4400. D_ = 4;
  4401. var r, n, d, r2: MPInteger;
  4402. begin
  4403. z_init(r);
  4404. z_init_set_si(n, N_);
  4405. z_init_set_si(d, D_);
  4406. z_cdiv_r(r, n, d);
  4407. assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
  4408. r2 := z_cdiv_r(n, d);
  4409. assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
  4410. end;
  4411. procedure TTestGmpExtensions.z_fdiv_r_test;
  4412. const
  4413. N_ = -17;
  4414. D_ = 4;
  4415. var r, n, d, r2: MPInteger;
  4416. begin
  4417. z_init(r);
  4418. z_init_set_si(n, N_);
  4419. z_init_set_si(d, D_);
  4420. z_fdiv_r(r, n, d);
  4421. assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
  4422. r2 := z_fdiv_r(n, d);
  4423. assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
  4424. end;
  4425. procedure TTestGmpExtensions.z_tdiv_r_test;
  4426. const
  4427. N_ = -17;
  4428. D_ = 4;
  4429. var r, n, d, r2: MPInteger;
  4430. begin
  4431. z_init(r);
  4432. z_init_set_si(n, N_);
  4433. z_init_set_si(d, D_);
  4434. z_tdiv_r(r, n, d);
  4435. assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
  4436. r2 := z_tdiv_r(n, d);
  4437. assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
  4438. end;
  4439. procedure TTestGmpExtensions.z_cdiv_r_2exp_test;
  4440. const
  4441. N_ = -17;
  4442. B_ = 2;
  4443. D_ = 1 shl B_;
  4444. var r, n, r2: MPInteger;
  4445. begin
  4446. z_init(r);
  4447. z_init_set_si(n, N_);
  4448. z_cdiv_r_2exp(r, n, B_);
  4449. assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
  4450. r2 := z_cdiv_r_2exp(n, B_);
  4451. assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
  4452. end;
  4453. procedure TTestGmpExtensions.z_fdiv_r_2exp_test;
  4454. const
  4455. N_ = -17;
  4456. B_ = 2;
  4457. D_ = 1 shl B_;
  4458. var r, n, r2: MPInteger;
  4459. begin
  4460. z_init(r);
  4461. z_init_set_si(n, N_);
  4462. z_fdiv_r_2exp(r, n, B_);
  4463. assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
  4464. r2 := z_fdiv_r_2exp(n, B_);
  4465. assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
  4466. end;
  4467. procedure TTestGmpExtensions.z_tdiv_r_2exp_test;
  4468. const
  4469. N_ = -17;
  4470. B_ = 2;
  4471. D_ = 1 shl B_;
  4472. var r, n, r2: MPInteger;
  4473. begin
  4474. z_init(r);
  4475. z_init_set_si(n, N_);
  4476. z_tdiv_r_2exp(r, n, B_);
  4477. assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
  4478. r2 := z_tdiv_r_2exp(n, B_);
  4479. assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
  4480. end;
  4481. procedure TTestGmpExtensions.z_cdiv_r_ui_test;
  4482. const
  4483. N_ = -17;
  4484. D_ = 4;
  4485. var
  4486. r, n: MPInteger;
  4487. ur: valuint;
  4488. begin
  4489. z_init(r);
  4490. z_init_set_si(n, N_);
  4491. ur := z_cdiv_r_ui(r, n, D_);
  4492. assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
  4493. assert(ur - abs(z_get_si(r)) = 0);
  4494. end;
  4495. procedure TTestGmpExtensions.z_fdiv_r_ui_test;
  4496. const
  4497. N_ = -17;
  4498. D_ = 4;
  4499. var
  4500. r, n: MPInteger;
  4501. ur: valuint;
  4502. begin
  4503. z_init(r);
  4504. z_init_set_si(n, N_);
  4505. ur := z_fdiv_r_ui(r, n, D_);
  4506. assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
  4507. assert(ur - abs(z_get_si(r)) = 0);
  4508. end;
  4509. procedure TTestGmpExtensions.z_tdiv_r_ui_test;
  4510. const
  4511. N_ = -17;
  4512. D_ = 4;
  4513. var
  4514. r, n: MPInteger;
  4515. ur: valuint;
  4516. begin
  4517. z_init(r);
  4518. z_init_set_si(n, N_);
  4519. ur := z_tdiv_r_ui(r, n, D_);
  4520. assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
  4521. assert(ur - abs(z_get_si(r)) = 0);
  4522. end;
  4523. procedure TTestGmpExtensions.z_cdiv_ui_test;
  4524. const
  4525. N_ = -17;
  4526. D_ = 4;
  4527. var n: MPInteger;
  4528. begin
  4529. z_init_set_si(n, N_);
  4530. assert(z_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
  4531. end;
  4532. procedure TTestGmpExtensions.z_fdiv_ui_test;
  4533. const
  4534. N_ = -17;
  4535. D_ = 4;
  4536. var n: MPInteger;
  4537. begin
  4538. z_init_set_si(n, N_);
  4539. assert(z_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
  4540. end;
  4541. procedure TTestGmpExtensions.z_tdiv_ui_test;
  4542. const
  4543. N_ = -17;
  4544. D_ = 4;
  4545. var n: MPInteger;
  4546. begin
  4547. z_init_set_si(n, N_);
  4548. assert(z_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
  4549. end;
  4550. procedure TTestGmpExtensions.z_mod_test;
  4551. const
  4552. N_ = 17;
  4553. D_ = -4;
  4554. var r, n, d, r2: MPInteger;
  4555. begin
  4556. z_init(r);
  4557. z_init_set_si(n, N_);
  4558. z_init_set_si(d, D_);
  4559. z_mod(r, n, d);
  4560. assert(z_get_si(r) = N_ mod abs(D_));
  4561. r2 := z_mod(n, d);
  4562. assert(z_get_si(r2) = N_ mod abs(D_));
  4563. end;
  4564. procedure TTestGmpExtensions.z_divexact_test;
  4565. const
  4566. N_ = -16;
  4567. D_ = 4;
  4568. var q, n, d, q2: MPInteger;
  4569. begin
  4570. z_init(q);
  4571. z_init_set_si(n, N_);
  4572. z_init_set_si(d, D_);
  4573. z_divexact(q, n, d);
  4574. assert(z_get_si(q) * D_ = N_);
  4575. q2 := z_divexact(n, d);
  4576. assert(z_get_si(q2) * D_ = N_);
  4577. end;
  4578. procedure TTestGmpExtensions.z_divexact_ui_test;
  4579. const
  4580. N_ = -16;
  4581. D_ = 4;
  4582. var q, n, q2: MPInteger;
  4583. begin
  4584. z_init(q);
  4585. z_init_set_si(n, N_);
  4586. z_divexact_ui(q, n, D_);
  4587. assert(z_get_si(q) * D_ = N_);
  4588. q2 := z_divexact_ui(n, D_);
  4589. assert(z_get_si(q2) * D_ = N_);
  4590. end;
  4591. procedure TTestGmpExtensions.z_divisible_p_test;
  4592. const
  4593. N_ = -16;
  4594. D_ = 4;
  4595. var n, d: MPInteger;
  4596. begin
  4597. z_init_set_si(n, N_);
  4598. z_init_set_si(d, D_);
  4599. assert(z_divisible_p(n, d));
  4600. z_set_si(n, z_get_si(n) + 1);
  4601. assert(not z_divisible_p(n, d));
  4602. end;
  4603. procedure TTestGmpExtensions.z_divisible_ui_p_test;
  4604. const
  4605. N_ = -16;
  4606. D_ = 4;
  4607. var n: MPInteger;
  4608. begin
  4609. z_init_set_si(n, N_);
  4610. assert(z_divisible_ui_p(n, D_));
  4611. z_set_si(n, z_get_si(n) + 1);
  4612. assert(not z_divisible_ui_p(n, D_));
  4613. end;
  4614. procedure TTestGmpExtensions.z_divisible_2exp_p_test;
  4615. const
  4616. N_ = -16;
  4617. B_ = 2;
  4618. var n: MPInteger;
  4619. begin
  4620. z_init_set_si(n, N_);
  4621. assert(z_divisible_2exp_p(n, B_));
  4622. z_set_si(n, z_get_si(n) + 1);
  4623. assert(not z_divisible_ui_p(n, B_));
  4624. end;
  4625. procedure TTestGmpExtensions.z_congruent_p_test;
  4626. const
  4627. N_ = 23;
  4628. C_ = 6;
  4629. D_ = 17;
  4630. var n, c, d: MPInteger;
  4631. begin
  4632. z_init_set_si(n, N_);
  4633. z_init_set_si(c, C_);
  4634. z_init_set_si(d, D_);
  4635. assert(z_congruent_p(n, c, d));
  4636. z_set_si(n, z_get_si(n) + 1);
  4637. assert(not z_congruent_p(n, c, d));
  4638. end;
  4639. procedure TTestGmpExtensions.z_congruent_2exp_p_test;
  4640. const
  4641. N_ = 23;
  4642. C_ = 7;
  4643. B_ = 4;
  4644. var n, c: MPInteger;
  4645. begin
  4646. z_init_set_si(n, N_);
  4647. z_init_set_si(c, C_);
  4648. assert(z_congruent_2exp_p(n, c, B_));
  4649. z_set_si(n, z_get_si(n) + 1);
  4650. assert(not z_congruent_2exp_p(n, c, B_));
  4651. end;
  4652. procedure TTestGmpExtensions.z_congruent_ui_p_test;
  4653. const
  4654. N_ = 23;
  4655. C_ = 6;
  4656. D_ = 17;
  4657. var n: MPInteger;
  4658. begin
  4659. z_init_set_si(n, N_);
  4660. assert(z_congruent_ui_p(n, C_, D_));
  4661. z_set_si(n, z_get_si(n) + 1);
  4662. assert(not z_congruent_ui_p(n, C_, D_));
  4663. end;
  4664. procedure TTestGmpExtensions.z_powm_test;
  4665. const
  4666. N_EXP = 3;
  4667. N_MOD = 16;
  4668. ROP_ = 8;
  4669. var rop, base, exp, mod_, r2: MPInteger;
  4670. begin
  4671. z_init(rop);
  4672. z_init_set_si(base, BASE10);
  4673. z_init_set_si(exp, N_EXP);
  4674. z_init_set_si(mod_, N_MOD);
  4675. z_powm(rop, base, exp, mod_);
  4676. assert(z_get_si(rop) = ROP_);
  4677. r2 := z_powm(base, exp, mod_);
  4678. assert(z_get_si(r2) = ROP_);
  4679. end;
  4680. procedure TTestGmpExtensions.z_powm_ui_test;
  4681. const
  4682. N_EXP = 3;
  4683. N_MOD = 16;
  4684. ROP_ = 8;
  4685. var rop, base, mod_, r2: MPInteger;
  4686. begin
  4687. z_init(rop);
  4688. z_init_set_si(base, BASE10);
  4689. z_init_set_si(mod_, N_MOD);
  4690. z_powm_ui(rop, base, N_EXP, mod_);
  4691. assert(z_get_si(rop) = ROP_);
  4692. r2 := z_powm_ui(base, N_EXP, mod_);
  4693. assert(z_get_si(r2) = ROP_);
  4694. end;
  4695. procedure TTestGmpExtensions.z_pow_ui_test;
  4696. const
  4697. BASE_ = 10;
  4698. EXP = 3;
  4699. var rop, base, r2: MPInteger;
  4700. begin
  4701. z_init(rop);
  4702. z_init_set_si(base, BASE_);
  4703. z_pow_ui(rop, base, EXP);
  4704. assert(z_get_si(rop) = BASE_ ** EXP);
  4705. r2 := z_pow_ui(base, EXP);
  4706. assert(z_get_si(r2) = BASE_ ** EXP);
  4707. end;
  4708. procedure TTestGmpExtensions.z_ui_pow_ui_test;
  4709. const
  4710. BASE_ = 10;
  4711. EXP = 3;
  4712. var rop, r2: MPInteger;
  4713. begin
  4714. z_init(rop);
  4715. z_ui_pow_ui(rop, BASE_, EXP);
  4716. assert(z_get_si(rop) = BASE_ ** EXP);
  4717. r2 := z_ui_pow_ui(BASE_, EXP);
  4718. assert(z_get_si(r2) = BASE_ ** EXP);
  4719. end;
  4720. procedure TTestGmpExtensions.z_root_test;
  4721. const
  4722. ROOT = 5;
  4723. N_ = 3;
  4724. var rop, op: MPInteger;
  4725. begin
  4726. z_init(rop);
  4727. z_init_set_si(op, ROOT ** N_);
  4728. assert(z_root(rop, op, N_));
  4729. assert(z_get_si(rop) = ROOT);
  4730. z_set_si(op, ROOT ** N_ + 1);
  4731. assert(not z_root(rop, op, N_));
  4732. assert(z_get_si(rop) = ROOT);
  4733. end;
  4734. procedure TTestGmpExtensions.z_rootrem_test;
  4735. const
  4736. ROOT_ = 5;
  4737. N_ = 3;
  4738. REM_ = 1;
  4739. var root, rem, u: MPInteger;
  4740. begin
  4741. assert(REM_ < ROOT_);
  4742. z_init(root);
  4743. z_init(rem);
  4744. z_init_set_si(u, ROOT_ ** N_);
  4745. z_rootrem(root, rem, u, N_);
  4746. assert(z_get_si(root) = ROOT_);
  4747. assert(z_get_si(rem) = 0);
  4748. z_set_si(u, ROOT_ ** N_ + REM_);
  4749. z_rootrem(root, rem, u, N_);
  4750. assert(z_get_si(root) = ROOT_);
  4751. assert(z_get_si(rem) = REM_);
  4752. end;
  4753. procedure TTestGmpExtensions.z_sqrt_test;
  4754. const ROOT = 5;
  4755. var rop, op, r2: MPInteger;
  4756. begin
  4757. z_init(rop);
  4758. z_init_set_si(op, ROOT ** 2);
  4759. z_sqrt(rop, op);
  4760. assert(z_get_si(rop) = ROOT);
  4761. r2 := z_sqrt(op);
  4762. assert(z_get_si(r2) = ROOT);
  4763. end;
  4764. procedure TTestGmpExtensions.z_sqrtrem_test;
  4765. const
  4766. ROOT = 5;
  4767. REM = 1;
  4768. var rop1, rop2, op: MPInteger;
  4769. begin
  4770. z_init(rop1);
  4771. z_init(rop2);
  4772. z_init_set_si(op, ROOT ** 2 + REM);
  4773. z_sqrtrem(rop1, rop2, op);
  4774. assert(z_get_si(rop1) = ROOT);
  4775. assert(z_get_si(rop2) = REM);
  4776. end;
  4777. procedure TTestGmpExtensions.z_perfect_power_p_test;
  4778. const
  4779. ROOT = 3;
  4780. EXP = 3;
  4781. var op: MPInteger;
  4782. begin
  4783. z_init_set_si(op, ROOT ** EXP);
  4784. assert(z_perfect_power_p(op));
  4785. z_set_si(op, ROOT ** EXP + 1);
  4786. assert(not z_perfect_power_p(op));
  4787. end;
  4788. procedure TTestGmpExtensions.z_perfect_square_p_test;
  4789. const ROOT = 3;
  4790. var op: MPInteger;
  4791. begin
  4792. z_init_set_si(op, ROOT ** 2);
  4793. assert(z_perfect_square_p(op));
  4794. z_set_si(op, ROOT ** 2 or 2);
  4795. assert(not z_perfect_square_p(op));
  4796. end;
  4797. procedure TTestGmpExtensions.z_probab_prime_p_test;
  4798. const
  4799. N_ = 127;
  4800. REPS = 5;
  4801. var n: MPInteger;
  4802. begin
  4803. z_init_set_si(n, N_);
  4804. assert(z_probab_prime_p(n, REPS) = 2);
  4805. z_set_si(n, N_ + 1);
  4806. assert(z_probab_prime_p(n, REPS) = 0);
  4807. end;
  4808. procedure TTestGmpExtensions.z_nextprime_test;
  4809. const
  4810. PRIME3 = 5;
  4811. PRIME4 = 7;
  4812. var rop, op, r2: MPInteger;
  4813. begin
  4814. z_init(rop);
  4815. z_init_set_si(op, PRIME3);
  4816. z_nextprime(rop, op);
  4817. assert(z_get_si(rop) = PRIME4);
  4818. r2 := z_nextprime(op);
  4819. assert(z_get_si(r2) = PRIME4);
  4820. end;
  4821. procedure TTestGmpExtensions.z_gcd_test;
  4822. const
  4823. OP_1 = 42;
  4824. OP_2 = 56;
  4825. ROP_ = 14;
  4826. var rop, op1, op2, r2: MPInteger;
  4827. begin
  4828. z_init(rop);
  4829. z_init_set_si(op1, OP_1);
  4830. z_init_set_si(op2, OP_2);
  4831. z_gcd(rop, op1, op2);
  4832. assert(z_get_si(rop) = ROP_);
  4833. r2 := z_gcd(op1, op2);
  4834. assert(z_get_si(r2) = ROP_);
  4835. end;
  4836. procedure TTestGmpExtensions.z_gcd_ui_test;
  4837. const
  4838. OP_1 = 42;
  4839. OP_2 = 56;
  4840. ROP_ = 14;
  4841. var rop, op1: MPInteger;
  4842. begin
  4843. z_init(rop);
  4844. z_init_set_si(op1, OP_1);
  4845. assert(z_gcd_ui(rop, op1, OP_2) = ROP_);
  4846. assert(z_get_si(rop) = ROP_);
  4847. end;
  4848. procedure TTestGmpExtensions.z_gcdext_test;
  4849. const
  4850. A_ = 42;
  4851. B_ = 56;
  4852. G_ = 14;
  4853. var g, s, t, a, b: MPInteger;
  4854. begin
  4855. z_init(g);
  4856. z_init(s);
  4857. z_init(t);
  4858. z_init_set_si(a, A_);
  4859. z_init_set_si(b, B_);
  4860. z_gcdext(g, s, t, a, b);
  4861. assert(z_get_si(g) = G_);
  4862. assert(A_ * z_get_si(s) + B_ * z_get_si(t) = G_);
  4863. end;
  4864. procedure TTestGmpExtensions.z_lcm_test;
  4865. const
  4866. OP_1 = 21;
  4867. OP_2 = 6;
  4868. ROP_ = 42;
  4869. var rop, op1, op2, r2: MPInteger;
  4870. begin
  4871. z_init(rop);
  4872. z_init_set_si(op1, OP_1);
  4873. z_init_set_si(op2, OP_2);
  4874. z_lcm(rop, op1, op2);
  4875. assert(z_get_si(rop) = ROP_);
  4876. r2 := z_lcm(op1, op2);
  4877. assert(z_get_si(r2) = ROP_);
  4878. end;
  4879. procedure TTestGmpExtensions.z_lcm_ui_test;
  4880. const
  4881. OP_1 = 21;
  4882. OP_2 = 6;
  4883. ROP_ = 42;
  4884. var rop, op1, r2: MPInteger;
  4885. begin
  4886. z_init(rop);
  4887. z_init_set_si(op1, OP_1);
  4888. z_lcm_ui(rop, op1, OP_2);
  4889. assert(z_get_si(rop) = ROP_);
  4890. r2 := z_lcm_ui(op1, OP_2);
  4891. assert(z_get_si(r2) = ROP_);
  4892. end;
  4893. procedure TTestGmpExtensions.z_invert_test;
  4894. const
  4895. OP_1 = 256;
  4896. OP_2 = 337;
  4897. ROP_ = 104;
  4898. var rop, op1, op2: MPInteger;
  4899. begin
  4900. z_init(rop);
  4901. z_init_set_si(op1, OP_1);
  4902. z_init_set_si(op2, OP_2);
  4903. assert(z_invert(rop, op1, op2) <> 0);
  4904. assert(z_get_si(rop) = ROP_);
  4905. end;
  4906. procedure TTestGmpExtensions.z_jacobi_test;
  4907. const
  4908. B0 = 11;
  4909. A0 = 13 * B0;
  4910. AM1 = 1001;
  4911. BM1 = 9907;
  4912. A1 = 4;
  4913. B1 = 7;
  4914. var a, b: MPInteger;
  4915. begin
  4916. z_init_set_si(a, A0);
  4917. z_init_set_si(b, B0);
  4918. assert(z_jacobi(a, b) = 0);
  4919. z_set_si(a, AM1);
  4920. z_set_si(b, BM1);
  4921. assert(z_jacobi(a, b) = -1);
  4922. z_set_si(a, A1);
  4923. z_set_si(b, B1);
  4924. assert(z_jacobi(a, b) = 1);
  4925. end;
  4926. procedure TTestGmpExtensions.z_kronecker_si_test;
  4927. const
  4928. A_ = 8;
  4929. B0 = 6;
  4930. BM1 = 5;
  4931. B1 = 7;
  4932. var a: MPInteger;
  4933. begin
  4934. z_init_set_si(a, A_);
  4935. assert(z_kronecker_si(a, B1) = 1);
  4936. assert(z_kronecker_si(a, B0) = 0);
  4937. assert(z_kronecker_si(a, BM1) = -1);
  4938. end;
  4939. procedure TTestGmpExtensions.z_kronecker_ui_test;
  4940. const
  4941. A_ = 8;
  4942. B0 = 6;
  4943. BM1 = 5;
  4944. B1 = 7;
  4945. var a: MPInteger;
  4946. begin
  4947. z_init_set_si(a, A_);
  4948. assert(z_kronecker_ui(a, B1) = 1);
  4949. assert(z_kronecker_ui(a, B0) = 0);
  4950. assert(z_kronecker_ui(a, BM1) = -1);
  4951. end;
  4952. procedure TTestGmpExtensions.z_si_kronecker_test;
  4953. const
  4954. A_ = 8;
  4955. B0 = 6;
  4956. BM1 = 5;
  4957. B1 = 7;
  4958. var b: MPInteger;
  4959. begin
  4960. z_init_set_si(b, B1);
  4961. assert(z_si_kronecker(A_, b) = 1);
  4962. z_set_si(b, B0);
  4963. assert(z_si_kronecker(A_, b) = 0);
  4964. z_set_si(b, BM1);
  4965. assert(z_si_kronecker(A_, b) = -1);
  4966. end;
  4967. procedure TTestGmpExtensions.z_ui_kronecker_test;
  4968. const
  4969. A_ = 8;
  4970. B0 = 6;
  4971. BM1 = 5;
  4972. B1 = 7;
  4973. var b: MPInteger;
  4974. begin
  4975. z_init_set_si(b, B1);
  4976. assert(z_ui_kronecker(A_, b) = 1);
  4977. z_set_si(b, B0);
  4978. assert(z_ui_kronecker(A_, b) = 0);
  4979. z_set_si(b, BM1);
  4980. assert(z_ui_kronecker(A_, b) = -1);
  4981. end;
  4982. procedure TTestGmpExtensions.z_remove_test;
  4983. const
  4984. F_ = 5;
  4985. OP_ = 3 * F_ * 7;
  4986. ROP_ = OP_ div F_;
  4987. var rop, op, f: MPInteger;
  4988. begin
  4989. z_init(rop);
  4990. z_init_set_si(op, OP_);
  4991. z_init_set_si(f, F_);
  4992. assert(z_remove(rop, op, f) = 1);
  4993. assert(z_get_si(rop) = ROP_);
  4994. end;
  4995. procedure TTestGmpExtensions.z_fac_ui_test;
  4996. const
  4997. OP = 4;
  4998. ROP_ = 2 * 3 * 4;
  4999. var rop, r2: MPInteger;
  5000. begin
  5001. z_init(rop);
  5002. z_fac_ui(rop, OP);
  5003. assert(z_get_si(rop) = ROP_);
  5004. r2 := z_fac_ui(OP);
  5005. assert(z_get_si(r2) = ROP_);
  5006. end;
  5007. procedure TTestGmpExtensions.z_bin_ui_test;
  5008. const
  5009. N_ = 7;
  5010. K = 3;
  5011. ROP_ = 35;
  5012. var rop, n, r2: MPInteger;
  5013. begin
  5014. z_init(rop);
  5015. z_init_set_si(n, N_);
  5016. z_bin_ui(rop, n, K);
  5017. assert(z_get_si(rop) = ROP_);
  5018. r2 := z_bin_ui(n, K);
  5019. assert(z_get_si(r2) = ROP_);
  5020. end;
  5021. procedure TTestGmpExtensions.z_bin_uiui_test;
  5022. const
  5023. N = 7;
  5024. K = 3;
  5025. ROP_ = 35;
  5026. var rop, r2: MPInteger;
  5027. begin
  5028. z_init(rop);
  5029. z_bin_uiui(rop, N, K);
  5030. assert(z_get_si(rop) = ROP_);
  5031. r2 := z_bin_uiui(N, K);
  5032. assert(z_get_si(r2) = ROP_);
  5033. end;
  5034. procedure TTestGmpExtensions.z_fib_ui_test;
  5035. const
  5036. N = 10;
  5037. FN_ = 55;
  5038. var fn, ff: MPInteger;
  5039. begin
  5040. z_init(fn);
  5041. z_fib_ui(fn, N);
  5042. assert(z_get_si(fn) = FN_);
  5043. ff := z_fib_ui(N);
  5044. assert(z_get_si(ff) = FN_);
  5045. end;
  5046. procedure TTestGmpExtensions.z_fib2_ui_test;
  5047. const
  5048. N = 10;
  5049. FN_ = 55;
  5050. FNSUB1_ = 34;
  5051. var fn, fnsub1, ff, ff1: MPInteger;
  5052. begin
  5053. z_init(fn);
  5054. z_init(fnsub1);
  5055. z_fib2_ui(fn, fnsub1, N);
  5056. assert(z_get_si(fn) = FN_);
  5057. assert(z_get_si(fnsub1) = FNSUB1_);
  5058. z_init(ff1);
  5059. ff := z_fib2_ui(ff1, N);
  5060. assert(z_get_si(ff) = FN_);
  5061. assert(z_get_si(ff1) = FNSUB1_);
  5062. end;
  5063. procedure TTestGmpExtensions.z_lucnum_ui_test;
  5064. const
  5065. N = 10;
  5066. LN_ = 123;
  5067. var ln, l2: MPInteger;
  5068. begin
  5069. z_init(ln);
  5070. z_lucnum_ui(ln, N);
  5071. assert(z_get_si(ln) = LN_);
  5072. l2 := z_lucnum_ui(N);
  5073. assert(z_get_si(l2) = LN_);
  5074. end;
  5075. procedure TTestGmpExtensions.z_lucnum2_ui_test;
  5076. const
  5077. N = 10;
  5078. LN_ = 123;
  5079. LNSUB1_ = 76;
  5080. var ln, lnsub1, l2, l2s1: MPInteger;
  5081. begin
  5082. z_init(ln);
  5083. z_init(lnsub1);
  5084. z_lucnum2_ui(ln, lnsub1, N);
  5085. assert(z_get_si(ln) = LN_);
  5086. assert(z_get_si(lnsub1) = LNSUB1_);
  5087. z_init(l2s1);
  5088. l2 := z_lucnum2_ui(l2s1, N);
  5089. assert(z_get_si(l2) = LN_);
  5090. assert(z_get_si(l2s1) = LNSUB1_);
  5091. end;
  5092. procedure TTestGmpExtensions.z_cmp_test;
  5093. const
  5094. OP_1 = -10;
  5095. OP_2 = OP_1 - 1;
  5096. var op1, op2: MPInteger;
  5097. begin
  5098. z_init_set_si(op1, OP_1);
  5099. z_init_set_si(op2, OP_2);
  5100. assert(z_cmp(op1, op2) > 0);
  5101. z_set_si(op2, OP_1);
  5102. assert(z_cmp(op1, op2) = 0);
  5103. z_set_si(op2, OP_1 + 1);
  5104. assert(z_cmp(op1, op2) < 0);
  5105. end;
  5106. procedure TTestGmpExtensions.z_cmp_d_test;
  5107. const
  5108. OP_1 = -10;
  5109. var op1: MPInteger;
  5110. begin
  5111. z_init_set_si(op1, OP_1);
  5112. assert(z_cmp_d(op1, OP_1 - 1) > 0);
  5113. assert(z_cmp_d(op1, OP_1) = 0);
  5114. assert(z_cmp_d(op1, OP_1 + 1) < 0);
  5115. end;
  5116. procedure TTestGmpExtensions.z_cmp_si_test;
  5117. const
  5118. OP_1 = -10;
  5119. var op1: MPInteger;
  5120. begin
  5121. z_init_set_si(op1, OP_1);
  5122. assert(z_cmp_si(op1, OP_1 - 1) > 0);
  5123. assert(z_cmp_si(op1, OP_1) = 0);
  5124. assert(z_cmp_si(op1, OP_1 + 1) < 0);
  5125. end;
  5126. procedure TTestGmpExtensions.z_cmp_ui_test;
  5127. const
  5128. OP_1 = 10;
  5129. var op1: MPInteger;
  5130. begin
  5131. z_init_set_si(op1, OP_1);
  5132. assert(z_cmp_ui(op1, OP_1 - 1) > 0);
  5133. assert(z_cmp_ui(op1, OP_1) = 0);
  5134. assert(z_cmp_ui(op1, OP_1 + 1) < 0);
  5135. end;
  5136. procedure TTestGmpExtensions.z_cmpabs_test;
  5137. const
  5138. OP_1 = -10;
  5139. OP_2 = -OP_1 - 1;
  5140. var op1, op2: MPInteger;
  5141. begin
  5142. z_init_set_si(op1, OP_1);
  5143. z_init_set_si(op2, -OP_2);
  5144. assert(z_cmpabs(op1, op2) > 0);
  5145. z_set_si(op2, -OP_1);
  5146. assert(z_cmpabs(op1, op2) = 0);
  5147. z_set_si(op2, -OP_1 + 1);
  5148. assert(z_cmpabs(op1, op2) < 0);
  5149. end;
  5150. procedure TTestGmpExtensions.z_cmpabs_d_test;
  5151. const OP_1 = -10;
  5152. var op1: MPInteger;
  5153. begin
  5154. z_init_set_si(op1, OP_1);
  5155. assert(z_cmpabs_d(op1, -OP_1 - 1) > 0);
  5156. assert(z_cmpabs_d(op1, -OP_1) = 0);
  5157. assert(z_cmpabs_d(op1, -OP_1 + 1) < 0);
  5158. end;
  5159. procedure TTestGmpExtensions.z_cmpabs_ui_test;
  5160. const OP_1 = -10;
  5161. var op1: MPInteger;
  5162. begin
  5163. z_init_set_si(op1, OP_1);
  5164. assert(z_cmpabs_ui(op1, -OP_1 - 1) > 0);
  5165. assert(z_cmpabs_ui(op1, -OP_1) = 0);
  5166. assert(z_cmpabs_ui(op1, -OP_1 + 1) < 0);
  5167. end;
  5168. procedure TTestGmpExtensions.z_and_test;
  5169. const
  5170. OP_1 = $c;
  5171. OP_2 = $a;
  5172. var rop, op1, op2, r2: MPInteger;
  5173. begin
  5174. z_init(rop);
  5175. z_init_set_si(op1, OP_1);
  5176. z_init_set_si(op2, OP_2);
  5177. z_and(rop, op1, op2);
  5178. assert(z_get_si(rop) = OP_1 and OP_2);
  5179. r2 := z_and(op1, op2);
  5180. assert(z_get_si(r2) = OP_1 and OP_2);
  5181. end;
  5182. procedure TTestGmpExtensions.z_ior_test;
  5183. const
  5184. OP_1 = $c;
  5185. OP_2 = $a;
  5186. var rop, op1, op2, r2: MPInteger;
  5187. begin
  5188. z_init(rop);
  5189. z_init_set_si(op1, OP_1);
  5190. z_init_set_si(op2, OP_2);
  5191. z_ior(rop, op1, op2);
  5192. assert(z_get_si(rop) = OP_1 or OP_2);
  5193. r2 := z_ior(op1, op2);
  5194. assert(z_get_si(r2) = OP_1 or OP_2);
  5195. end;
  5196. procedure TTestGmpExtensions.z_xor_test;
  5197. const
  5198. OP_1 = $c;
  5199. OP_2 = $a;
  5200. var rop, op1, op2, r2: MPInteger;
  5201. begin
  5202. z_init(rop);
  5203. z_init_set_si(op1, OP_1);
  5204. z_init_set_si(op2, OP_2);
  5205. z_xor(rop, op1, op2);
  5206. assert(z_get_si(rop) = OP_1 xor OP_2);
  5207. r2 := z_xor(op1, op2);
  5208. assert(z_get_si(r2) = OP_1 xor OP_2);
  5209. end;
  5210. procedure TTestGmpExtensions.z_com_test;
  5211. const
  5212. OP_1 = 2;
  5213. var rop, op1, r2: MPInteger;
  5214. begin
  5215. z_init(rop);
  5216. z_init_set_si(op1, OP_1);
  5217. z_com(rop, op1);
  5218. assert(z_get_si(rop) = not OP_1 );
  5219. r2 := z_com(op1);
  5220. assert(z_get_si(r2) = not OP_1 );
  5221. end;
  5222. procedure TTestGmpExtensions.z_popcount_test;
  5223. const
  5224. OP_ = $55AA;
  5225. N = 8;
  5226. var op: MPInteger;
  5227. begin
  5228. z_init_set_si(op, OP_);
  5229. assert(z_popcount(op) = N);
  5230. end;
  5231. procedure TTestGmpExtensions.z_hamdist_test;
  5232. const
  5233. OP_1 = $55;
  5234. OP_2 = $7A;
  5235. N = 5;
  5236. var op1, op2: MPInteger;
  5237. begin
  5238. z_init_set_si(op1, OP_1);
  5239. z_init_set_si(op2, OP_2);
  5240. assert(z_hamdist(op1, op2) = N);
  5241. end;
  5242. procedure TTestGmpExtensions.z_scan0_test;
  5243. const
  5244. OP_ = $F75;
  5245. STARTING_BIT = 4;
  5246. N = 7;
  5247. var op: MPInteger;
  5248. begin
  5249. z_init_set_si(op, OP_);
  5250. assert(z_scan0(op, STARTING_BIT) = N);
  5251. end;
  5252. procedure TTestGmpExtensions.z_scan1_test;
  5253. const
  5254. OP_ = $85;
  5255. STARTING_BIT = 4;
  5256. N = 7;
  5257. var op: MPInteger;
  5258. begin
  5259. z_init_set_si(op, OP_);
  5260. assert(z_scan1(op, STARTING_BIT) = N);
  5261. end;
  5262. procedure TTestGmpExtensions.z_setbit_test;
  5263. const
  5264. ROP_ = $F75;
  5265. BIT_INDEX = 7;
  5266. var rop: MPInteger;
  5267. begin
  5268. z_init_set_ui(rop, ROP_);
  5269. z_setbit(rop, BIT_INDEX);
  5270. assert(z_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
  5271. end;
  5272. procedure TTestGmpExtensions.z_clrbit_test;
  5273. const
  5274. ROP_ = $F75;
  5275. BIT_INDEX = 9;
  5276. var rop: MPInteger;
  5277. begin
  5278. z_init_set_ui(rop, ROP_);
  5279. z_clrbit(rop, BIT_INDEX);
  5280. assert(z_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
  5281. end;
  5282. procedure TTestGmpExtensions.z_combit_test;
  5283. const
  5284. ROP_ = $F75;
  5285. BIT_INDEX = 7;
  5286. var rop: MPInteger;
  5287. begin
  5288. z_init_set_ui(rop, ROP_);
  5289. z_combit(rop, BIT_INDEX);
  5290. assert(z_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
  5291. end;
  5292. procedure TTestGmpExtensions.z_tstbit_test;
  5293. const
  5294. ROP_ = $F75;
  5295. BIT_INDEX1 = 7;
  5296. BIT_INDEX2 = 8;
  5297. var rop: MPInteger;
  5298. begin
  5299. z_init_set_ui(rop, ROP_);
  5300. assert(z_tstbit(rop, BIT_INDEX1) = longbool(ROP_ and (1 shl BIT_INDEX1)));
  5301. assert(z_tstbit(rop, BIT_INDEX2) = longbool(ROP_ and (1 shl BIT_INDEX2)));
  5302. end;
  5303. procedure TTestGmpExtensions.z_urandomb_test;
  5304. const
  5305. B = 8 * (sizeof(valuint) - 1);
  5306. N = 1 shl B;
  5307. var
  5308. rop, r2: MPInteger;
  5309. state: MPRandState;
  5310. begin
  5311. randinit_default(state);
  5312. z_init(rop);
  5313. z_urandomb(rop, state, B);
  5314. assert(z_cmp_ui(rop, N) < 0);
  5315. r2 := z_urandomb(state, B);
  5316. assert(z_cmp_ui(r2, N) < 0);
  5317. end;
  5318. procedure TTestGmpExtensions.z_urandomm_test;
  5319. const
  5320. N_ = 1000000;
  5321. var
  5322. rop, n, r2: MPInteger;
  5323. state: MPRandState;
  5324. begin
  5325. randinit_default(state);
  5326. z_init(rop);
  5327. z_init_set_ui(n, N_);
  5328. z_urandomm(rop, state, n);
  5329. assert(z_cmp_ui(rop, N_) < 0);
  5330. r2 := z_urandomm(state, n);
  5331. assert(z_cmp_ui(r2, N_) < 0);
  5332. end;
  5333. procedure TTestGmpExtensions.z_rrandomb_test;
  5334. const
  5335. B = 8 * sizeof(valuint) - 2;
  5336. N = 1 shl B;
  5337. var
  5338. rop, r2: MPInteger;
  5339. state: MPRandState;
  5340. begin
  5341. randinit_default(state);
  5342. z_init(rop);
  5343. z_rrandomb(rop, state, B);
  5344. assert(z_cmp_ui(rop, N) < 0);
  5345. r2 := z_rrandomb(state, B);
  5346. assert(z_cmp_ui(r2, N) < 0);
  5347. end;
  5348. procedure TTestGmpExtensions.z_fits_ushort_p_test;
  5349. var op: MPInteger;
  5350. begin
  5351. z_init_set_ui(op, high(word));
  5352. assert(z_fits_ushort_p(op));
  5353. z_add_ui(op, op, 1);
  5354. assert(not z_fits_ushort_p(op));
  5355. end;
  5356. procedure TTestGmpExtensions.z_fits_sshort_p_test;
  5357. var op: MPInteger;
  5358. begin
  5359. z_init_set_si(op, high(smallint));
  5360. assert(z_fits_sshort_p(op));
  5361. z_add_ui(op, op, 1);
  5362. assert(not z_fits_sshort_p(op));
  5363. end;
  5364. procedure TTestGmpExtensions.z_fits_uint_p_test;
  5365. var op: MPInteger;
  5366. begin
  5367. z_init_set_ui(op, high(cardinal));
  5368. assert(z_fits_uint_p(op));
  5369. z_add_ui(op, op, 1);
  5370. assert(not z_fits_uint_p(op));
  5371. end;
  5372. procedure TTestGmpExtensions.z_fits_sint_p_test;
  5373. var op: MPInteger;
  5374. begin
  5375. z_init_set_si(op, high(integer));
  5376. assert(z_fits_sint_p(op));
  5377. z_add_ui(op, op, 1);
  5378. assert(not z_fits_sint_p(op));
  5379. end;
  5380. procedure TTestGmpExtensions.z_fits_ulong_p_test;
  5381. var op: MPInteger;
  5382. begin
  5383. z_init_set_ui(op, high(valuint));
  5384. assert(z_fits_ulong_p(op));
  5385. z_add_ui(op, op, 1);
  5386. assert(not z_fits_ulong_p(op));
  5387. end;
  5388. procedure TTestGmpExtensions.z_fits_slong_p_test;
  5389. var op: MPInteger;
  5390. begin
  5391. z_init_set_si(op, high(valsint));
  5392. assert(z_fits_slong_p(op));
  5393. z_add_ui(op, op, 1);
  5394. assert(not z_fits_slong_p(op));
  5395. end;
  5396. procedure TTestGmpExtensions.z_sizeinbase_test;
  5397. const
  5398. OP_ = 1000000;
  5399. var rop: MPInteger;
  5400. begin
  5401. z_init_set_ui(rop, OP_);
  5402. assert(z_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
  5403. end;
  5404. procedure TTestGmpExtensions.z_size_test;
  5405. var rop: MPInteger;
  5406. begin
  5407. z_init(rop);
  5408. assert(z_size(rop) = 0);
  5409. z_add_ui(rop, rop, 1);
  5410. assert(z_size(rop) = 1);
  5411. end;
  5412. procedure TTestGmpExtensions.q_init_test;
  5413. var rational: MPRational;
  5414. begin
  5415. q_init(rational);
  5416. assert(q_cmp_ui(rational, 0, 1) = 0);
  5417. end;
  5418. procedure TTestGmpExtensions.q_clear_test;
  5419. var rational: MPRational;
  5420. begin
  5421. q_init(rational);
  5422. q_clear(rational);
  5423. end;
  5424. procedure TTestGmpExtensions.q_set_ui_test;
  5425. const
  5426. OP_1 = 13;
  5427. OP_2 = 17;
  5428. var rational: MPRational;
  5429. begin
  5430. q_init(rational);
  5431. q_set_ui(rational, OP_1, OP_2);
  5432. assert(q_cmp_ui(rational, OP_1, OP_2) = 0);
  5433. end;
  5434. procedure TTestGmpExtensions.q_set_si_test;
  5435. const
  5436. OP_1 = -13;
  5437. OP_2 = 17;
  5438. var rational: MPRational;
  5439. begin
  5440. q_init(rational);
  5441. q_set_si(rational, OP_1, OP_2);
  5442. assert(q_cmp_si(rational, OP_1, OP_2) = 0);
  5443. end;
  5444. procedure TTestGmpExtensions.q_canonicalize_test;
  5445. const
  5446. OP_1 = -13;
  5447. OP_2 = 17;
  5448. CF = 11;
  5449. var rational: MPRational;
  5450. begin
  5451. q_init(rational);
  5452. q_set_si(rational, CF * OP_1, CF * OP_2);
  5453. q_canonicalize(rational);
  5454. assert(q_cmp_si(rational, OP_1, OP_2) = 0);
  5455. end;
  5456. procedure TTestGmpExtensions.q_set_test;
  5457. const
  5458. OP_1 = -13;
  5459. OP_2 = 17;
  5460. var rational1, rational2: MPRational;
  5461. begin
  5462. q_init(rational1);
  5463. q_init(rational2);
  5464. q_set_si(rational2, OP_1, OP_2);
  5465. q_set(rational1, rational2);
  5466. assert(q_cmp_si(rational1, OP_1, OP_2) = 0);
  5467. end;
  5468. procedure TTestGmpExtensions.q_set_z_test;
  5469. const
  5470. OP_1 = -13;
  5471. var
  5472. rational: MPRational;
  5473. op: MPInteger;
  5474. begin
  5475. q_init(rational);
  5476. z_init_set_si(op, OP_1);
  5477. q_set_z(rational, op);
  5478. assert(q_cmp_si(rational, OP_1, 1) = 0);
  5479. end;
  5480. procedure TTestGmpExtensions.q_set_str_test;
  5481. const
  5482. OP_1 = -13;
  5483. OP_2 = 17;
  5484. var rational: MPRational;
  5485. begin
  5486. q_init(rational);
  5487. assert(q_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10));
  5488. assert(q_cmp_si(rational, OP_1, OP_2) = 0);
  5489. assert(not q_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10));
  5490. end;
  5491. procedure TTestGmpExtensions.q_swap_test;
  5492. const
  5493. ROP_1N = -13;
  5494. ROP_1D = 17;
  5495. ROP_2N = -23;
  5496. ROP_2D = 31;
  5497. var rop1, rop2: MPRational;
  5498. begin
  5499. q_init(rop1);
  5500. q_init(rop2);
  5501. q_set_si(rop1, ROP_1N, ROP_1D);
  5502. q_set_si(rop2, ROP_2N, ROP_2D);
  5503. q_swap(rop1, rop2);
  5504. assert(q_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
  5505. assert(q_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
  5506. end;
  5507. procedure TTestGmpExtensions.q_get_d_test;
  5508. const
  5509. OP_1 = -1;
  5510. OP_2 = 2;
  5511. var op: MPRational;
  5512. begin
  5513. q_init(op);
  5514. q_set_si(op, OP_1, OP_2);
  5515. assert(q_get_d(op) = OP_1 / OP_2);
  5516. end;
  5517. procedure TTestGmpExtensions.q_set_d_test;
  5518. const
  5519. OP_1 = -1;
  5520. OP_2 = 2;
  5521. var rop: MPRational;
  5522. begin
  5523. q_init(rop);
  5524. q_set_d(rop, OP_1 / OP_2);
  5525. assert(q_cmp_si(rop, OP_1, OP_2) = 0);
  5526. end;
  5527. procedure TTestGmpExtensions.q_set_f_test;
  5528. const OP_ = -10;
  5529. var
  5530. op: MPFloat;
  5531. rop: MPRational;
  5532. begin
  5533. f_init_set_si(op, OP_);
  5534. q_init(rop);
  5535. q_set_f(rop, op);
  5536. assert(q_get_d(rop) = OP_);
  5537. end;
  5538. procedure TTestGmpExtensions.q_get_str_test;
  5539. const
  5540. OP_1 = -1;
  5541. OP_2 = 2;
  5542. var
  5543. op: MPRational;
  5544. p: pchar;
  5545. s, s2: string;
  5546. begin
  5547. q_init(op);
  5548. q_set_si(op, OP_1, OP_2);
  5549. s := q_get_str(BASE10, op);
  5550. assert(s = inttostr(OP_1) + '/' + inttostr(OP_2));
  5551. p := q_get_str(nil, BASE10, op);
  5552. assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
  5553. freemem(p);
  5554. setlength(s2, length(inttostr(OP_1) + '/' + inttostr(OP_2)));
  5555. assert(pointer(q_get_str(pchar(s2), BASE10, op)) = pointer(s2));
  5556. assert(s2 = inttostr(OP_1) + '/' + inttostr(OP_2));
  5557. end;
  5558. procedure TTestGmpExtensions.q_add_test;
  5559. const
  5560. N1 = 5;
  5561. D1 = 2;
  5562. N2 = -7;
  5563. D2 = 3;
  5564. var sum, addend1, addend2, s2: MPRational;
  5565. begin
  5566. q_init(sum);
  5567. q_init(addend1);
  5568. q_init(addend2);
  5569. q_set_si(addend1, N1, D1);
  5570. q_set_si(addend2, N2, D2);
  5571. q_add(sum, addend1, addend2);
  5572. assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
  5573. s2 := q_add(addend1, addend2);
  5574. assert(q_cmp_si(s2, N1 * D2 + N2 * D1, D1 * D2) = 0);
  5575. end;
  5576. procedure TTestGmpExtensions.q_sub_test;
  5577. const
  5578. N1 = 5;
  5579. D1 = 2;
  5580. N2 = -7;
  5581. D2 = 3;
  5582. var difference, minuend, subtrahend, diff2: MPRational;
  5583. begin
  5584. q_init(difference);
  5585. q_init(minuend);
  5586. q_init(subtrahend);
  5587. q_set_si(minuend, N1, D1);
  5588. q_set_si(subtrahend, N2, D2);
  5589. q_sub(difference, minuend, subtrahend);
  5590. assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
  5591. diff2 := q_sub(minuend, subtrahend);
  5592. assert(q_cmp_si(diff2, N1 * D2 - N2 * D1, D1 * D2) = 0);
  5593. end;
  5594. procedure TTestGmpExtensions.q_mul_test;
  5595. const
  5596. N1 = 5;
  5597. D1 = 2;
  5598. N2 = -7;
  5599. D2 = 3;
  5600. var product, multiplier, multiplicant, p2: MPRational;
  5601. begin
  5602. q_init(product);
  5603. q_init(multiplier);
  5604. q_init(multiplicant);
  5605. q_set_si(multiplier, N1, D1);
  5606. q_set_si(multiplicant, N2, D2);
  5607. q_mul(product, multiplier, multiplicant);
  5608. assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
  5609. p2 := q_mul(multiplier, multiplicant);
  5610. assert(q_cmp_si(p2, N1 * N2, D1 * D2) = 0);
  5611. end;
  5612. procedure TTestGmpExtensions.q_mul_2exp_test;
  5613. const
  5614. N1 = 5;
  5615. D1 = 3;
  5616. OP_2 = 2;
  5617. var rop, op1, r2: MPRational;
  5618. begin
  5619. q_init(rop);
  5620. q_init(op1);
  5621. q_set_si(op1, N1, D1);
  5622. q_mul_2exp(rop, op1, OP_2);
  5623. assert(q_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
  5624. r2 := q_mul_2exp(op1, OP_2);
  5625. assert(q_cmp_si(r2, N1 * (1 shl OP_2), D1) = 0);
  5626. end;
  5627. procedure TTestGmpExtensions.q_div_test;
  5628. const
  5629. N1 = 5;
  5630. D1 = 2;
  5631. N2 = -7;
  5632. D2 = 3;
  5633. var quotient, dividend, divisor, q2: MPRational;
  5634. begin
  5635. q_init(quotient);
  5636. q_init(dividend);
  5637. q_init(divisor);
  5638. q_set_si(dividend, N1, D1);
  5639. q_set_si(divisor, N2, D2);
  5640. q_div(quotient, dividend, divisor);
  5641. assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
  5642. q2 := q_div(dividend, divisor);
  5643. assert(q_cmp_si(q2, -N1 * D2, -D1 * N2) = 0);
  5644. end;
  5645. procedure TTestGmpExtensions.q_div_2exp_test;
  5646. const
  5647. N1 = 5;
  5648. D1 = 3;
  5649. OP_2 = 2;
  5650. var rop, op1, r2: MPRational;
  5651. begin
  5652. q_init(rop);
  5653. q_init(op1);
  5654. q_set_si(op1, N1, D1);
  5655. q_div_2exp(rop, op1, OP_2);
  5656. assert(q_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
  5657. r2 := q_div_2exp(op1, OP_2);
  5658. assert(q_cmp_si(r2, N1, D1 * (1 shl OP_2)) = 0);
  5659. end;
  5660. procedure TTestGmpExtensions.q_neg_test;
  5661. const
  5662. N1 = -5;
  5663. D1 = 3;
  5664. var negated_operand, operand, n2: MPRational;
  5665. begin
  5666. q_init(negated_operand);
  5667. q_init(operand);
  5668. q_set_si(operand, N1, D1);
  5669. q_neg(negated_operand, operand);
  5670. assert(q_cmp_si(negated_operand, -N1, D1) = 0);
  5671. n2 := q_neg(operand);
  5672. assert(q_cmp_si(n2, -N1, D1) = 0);
  5673. end;
  5674. procedure TTestGmpExtensions.q_abs_test;
  5675. const
  5676. N1 = 5;
  5677. D1 = 3;
  5678. var rop, op, r2: MPRational;
  5679. begin
  5680. q_init(rop);
  5681. q_init(op);
  5682. q_set_si(op, -N1, D1);
  5683. q_abs(rop, op);
  5684. assert(q_cmp_si(rop, N1, D1) = 0);
  5685. r2 := q_abs(op);
  5686. assert(q_cmp_si(r2, N1, D1) = 0);
  5687. end;
  5688. procedure TTestGmpExtensions.q_inv_test;
  5689. const
  5690. N1 = -5;
  5691. D1 = 3;
  5692. var inverted_number, number, i2: MPRational;
  5693. begin
  5694. q_init(inverted_number);
  5695. q_init(number);
  5696. q_set_si(number, N1, D1);
  5697. q_inv(inverted_number, number);
  5698. assert(q_cmp_si(inverted_number, -D1, -N1) = 0);
  5699. i2 := q_inv(number);
  5700. assert(q_cmp_si(i2, -D1, -N1) = 0);
  5701. end;
  5702. procedure TTestGmpExtensions.q_cmp_test;
  5703. const
  5704. N1 = -7;
  5705. D1 = 5;
  5706. var op1, op2: MPRational;
  5707. begin
  5708. q_init(op1);
  5709. q_init(op2);
  5710. q_set_si(op1, N1, D1);
  5711. q_set_si(op2, N1, D1);
  5712. assert(q_cmp(op1, op2) = 0);
  5713. q_set_si(op1, N1 + 1, D1);
  5714. assert(q_cmp(op1, op2) > 0);
  5715. q_set_si(op1, N1 - 1, D1);
  5716. assert(q_cmp(op1, op2) < 0);
  5717. end;
  5718. procedure TTestGmpExtensions.q_cmp_si_test;
  5719. const
  5720. N1 = -7;
  5721. D1 = 5;
  5722. var op1: MPRational;
  5723. begin
  5724. q_init(op1);
  5725. q_set_si(op1, N1, D1);
  5726. assert(q_cmp_si(op1, N1, D1) = 0);
  5727. assert(q_cmp_si(op1, N1 - 1, D1) > 0);
  5728. assert(q_cmp_si(op1, N1 + 1, D1) < 0);
  5729. end;
  5730. procedure TTestGmpExtensions.q_cmp_ui_test;
  5731. const
  5732. N1 = 7;
  5733. D1 = 5;
  5734. var op1: MPRational;
  5735. begin
  5736. q_init(op1);
  5737. q_set_si(op1, N1, D1);
  5738. assert(q_cmp_ui(op1, N1, D1) = 0);
  5739. assert(q_cmp_ui(op1, N1 - 1, D1) > 0);
  5740. assert(q_cmp_ui(op1, N1 + 1, D1) < 0);
  5741. end;
  5742. procedure TTestGmpExtensions.q_equal_test;
  5743. const
  5744. N1 = -7;
  5745. D1 = 5;
  5746. var op1, op2: MPRational;
  5747. begin
  5748. q_init(op1);
  5749. q_init(op2);
  5750. q_set_si(op1, N1, D1);
  5751. q_set_si(op2, N1, D1);
  5752. assert(q_equal(op1, op2));
  5753. q_set_si(op1, N1 + 1, D1);
  5754. assert(not q_equal(op1, op2));
  5755. q_set_si(op1, N1 - 1, D1);
  5756. assert(not q_equal(op1, op2));
  5757. end;
  5758. procedure TTestGmpExtensions.q_get_num_test;
  5759. const
  5760. N1 = -7;
  5761. D1 = 5;
  5762. var
  5763. rational: MPRational;
  5764. numerator, n2: MPInteger;
  5765. begin
  5766. q_init(rational);
  5767. z_init(numerator);
  5768. q_set_si(rational, N1, D1);
  5769. q_get_num(numerator, rational);
  5770. assert(z_get_si(numerator) = N1);
  5771. n2 := q_get_num(rational);
  5772. assert(z_get_si(n2) = N1);
  5773. end;
  5774. procedure TTestGmpExtensions.q_get_den_test;
  5775. const
  5776. N1 = -7;
  5777. D1 = 5;
  5778. var
  5779. rational: MPRational;
  5780. denominator, d2: MPInteger;
  5781. begin
  5782. q_init(rational);
  5783. z_init(denominator);
  5784. q_set_si(rational, N1, D1);
  5785. q_get_den(denominator, rational);
  5786. assert(z_get_si(denominator) = D1);
  5787. d2 := q_get_den(rational);
  5788. assert(z_get_si(d2) = D1);
  5789. end;
  5790. procedure TTestGmpExtensions.q_set_num_test;
  5791. const
  5792. N1 = -7;
  5793. D1 = 5;
  5794. N2 = 3;
  5795. var
  5796. rational: MPRational;
  5797. numerator: MPInteger;
  5798. begin
  5799. q_init(rational);
  5800. z_init_set_si(numerator, N2);
  5801. q_set_si(rational, N1, D1);
  5802. q_set_num(rational, numerator);
  5803. assert(q_cmp_si(rational, N2, D1) = 0);
  5804. end;
  5805. procedure TTestGmpExtensions.q_set_den_test;
  5806. const
  5807. N1 = -7;
  5808. D1 = 5;
  5809. D2 = 3;
  5810. var
  5811. rational: MPRational;
  5812. denominator: MPInteger;
  5813. begin
  5814. q_init(rational);
  5815. z_init_set_si(denominator, D2);
  5816. q_set_si(rational, N1, D1);
  5817. q_set_den(rational, denominator);
  5818. assert(q_cmp_si(rational, N1, D2) = 0);
  5819. end;
  5820. procedure TTestGmpExtensions.f_get_default_prec_test;
  5821. begin
  5822. assert(f_get_default_prec > 0);
  5823. end;
  5824. procedure TTestGmpExtensions.f_set_default_prec_test;
  5825. var prec: valuint;
  5826. begin
  5827. prec := f_get_default_prec;
  5828. f_set_default_prec(2 * prec);
  5829. assert(f_get_default_prec = 2 * prec);
  5830. f_set_default_prec(prec);
  5831. end;
  5832. procedure TTestGmpExtensions.f_init_test;
  5833. var x: MPFloat;
  5834. begin
  5835. f_init(x);
  5836. assert(f_get_prec(x) = f_get_default_prec);
  5837. end;
  5838. procedure TTestGmpExtensions.f_init2_test;
  5839. var x: MPFloat;
  5840. begin
  5841. f_init2(x, 2 * f_get_default_prec);
  5842. assert(f_get_prec(x) = 2 * f_get_default_prec);
  5843. end;
  5844. procedure TTestGmpExtensions.f_clear_test;
  5845. var x: MPFloat;
  5846. begin
  5847. f_init(x);
  5848. f_clear(x);
  5849. end;
  5850. procedure TTestGmpExtensions.f_get_prec_test;
  5851. var x: MPFloat;
  5852. begin
  5853. f_init(x);
  5854. f_set_prec(x, 2 * f_get_default_prec);
  5855. assert(f_get_prec(x) = 2 * f_get_default_prec);
  5856. end;
  5857. procedure TTestGmpExtensions.f_set_prec_test;
  5858. var x: MPFloat;
  5859. begin
  5860. f_init(x);
  5861. f_set_prec(x, 2 * f_get_default_prec);
  5862. assert(f_get_prec(x) = 2 * f_get_default_prec);
  5863. end;
  5864. procedure TTestGmpExtensions.f_set_prec_raw_test;
  5865. const N = 10;
  5866. var x: MPFloat;
  5867. begin
  5868. f_init2(x, N * f_get_default_prec);
  5869. f_set_prec_raw(x, f_get_default_prec);
  5870. f_set_prec_raw(x, N * f_get_default_prec);
  5871. end;
  5872. procedure TTestGmpExtensions.f_set_q_test;
  5873. const OP_ = -10;
  5874. var
  5875. op: MPRational;
  5876. rop: MPFloat;
  5877. begin
  5878. q_init(op);
  5879. f_init(rop);
  5880. q_set_si(op, OP_, 1);
  5881. f_set_q(rop, op);
  5882. assert(f_get_si(rop) = OP_);
  5883. end;
  5884. procedure TTestGmpExtensions.f_set_ui_test;
  5885. const OP = 1000000;
  5886. var rop: MPFloat;
  5887. begin
  5888. f_init(rop);
  5889. f_set_ui(rop, OP);
  5890. assert(f_get_ui(rop) = OP);
  5891. end;
  5892. procedure TTestGmpExtensions.f_get_ui_test;
  5893. const OP = 1000000;
  5894. var rop: MPFloat;
  5895. begin
  5896. f_init(rop);
  5897. f_set_ui(rop, OP);
  5898. assert(f_get_ui(rop) = OP);
  5899. end;
  5900. procedure TTestGmpExtensions.f_set_si_test;
  5901. const OP = -1000000;
  5902. var rop: MPFloat;
  5903. begin
  5904. f_init(rop);
  5905. f_set_si(rop, OP);
  5906. assert(f_get_si(rop) = OP);
  5907. end;
  5908. procedure TTestGmpExtensions.f_get_si_test;
  5909. const OP = -1000000;
  5910. var rop: MPFloat;
  5911. begin
  5912. f_init(rop);
  5913. f_set_si(rop, OP);
  5914. assert(f_get_si(rop) = OP);
  5915. end;
  5916. procedure TTestGmpExtensions.f_set_test;
  5917. const N = -1000000;
  5918. var rop, op: MPFloat;
  5919. begin
  5920. f_init(rop);
  5921. f_init_set_si(op, N);
  5922. f_set(rop, op);
  5923. assert(f_get_si(rop) = N);
  5924. end;
  5925. procedure TTestGmpExtensions.f_set_str_test;
  5926. const N = -123;
  5927. var rop: MPFloat;
  5928. begin
  5929. f_init(rop);
  5930. assert(f_set_str(rop, inttostr(N), BASE10));
  5931. assert(f_get_si(rop) = N);
  5932. end;
  5933. procedure TTestGmpExtensions.f_swap_test;
  5934. const
  5935. ROP_1 = -13;
  5936. ROP_2 = -23;
  5937. var rop1, rop2: MPFloat;
  5938. begin
  5939. f_init_set_si(rop1, ROP_1);
  5940. f_init_set_si(rop2, ROP_2);
  5941. f_swap(rop1, rop2);
  5942. assert(f_get_si(rop1) = ROP_2);
  5943. assert(f_get_si(rop2) = ROP_1);
  5944. end;
  5945. procedure TTestGmpExtensions.f_get_d_test;
  5946. const N = -1.5;
  5947. var rop: MPFloat;
  5948. begin
  5949. f_init_set_d(rop, N);
  5950. assert(f_get_d(rop) = N);
  5951. end;
  5952. procedure TTestGmpExtensions.f_set_d_test;
  5953. const N = -1.5;
  5954. var rop: MPFloat;
  5955. begin
  5956. f_init(rop);
  5957. f_set_d(rop, N);
  5958. assert(f_get_d(rop) = N);
  5959. end;
  5960. procedure TTestGmpExtensions.f_set_z_test;
  5961. const
  5962. OP_1 = -13;
  5963. var
  5964. rop: MPFloat;
  5965. op: MPInteger;
  5966. begin
  5967. f_init(rop);
  5968. z_init_set_si(op, OP_1);
  5969. f_set_z(rop, op);
  5970. assert(f_get_si(rop) = OP_1);
  5971. end;
  5972. procedure TTestGmpExtensions.f_get_d_2exp_test;
  5973. const
  5974. M = 0.5;
  5975. E = 4;
  5976. N = (1 shl E) div 2;
  5977. var
  5978. rop: MPFloat;
  5979. exp: valsint;
  5980. begin
  5981. f_init_set_d(rop, N);
  5982. exp := -1;
  5983. assert(f_get_d_2exp(exp, rop) = M);
  5984. assert(exp = E);
  5985. end;
  5986. procedure TTestGmpExtensions.f_get_str_test;
  5987. const
  5988. N = 3.1416;
  5989. S = '31416';
  5990. E = 1;
  5991. var
  5992. op: MPFloat;
  5993. p: pchar;
  5994. exp: mp_exp_t;
  5995. s1: string;
  5996. begin
  5997. f_init_set_d(op, N);
  5998. p := f_get_str(nil, exp, BASE10, length(S), op);
  5999. assert(p = S);
  6000. assert(exp = E);
  6001. freemem(p);
  6002. setlength(s1, length(S));
  6003. assert(pointer(f_get_str(pchar(s1), exp, BASE10, length(s), op)) = pointer(s1));
  6004. assert(s1 = S);
  6005. s1 := f_get_str(exp, BASE10, length(S), op);
  6006. assert(s1 = S);
  6007. end;
  6008. procedure TTestGmpExtensions.f_add_test;
  6009. const
  6010. OP1_ = 1;
  6011. OP2_ = 2;
  6012. var rop, op1, op2, r2: MPFloat;
  6013. begin
  6014. f_init(rop);
  6015. f_init_set_d(op1, OP1_);
  6016. f_init_set_d(op2, OP2_);
  6017. f_add(rop, op1, op2);
  6018. assert(f_get_d(rop) = OP1_ + OP2_);
  6019. r2 := f_add(op1, op2);
  6020. assert(f_get_d(r2) = OP1_ + OP2_);
  6021. end;
  6022. procedure TTestGmpExtensions.f_add_ui_test;
  6023. const
  6024. OP1_ = 1;
  6025. OP2_ = 2;
  6026. var rop, op1, r2: MPFloat;
  6027. begin
  6028. f_init(rop);
  6029. f_init_set_d(op1, OP1_);
  6030. f_add_ui(rop, op1, OP2_);
  6031. assert(f_get_d(rop) = OP1_ + OP2_);
  6032. r2 := f_add_ui(op1, OP2_);
  6033. assert(f_get_d(r2) = OP1_ + OP2_);
  6034. end;
  6035. procedure TTestGmpExtensions.f_sub_test;
  6036. const
  6037. OP1_ = 3;
  6038. OP2_ = 1;
  6039. var rop, op1, op2, r2: MPFloat;
  6040. begin
  6041. f_init(rop);
  6042. f_init_set_d(op1, OP1_);
  6043. f_init_set_d(op2, OP2_);
  6044. f_sub(rop, op1, op2);
  6045. assert(f_get_d(rop) = OP1_ - OP2_);
  6046. r2 := f_sub(op1, op2);
  6047. assert(f_get_d(r2) = OP1_ - OP2_);
  6048. end;
  6049. procedure TTestGmpExtensions.f_sub_ui_test;
  6050. const
  6051. OP1_ = 3;
  6052. OP2_ = 1;
  6053. var rop, op1, r2: MPFloat;
  6054. begin
  6055. f_init(rop);
  6056. f_init_set_d(op1, OP1_);
  6057. f_sub_ui(rop, op1, OP2_);
  6058. assert(f_get_d(rop) = OP1_ - OP2_);
  6059. r2 := f_sub_ui(op1, OP2_);
  6060. assert(f_get_d(r2) = OP1_ - OP2_);
  6061. end;
  6062. procedure TTestGmpExtensions.f_ui_sub_test;
  6063. const
  6064. OP1_ = 3;
  6065. OP2_ = 1;
  6066. var rop, op2, r2: MPFloat;
  6067. begin
  6068. f_init(rop);
  6069. f_init_set_d(op2, OP2_);
  6070. f_ui_sub(rop, OP1_, op2);
  6071. assert(f_get_d(rop) = OP1_ - OP2_);
  6072. r2 := f_ui_sub(OP1_, op2);
  6073. assert(f_get_d(r2) = OP1_ - OP2_);
  6074. end;
  6075. procedure TTestGmpExtensions.f_mul_test;
  6076. const
  6077. OP1_ = 2;
  6078. OP2_ = 3;
  6079. var rop, op1, op2, r2: MPFloat;
  6080. begin
  6081. f_init(rop);
  6082. f_init_set_d(op1, OP1_);
  6083. f_init_set_d(op2, OP2_);
  6084. f_mul(rop, op1, op2);
  6085. assert(f_get_d(rop) = OP1_ * OP2_);
  6086. r2 := f_mul(op1, op2);
  6087. assert(f_get_d(r2) = OP1_ * OP2_);
  6088. end;
  6089. procedure TTestGmpExtensions.f_mul_ui_test;
  6090. const
  6091. OP1_ = 2;
  6092. OP2_ = 3;
  6093. var rop, op1, r2: MPFloat;
  6094. begin
  6095. f_init(rop);
  6096. f_init_set_d(op1, OP1_);
  6097. f_mul_ui(rop, op1, OP2_);
  6098. assert(f_get_d(rop) = OP1_ * OP2_);
  6099. r2 := f_mul_ui(op1, OP2_);
  6100. assert(f_get_d(r2) = OP1_ * OP2_);
  6101. end;
  6102. procedure TTestGmpExtensions.f_mul_2exp_test;
  6103. const
  6104. OP1_ = 3;
  6105. OP2_ = 4;
  6106. var rop, op1, r2: MPFloat;
  6107. begin
  6108. f_init(rop);
  6109. f_init_set_d(op1, OP1_);
  6110. f_mul_2exp(rop, op1, OP2_);
  6111. assert(f_get_d(rop) = OP1_ * (1 shl OP2_));
  6112. r2 := f_mul_2exp(op1, OP2_);
  6113. assert(f_get_d(r2) = OP1_ * (1 shl OP2_));
  6114. end;
  6115. procedure TTestGmpExtensions.f_div_test;
  6116. const
  6117. OP1_ = 6;
  6118. OP2_ = 2;
  6119. var rop, op1, op2, r2: MPFloat;
  6120. begin
  6121. f_init(rop);
  6122. f_init_set_d(op1, OP1_);
  6123. f_init_set_d(op2, OP2_);
  6124. f_div(rop, op1, op2);
  6125. assert(f_get_d(rop) = OP1_ / OP2_);
  6126. r2 := f_div(op1, op2);
  6127. assert(f_get_d(r2) = OP1_ / OP2_);
  6128. end;
  6129. procedure TTestGmpExtensions.f_div_ui_test;
  6130. const
  6131. OP1_ = 6;
  6132. OP2_ = 2;
  6133. var rop, op1, r2: MPFloat;
  6134. begin
  6135. f_init(rop);
  6136. f_init_set_d(op1, OP1_);
  6137. f_div_ui(rop, op1, OP2_);
  6138. assert(f_get_d(rop) = OP1_ / OP2_);
  6139. r2 := f_div_ui(op1, OP2_);
  6140. assert(f_get_d(r2) = OP1_ / OP2_);
  6141. end;
  6142. procedure TTestGmpExtensions.f_ui_div_test;
  6143. const
  6144. OP1_ = 6;
  6145. OP2_ = 2;
  6146. var rop, op2, r2: MPFloat;
  6147. begin
  6148. f_init(rop);
  6149. f_init_set_si(op2, OP2_);
  6150. f_ui_div(rop, OP1_, op2);
  6151. assert(f_get_d(rop) = OP1_ / OP2_);
  6152. r2 := f_ui_div(OP1_, op2);
  6153. assert(f_get_d(r2) = OP1_ / OP2_);
  6154. end;
  6155. procedure TTestGmpExtensions.f_div_2exp_test;
  6156. const
  6157. OP1_ = 16;
  6158. OP2_ = 2;
  6159. var rop, op1, r2: MPFloat;
  6160. begin
  6161. f_init(rop);
  6162. f_init_set_d(op1, OP1_);
  6163. f_div_2exp(rop, op1, OP2_);
  6164. assert(f_get_d(rop) = OP1_ / (1 shl OP2_));
  6165. r2 := f_div_2exp(op1, OP2_);
  6166. assert(f_get_d(r2) = OP1_ / (1 shl OP2_));
  6167. end;
  6168. procedure TTestGmpExtensions.f_sqrt_test;
  6169. const
  6170. OP_ = 4;
  6171. var rop, op, r2: MPFloat;
  6172. begin
  6173. f_init(rop);
  6174. f_init_set_d(op, OP_);
  6175. f_sqrt(rop, op);
  6176. assert(f_get_d(rop) = sqrt(OP_));
  6177. r2 := f_sqrt(op);
  6178. assert(f_get_d(r2) = sqrt(OP_));
  6179. end;
  6180. procedure TTestGmpExtensions.f_sqrt_ui_test;
  6181. const
  6182. OP_ = 4;
  6183. var rop, r2: MPFloat;
  6184. begin
  6185. f_init(rop);
  6186. f_sqrt_ui(rop, OP_);
  6187. assert(f_get_d(rop) = sqrt(OP_));
  6188. r2 := f_sqrt_ui(OP_);
  6189. assert(f_get_d(r2) = sqrt(OP_));
  6190. end;
  6191. procedure TTestGmpExtensions.f_pow_ui_test;
  6192. const
  6193. OP1_ = 3;
  6194. OP2_ = 2;
  6195. var rop, op1, r2: MPFloat;
  6196. begin
  6197. f_init(rop);
  6198. f_init_set_d(op1, OP1_);
  6199. f_pow_ui(rop, op1, OP2_);
  6200. assert(f_get_d(rop) = OP1_ ** OP2_);
  6201. r2 := f_pow_ui(op1, OP2_);
  6202. assert(f_get_d(r2) = OP1_ ** OP2_);
  6203. end;
  6204. procedure TTestGmpExtensions.f_neg_test;
  6205. const
  6206. OP_ = 4;
  6207. var rop, op, r2: MPFloat;
  6208. begin
  6209. f_init(rop);
  6210. f_init_set_d(op, OP_);
  6211. f_neg(rop, op);
  6212. assert(f_get_d(rop) = -OP_);
  6213. r2 := f_neg(op);
  6214. assert(f_get_d(r2) = -OP_);
  6215. end;
  6216. procedure TTestGmpExtensions.f_abs_test;
  6217. const OP_ = -4;
  6218. var rop, op, r2: MPFloat;
  6219. begin
  6220. f_init(rop);
  6221. f_init_set_d(op, OP_);
  6222. f_abs(rop, op);
  6223. assert(f_get_d(rop) = -OP_);
  6224. r2 := f_abs(op);
  6225. assert(f_get_d(r2) = -OP_);
  6226. end;
  6227. procedure TTestGmpExtensions.f_cmp_test;
  6228. const OP_1 = -10;
  6229. var op1, op2: MPFloat;
  6230. begin
  6231. f_init_set_si(op1, OP_1);
  6232. f_init_set_si(op2, OP_1);
  6233. assert(f_cmp(op1, op2) = 0);
  6234. f_set_si(op2, OP_1 + 1);
  6235. assert(f_cmp(op1, op2) < 0);
  6236. f_set_si(op2, OP_1 - 1);
  6237. assert(f_cmp(op1, op2) > 0);
  6238. end;
  6239. procedure TTestGmpExtensions.f_cmp_d_test;
  6240. const OP_ = -10;
  6241. var op: MPFloat;
  6242. begin
  6243. f_init_set_si(op, OP_);
  6244. assert(f_cmp_d(op, OP_) = 0);
  6245. assert(f_cmp_d(op, OP_ + 1) < 0);
  6246. assert(f_cmp_d(op, OP_ - 1) > 0);
  6247. end;
  6248. procedure TTestGmpExtensions.f_cmp_si_test;
  6249. const OP_ = -10;
  6250. var op: MPFloat;
  6251. begin
  6252. f_init_set_si(op, OP_);
  6253. assert(f_cmp_si(op, OP_) = 0);
  6254. assert(f_cmp_si(op, OP_ + 1) < 0);
  6255. assert(f_cmp_si(op, OP_ - 1) > 0);
  6256. end;
  6257. procedure TTestGmpExtensions.f_cmp_ui_test;
  6258. const OP_ = 10;
  6259. var op: MPFloat;
  6260. begin
  6261. f_init_set_si(op, OP_);
  6262. assert(f_cmp_ui(op, OP_) = 0);
  6263. assert(f_cmp_ui(op, OP_ + 1) < 0);
  6264. assert(f_cmp_ui(op, OP_ - 1) > 0);
  6265. end;
  6266. procedure TTestGmpExtensions.f_eq_test;
  6267. const
  6268. OP_1 = 10;
  6269. OP_3 = 8;
  6270. var op1, op2: MPFloat;
  6271. begin
  6272. f_init_set_si(op1, OP_1);
  6273. f_init_set_si(op2, OP_1);
  6274. assert(f_eq(op1, op2, OP_3));
  6275. end;
  6276. procedure TTestGmpExtensions.f_reldiff_test;
  6277. const
  6278. OP1_ = 4;
  6279. OP2_ = 2;
  6280. var rop, op1, op2, r2: MPFloat;
  6281. begin
  6282. f_init(rop);
  6283. f_init_set_d(op1, OP1_);
  6284. f_init_set_d(op2, OP2_);
  6285. f_reldiff(rop, op1, op2);
  6286. assert(f_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
  6287. r2 := f_reldiff(op1, op2);
  6288. assert(f_get_d(r2) = abs(OP1_ - OP2_) / OP1_);
  6289. end;
  6290. procedure TTestGmpExtensions.f_ceil_test;
  6291. const N = 3.1;
  6292. var rop, op, r2: MPFloat;
  6293. begin
  6294. f_init(rop);
  6295. f_init_set_d(op, N);
  6296. f_ceil(rop, op);
  6297. assert(f_get_d(rop) = ceil(N));
  6298. r2 := f_ceil(op);
  6299. assert(f_get_d(r2) = ceil(N));
  6300. end;
  6301. procedure TTestGmpExtensions.f_floor_test;
  6302. const N = 3.9;
  6303. var rop, op, r2: MPFloat;
  6304. begin
  6305. f_init(rop);
  6306. f_init_set_d(op, N);
  6307. f_floor(rop, op);
  6308. assert(f_get_d(rop) = floor(N));
  6309. r2 := f_floor(op);
  6310. assert(f_get_d(r2) = floor(N));
  6311. end;
  6312. procedure TTestGmpExtensions.f_trunc_test;
  6313. const N = -3.9;
  6314. var rop, op, r2: MPFloat;
  6315. begin
  6316. f_init(rop);
  6317. f_init_set_d(op, N);
  6318. f_trunc(rop, op);
  6319. assert(f_get_d(rop) = trunc(N));
  6320. r2 := f_trunc(op);
  6321. assert(f_get_d(r2) = trunc(N));
  6322. end;
  6323. procedure TTestGmpExtensions.f_integer_p_test;
  6324. const
  6325. N1 = 10;
  6326. N2 = 10.1;
  6327. var op: MPFloat;
  6328. begin
  6329. f_init_set_si(op, N1);
  6330. assert(f_integer_p(op));
  6331. f_set_d(op, N2);
  6332. assert(not f_integer_p(op));
  6333. end;
  6334. procedure TTestGmpExtensions.f_fits_ushort_p_test;
  6335. var op: MPFloat;
  6336. begin
  6337. f_init_set_ui(op, high(word));
  6338. assert(f_fits_ushort_p(op));
  6339. f_add_ui(op, op, 1);
  6340. assert(not f_fits_ushort_p(op));
  6341. end;
  6342. procedure TTestGmpExtensions.f_fits_sshort_p_test;
  6343. var op: MPFloat;
  6344. begin
  6345. f_init_set_ui(op, high(smallint));
  6346. assert(f_fits_sshort_p(op));
  6347. f_add_ui(op, op, 1);
  6348. assert(not f_fits_sshort_p(op));
  6349. f_clear(op);
  6350. end;
  6351. procedure TTestGmpExtensions.f_fits_uint_p_test;
  6352. var op: MPFloat;
  6353. begin
  6354. f_init_set_ui(op, high(cardinal));
  6355. assert(f_fits_uint_p(op));
  6356. f_add_ui(op, op, 1);
  6357. assert(not f_fits_uint_p(op));
  6358. f_clear(op);
  6359. end;
  6360. procedure TTestGmpExtensions.f_fits_sint_p_test;
  6361. var op: MPFloat;
  6362. begin
  6363. f_init_set_ui(op, high(integer));
  6364. assert(f_fits_sint_p(op));
  6365. f_add_ui(op, op, 1);
  6366. assert(not f_fits_sint_p(op));
  6367. f_clear(op);
  6368. end;
  6369. procedure TTestGmpExtensions.f_fits_ulong_p_test;
  6370. var op: MPFloat;
  6371. begin
  6372. f_init_set_ui(op, high(valuint));
  6373. assert(f_fits_ulong_p(op));
  6374. f_add_ui(op, op, 1);
  6375. assert(not f_fits_ulong_p(op));
  6376. f_clear(op);
  6377. end;
  6378. procedure TTestGmpExtensions.f_fits_slong_p_test;
  6379. var op: MPFloat;
  6380. begin
  6381. f_init_set_ui(op, high(valsint));
  6382. assert(f_fits_slong_p(op));
  6383. f_add_ui(op, op, 1);
  6384. assert(not f_fits_slong_p(op));
  6385. f_clear(op);
  6386. end;
  6387. procedure TTestGmpExtensions.f_urandomb_test;
  6388. const NBITS = 100;
  6389. var
  6390. rop, r2: MPFloat;
  6391. state: MPRandState;
  6392. cmp: longint;
  6393. begin
  6394. randinit_default(state);
  6395. f_init(rop);
  6396. f_urandomb(rop, state, NBITS);
  6397. cmp := f_cmp_ui(rop, 0);
  6398. assert(cmp >= 0);
  6399. assert(f_cmp_ui(rop, 1) < 0);
  6400. r2 := f_urandomb(state, NBITS);
  6401. cmp := f_cmp_ui(r2, 0);
  6402. assert(cmp >= 0);
  6403. assert(f_cmp_ui(r2, 1) < 0);
  6404. end;
  6405. procedure TTestGmpExtensions.f_random2_test;
  6406. var
  6407. rop, r2: MPFloat;
  6408. begin
  6409. f_init(rop);
  6410. f_random2(rop, 1, 1);
  6411. r2 := f_random2(1, 1);
  6412. assert(assigned(r2))
  6413. end;
  6414. procedure TTestGmpExtensions.f_init_set_test;
  6415. const N = -1000000;
  6416. var rop, op: MPFloat;
  6417. begin
  6418. f_init_set_si(op, N);
  6419. f_init_set(rop, op);
  6420. assert(f_get_si(rop) = N);
  6421. end;
  6422. procedure TTestGmpExtensions.f_init_set_d_test;
  6423. const N = -1.5;
  6424. var rop: MPFloat;
  6425. begin
  6426. f_init_set_d(rop, N);
  6427. assert(f_get_d(rop) = N);
  6428. end;
  6429. procedure TTestGmpExtensions.f_init_set_si_test;
  6430. const N = -5;
  6431. var rop: MPFloat;
  6432. begin
  6433. f_init_set_si(rop, N);
  6434. assert(f_get_si(rop) = N);
  6435. end;
  6436. procedure TTestGmpExtensions.f_init_set_str_test;
  6437. const N = -123;
  6438. var rop: MPFloat;
  6439. begin
  6440. f_init_set_str(rop, inttostr(N), BASE10);
  6441. assert(f_get_si(rop) = N);
  6442. end;
  6443. procedure TTestGmpExtensions.f_init_set_ui_test;
  6444. const N = 5;
  6445. var rop: MPFloat;
  6446. begin
  6447. f_init_set_ui(rop, N);
  6448. assert(f_get_ui(rop) = N);
  6449. end;
  6450. { TTestGmpOperators }
  6451. // operator * (op1: MPFloat; op2: MPFloat): MPFloat;
  6452. procedure TTestGmpOperators.star__MPFloat__MPFloat__MPFloat_;
  6453. const
  6454. OP1_ = 2;
  6455. OP2_ = 3;
  6456. var rop, op1, op2: MPFloat;
  6457. begin
  6458. f_init_set_d(op1, OP1_);
  6459. f_init_set_d(op2, OP2_);
  6460. rop := op1 * op2;
  6461. assert(f_get_d(rop) = OP1_ * OP2_);
  6462. end;
  6463. // operator * (op1: MPInteger; op2: MPInteger): MPInteger;
  6464. procedure TTestGmpOperators.star__MPInteger__MPInteger__MPInteger_;
  6465. const
  6466. OP_1 = -10;
  6467. OP_2 = 1000;
  6468. var rop, op1, op2: MPInteger;
  6469. begin
  6470. z_init_set_si(op1, OP_1);
  6471. z_init_set_si(op2, OP_2);
  6472. rop := op1 * op2;
  6473. assert(z_get_si(rop) = OP_1 * OP_2);
  6474. end;
  6475. // operator * (op1: MPRational; op2: MPRational): MPRational;
  6476. procedure TTestGmpOperators.star__MPRational__MPRational__MPRational_;
  6477. const
  6478. N1 = 5;
  6479. D1 = 2;
  6480. N2 = -7;
  6481. D2 = 3;
  6482. var product, multiplier, multiplicant: MPRational;
  6483. begin
  6484. q_init(multiplier);
  6485. q_init(multiplicant);
  6486. q_set_si(multiplier, N1, D1);
  6487. q_set_si(multiplicant, N2, D2);
  6488. product := multiplier * multiplicant;
  6489. assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
  6490. end;
  6491. // operator ** (op1: MPFloat; op2: valuint): MPFloat;
  6492. procedure TTestGmpOperators.pow__MPFloat_valuint_MPFloat_;
  6493. const
  6494. OP1_ = 3;
  6495. OP2_ = 2;
  6496. var rop, op1: MPFloat;
  6497. begin
  6498. f_init_set_d(op1, OP1_);
  6499. rop := op1 ** OP2_;
  6500. assert(f_get_d(rop) = OP1_ ** OP2_);
  6501. end;
  6502. // operator ** (op1: MPInteger; op2: valuint): MPInteger;
  6503. procedure TTestGmpOperators.pow__MPInteger_valuint_MPInteger_;
  6504. const
  6505. BASE_ = 10;
  6506. EXP = 3;
  6507. var rop, base: MPInteger;
  6508. begin
  6509. z_init_set_si(base, BASE_);
  6510. rop := base ** EXP;
  6511. assert(z_get_si(rop) = BASE_ ** EXP);
  6512. end;
  6513. // operator + (op1: MPFloat; op2: MPFloat): MPFloat;
  6514. procedure TTestGmpOperators.plus__MPFloat__MPFloat__MPFloat_;
  6515. const
  6516. OP1_ = 1;
  6517. OP2_ = 2;
  6518. var rop, op1, op2: MPFloat;
  6519. begin
  6520. f_init_set_d(op1, OP1_);
  6521. f_init_set_d(op2, OP2_);
  6522. rop := op1 + op2;
  6523. assert(f_get_d(rop) = OP1_ + OP2_);
  6524. end;
  6525. // operator + (op1: MPInteger; op2: MPInteger): MPInteger;
  6526. procedure TTestGmpOperators.plus__MPInteger__MPInteger__MPInteger_;
  6527. const
  6528. OP_1 = -1000;
  6529. OP_2 = 1000000;
  6530. var rop, op1, op2: MPInteger;
  6531. begin
  6532. z_init_set_si(op1, OP_1);
  6533. z_init_set_si(op2, OP_2);
  6534. rop := op1 + op2;
  6535. assert(z_get_si(rop) = OP_1 + OP_2);
  6536. end;
  6537. // operator + (op1: MPRational; op2: MPRational): MPRational;
  6538. procedure TTestGmpOperators.plus__MPRational__MPRational__MPRational_;
  6539. const
  6540. N1 = 5;
  6541. D1 = 2;
  6542. N2 = -7;
  6543. D2 = 3;
  6544. var sum, addend1, addend2: MPRational;
  6545. begin
  6546. q_init(addend1);
  6547. q_init(addend2);
  6548. q_set_si(addend1, N1, D1);
  6549. q_set_si(addend2, N2, D2);
  6550. sum := addend1 + addend2;
  6551. assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
  6552. end;
  6553. // operator - (op: MPFloat): MPFloat;
  6554. procedure TTestGmpOperators.minus__MPFloat__MPFloat_;
  6555. const
  6556. OP_ = 4;
  6557. var rop, op: MPFloat;
  6558. begin
  6559. f_init_set_d(op, OP_);
  6560. rop := -op;
  6561. assert(f_get_d(rop) = -OP_);
  6562. end;
  6563. // operator - (op: MPInteger): MPInteger;
  6564. procedure TTestGmpOperators.minus__MPInteger__MPInteger_;
  6565. const OP_ = 1000;
  6566. var rop, op: MPInteger;
  6567. begin
  6568. z_init_set_si(op, OP_);
  6569. rop := -op;
  6570. assert(z_get_si(rop) = -OP_);
  6571. end;
  6572. // operator - (op: MPRational): MPRational;
  6573. procedure TTestGmpOperators.minus__MPRational__MPRational_;
  6574. const
  6575. N1 = -5;
  6576. D1 = 3;
  6577. var negated_operand, operand: MPRational;
  6578. begin
  6579. q_init(negated_operand);
  6580. q_init(operand);
  6581. q_set_si(operand, N1, D1);
  6582. negated_operand := - operand;
  6583. assert(q_cmp_si(negated_operand, -N1, D1) = 0);
  6584. end;
  6585. // operator - (op1: MPFloat; op2: MPFloat): MPFloat;
  6586. procedure TTestGmpOperators.minus__MPFloat__MPFloat__MPFloat_;
  6587. const
  6588. OP1_ = 3;
  6589. OP2_ = 1;
  6590. var rop, op1, op2: MPFloat;
  6591. begin
  6592. f_init_set_d(op1, OP1_);
  6593. f_init_set_d(op2, OP2_);
  6594. rop := op1 - op2;
  6595. assert(f_get_d(rop) = OP1_ - OP2_);
  6596. end;
  6597. // operator - (op1: MPInteger; op2: MPInteger): MPInteger;
  6598. procedure TTestGmpOperators.minus__MPInteger__MPInteger__MPInteger_;
  6599. const
  6600. OP_1 = -1000;
  6601. OP_2 = 1000000;
  6602. var rop, op1, op2: MPInteger;
  6603. begin
  6604. z_init_set_si(op1, OP_1);
  6605. z_init_set_si(op2, OP_2);
  6606. rop := op1 - op2;
  6607. assert(z_get_si(rop) = OP_1 - OP_2);
  6608. end;
  6609. // operator - (op1: MPRational; op2: MPRational): MPRational;
  6610. procedure TTestGmpOperators.minus__MPRational__MPRational__MPRational_;
  6611. const
  6612. N1 = 5;
  6613. D1 = 2;
  6614. N2 = -7;
  6615. D2 = 3;
  6616. var difference, minuend, subtrahend: MPRational;
  6617. begin
  6618. q_init(minuend);
  6619. q_init(subtrahend);
  6620. q_set_si(minuend, N1, D1);
  6621. q_set_si(subtrahend, N2, D2);
  6622. difference := minuend - subtrahend;
  6623. assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
  6624. end;
  6625. // operator / (op1: MPFloat; op2: MPFloat): MPFloat;
  6626. procedure TTestGmpOperators.slash__MPFloat__MPFloat__MPFloat_;
  6627. const
  6628. OP1_ = 6;
  6629. OP2_ = 2;
  6630. var rop, op1, op2: MPFloat;
  6631. begin
  6632. f_init_set_d(op1, OP1_);
  6633. f_init_set_d(op2, OP2_);
  6634. rop := op1 / op2;
  6635. assert(f_get_d(rop) = OP1_ / OP2_);
  6636. end;
  6637. // operator / (op1: MPInteger; op2: MPInteger): MPInteger;
  6638. procedure TTestGmpOperators.slash__MPInteger__MPInteger__MPInteger_;
  6639. const
  6640. N_ = -17;
  6641. D_ = 4;
  6642. var q, n, d: MPInteger;
  6643. begin
  6644. z_init_set_si(n, N_);
  6645. z_init_set_si(d, D_);
  6646. q := n / d;
  6647. assert(z_get_si(q) = trunc(N_ / D_));
  6648. end;
  6649. // operator / (op1: MPRational; op2: MPRational): MPRational;
  6650. procedure TTestGmpOperators.slash__MPRational__MPRational__MPRational_;
  6651. const
  6652. N1 = 5;
  6653. D1 = 2;
  6654. N2 = -7;
  6655. D2 = 3;
  6656. var quotient, dividend, divisor: MPRational;
  6657. begin
  6658. q_init(dividend);
  6659. q_init(divisor);
  6660. q_set_si(dividend, N1, D1);
  6661. q_set_si(divisor, N2, D2);
  6662. quotient := dividend / divisor;
  6663. assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
  6664. end;
  6665. // operator := (op: double): MPFloat;
  6666. procedure TTestGmpOperators.assign_double_MPFloat_;
  6667. const N = -1.5;
  6668. var rop: MPFloat;
  6669. begin
  6670. rop := N;
  6671. assert(f_get_d(rop) = N);
  6672. end;
  6673. // operator := (op: double): MPInteger;
  6674. procedure TTestGmpOperators.assign_double_MPInteger_;
  6675. const OP_ = 1000000;
  6676. var rop: MPInteger;
  6677. begin
  6678. rop := OP_;
  6679. assert(z_get_si(rop) = OP_);
  6680. end;
  6681. // operator := (op: double): MPRational;
  6682. procedure TTestGmpOperators.assign_double_MPRational_;
  6683. const
  6684. OP_1 = -1;
  6685. OP_2 = 2;
  6686. var rop: MPRational;
  6687. begin
  6688. rop := OP_1 / OP_2;
  6689. assert(q_cmp_si(rop, OP_1, OP_2) = 0);
  6690. end;
  6691. // operator := (op: MPFloat): cardinal;
  6692. procedure TTestGmpOperators.assign__MPFloat_Cardinal;
  6693. const OP = 1000000;
  6694. var rop: MPFloat;
  6695. begin
  6696. rop := OP;
  6697. assert(f_get_ui(rop) = OP);
  6698. end;
  6699. // operator := (op: MPFloat): double;
  6700. procedure TTestGmpOperators.assign__MPFloat_double;
  6701. const N = -1.5;
  6702. var rop: MPFloat;
  6703. begin
  6704. rop := N;
  6705. assert(f_get_d(rop) = N);
  6706. end;
  6707. // operator := (op: MPFloat): integer;
  6708. procedure TTestGmpOperators.assign__MPFloat_integer;
  6709. const OP = -1000000;
  6710. var rop: MPFloat;
  6711. begin
  6712. rop := OP;
  6713. assert(f_get_si(rop) = OP);
  6714. end;
  6715. // operator := (op: MPFloat): mpf_t;
  6716. procedure TTestGmpOperators.assign__MPFloat_mpf_t;
  6717. const N = -1000000;
  6718. var
  6719. rop: mpf_t;
  6720. op: MPFloat;
  6721. begin
  6722. f_init_set_si(op, N);
  6723. rop := op;
  6724. assert(mpf_get_si(rop) = N);
  6725. mpf_clear(rop);
  6726. end;
  6727. // operator := (op: MPFloat): MPInteger;
  6728. procedure TTestGmpOperators.assign__MPFloat__MPInteger_;
  6729. const OP_ = -10;
  6730. var
  6731. op: MPFloat;
  6732. rop: MPInteger;
  6733. begin
  6734. f_init_set_si(op, OP_);
  6735. rop := op;
  6736. assert(z_get_si(rop) = OP_);
  6737. end;
  6738. // operator := (op: MPFloat): MPRational;
  6739. procedure TTestGmpOperators.assign__MPFloat__MPRational_;
  6740. const OP_ = -10;
  6741. var
  6742. op: MPFloat;
  6743. rop: MPRational;
  6744. begin
  6745. f_init_set_si(op, OP_);
  6746. rop := op;
  6747. assert(q_get_d(rop) = OP_);
  6748. end;
  6749. // operator := (op: MPFloat): string;
  6750. procedure TTestGmpOperators.assign__MPFloat_string;
  6751. const
  6752. N = 123456;
  6753. S = '123456';
  6754. var
  6755. op: MPFloat;
  6756. r: string;
  6757. begin
  6758. f_init_set_d(op, N);
  6759. r := op;
  6760. assert(r = S);
  6761. end;
  6762. // operator := (op: MPFloat): valsint;
  6763. procedure TTestGmpOperators.assign__MPFloat_valsint;
  6764. const OP_ = -1000000;
  6765. var
  6766. op: MPFloat;
  6767. r: valsint;
  6768. begin
  6769. f_init_set_si(op, OP_);
  6770. r := op;
  6771. assert(r = OP_);
  6772. end;
  6773. // operator := (op: MPFloat): valuint;
  6774. procedure TTestGmpOperators.assign__MPFloat_valuint;
  6775. const OP_ = 1000000;
  6776. var
  6777. op: MPFloat;
  6778. r: valuint;
  6779. begin
  6780. f_init_set_si(op, OP_);
  6781. r := op;
  6782. assert(r = OP_);
  6783. end;
  6784. // operator := (var op: mpf_t): MPFloat;
  6785. procedure TTestGmpOperators.assign_mpf_t_MPFloat_;
  6786. const N = -1000000;
  6787. var
  6788. op: mpf_t;
  6789. rop: MPFloat;
  6790. begin
  6791. mpf_init_set_si(op, N);
  6792. rop := op;
  6793. assert(f_get_si(rop) = N);
  6794. mpf_clear(op);
  6795. end;
  6796. // operator := (op: MPInteger): cardinal;
  6797. procedure TTestGmpOperators.assign__MPInteger_cardinal;
  6798. const N = 1000000;
  6799. var
  6800. op: MPInteger;
  6801. r: cardinal;
  6802. begin
  6803. z_init_set_ui(op, N);
  6804. r := op;
  6805. assert(r = N);
  6806. end;
  6807. // operator := (op: MPInteger): double;
  6808. procedure TTestGmpOperators.assign__MPInteger_double;
  6809. const N = -1000;
  6810. var
  6811. op: MPInteger;
  6812. r: double;
  6813. begin
  6814. z_init_set_si(op, N);
  6815. r := op;
  6816. assert(r = N);
  6817. end;
  6818. // operator := (op: MPInteger): integer;
  6819. procedure TTestGmpOperators.assign__MPInteger_integer;
  6820. const N = -1000000;
  6821. var
  6822. op: MPInteger;
  6823. r: integer;
  6824. begin
  6825. z_init_set_si(op, N);
  6826. r := op;
  6827. assert(r = N);
  6828. end;
  6829. // operator := (op: MPInteger): MPFloat;
  6830. procedure TTestGmpOperators.assign__MPInteger__MPFloat_;
  6831. const
  6832. OP_1 = -13;
  6833. var
  6834. rop: MPFloat;
  6835. op: MPInteger;
  6836. begin
  6837. z_init_set_si(op, OP_1);
  6838. rop := op;
  6839. assert(f_get_si(rop) = OP_1);
  6840. end;
  6841. // operator := (op: MPInteger): MPRational;
  6842. procedure TTestGmpOperators.assign__MPInteger__MPRational_;
  6843. const
  6844. OP_1 = -13;
  6845. var
  6846. rational: MPRational;
  6847. op: MPInteger;
  6848. begin
  6849. z_init_set_si(op, OP_1);
  6850. rational := op;
  6851. assert(q_cmp_si(rational, OP_1, 1) = 0);
  6852. end;
  6853. // operator := (op: MPInteger): mpz_t;
  6854. procedure TTestGmpOperators.assign__MPInteger_mpz_t;
  6855. const N = -1000000;
  6856. var
  6857. rop: mpz_t;
  6858. op: MPInteger;
  6859. begin
  6860. z_init_set_si(op, N);
  6861. rop := op;
  6862. assert(mpz_get_si(rop) = N);
  6863. mpz_clear(rop);
  6864. end;
  6865. // operator := (op: MPInteger): string;
  6866. procedure TTestGmpOperators.assign__MPInteger_string;
  6867. const
  6868. N = 123456;
  6869. S = '123456';
  6870. var
  6871. op: MPInteger;
  6872. r: string;
  6873. begin
  6874. z_init_set_ui(op, N);
  6875. r := op;
  6876. assert(r = S);
  6877. end;
  6878. // operator := (op: MPInteger): valsint;
  6879. procedure TTestGmpOperators.assign__MPInteger_valsint;
  6880. const N = -1000000;
  6881. var
  6882. op: MPInteger;
  6883. r: valsint;
  6884. begin
  6885. z_init_set_si(op, N);
  6886. r := op;
  6887. assert(r = N);
  6888. end;
  6889. // operator := (op: MPInteger): valuint;
  6890. procedure TTestGmpOperators.assign__MPInteger_valuint;
  6891. const N = 1000000;
  6892. var
  6893. op: MPInteger;
  6894. r: valuint;
  6895. begin
  6896. z_init_set_ui(op, N);
  6897. r := op;
  6898. assert(r = N);
  6899. end;
  6900. // operator := (var op: mpq_t): MPRational;
  6901. procedure TTestGmpOperators.assign_mpq_t_MPRational_;
  6902. const
  6903. N = -17;
  6904. D = 3;
  6905. var
  6906. op: mpq_t;
  6907. rop: MPRational;
  6908. begin
  6909. mpq_init(op);
  6910. mpq_set_si(op, N, D);
  6911. rop := op;
  6912. assert(q_cmp_si(rop, N, D) = 0);
  6913. mpq_clear(op);
  6914. end;
  6915. // operator := (op: MPRandState): randstate_t;
  6916. procedure TTestGmpOperators.assign__MPRandState_randstate_t;
  6917. var
  6918. op: MPRandState;
  6919. rop: randstate_t;
  6920. begin
  6921. randinit_default(op);
  6922. rop := op;
  6923. assert(rnd_test(rop));
  6924. mp_randclear(rop);
  6925. end;
  6926. // operator := (op: MPRational): double;
  6927. procedure TTestGmpOperators.assign__MPRational_double;
  6928. const
  6929. OP_1 = -1;
  6930. OP_2 = 2;
  6931. var
  6932. op: MPRational;
  6933. r: double;
  6934. begin
  6935. q_init(op);
  6936. q_set_si(op, OP_1, OP_2);
  6937. r := op;
  6938. assert(r = OP_1 / OP_2);
  6939. end;
  6940. // operator := (op: MPRational): MPFloat;
  6941. procedure TTestGmpOperators.assign__MPRational__MPFloat_;
  6942. const OP_ = -10;
  6943. var
  6944. op: MPRational;
  6945. rop: MPFloat;
  6946. begin
  6947. q_init(op);
  6948. q_set_si(op, OP_, 1);
  6949. rop := op;
  6950. assert(f_get_si(rop) = OP_);
  6951. end;
  6952. // operator := (op: MPRational): MPInteger;
  6953. procedure TTestGmpOperators.assign__MPRational__MPInteger_;
  6954. const OP_ = -10;
  6955. var
  6956. op: MPRational;
  6957. rop: MPInteger;
  6958. begin
  6959. q_init(op);
  6960. q_set_si(op, OP_, 1);
  6961. rop := op;
  6962. assert(z_get_si(rop) = OP_);
  6963. end;
  6964. // operator := (op: MPRational): mpq_t;
  6965. procedure TTestGmpOperators.assign__MPRational_mpq_t;
  6966. const
  6967. OP_1 = -13;
  6968. OP_2 = 17;
  6969. var
  6970. rational: mpq_t;
  6971. op: MPRational;
  6972. begin
  6973. q_init(op);
  6974. q_set_si(op, OP_1, OP_2);
  6975. rational := op;
  6976. assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
  6977. mpq_clear(rational);
  6978. end;
  6979. // operator := (op: MPRational): string;
  6980. procedure TTestGmpOperators.assign__MPRational_string;
  6981. const
  6982. N = 5;
  6983. D = 3;
  6984. S = '5/3';
  6985. var
  6986. op: MPRational;
  6987. r: string;
  6988. begin
  6989. q_init(op);
  6990. q_set_si(op, N, D);
  6991. r := op;
  6992. assert(r = S);
  6993. end;
  6994. // operator := (var op: mpz_t): MPInteger;
  6995. procedure TTestGmpOperators.assign_mpz_t_MPInteger_;
  6996. const N = -1000000;
  6997. var
  6998. op: mpz_t;
  6999. rop: MPInteger;
  7000. begin
  7001. mpz_init_set_si(op, N);
  7002. rop := op;
  7003. assert(z_get_si(rop) = N);
  7004. mpz_clear(op);
  7005. end;
  7006. // operator := (var op: randstate_t): MPRandState;
  7007. procedure TTestGmpOperators.assign_randstate_t_MPRandState_;
  7008. var
  7009. op: randstate_t;
  7010. rop: MPRandState;
  7011. begin
  7012. mp_randinit_default(op);
  7013. rop := op;
  7014. assert(rnd_test(rop.ptr^));
  7015. mp_randclear(op);
  7016. end;
  7017. // operator := (op: string): MPFloat;
  7018. procedure TTestGmpOperators.assign_string_MPFloat_;
  7019. const N = -123;
  7020. var rop: MPFloat;
  7021. begin
  7022. rop := inttostr(N);
  7023. assert(f_get_si(rop) = N);
  7024. end;
  7025. // operator := (op: string): MPInteger;
  7026. procedure TTestGmpOperators.assign_string_MPInteger_;
  7027. const N = -123;
  7028. var rop: MPInteger;
  7029. begin
  7030. rop := inttostr(N);
  7031. assert(z_get_si(rop) = N);
  7032. end;
  7033. // operator := (op: string): MPRational;
  7034. procedure TTestGmpOperators.assign_string_MPRational_;
  7035. const
  7036. N = 5;
  7037. D = 3;
  7038. S = '5/3';
  7039. var rop: MPRational;
  7040. begin
  7041. rop := S;
  7042. assert(q_cmp_si(rop, N, D) = 0);
  7043. end;
  7044. // operator := (op: valsint): MPFloat;
  7045. procedure TTestGmpOperators.assign_valsint_MPFloat_;
  7046. const OP = -1000000;
  7047. var rop: MPFloat;
  7048. begin
  7049. rop := OP;
  7050. assert(f_get_si(rop) = OP);
  7051. end;
  7052. // operator := (op: valsint): MPInteger;
  7053. procedure TTestGmpOperators.assign_valsint_MPInteger_;
  7054. const OP = -1000000;
  7055. var rop: MPInteger;
  7056. begin
  7057. rop := OP;
  7058. assert(z_get_si(rop) = OP);
  7059. end;
  7060. // operator := (op: valsint): MPRational;
  7061. procedure TTestGmpOperators.assign_valsint_MPRational_;
  7062. const OP = -1000000;
  7063. var rop: MPRational;
  7064. begin
  7065. rop := OP;
  7066. assert(q_cmp_si(rop, OP, 1) = 0);
  7067. end;
  7068. // operator := (op: valuint): MPFloat;
  7069. procedure TTestGmpOperators.assign_valuint_MPFloat_;
  7070. const OP = 1000000;
  7071. var rop: MPFloat;
  7072. begin
  7073. rop := OP;
  7074. assert(f_get_ui(rop) = OP);
  7075. end;
  7076. // operator := (op: valuint): MPInteger;
  7077. procedure TTestGmpOperators.assign_valuint_MPInteger_;
  7078. const OP = 1000000;
  7079. var rop: MPInteger;
  7080. begin
  7081. rop := OP;
  7082. assert(z_get_ui(rop) = OP);
  7083. end;
  7084. // operator := (op: valuint): MPRational;
  7085. procedure TTestGmpOperators.assign_valuint_MPRational_;
  7086. const OP = 1000000;
  7087. var rop: MPRational;
  7088. begin
  7089. rop := OP;
  7090. assert(q_cmp_ui(rop, OP, 1) = 0);
  7091. end;
  7092. // operator < (op1: MPFloat; op2: MPFloat): boolean;
  7093. procedure TTestGmpOperators.lt__MPFloat__MPFloat_boolean;
  7094. const
  7095. OP1_ = 1.2;
  7096. OP2_ = OP1_ + 1;
  7097. var op1, op2: MPFloat;
  7098. begin
  7099. f_init_set_d(op1, OP1_);
  7100. f_init_set_d(op2, OP2_);
  7101. assert(op1 < op2);
  7102. end;
  7103. // operator < (op1: MPInteger; op2: MPInteger): boolean;
  7104. procedure TTestGmpOperators.lt__MPInteger__MPInteger_boolean;
  7105. const
  7106. OP1_ = 12;
  7107. OP2_ = OP1_ + 1;
  7108. var op1, op2: MPInteger;
  7109. begin
  7110. z_init_set_d(op1, OP1_);
  7111. z_init_set_d(op2, OP2_);
  7112. assert(op1 < op2);
  7113. end;
  7114. // operator < (op1: MPRational; op2: MPRational): boolean;
  7115. procedure TTestGmpOperators.lt__MPRational__MPRational_boolean;
  7116. const
  7117. OP1_ = 12;
  7118. OP2_ = OP1_ + 1;
  7119. var op1, op2: MPRational;
  7120. begin
  7121. q_init(op1);
  7122. q_init(op2);
  7123. q_set_si(op1, OP1_, 1);
  7124. q_set_si(op2, OP2_, 1);
  7125. assert(op1 < op2);
  7126. end;
  7127. // operator <= (op1: MPFloat; op2: MPFloat): boolean;
  7128. procedure TTestGmpOperators.le__MPFloat__MPFloat_boolean;
  7129. const
  7130. OP1_ = 1.2;
  7131. OP2_ = OP1_ + 1;
  7132. var op1, op2: MPFloat;
  7133. begin
  7134. f_init_set_d(op1, OP1_);
  7135. f_init_set_d(op2, OP2_);
  7136. assert(op1 <= op2);
  7137. f_set_d(op2, OP1_);
  7138. assert(op1 <= op2);
  7139. end;
  7140. // operator <= (op1: MPInteger; op2: MPInteger): boolean;
  7141. procedure TTestGmpOperators.le__MPInteger__MPInteger_boolean;
  7142. const
  7143. OP1_ = 12;
  7144. OP2_ = OP1_ + 1;
  7145. var op1, op2: MPInteger;
  7146. begin
  7147. z_init_set_ui(op1, OP1_);
  7148. z_init_set_ui(op2, OP2_);
  7149. assert(op1 <= op2);
  7150. z_set_ui(op2, OP1_);
  7151. assert(op1 <= op2);
  7152. end;
  7153. // operator <= (op1: MPRational; op2: MPRational): boolean;
  7154. procedure TTestGmpOperators.le__MPRational__MPRational_boolean;
  7155. const
  7156. OP1_ = 12;
  7157. OP2_ = OP1_ + 1;
  7158. var op1, op2: MPRational;
  7159. begin
  7160. q_init(op1);
  7161. q_init(op2);
  7162. q_set_si(op1, OP1_, 1);
  7163. q_set_si(op2, OP2_, 1);
  7164. assert(op1 <= op2);
  7165. q_set_si(op2, OP1_, 1);
  7166. assert(op1 <= op2);
  7167. end;
  7168. // operator > (op1: MPFloat; op2: MPFloat): boolean;
  7169. procedure TTestGmpOperators.gt__MPFloat__MPFloat_boolean;
  7170. const
  7171. OP1_ = 1.2;
  7172. OP2_ = OP1_ - 1;
  7173. var op1, op2: MPFloat;
  7174. begin
  7175. f_init_set_d(op1, OP1_);
  7176. f_init_set_d(op2, OP2_);
  7177. assert(op1 > op2);
  7178. end;
  7179. // operator > (op1: MPInteger; op2: MPInteger): boolean;
  7180. procedure TTestGmpOperators.gt__MPInteger__MPInteger_boolean;
  7181. const
  7182. OP1_ = 12;
  7183. OP2_ = OP1_ - 1;
  7184. var op1, op2: MPInteger;
  7185. begin
  7186. z_init_set_d(op1, OP1_);
  7187. z_init_set_d(op2, OP2_);
  7188. assert(op1 > op2);
  7189. end;
  7190. // operator > (op1: MPRational; op2: MPRational): boolean;
  7191. procedure TTestGmpOperators.gt__MPRational__MPRational_boolean;
  7192. const
  7193. OP1_ = 12;
  7194. OP2_ = OP1_ - 1;
  7195. var op1, op2: MPRational;
  7196. begin
  7197. q_init(op1);
  7198. q_init(op2);
  7199. q_set_si(op1, OP1_, 1);
  7200. q_set_si(op2, OP2_, 1);
  7201. assert(op1 > op2);
  7202. end;
  7203. // operator >= (op1: MPFloat; op2: MPFloat): boolean;
  7204. procedure TTestGmpOperators.ge__MPFloat__MPFloat_boolean;
  7205. const
  7206. OP1_ = 1.2;
  7207. OP2_ = OP1_ - 1;
  7208. var op1, op2: MPFloat;
  7209. begin
  7210. f_init_set_d(op1, OP1_);
  7211. f_init_set_d(op2, OP2_);
  7212. assert(op1 >= op2);
  7213. f_set_d(op2, OP1_);
  7214. assert(op1 >= op2);
  7215. end;
  7216. // operator >= (op1: MPInteger; op2: MPInteger): boolean;
  7217. procedure TTestGmpOperators.ge__MPInteger__MPInteger_boolean;
  7218. const
  7219. OP1_ = 12;
  7220. OP2_ = OP1_ - 1;
  7221. var op1, op2: MPInteger;
  7222. begin
  7223. z_init_set_ui(op1, OP1_);
  7224. z_init_set_ui(op2, OP2_);
  7225. assert(op1 >= op2);
  7226. z_set_ui(op2, OP1_);
  7227. assert(op1 >= op2);
  7228. end;
  7229. // operator >= (op1: MPRational; op2: MPRational): boolean;
  7230. procedure TTestGmpOperators.ge__MPRational__MPRational_boolean;
  7231. const
  7232. OP1_ = 12;
  7233. OP2_ = OP1_ - 1;
  7234. var op1, op2: MPRational;
  7235. begin
  7236. q_init(op1);
  7237. q_init(op2);
  7238. q_set_si(op1, OP1_, 1);
  7239. q_set_si(op2, OP2_, 1);
  7240. assert(op1 >= op2);
  7241. q_set_si(op2, OP1_, 1);
  7242. assert(op1 >= op2);
  7243. end;