fork download
  1. #include <gmp.h>
  2. #include <stdio.h>
  3.  
  4. //
  5. // 一般項
  6. //
  7. mp_bitcnt_t gmp_fibonacci_f(unsigned int n_, mpz_t y_, mp_bitcnt_t prec_) {
  8.  
  9. mpf_t r5;
  10. mpf_t ltmp;
  11. mpf_t rtmp;
  12. mp_bitcnt_t prec;
  13.  
  14. mpf_init2(r5, prec_);
  15. mpf_init2(ltmp, prec_);
  16. mpf_init2(rtmp, prec_);
  17.  
  18. mpf_sqrt_ui(r5, 5);
  19.  
  20. mpf_add_ui(rtmp, r5, 1);
  21. mpf_div_ui(rtmp, rtmp, 2);
  22. mpf_pow_ui(ltmp, rtmp, n_);
  23. mpf_ui_sub(rtmp, 1, rtmp);
  24. mpf_pow_ui(rtmp, rtmp, n_);
  25. mpf_sub(ltmp, ltmp, rtmp);
  26. mpf_div(ltmp, ltmp, r5);
  27. mpf_set_d(rtmp, 0.5);
  28. mpf_add(ltmp, ltmp, rtmp);
  29. mpz_set_f(y_, ltmp);
  30.  
  31. prec = mpf_get_prec(r5);
  32.  
  33. mpf_clear(ltmp);
  34. mpf_clear(rtmp);
  35. mpf_clear(r5);
  36.  
  37. return prec;
  38. }
  39.  
  40. mp_bitcnt_t gmp_zgetbits(mpz_t y_) {
  41. mp_bitcnt_t prev_bits = 0;
  42. mp_bitcnt_t bits;
  43.  
  44. bits = mpz_scan1(y_, prev_bits);
  45. if (bits == -1) {
  46. return 1;
  47. }
  48. prev_bits = 1;
  49.  
  50. for (;;) {
  51. bits = mpz_scan1(y_, prev_bits);
  52. if (bits == -1) {
  53. break;
  54. }
  55. prev_bits = bits + 1;
  56. }
  57.  
  58. return prev_bits;
  59. }
  60.  
  61. //
  62. // 必要な精度を試しに取得
  63. //
  64. mp_bitcnt_t gmp_try_fibonacci_f(unsigned int n_, mpz_t y_) {
  65.  
  66. mp_bitcnt_t prec = 1;
  67. mpz_t try_y;
  68. mpz_init(try_y);
  69.  
  70. for ( ; ; ++prec) {
  71. prec = gmp_fibonacci_f(n_, try_y, prec);
  72.  
  73. if (!mpz_cmp(try_y, y_)) {
  74. break;
  75. }
  76. }
  77.  
  78. mpz_clear(try_y);
  79. return prec;
  80. }
  81.  
  82. int main(int argc, char* argv[]) {
  83.  
  84. mpz_t gy;
  85. mpz_t fy;
  86. unsigned int res_bits;
  87. unsigned int req_bits;
  88. unsigned int est_res_bits;
  89.  
  90. mpz_init(gy);
  91. mpz_init(fy);
  92.  
  93. fprintf(stdout, "n,res,req,est_res\n");
  94. for (unsigned int i = 0; i < 10000; ++i) {
  95.  
  96. mpz_fib_ui(gy, i);
  97. res_bits = gmp_zgetbits(gy);
  98. gmp_fibonacci_f(i, fy, 32);
  99. est_res_bits = gmp_zgetbits(fy);
  100. req_bits = gmp_try_fibonacci_f(i, gy);
  101. fprintf(stdout, "%d,%d,%d,%d\n", i, res_bits, req_bits, est_res_bits);
  102. }
  103.  
  104. mpz_clear(gy);
  105. mpz_clear(fy);
  106. return 0;
  107. }
  108.  
  109.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
/home/TYxDZS/ccjoN1iO.o: In function `gmp_fibonacci_f':
prog.c:(.text+0x28): undefined reference to `__gmpf_init2'
prog.c:(.text+0x33): undefined reference to `__gmpf_init2'
prog.c:(.text+0x3e): undefined reference to `__gmpf_init2'
prog.c:(.text+0x4b): undefined reference to `__gmpf_sqrt_ui'
prog.c:(.text+0x5b): undefined reference to `__gmpf_add_ui'
prog.c:(.text+0x6b): undefined reference to `__gmpf_div_ui'
prog.c:(.text+0x79): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0x89): undefined reference to `__gmpf_ui_sub'
prog.c:(.text+0x97): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0xa5): undefined reference to `__gmpf_sub'
prog.c:(.text+0xb3): undefined reference to `__gmpf_div'
prog.c:(.text+0xc3): undefined reference to `__gmpf_set_d'
prog.c:(.text+0xd1): undefined reference to `__gmpf_add'
prog.c:(.text+0xdc): undefined reference to `__gmpz_set_f'
prog.c:(.text+0xe4): undefined reference to `__gmpf_get_prec'
prog.c:(.text+0xef): undefined reference to `__gmpf_clear'
prog.c:(.text+0xf7): undefined reference to `__gmpf_clear'
prog.c:(.text+0xff): undefined reference to `__gmpf_clear'
/home/TYxDZS/ccjoN1iO.o: In function `gmp_zgetbits':
prog.c:(.text+0x131): undefined reference to `__gmpz_scan1'
prog.c:(.text+0x14b): undefined reference to `__gmpz_scan1'
/home/TYxDZS/ccjoN1iO.o: In function `gmp_try_fibonacci_f':
prog.c:(.text+0x177): undefined reference to `__gmpz_init'
prog.c:(.text+0x1a1): undefined reference to `__gmpz_cmp'
prog.c:(.text+0x1ad): undefined reference to `__gmpz_clear'
/home/TYxDZS/ccjoN1iO.o: In function `main':
prog.c:(.text.startup+0x23): undefined reference to `__gmpz_init'
prog.c:(.text.startup+0x2b): undefined reference to `__gmpz_init'
prog.c:(.text.startup+0x57): undefined reference to `__gmpz_fib_ui'
prog.c:(.text.startup+0xb7): undefined reference to `__gmpz_clear'
prog.c:(.text.startup+0xbf): undefined reference to `__gmpz_clear'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty