● GNU MP (GMP)
・ GMP 用のインクルードファイルとコンパイルのしかた

#include <gmp.h>
/* const char* const gmp_version : Global Constant */

gcc myprogram.c -lgmp
g++ mycxxprog.cc -lgmpxx -lgmp

・ GMP データタイプ
mpz_t : multiple precision integer
mpq_t : multiple precision fraction
mpf_t : multiple precision floating point number

 これらの任意長の数値は、"limb" と呼ばれる適当なサイズの
machine word に分割されてメモリーに格納されます。 通常、limb のサイズは 32 または 64 bit です。limb のデータ型は mp_limb_t です。

 MP 変数を関数の引数として使うと call-by-reference (アドレス渡し) になります。 関数内で MP 変数の値を変えると、呼び出した側での変数の値も変わります。


● とにかく動くプログラム ─
 "C" 言語です。

#include <stdio.h>
#include <gmp.h>

/*
  n! の計算。 report_flag は途中経過報告フラグ。
*/
int zfact(unsigned int n, mpz_t result, int report_flag)
{
    if (n < 2) {
        mpz_set_ui(result, 1);
        return 0;
    }
    mpz_set_ui(result, n);
    while (--n > 1) {
        mpz_mul_ui(result, result, n);
        if (report_flag)
            gmp_printf("n %d: %Zd\n", n, result);
    }
    return 0;
}

/*
  12 の階乗を計算します。 途中経過を報告します。
*/
int main(int argc, char* argv[])
{

    mpz_t result;
    mpz_init(result);
    zfact(12, result, 1);
    gmp_printf("result: %Zd\n", result);
    mpz_clear(result);
    return 0;
}


● コンパイルと実行

 gcc のオプション -Wall を指定すると、警告メッセージを全て出力します。

admin@notebook ~
$ gcc -Wall -o first.exe first.c -lgmp

admin@notebook ~
$ ./first
n 11: 132
n 10: 1320
n 9: 11880
n 8: 95040
n 7: 665280
n 6: 3991680
n 5: 19958400
n 4: 79833600
n 3: 239500800
n 2: 479001600
result: 479001600


 Top に戻る