GNU 多倍長演算ライブラリ( GMP ) は、符号付き整数、有理数、浮動小数点数を扱う任意精度演算のためのフリーライブラリです。[ 4 ]使用可能なメモリによって暗示されるもの以外に、精度に実際的な制限はありません(オペランドは32 ビット マシンでは最大 2 32 -1 ビット、 64 ビット マシンでは2 37ビットになります)。 [ 5 ] [ 6 ] GMP には豊富な関数セットがあり、関数には標準的なインターフェースがあります。基本的なインターフェースはC用ですが、Ada、C++、C#、Julia、.NET、OCaml、Perl、PHP、Python、R、Ruby、Rustなど、他の言語用のラッパーも存在します。
2008 年以前、Java 仮想マシンであるKaffe は、Java の組み込み任意精度演算をサポートするために GMP を使用していました。[ 7 ]その後まもなく、GNU Classpathに GMP サポートが追加され、とのバックエンドとして使用されるようになりました。[ 8 ]java.math.BigIntegerjava.math.BigDecimal
GMPの主な対象アプリケーションは、暗号化アプリケーションと研究、インターネットセキュリティアプリケーション、およびコンピュータ代数システムです。
GMPは、あらゆるオペランドサイズにおいて、他のどの任意精度演算(ビッグナンバー)ライブラリよりも高速であることを目指しています。これを実現する上で重要な要素は以下のとおりです。
最初のGMPリリースは1991年に行われました。これは継続的に開発および維持されています。[ 9 ]
GMPはGNUプロジェクトの一部であり(ただし、ウェブサイトがgnu.org以外にあるため混乱を招く可能性がある)、GNU Lesser General Public License(LGPL)に基づいて配布されている。
GMPは、 Mathematica [ 10 ]やMaple [ 11 ]などの多くの数式処理システムで整数演算に使用されています。また、計算幾何学アルゴリズムライブラリ(CGAL)でも使用されています。
GMPはGNUコンパイラコレクション(GCC)をビルドするために必要です。[ 12 ]
Cライブラリインターフェースは以下を定義します。
mpz_t(多倍長整数)mpq_t(多倍長有理数)mpf_t(多倍長浮動小数点数)gmp_randstate_t(乱数生成に使用されるランダムな状態)関数には型名が接頭辞として付きます(例えば、多倍長整数に対する演算にはmpz、などが接頭辞として付きます)。
ライブラリには、 、 、 などの追加のユーティリティ (すべて で始まる) も含まれていますgmp。gmp_scanfgmp_printf
以下は、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 );// 使用済みメモリを解放するmpz_clear ( x ); mpz_clear ( y ); mpz_clear ( result );return 0 ; }このコードは、。
このプログラムをコンパイルして実行すると、次の結果が得られます。(この-lgmpフラグは、Unix系システムでコンパイルする場合に使用します。)
7612058254738945 * 9263591128439081 -------------------- 70514995317761165008628990709545 C++ライブラリインターフェースは、以下のクラスを定義します。
mpz_class(対応するmpz_t)mpq_class(対応するmpq_t)mpf_class(対応するmpf_t)gmp_randclass(乱数生成ユーティリティを提供する)C ライブラリの独立した関数は、C++ クラスのメソッドとして統合されます。C++ ライブラリはすべてのシンボルをグローバルに配置し、ライブラリ名前空間を使用しません。宣言ではこれを避けることをお勧めしますauto。[ 13 ] C 型に戻るには、各クラスが対応するget_mp_t()メソッドを提供します (たとえばmpz_class::get_mpz_t())。
比較のために、代わりに以下の同等のC++プログラムを作成することもできます。(これらの-lgmpxx -lgmpフラグは、Unix系システムでコンパイルする場合に使用します。)
import < gmpxx . h > ; import std ;int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); mpz_class result = x * y ;std :: println ( "{} \ n " " * \ n " "{} \n " " -------------------- \n " "{}" , x.get_str ( ), y.get_str ( ), result.get_str () );return 0 ; }