FreeBASIC マニュアルのトップに戻る

FreeBASIC GMP ライブラリを使ったユーザ定義型の活用例

目次→フォーラム→FreeBASIC→補足gmp 6.1.2 and mpfr 3.1.5←オリジナル・フォーラム

GMP ライブラリを使ったユーザ定義型の活用例 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

このページは、srvaldez さんが、フォーラム Programming→Generalgmp 6.1.2 and mpfr 3.1.5 で公開している GMP ヘッダー・ファイルに同梱されいてるサンプル・プログラムを、日本語化したものです。

さらに、BeginnersAlways for me a Big question で、dodicat さんが紹介している階乗を求める関数を追加しています。

GMP ライブラリを使った「ユーザ定義型」については、GMP ライブラリを使ったユーザ定義型と活用例 を参照下さい。

参考:多倍長演算ライブラリ(GNU MP) Version 6.1.2マニュアル
https://na-inet.jp/na/gmp_ja/

環境準備:
gmp-6.1.2(gmp-6.1.2.zip) ファイルをダウンロードして、共有ライブラリ libgmp.a を該当フォルダに保存します。
私の場合は、C:\Tool\FreeBASIC\lib\win32\libgmp.a

除算・平方根・フィボナッチ数・階乗

以下を、例えば gmpf-fb testJP.bas という名前で保存します。
同じフォルダに、gmp.bi と gmpf-overload.bi を保存したうえで、コンパイル実行します。
Dim Shared As Long mpf_digits_precision=50

#Include Once "gmpf-overload.bi"

Declare Function factorial(n As ULong,numberbase As Long=10) As String 
'==================================================================
'test

set_precision(10) '変数を定義する前に、精度を設定する

Dim As gmpf xf, yf, zf '自動初期化
Dim As __mpq_struct q2
Dim As String s
Dim As mp_exp_t xp
Dim As Integer i, j

mpq_init(@q2)
mpq_set_ui(@q2, 1, 3) 'q2 = 1/3
zf=q2 'mpq から mpf に自動型変換
Print "mpq 1/3 から mpf に自動型変換"
Print zf.toString("%45.40f"); "     全体 45 桁、小数部 40 桁で実数出力"
Print zf.toString("%45.40e"); " 全体 45 桁、小数部 40 桁で指数表示"
Print zf.toString ; "                           デフォルト表示"
Print "何かキー入力で継続 "
Sleep

Print
For xf="1" To 10 Step "1"
   yf=gmpf_Sqr(xf)
   Print "Sqr(";xf;") =",yf.toString("f") '浮動小数点形式、すべての桁
Next
Print
Print "=================================================================="
Print "デフォルトの精度を50桁に変更する"
Print
set_precision(50) 'デフォルトの精度を変更する
xf.set_prec '定義済みの変数の精度も変更する必要があります
yf.set_prec
zf.set_prec
For xf="1" To 10 Step "1"
   yf=gmpf_Sqr(xf)
   Print "Sqr(";xf;") =",yf.toString("%45.40f") '浮動小数点形式、digits.decimals
Next
Print "何かキー入力で継続 "
Sleep

Print
Print "mpq 1/3 から mpf に自動型変換"
zf=q2
Print zf.toString("%45.40f"); "                       全体 45 桁、小数部 40 桁で実数出力"
Print zf; "      自由形式で表示" '浮動小数点形式、すべての桁
Print zf.toString("e"); "  指数(sci 形式)で表示" 'Scientific notation 形式(電卓では sci モードと表示)、すべての桁
Print
Print "何かキー入力で継続 "
Print
Print "精度を 2,880桁に設定し直して"
Print "最初の 116 フィボナッチ数を計算する"
Sleep

set_precision(2880) '精度を2880桁に設定
xf.set_prec         '変数は事前に50桁の精度で初期化されていたため、
                    'より高い精度で再初期化する必要があります。

s=String(23,"9")+"8"+String(24,"9")
xf=s
xf=1/xf
s=xf.toString("%2885.2880f")
s=Mid(s,4)
'mpf_get_str (s, @xp, 10, 2880, @xf.num)
j=1
For i=1 To 58
   Print Mid(s,j,24),Mid(s,j+24,24)
   If i=50 Then
      Print i*2
   EndIf
   j+=48
Next

mpq_clear(@q2)
'mpf 変数を自動クリーンアップ

Print
Print "階乗を計算"
Print "何かキー入力で継続 "
Sleep

'void mpz_fac_ui (mpz_t rop, unsigned long int op) 
'rop = op!.(階乗)

Print
Dim As mpz_t k
mpz_init(@k)
Dim As Double t=Timer
mpz_fac_ui(@k, 100000)
t=Timer-t
Print "階乗 100000! の計算時間 ";t

Print 
Print "以下は 5000!"
Print "何かキー入力で継続 "
Sleep
Print factorial(5000)
Print

Print "何かキー入力で終了 ";

Sleep

'by dodicat ≫ May 04, 2017 12:37 
'階乗を計算するユーザ定義関数

Function factorial(n As ULong,numberbase As Long=10) As String 
    Dim As __mpz_struct Intanswer
    mpz_init( @Intanswer)
    mpz_fac_ui(@Intanswer,n)
    Dim As ZString Ptr s = mpz_get_str(0, numberbase, @intanswer)
    mpz_clear(@Intanswer)
    Function= Trim(*s)
    DeAllocate(s)
End Function

'Print factorial(150,16) '16 進数で表示
'Print factorial(150,10) '10 進数で表示

説明:
Function: void mpz_fac_ui (mpz_t rop, unsigned long int n)
Function: void mpz_2fac_ui (mpz_t rop, unsigned long int n)
Function: void mpz_mfac_uiui (mpz_t rop, unsigned long int n, unsigned long int m)
nの階数を求め,ropに格納します。
mpz_fac_ui関数は階数 n! を, mpz_2fac_ui関数は2重階数 n!! を,mpz_mfac_uiuiは m重階数 n!^(m) を計算します。

参考:
1.階乗 100000! の計算時間
 ASUS T100     0.15
 ASUS ET2232   0.11
 ThinkPad E570 0.07

2.以下は、5000! の計算結果です。
4228577926605543522201064200233584405390786674626646748849782402181358052708108200690899047871706387
5370847466573006854458784860666838127363372108937727876312793903630584621606439044789869822398719297
0889621161265296832177550039924219683703146907264472878789790404754884162215226671928410969236910449
5659717363529484002238403811206448202308576711045023061748947554283097617817240408053248099278093287
8405548619936454829121187625824880218917397790005021321259804363924462646077051135884659510867547058
5833924655225589035474435988347383178988034633008458631510209091509935653820010933047965742556741930
9170551728052002360750859911976352287559079020433697431235069168312119244959715562674075214621989862
3308862599830285986485757874944596311528697088671004626842364817898990545469086139161321834417414880
7186234448114831209490361196546872767755617886828720269104814092456410341835975604276458161513178575
9016610717825441569808833593727299956033713712004710494376562911424886053352994996423006999722049181
2010081905943914067505326500477553385089909794510155109148690700440711957233602624336813233021870928
7699196806656569752790422258267841561083376425781032629202687211070274681394351128601502326190649959
1718973641763784364912197091098409445148953589591038041769419566578348220717491055127526391483811720
5260482696516264271009491939333266103010436053045911701455720958471435372194824668679346737590487226
8133410207860903657108806376616249749507413107077401682180585945526445171409277469230062697511346044
1745679467358287822616295842486751573791729427241787831054298582451175755118845065744248275746608002
3858837849239624736876150701576772589832112863229553704490251638792512759084179174464046691353104734
7984464996154595542013996317357476301740036796192919942190762895445656261767041799538161133387312823
5115341525813090879158836383516647972259129442706535571425117373238072326329581217979166796923296870
9692390100325557478905509980748706104723064619598495523965761220867386651417169930755769189790267515
7342075864796345338446835085965490727326321910504064289713096224505162064669468098869917122127404504
0206849232662417601329102278666872703052847094525268254966177724996452066998369259106908940826374010
4349837159112645582228060636139411534431677176993435366428492829443641476961588199366138825557748770
9937004594753907845149034434521174560594039916268444697661821387470705325559577933196460996662145377
5649354741697085623892147732228655071824904300161861421927604523076706211429617672747041236161072200
0974375864749275366514953216478084907514633007101669131342066288256261828386583698363210876071042751
6073348347788414796732427080410860761841281888307115098982135338406610652147087046874760995427473673
5094515535997690403673533855510525716826503176824057439934148623923319814325791821933218989404508650
1361099809838399311099635598132800104973158859631213185380120504678764291066936560043730563343198487
9048998524701293300789344532868156679762880495532846386020133480265279836946393384995675049993707814
7465615434389304313842378789818478028860099710886956329883477118631223827859636531151323779313736473
9742936941149902875197222799954518261548829895115192668211245135531847220999043535594988729992203506
2039816011086376236539782172380237846650673624510635034423187315338308212043804710999419227821039747
5527174160438901697239613055493718448361198035658960620250090936643993601720073836133544050943290724
7651890950250772467584198941222465939216311635203814736247952853973208930953342191063570280557662972
0156556510767780805933453631121829561792887673002802450932122778852968418208261778476955644980385691
2757873726780409591587117339711031652326780607981276092461735041201826668742628053852758439791676090
0774338074842075118511910292196033937628098675366508521286925532153678793252188257410186613705432897
3735862725370178558806639851350386944039604928258820180419178073649693885802597758398892014389747165
4659735108526057062344020696370656601295357340435829614734272758056308395106673753492596595185756469
3972321827578000325059389530382053969755887051154307392082742244051629970873959976846120624662909811
2368012579891284802505094028916959765079395437191311379314427405135599630375642214527294341797246187
5979640742391478389935415658347161568584990367730566113538333670875489004130919816763307490415103375
9730724688583924694171554829573075061850588158195952899266022562690343957331345066697295211523066869
6227920947779974336574472673471408928071411283888082693377378077293104110767513639476200610858040596
0196390580157610023374638693522283858014349571781255814458629300424794040657368598620079146045902554
1392995008804471038475899032654809733816694050008545272371357139490246382030866854180283831752766806
4278489561005755859991718966786449154063570014497194249878920859731254275567514575206399118150736397
4831024907938417256534218942767691165981534300846370877695102954151365517346750540152397060425717460
0108996844049884598547797790503163256848915655723100649972649872148080018177035770150298300887948724
3887718884416833034708723239505377642232944095773219137582371673924704216723002256883135779230394688
9006624661825326584907244067670249395796972174674855629981831496656117439976804820941662574638796603
0517127492511922636761533752438165621733077165012952098875485646713186260238761996433486796151440832
8902061082833180891221325853682856469916007952105166960451695430614212305743006877217407155473217957
5770175959676405638127291538675136987123955705423509992286059754699621861955313541321391264366769004
6542999681168055073786677066598802706297250200188284588614534436877145536130441446561336909286274827
6981946836480550952968681758714859972973082332924094777085275279923304892719633314751563311192746150
3892192906167806079013834511370663006843762671998855151436812661373199121032354697867564212106248990
0555356402292434583126423103836341678171990835414041171774018595060667419834814334544424719143682822
5654380047860390575922417071802670646875454211626958746795398540784464654140381751149965273621123540
8801669902801490332251394608326681709307138688265499773742861277894177847526813283718187591036421408
8178322073980805971420328530972144304184545918300283340870578313828497328376128618292713674516189736
6207237396132790944984014154408304074405393067540767126182547597130843470311389815695365971788564022
7506742374003236218500947652675219419012413874782798834264708736168124853844440127725210500722793158
5309627912113116016777207795257261380024068442188545353712134190223637968401238525528860718996772569
4227433323948595075570839061877450159652184414998155476107548008054192318436948191732631430603548399
7907833072676367290909807728273558543480322600674725370977854645677611818073674243673917698637580721
4585979148503370059299496379336910028344455808983805401763540373713301931129308095828761210738037480
0660269767842888358265737486556785868822015143046249655995760379768685318192365806469199584071845493
6069221697761375426622396586449897709214781347091279174608716302208219814346542450657312626830895790
3101289336078864410723018480540037313601421622915914699201988414829001441431280090310210783330509023
8435726779416177246873411503598700003151092815700331081727415624680432977205070450456683898626301702
9893011453644774168567325123303764778817490360525726055206843706161165397551325413693038677832672082
2732366424920643236308926876882665093969186168327173975747955299324240618699242036378192948536809803
5256331092448215269276219116259145886393677034653480367887126133367116968226450914997055448521259751
8700847200256746587524039320610459030700394382520193831024809290196846024721712983216282379946271253
6635997189837442509912067368838373829965389203066284307454755907423534527402921160609134632768474952
2046010409575607348155101677203187580089224494752922031093841661588823584993931745149914395557357641
5841854798317024285239654510875254254647772945952303609464165419977979471368063449159987724091764431
3737117854221074057212116686869215324049008038420592119262287544089826147890812369895636708080468762
8524499897440855677969456909042340530355943524640751677873953113928698614347227572144946891896093294
3754767412349077927543383494123230600787676100899491561269340389211483702171933876178233703589258171
1286956345000136761989714540098664346192219767697593001055522519891300212302178083193433088044659295
4552165911855939202579781122952065357362914478404946474565003115498072056580360667380889572746464375
4280558193222993050892878068745374013271002744283179253550034515366931721120882276039428097886457273
0697997128564957693435400403072844058174664837665849803995896424337018345415172028533781090411312446
2432903353964296651109482836884580127588701293156099225044518125460113274986014470437757313881001319
2761246761166148335289355575031060184497889943782746138546517082416131676814639118700008128451443414
0673998543007277230375811161351109435561489632392975084638315293026358253536178483755851966694997225
1935515953807207838615142130284450051795239760968433198292598921623223582396390262548856855875458198
3715590084478600867459457091181287932282220517675093718661100131936258452234939498295111992808378605
2350641276933754813060959426446342507760114733420913912854162818317226214378306296240814939199718752
8106367348876678481602342743230027158192404187686545826519361990687336892886715133840245486110982482
0044827217994966587122571744290449167811948241656315603034738333176651212180527807959582202983306119
4516401941331555037966298021535768073112453058591596970997398805574355008327907184495975235359464435
4789680372126344509423070253995102864458237454677761013556916212309752286152053213998745673034127676
5033696366823066655520515624911325289261558638685031008491809205076806582659152761637199286942583506
0485973227394928608026064062752134100780181510562378792621203942478183343943387720639580111580908419
0794320195178235740190546595990289617711776195270354051193727229722248442080440098750369411277686593
0221330106250318620851450764210529805088371979860525577503039496061584428388468661375109684415673098
3807939434957001302926517795712062555585195131357402989758928347552533440985891140069444930843287400
5015554332587793895080241128538758725945136400838324944471346436826148195406004114845870234072926697
7406313258786347906676982661815012561176922757152912491648217023728844163576009968511009394114446776
2818600707227852231494104856439625579680822128993579926220855388922116476522085036770647649149613378
9353761537391569177822237744837614120253342622508007300513473422771427333106345971803240244226950458
0905393266891036193819988388440362317952824354953624896707341559480676885153210730644760778596286278
5228365724456430644909627751717265695423839294195840952725328165957253453142838962989400588653948682
4117113929627356938973482935854650278689437014798383826002058208853517073216288725214522205265969614
9621478848401290045077372524246050743396608181829602960191963141249985384220176951103613805617010163
5774354253114866936999413094090836822007193643511197859278249349147705218722654610919959726943915240
0467901173602521030051886080337084840114810246351288263986170081804888380750203521448348740849154718
7144788578095745154995050050707894288428884100278777774559811323199406241765321486863165817367744100
8406343695998951928831086912451786634255935345824258941139051646944037756266582157784593682990967975
4548350510473633770839151033854639602753486401635204633884342346714935641429160856846724874244782055
1137591682364722977936129710803025309344781155277375404589689903548080583093812673235935630985465643
7620938537105280834460718907600338878161801985327375949856691670470344843836350341636832526640322417
4519476678140428319327482851882140344319384445475456765253419659194332132585432270070759038565239668
2271713000091891220508451852615146279377175975288529786379317112125295294433237579100729090017035587
6379861248028146309394439191695012933631504528516353931286858642743729610944610123560487743986329961
1899755965996608749049271167685268675335991297583209089553296409523640116060078495005377892783750147
3441221237779077271341466474044898375894876754232945468993542203416699613666989765299785807958990558
6405038850708313733307683976688246368099235521972724183173512764618911238048588311556947788810175970
8977682149644340317924443085170303692214137621194388641989508360339306459037361842937028710758321966
6075461137610763625439286143162428907540210822336200123093847373122203742690338385799286785729394341
6828705376337409193818463226113174093427811791889164244751354347844604054945537983455616335381586844
1692054518698919434175386663900335756765603264363767906721626620330878425545157208117246381251512669
8466858872090131448616325604610195133718145852499881766299251421450147102061931903736713803476634310
2970522241478503018827510634744624125870793733908509575772431673506688509420876153616444044375586016
0625837091300574162065273670941888667964570550744724714137001968165215954380698515999483361357521322
1061318847719266419423953514122335467464614917430134758660373381765326045574029254722793602889261893
8589969565687678301718687398876388762597274397606281326344664767941367972618493339507466582044167798
9806604203937116666336696282569349097348391155869004856032512219241534268522369316036765491047702733
5215401431683388729684054432969676840360731824353362248654338235981235441675146083407811666618587817
3398062419925457785346267803903993755780275994295720528104377566697939683810934111895947576622019121
7535093638985465283078692370662512323684390235587636228324657161183714078807661162179517887972801841
5720196390844002690374503811927971703144898718150313199921115639083030172880126106420620053592402782
7739391802639171772013612598477693398064706376302260888535993759507908878908179180219576803338196860
5120487107610874898411568740159953020639098138993261095538868264084012160831040525974539251576403732
8890867369483664047346227085600408916107822219434051797945501553476829668553200975019055814199145911
2418150106225562741123157137735869719437413082202738384381594063857138791333759236233044045348723304
7240668784133333047898995255221468847973813568083995644533005222551320155267768895412770329278670827
4900411720766631127836381523435476816631211890868649913802362817752759460612118133420547918016192203
4691276038190052801234397359827046149981451132461819565852823204465827008206493468025155651127282208
3811563192256509945201222666603226059396247019707668580396286975551115189973049085051758765306785758
0006604240668941706203038467858602573706343525995868850886796540044651877902089429351532173167501137
3803146603464242948907632222813376329991964133650202862728926808756003661377060746357551507908798209
9722660130472907825746908175451952405573791313113170617323191598673971588373108168916968657704150695
5129476523861348157669675803647620052890602227445317443054984028630488508695577615286503260809411606
8857069889476204647850088430397310741277419196169745051711032908281520127388866342263149214709022001
6940636504812047036016738602290671629816411198202268607961324739550057567564568204754619040423011062
3713673959956789408847059768595145050172415177460173514309909726155093783347200000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000
 
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2017-05-09
日本語翻訳:WATANABE Makoto、原文著作者:srvaldez、dodicat , 2017-05-07 09:39

ホームページのトップに戻る

表示-非営利-継承