GMP(GNU Multi-Precision Library)の使い方1 変数編

GMPの基本的な使い方のうち変数およびそれに関係するAPIについてを簡単にまとめます。

変数

GMPには数値を格納する型として次の3つが用意されています。

  1. 整数型…mpz_t
  2. 浮動小数点数型…mpf_t
  3. 有理数型…mpq_t

変数の初期化

これらの変数は使用する前に初期化をする必要が有ります。
変数の初期化は次のように行います。

//整数型の場合
mpz_t I;
mpz_t J;
mpz_init(I);//精度を指定しない方法
mpz_init2(I2, 256);//精度を指定する方法、この場合256bit分の精度が保証される

//浮動小数点型の場合
mpf_t F;
mpf_t G;
mpf_init(F);
mpf_init2(G, 512);

//有理数型の場合
mpq_t Q;
mpq_init(Q);

有理数型は精度を指定する方法は用意されていません。

変数に代入

変数を宣言して初期化しても、数値を代入しないとなにもできないですよね。
変数に代入する方法はいくつか用意されていて、doubleやunsigned longなどの基本的な型からする方法や、大きな桁の数値のために文字列から代入する方法などがあります。

mpz_set(I, J); //mpz_t Iにmpz_t J を代入
mpz_set_ui(I, ui); //mpz_t Iにunsigned long int uiを代入
mpz_set_si(I, si); //mpz_t Iにsigned long int siを代入
mpz_set_d(I, d); //mpz_t Iにdouble dを代入
mpz_set_q(I, Q) //mpz_t Iにmpq_t Qを代入
mpz_set_f(I, F); //mpz_t Iにmpf_t Fを代入
mpz_set_str(I, "1234567890", 10); //十進数の1234567890をIに代入

mpf_set(F, G); //mpf_t Fにmpf_t Gを代入
mpf_set_ui(F, ui);  //mpf_t Fにunsigned long int uiを代入
mpf_set_si(F, si);  //mpf_t Fにsigned long int siを代入
mpf_set_d(F, d);  //mpf_t Fにdouble dを代入
mpf_set_z(F, I);  //mpf_t Fにmpz_t Iを代入
mpf_set_q(F, Q);  //mpf_t Fにmpq_t Qを代入
mpf_set_str(F, "3.14", 10); //mpf_t Fに十進数の3.14を代入
mpf_set_str(F, "1.23e10", 10); //mpf_t Fに十進数の1.23e10を代入

mpq_set(Q, R); //mpq_t Qにmpq_t Rを代入
mpq_set_z(Q, I); //mpq_t Qにmpz_t Iを代入
mpq_set_ui(Q, ui1, ui2); //mpq_t Qにunsigned long ui1/unsigned long ui2を代入 
mpq_set_si(Q, si1, si2); //mpq_t Qにsigned long si1/signed long si2を代入
mpq_set_str(Q, "41/152", 10); //mpq_t Qに十進数の41/152を代入

変数の削除

使用しなくなった変数はメモリの無駄遣いを防ぐために開放しましょう。

mpz_clear(I); //mpz_t Iを開放
mpf_clear(F); //mpf_t Fを開放
mpq_clear(Q); //mpq_t Qを開放

ここにまとめたもの以外にも様々なAPIが用意されています。
GMPのサイトで公開されているのでより詳しい情報はそちらで確認してみてください。
https://gmplib.org/manual/

カテゴリー: C, Ubuntu, ソフトウェア パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です