fork download
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. template<class T>
  5. // F(1) == F(2) == 1 なので X != 1 とする
  6. T Fi(const T& X) {
  7. T Phi = (1 + std::sqrt(5)) / 2;
  8. T A01 = std::pow(-1, std::fmod(X + 1, 3));
  9. return (std::log(std::sqrt(5) * X + std::sqrt(5 * (X * X) - 4 * A01)) - std::log(2)) / std::log(Phi);
  10. }
  11. template<class T>
  12. T F(const T& N) {
  13. T Phi = (1 + std::sqrt(5)) / 2;
  14.  
  15. return (std::pow(Phi, N) - std::pow(-Phi, -N)) / std::sqrt(5);
  16. }
  17.  
  18. int main() {
  19. // フィボナッチ数列 = {0, 1, 1, 2, 3, 5, 8, 13, 21, ...}
  20. double A = F<double>(8); // フィボナッチ数列の8番目
  21. double B = Fi<double>(21); // 21はフィボナッチ数列で何番目か(8番目)
  22.  
  23. std::cout << A << std::endl;
  24. std::cout << B<< std::endl;
  25. // n != 2 のとき Fi(F(n)) == n になる
  26. std::cout << Fi<double>(F<double>(100)) << std::endl;
  27. return 0;
  28. }
Success #stdin #stdout 0s 4456KB
stdin
Standard input is empty
stdout
21
8
100