#include #include #include /* n! の近似値と桁数 */ void fact_digits(unsigned int ni) { double n = ni; double afa, dfa; afa = sqrt(M_TWOPI * n) * pow(n, n) * exp(-n); /* dfa = 0.5 * log10(M_TWOPI * n) + n * log10(n) + log10(exp(-n)); */ dfa = 0.5 * log10(M_TWOPI * n) + n * log10(n/M_E); printf("%d: n! approx = %g, %.0f digits\n", ni, afa, dfa + 0.5); } /* n! の値と使用している limb の数 */ int fact_value(unsigned int n, mpz_t result) { unsigned int m = 2; if (n < m) { mpz_set_ui(result, 1); return 0; } printf("mp_bits_per_limb %d\n", mp_bits_per_limb); mpz_set_ui(result, m); while (++m <= n) { fact_digits(m); mpz_mul_ui(result, result, m); gmp_printf(" %Zd (%u limbs, %u bits)\n", result, mpz_size(result), mp_bits_per_limb * mpz_size(result)); /* printf(" _mp_alloc %d, _mp_size %d\n", result[0]._mp_alloc, result[0]._mp_size); */ } return 0; } int main(int argc, char* argv[]) { unsigned int n = 24; mpz_t result; mpz_init(result); fact_value(n, result); mpz_clear(result); return 0; }