【C/C++対応】UbuntuにGMPをインストールする方法

2021/01/05
2

プログラミングで多倍長演算を行いたいときにとても便利ですが、インストールが若干めんどくさいGMP。久しぶりにUbuntuでインストールしようとしたら思いのほか手間取ってしまったので、備忘録も兼ねてメモしておきます。

GMPとは?

GMPはGNU Multi-Precision Libraryという、多倍長演算ライブラリです。

C/C++では通常、Unsigned Long Long型で最大64bitまでの整数しか扱えませんが、GMPではなんと数千桁レベルの数値を扱うことができます。

しかも、任意精度なのでリソースが許す限りいくらでもデカい数値を扱えるという優れモノ。暗号研究や数値解析にはもってこいのライブラリといえます。

インストール方法

実行環境:Ubuntu 20.04.1 LTS

インストールにあたり、こちらのサイトを参考にさせていただきました。

まずターミナルを起動して、以下のコマンドを実行してください。

$ sudo apt-get update
$ sudo apt-get install g++ m4 zlib1g-dev make p7zip

上記では、Ubuntuのアップデートと必要なライブラリのインストールを行っています。完了したら、GMP本体をダウンロード&展開します。

$ wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz
$ tar -xvf gmp-6.1.2.tar.xz

補足:GMP-6.1.2が安定版のようです。(記事執筆当時)

ダウンロードしたgmpフォルダに移動し、以下のコマンドを実行してビルド&インストールします。「--enable-cxx」というのは、C++に対応するためのオプションです。

$ ./configure --enable-cxx
$ make
$ make check
$ sudo make install

それぞれのコマンド実行後、画面にしばらく表示が続くので気長に待ちましょう。

処理が無事終わると、インストールが終了した旨の表示が出ます。

画像の通り、/usr/local/lib にGMP関連のファイルが無事インストールされました。

テスト

テストコード

私が実際にGMPを使って書いたC++のソースコードがあるので、動作確認に以下のコードを.cppファイルにして実行してみてください。

#include <iostream>
#include <random>
#include <gmpxx.h>

#define SIZE 2048

using namespace std;

mpz_class gen_rand(void);

int main() {
  mpz_class c = gen_rand();
  mpz_class d = gen_rand();
  mpz_class n = gen_rand();
 
  cout << "c=" << c << endl;
  cout << "d=" << d << endl;
  cout << "n=" << n << endl;
  
  return 0;
}

mpz_class gen_rand(void) {
  mpz_class x;
  random_device rnd;
  gmp_randclass rand(gmp_randinit_default);

  rand.seed(rnd());
  x = rand.get_z_bits(SIZE);

  return x;
}

コンパイル方法

ソースコードのコンパイル方法は以下の通りです。

$ gcc -o file file.c -lgmp  #Cの場合
$ g++ -o file file.cpp -lgmpxx -lgmp  #C++の場合

CとC++でコンパイルの仕方が違うので注意してください。

トラブルシューティング

ビルド時のエラー

私がまさにそうだったんですが、GMPをビルド&インストールするときに./configure → makeしようとするとエラーが出ることがあります。

今回の手順では多分問題ないと思いますが、そうしたエラーはm4やmakeその他のライブラリ&開発環境のインストールが影響しているみたいです。

どうしてもエラーが出る場合、必要そうなライブラリなどを調べて「apt-get intall」でぶち込んでみてください。

プログラム実行時のエラー

プログラムの実行時にこんなエラーが出たことがありました。

$ ./test: error while loading shared libraries: libgmpxx.so.4: cannot open shared object file: No such file or directory

libgmpxx.so.4がないよ、というメッセージ。ググってみると、これもGMPライブラリがないことが原因だったみたいです。

以下のコマンドを実行すると無事直りました。

$ sudo apt-get install libgmpxx4ldbl libgmp3-dev

あとがき

GMPを初めて知ったときは何それ?という感じだったんですが、使い始めるとその便利さにびっくり。書き方や型に癖はあるものの、数値の大きさを全く気にせずに使えるのはかなりストレスフリーです。

GMPについて詳しい書き方などもっと知りたい!という人は(日本語いまいち情報少ないですが)ぜひググってみてください。こちらのサイトが関数など詳しくまとめられていて参考になりました。

2件のコメント
参考になりました。ありがとうございました。
>duckさん
コメントありがとうございます。お役に立てたなら何よりです。