GNU Multi-Precision Library (GMP)とは
GNU Multi-Precision Library(GMP)は、任意精度演算を可能にするフリーの数値計算
ライブラリです。GMPは、符号付き
整数、
有理数、
浮動小数点数を扱うことができ、実質的にハードウェアのメモリ容量に制限されることなく、非常に大きな数値の計算が可能です。
GMPの特徴
GMPは、その設計において速度を重視しており、オペランドのサイズに応じて最適な
アルゴリズムを選択し、重要なループには高度に最適化された
アセンブリ言語コードを使用しています。これにより、様々なサイズの数値に対して高いパフォーマンスを発揮します。
主な特徴は以下の通りです。
任意精度: 事実上、メモリ容量に制限されない精度で計算が可能
高速性: オペランドのサイズに応じて最適な
アルゴリズムを選択
多様な関数: 一貫したインターフェースで様々な関数を提供
多言語対応:
C言語の他、
C++,
OCaml,
Perl,
Pythonなど様々な言語で使用可能
GMPの利用例
GMPは、
暗号技術、インターネットセキュリティ、
数式処理システムなど、高度な計算能力を必要とする分野で広く利用されています。例えば、
Mathematicaなどの
数式処理システムでは、
整数の演算にGMPが採用されています。また、GCCのビルドにもGMPが必要です。
以下に
C言語と
C++でのコード例を示します。
c
include
include
int main() {
mpz_t a, b, result;
// Initialize GMP integers
mpz_init(a);
mpz_init(b);
mpz_init(result);
// Set values for a and b
mpz_set_str(a, "7612058254738945", 10);
mpz_set_str(b, "9263591128439081", 10);
// Calculate the product of a and b
mpz_mul(result, a, b);
// Print the result
gmp_printf("%Zd
", result);
// Clear GMP integers
mpz_clear(a);
mpz_clear(b);
mpz_clear(result);
return 0;
}
cpp
include
include
int main() {
mpz_class a = "7612058254738945";
mpz_class b = "9263591128439081";
// Calculate the product of a and b
mpz_class result = a
b;
// Print the result
std::cout << result << std::endl;
return 0;
}
GMPはGNUプロジェクトの一部であり、GNU Lesser General Public License (LGPL) でライセンスされています。公式サイトがgnu.orgにないため紛らわしい場合がありますが、GNUプロジェクトの一部です。
まとめ
GMPは、高度な数値計算を必要とする様々な分野で利用されている重要なライブラリです。その高速性と精度の高さから、今後も広く利用されていくことが期待されます。
関連情報
多倍長
整数
PARI/GP
GNU MPFR
外部リンク
公式サイト
GNU MP 6.1.2マニュアル日本語訳(PDF, Texinfoソース)