GNU Multi-Precision Library

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

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

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

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

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

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

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;
}

言語バインディング

脚注

関連項目 

 多倍長整数
 PARI/GP

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

GNUプロジェクト
数値解析ソフトウェア
数値計算ライブラリー
ライブラリ (プログラミング)
C言語