● 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 ~
$ ./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