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

FreeBASIC GMPで階乗

目次→フォーラム→FreeBASIC→補足ExtLib GMP←参考トピック

GMP ライブラリを利用して階乗を計算 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

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

 任意精度算術ライブラリ GMP の使用例として作った、階乗を計算するプログラムです。

 このプログラムは、Tiny Basic for Windows home page の下記ページに書かれているものを、使わせていただきました。

 再帰的アルゴリズム
http://www.tbasic.org/reference/old/Recursive.html
私は、これまで、再帰プログラムは高級なプログラミング技術だと思っていました。
ところが、再帰プログラムは計算機に負荷をかけるので、簡単に非再帰プログラムとして書けるものは再帰プログラムを使うべきではない。
ということを、このページで教えていただきました。

 階乗の計算結果は、下記サイトで答え合わせしました。

 任意精度演算
https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%E6%BC%94%E7%AE%97
1〜35 の階乗の値が紹介されています。

 任意精度算術ライブラリGMP
http://lv4.hateblo.jp/entry/2014/01/18/232829
1000! の値が紹介されています。

追記:
 このページを書いた後、dodicat さんのユーザ定義関数 の存在を知りました。
このページに、そのユーザ定義関数 Function factorial(n As Uinteger) As String を使うバージョンを追加します。
'Factorial
'dodicat さんのユーザ定義関数を使う
'https://www.freebasic.net/forum/viewtopic.php?t=23225
'by dodicat ≫ Jan 17, 2015 1:11 

#Include "gmpFunctionsJP.bas"

Dim n As Integer

For n=1 To 35
   Print n; "! = "; factorial(n)
Next n

Print
Print "factorial(1000) = "; factorial(1000) 
Sleep

以下は、素直に GMP の掛け算を使うバージョンです。
'Factorial

#include once "gmp.bi"

Dim n As Integer
Declare Function Kaijyou(n As Integer) As ULongInt
Declare Sub KaijyouGMP(n As Integer)

For n=1 To 25
   Print n; "! = "; Kaijyou(n)
   If n = 20 Then Print , "20! が 64 ビット符号なし型 の限界"
Next n

Print , "GMP を使うと(何かキー入力して下さい。)"
Sleep

KaijyouGMP(20)
KaijyouGMP(21)
KaijyouGMP(1000)

Sleep

Sub KaijyouGMP(n As Integer)
   
   Dim i As Integer 
   Dim As mpz_ptr BigNum = Allocate(SizeOf(__mpz_struct))
   
   mpz_init_set_si(BigNum, 1)
   
   For i = 1 to n
      mpz_mul_ui(BigNum, BigNum, i)
      'BigNum = BigNum * i
   Next i
   
   Print n; "! = ";
   Dim As ZString Ptr s = mpz_get_str(0, 10, BigNum)
   Print *s;
   Deallocate(s)
   Print
   
   mpz_clear(BigNum)
   Deallocate(BigNum)
End Sub

Function Kaijyou(n As Integer) As ULongInt
   Dim F As ULongInt
   Dim i As Integer
   F = 1
   For i = 1 to n
      F = F * i
   Next i
   Kaijyou = F
End Function

解説:
mpz_ptr
mpz_ptr は、mpz_t(整数型)のポインタです。

mpz_init_set_si 構文 mpz_init_set_si (mpz_t rop, long int op)
mpz_t(整数型)のオブジェクト rop を初期化して rop に op を代入します。

mpz_mul_ui
構文 mpz_mul_ui (mpz_t rop, mpz_t op1, unsigned long int op2)
op1 と op2 の積を rop に代入します。

mpz_get_str
文字列への変換
構文 char * mpz_get_str (char *str, int base, mpz_t op)
mpz_t(整数型)のオブジェクト op を、基数 base の数字列(NULL 終端文字列) char *str に変換します。
(2 <= base <= 36)
str が NULL ならば,必要なメモリ領域が確保されます。
結果の文字列へのポインタが返ります。

mpz_clear
メモリを解放
構文 mpz_clear (mpz_t x)
変数 x の使用していたメモリ領域を解放します。
mpz_clear() を使って mpz_init() でアロケートしたメモリーを解放します。


 
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2016-11-29(作成:2016-11-22)
著作:WATANABE Makoto

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

表示-非営利-継承