#include <iostream>
#include <cmath>
template<class T>
// F(1) == F(2) == 1 なので X != 1 とする
T Fi(const T& X) {
T Phi = (1 + std::sqrt(5)) / 2;
T A01 = std::pow(-1, std::fmod(X + 1, 3));
return (std::log(std::sqrt(5) * X + std::sqrt(5 * (X * X) - 4 * A01)) - std::log(2)) / std::log(Phi);
}
template<class T>
T F(const T& N) {
T Phi = (1 + std::sqrt(5)) / 2;
return (std::pow(Phi, N) - std::pow(-Phi, -N)) / std::sqrt(5);
}
int main() {
// フィボナッチ数列 = {0, 1, 1, 2, 3, 5, 8, 13, 21, ...}
double A = F<double>(8); // フィボナッチ数列の8番目
double B = Fi<double>(21); // 21はフィボナッチ数列で何番目か(8番目)
std::cout << A << std::endl;
std::cout << B<< std::endl;
// n != 2 のとき Fi(F(n)) == n になる
std::cout << Fi<double>(F<double>(100)) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+Cgp0ZW1wbGF0ZTxjbGFzcyBUPgovLyBGKDEpID09IEYoMikgPT0gMSDjgarjga7jgacgWCAhPSAxIOOBqOOBmeOCiwpUIEZpKGNvbnN0IFQmIFgpIHsKCVQgUGhpID0gKDEgKyBzdGQ6OnNxcnQoNSkpIC8gMjsKCVQgQTAxID0gc3RkOjpwb3coLTEsIHN0ZDo6Zm1vZChYICsgMSwgMykpOwoJcmV0dXJuIChzdGQ6OmxvZyhzdGQ6OnNxcnQoNSkgKiBYICsgc3RkOjpzcXJ0KDUgKiAoWCAqIFgpIC0gNCAqIEEwMSkpIC0gc3RkOjpsb2coMikpIC8gc3RkOjpsb2coUGhpKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPgpUIEYoY29uc3QgVCYgTikgewoJVCBQaGkgPSAoMSArIHN0ZDo6c3FydCg1KSkgLyAyOwoKCXJldHVybiAoc3RkOjpwb3coUGhpLCBOKSAtIHN0ZDo6cG93KC1QaGksIC1OKSkgLyBzdGQ6OnNxcnQoNSk7Cn0KCmludCBtYWluKCkgewogICAgLy8g44OV44Kj44Oc44OK44OD44OB5pWw5YiXID0gezAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgLi4ufQoJZG91YmxlIEEgPSBGPGRvdWJsZT4oOCk7IC8vIOODleOCo+ODnOODiuODg+ODgeaVsOWIl+OBrjjnlarnm64KCWRvdWJsZSBCID0gRmk8ZG91YmxlPigyMSk7IC8vIDIx44Gv44OV44Kj44Oc44OK44OD44OB5pWw5YiX44Gn5L2V55Wq55uu44GLKDjnlarnm64pCgoJc3RkOjpjb3V0IDw8IEEgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IEI8PCBzdGQ6OmVuZGw7CgkvLyBuICE9IDIg44Gu44Go44GNIEZpKEYobikpID09IG4g44Gr44Gq44KLCglzdGQ6OmNvdXQgPDwgRmk8ZG91YmxlPihGPGRvdWJsZT4oMTAwKSkgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=