Location : Home > Languages > Perl > Package
Title : Math::GMP
Toolbox Logo

名称

 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> が拡張した。

Toolbox Logo
Updated : 2008/05/09