Location : Home > Languages > Perl > Package Title : Math::GMP |
![]() |
Math::GMP - 任意の大きさの整数の計算
use Math::GMP; my $n = new Math::GMP 2; $n = $n ** (256*1024); $n = $n - 1; print "n is now $n\n";
Math::GMP は Math::BigInt 及び通常の整数の計算を置換するものとして設計されている。BigInt と異なり、Math::GMP は 全うな Perl 関数ではなく GNU gmp ライブラリを全ての計算で利用している。このおかげで速度に大きな改善が見られる。
本モジュールはインストールするためにはCコンパイラが必要である。これは多くの場合、小さなトレードオフとなる。本モジュールは Math::BigInt と完全な互換性はない。
Math::GMP オブジェクトは通常の数値スカラとして用いられ、できる限りシームレスに数学演算子をオーバーロードしている。しかし完全なインタフェースがほしければ以下のようにするとよい。
use Math::GMP qw(:constant); $n = 2 ** (256 * 1024); print "n is $n\n";
250,000 ビット値を計算するために通常の double を用いるため、 ':constant' がないと落ちてしまう。そのため無意味にオーバーフローする(指数が小さく浮動小数点の丸めのために精度が落ちる)。
オーバーロードしないインタフェースは不完全で、以下の関数だけが存在する。
new
$x = Math::GMP->new(123);
渡された文字列または数値から新規に Math::GMP オブジェクトを生成する。
$x = Math::GMP->new('abcd', 36);
2つめのパラメータで指定された基で示される1つめのパラメータから新規に Math::GMP オブジェクトを生成する。
bfac
$x = Math::GMP->new(5); $x->bfac(); # 1*2*3*4*5 = 120
$x の階乗を計算し、結果を $x に格納する。
band
$x = Math::GMP->new(6); $x->band(3); # 0b110 & 0b11 = 1
2つの引数の bit-wise AND を計算し、1つめの引数に格納する。
bxor
$x = Math::GMP->new(6); $x->bxor(3); # 0b110 & 0b11 = 0b101
2つの引数の bit-wise XOR を計算し、1つめの引数に格納する。
bior
$x = Math::GMP->new(6); $x->bior(3); # 0b110 & 0b11 = 0b111
2つの引数の bit-wise OR を計算し、1つめの引数に格納する。
bgcd
$x = Math::GMP->new(6); $x->bgcd(4); # 6 / 2 = 2, 4 / 2 = 2 => 2
2つの引数の最大公約数(GCD)を計算し、1つめの引数に格納する。
legendre
jacobi
fibonacci
$x = Math::GMP->fibonacci(16);
フィボナッチ数列の n 番目の値を計算する。
version 1.0 については、Math::GMP はほぼ古い Math::BigInt と互換性を保っている。しかし完全な Math::BigInt の書き直しではない。Math::BigInt への全面的な互換性を確保するためにどのように Math::GMP を使うのかについてはを参考資料を見よ。
正の値をとるものについて符号 '+' がつかないなど微細な非互換性があるが、これは意図的なものだ。
見落としたものもあると思われ、全てがうまく行くとは思っていない。
Math::BigInt にはデフォルトの純粋 Perl 実装とは異なるライブラリを使うための新しいインタフェースがある。例えば以下のようにできる。
use Math::BigInt lib => 'GMP';
Math::GMP がインストールされていなければ自身の Perl 実装に戻るべきである。
Math::BigInt, Math::BigInt::GMP, Math::BigInt::Pari, Math::BigInt::BitVect を見よ。
Mark Biggar と Ilya Zakharevich による古い Math::BigInt に基づいて Chip Turner <chip@redhat.com> が作成、さらに Tels <tels@bloodgate.com> が拡張した。
![]() |
Updated : 2008/05/09 |