GNU Multi-Precision Library(GMP)は、多倍長整数など任意精度の算術ライブラリで、自由ソフトウェアである。符号付き整数、有理数、浮動小数点数を扱う。事実上、動作中のハードウェアが持つメモリ容量以外には精度は制限されない(オペランドの大きさは32ビットマシンでは 231 ビット、64ビットマシンでは 237 ビットFuture releases)。様々な関数があり、それらが一貫したインタフェースで提供されている。基本インタフェースはC言語だが、他の言語用ラッパーを使えば、C++、OCaml、Perl、Pythonなどでも使える。また、Ruby 2.1のようにGCの変更と高速化を盛り込んだRuby 2.1.0 @IT、2014年1月7日(2015年11月11日閲覧)。、言語コアに組み込まれている例もある。

GMPの主な用途は暗号(実用と研究)、インターネットセキュリティ、数式処理システムである。

GMPは、どんなオペランドの大きさでも他の多倍長整数ライブラリよりも高速であることを目標としている。このために、以下の点を重視している。 基本算術型としてフルワードを使う。 オペランドの大きさによってそれぞれ異なるアルゴリズムを使う。非常に大きな数に有効なアルゴリズムは、小さい数では遅いことが多い。 重要なループには高度に最適化したアセンブリ言語コードを使う。当然、CPUによって異なったものになる。

最初のGMPは1991年にリリースされた。その後継続的に開発と保守が行われている。

公式サイトがgnu.orgにないので混乱する場合があるが、GMPはGNUプロジェクトの一部であり、GNU Lesser General Public License (LGPL) でライセンスされている。

GMPは多くの数式処理システムで整数の算術に使われている。例えばMathematicaがGMPを採用しているNumerical computation features for Mathematica 5.0 Rob Knapp。

GMPはGCCのビルドに必要である。

コード例 ここでは、GMPライブラリを使って大きな数字を掛け合わせて表示するC言語のコード例を示す。 #include <stdio.h> #include <gmp.h>

int main(void) { mpz_t x, y, result;

mpz_init_set_str(x, "7612058254738945", 10); mpz_init_set_str(y, "9263591128439081", 10); mpz_init(result);

mpz_mul(result, x, y); gmp_printf(" %Zd\n" "*\n" " %Zd\n" "--------------------\n" "%Zd\n", x, y, result);

/* free used memory */ mpz_clear(x); mpz_clear(y); mpz_clear(result);

return 0; } このコードは、7612058254738945×9263591128439081の値を計算している。

このプログラムをコンパイルして実行すると、次のような結果が得られる。(Unixタイプのシステムでコンパイルする場合は-lgmpフラグが使用される) 7612058254738945 * 9263591128439081

70514995317761165008628990709545 C++プログラムで同様の内容を書くと次のようになる。(Unixタイプのシステムでコンパイルする場合は-lgmpxx -lgmpフラグが使用される) #include <iostream> #include <gmpxx.h>

int main() { mpz_class x("7612058254738945"); mpz_class y("9263591128439081");

std::cout << " " << x << "\n" << "*\n" << " " << y << "\n" << "--------------------\n" << x * y << "\n";

return 0; } 言語バインディング ライブラリ名 言語 ライセンス GNU Multi-Precision Library C, C++ LGPL Math::GMP Perl LGPL Math::GMPz, Math::GMPf and Math::GMPq Perl Artistic License v1.0 + GPL v1.0-or-later General Multiprecision Python Project Python LGPL R package 'gmp' R言語 GPL The RubyGems project Ruby Apache 2.0 GNU Multi-Precision Library for PHP PHP PHP GNU Multi-Precision Routines for SBCL Common Lisp パブリックドメイン Ch GMP プロプライエタリ Parallel GMP Wrapper for BMDFM BMDFM LISP / C パブリックドメイン Glasgow Haskell Compiler(The implementation of Integeris basically a binding to GMP) Haskell BSD luajit-gmp LuaJIT MIT gmp-wrapper-for-delphi Delphi MIT Zarith OCaml LGPL Math.Gmp.Native Library .NET MIT nim-gmp Nim MIT

脚注

関連項目

多倍長整数 PARI/GP

外部リンク 公式サイト GNU MP 6.1.2マニュアル日本語訳(PDF, Texinfoソース)