LoginSignup
7
5

More than 5 years have passed since last update.

GMP(GNU Multi-Precision )ライブラリ

Last updated at Posted at 2019-03-18

既出なものも多いかとは思いますが、メモがてらに。
間違い等がございましたらコメントください。

GMP(GNU Multi-Precision )

GMPとは

言わずと知れた多倍長演算ライブラリ。多倍長演算ライブラリを用いると(リソースが許す限り)任意の大きさの数を扱うことが可能となる。
多倍長演算の主な利用先に暗号がある。標準の整数型であるunsigned long long int型で64bitまでの整数を扱うことができるが、暗号などでは数千bitの整数を扱う必要があるため多倍長演算ライブラリが必要となる。

ライセンス

LGPL(GNU Lesser General Public License)ライセンス。GPLよりも縛りがゆるいライセンス。
- 自己責任での使用
- 著作権表示の削除禁止
- 複製・改変・再配布・販売は自由
- 中に組み込む場合LGPLライセンスに
つまり、外部ライブラリとしてLGPLのプログラムを利用する場合には呼び出す側のプログラムはLGLPでなくてもよい。

インストール

GMPのホームページからソースファイルをダウンロード。

ダウンロードしたtar.lzファイルを解凍

tar --lzip -xvf gmp-oo.tar.lz

もし、lzipがインストールされていなければ、

sudo apt install lzip

でlzipをインストール。

その後、

./configure
make -j4
make check
sudo make install

これでGMPのインストールは完了です。

使い方

ソースファイル内に

#include <gmp.h>

を追加。
コンパイル時に-lgmpを追加。

以下サンプル

gcc -o gmp_test gmp_test.c -lgmp
gmp_test.c
#include <time.h>
#include <gmp.h>

int main(int argc, char const *argv[])
{
    /**
     * 多倍長整数構造体を初期化
     */
    mpz_t a;
    mpz_init(a);

    /**
     * 疑似乱数生成器のステート構造体を初期化
     * デフォルトはメルセンヌ・ツイスタ
     **/
    gmp_randstate_t state;
    gmp_randinit_default(state);

    /**
     * 時間をseedに
     * 暗号の秘密鍵生成などを行う際は/dev/randomなどからハードウェア乱数を取ること推奨
     **/
    time_t rtime;
    time(&rtime);
    gmp_randseed_ui(state, rtime);

    /**
     * 100bitの乱数を生成
     **/
    mpz_urandomb(a, state, 100);

    /**
     * 16進数で出力
     **/
    gmp_printf("%Zx\n",a);

    /**
     * お片付け
     **/
    mpz_clear(a);
    gmp_randclear(state);

    return 0;
}

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5