fork download
  1. #include <gmp.h>
  2.  
  3. mp_bitcnt_t gmp_zgetbits(mpz_t y_) {
  4. mp_bitcnt_t prev_bits = 0;
  5. mp_bitcnt_t bits;
  6.  
  7. bits = mpz_scan1(y_, prev_bits);
  8. if (bits == -1) {
  9. return 1;
  10. }
  11. prev_bits = 1;
  12.  
  13. for (;;) {
  14. bits = mpz_scan1(y_, prev_bits);
  15. if (bits == -1) {
  16. break;
  17. }
  18. prev_bits = bits + 1;
  19. }
  20.  
  21. return prev_bits;
  22. }
  23.  
  24. //
  25. // 一般項
  26. //
  27. static inline void sub_gmp_fibonacci_f(unsigned int n_, mpz_t y_, mp_bitcnt_t prec_) {
  28.  
  29. mpf_t r5;
  30. mpf_t ltmp;
  31. mpf_t rtmp;
  32.  
  33. mpf_init2(r5, prec_);
  34. mpf_init2(ltmp, prec_);
  35. mpf_init2(rtmp, prec_);
  36.  
  37. mpf_sqrt_ui(r5, 5);
  38. mpf_add_ui(rtmp, r5, 1);
  39. mpf_div_ui(rtmp, rtmp, 2);
  40.  
  41. mpf_pow_ui(ltmp, rtmp, n_);
  42. mpf_ui_sub(rtmp, 1, rtmp);
  43. mpf_pow_ui(rtmp, rtmp, n_);
  44. mpf_sub(ltmp, ltmp, rtmp);
  45. mpf_div(ltmp, ltmp, r5);
  46. mpf_set_d(rtmp, 0.5);
  47. mpf_add(ltmp, ltmp, rtmp);
  48. mpz_set_f(y_, ltmp);
  49.  
  50. mpf_clear(ltmp);
  51. mpf_clear(rtmp);
  52. mpf_clear(r5);
  53. }
  54.  
  55. void gmp_fibonacci_f(unsigned int n_, mpz_t y_) {
  56. mp_bitcnt_t est_res_bits;
  57. sub_gmp_fibonacci_f(n_, y_, 32);
  58. est_res_bits = gmp_zgetbits(y_) + 64;
  59. gmp_printf("calculation %dbits\n", est_res_bits);
  60.  
  61. sub_gmp_fibonacci_f(n_, y_, est_res_bits);
  62. }
  63.  
  64. #include <time.h>
  65. #include <sys/time.h>
  66.  
  67. inline static double baka_sec_count(void) {
  68. struct timeval tv;
  69. gettimeofday(&tv, NULL);
  70. return (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0);
  71.  
  72. }
  73.  
  74. int main(int argc, char* argv[]) {
  75. mpz_t fy;
  76. mpz_t gy;
  77.  
  78. unsigned int const n = 10000000;
  79.  
  80. double s;
  81. double e;
  82. clock_t us;
  83. clock_t ue;
  84.  
  85. mpz_init(fy);
  86. mpz_init(gy);
  87.  
  88. s = baka_sec_count();
  89. us = clock();
  90. gmp_fibonacci_f(n, fy);
  91. ue = clock();
  92. e = baka_sec_count();
  93. gmp_printf("f,%d,%lf,%lf\n", n, e - s, (double)(ue - us) / CLOCKS_PER_SEC);
  94.  
  95. s = baka_sec_count();
  96. us = clock();
  97. mpz_fib_ui(gy, n);
  98. ue = clock();
  99. e = baka_sec_count();
  100. gmp_printf("g,%d,%lf,%lf\n", n, e - s, (double)(ue - us) / CLOCKS_PER_SEC);
  101.  
  102. if (mpz_cmp(fy, gy)) {
  103. gmp_printf("validation error\n");
  104. }
  105.  
  106. mpz_clear(fy);
  107. mpz_clear(gy);
  108. return 0;
  109. }
  110.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
/home/mPrV95/ccf1hZlP.o: In function `gmp_zgetbits':
prog.c:(.text+0x11): undefined reference to `__gmpz_scan1'
prog.c:(.text+0x2b): undefined reference to `__gmpz_scan1'
/home/mPrV95/ccf1hZlP.o: In function `gmp_fibonacci_f':
prog.c:(.text+0x67): undefined reference to `__gmpf_init2'
prog.c:(.text+0x74): undefined reference to `__gmpf_init2'
prog.c:(.text+0x81): undefined reference to `__gmpf_init2'
prog.c:(.text+0x8e): undefined reference to `__gmpf_sqrt_ui'
prog.c:(.text+0x9e): undefined reference to `__gmpf_add_ui'
prog.c:(.text+0xae): undefined reference to `__gmpf_div_ui'
prog.c:(.text+0xbc): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0xcc): undefined reference to `__gmpf_ui_sub'
prog.c:(.text+0xda): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0xe8): undefined reference to `__gmpf_sub'
prog.c:(.text+0xf6): undefined reference to `__gmpf_div'
prog.c:(.text+0x106): undefined reference to `__gmpf_set_d'
prog.c:(.text+0x114): undefined reference to `__gmpf_add'
prog.c:(.text+0x11f): undefined reference to `__gmpz_set_f'
prog.c:(.text+0x127): undefined reference to `__gmpf_clear'
prog.c:(.text+0x12f): undefined reference to `__gmpf_clear'
prog.c:(.text+0x137): undefined reference to `__gmpf_clear'
prog.c:(.text+0x154): undefined reference to `__gmp_printf'
prog.c:(.text+0x15f): undefined reference to `__gmpf_init2'
prog.c:(.text+0x16a): undefined reference to `__gmpf_init2'
prog.c:(.text+0x175): undefined reference to `__gmpf_init2'
prog.c:(.text+0x182): undefined reference to `__gmpf_sqrt_ui'
prog.c:(.text+0x192): undefined reference to `__gmpf_add_ui'
prog.c:(.text+0x1a2): undefined reference to `__gmpf_div_ui'
prog.c:(.text+0x1b0): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0x1c0): undefined reference to `__gmpf_ui_sub'
prog.c:(.text+0x1ce): undefined reference to `__gmpf_pow_ui'
prog.c:(.text+0x1dc): undefined reference to `__gmpf_sub'
prog.c:(.text+0x1ea): undefined reference to `__gmpf_div'
prog.c:(.text+0x1fa): undefined reference to `__gmpf_set_d'
prog.c:(.text+0x208): undefined reference to `__gmpf_add'
prog.c:(.text+0x213): undefined reference to `__gmpz_set_f'
prog.c:(.text+0x21b): undefined reference to `__gmpf_clear'
prog.c:(.text+0x223): undefined reference to `__gmpf_clear'
prog.c:(.text+0x22b): undefined reference to `__gmpf_clear'
/home/mPrV95/ccf1hZlP.o: In function `main':
prog.c:(.text.startup+0x1f): undefined reference to `__gmpz_init'
prog.c:(.text.startup+0x27): undefined reference to `__gmpz_init'
prog.c:(.text.startup+0xd2): undefined reference to `__gmp_printf'
prog.c:(.text.startup+0x119): undefined reference to `__gmpz_fib_ui'
prog.c:(.text.startup+0x17d): undefined reference to `__gmp_printf'
prog.c:(.text.startup+0x188): undefined reference to `__gmpz_cmp'
prog.c:(.text.startup+0x19a): undefined reference to `__gmp_printf'
prog.c:(.text.startup+0x1a2): undefined reference to `__gmpz_clear'
prog.c:(.text.startup+0x1aa): undefined reference to `__gmpz_clear'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty