Основываясь на предыдущих ответах мною и psmears, я написал этот код C #.
Он медленно проходит шаги, и его можно явно уменьшить и оптимизировать:
// Input: T: number to test.
// Output: idx: index of the number in the Fibonacci sequence.
// eg: idx for 8 is 6. (0, 1, 1, 2, 3, 5, 8)
// Return value: True if Fibonacci, False otherwise.
static bool IsFib(long T, out int idx)
{
double root5 = Math.Sqrt(5);
double PSI = (1 + root5) / 2;
// For reference, IsFib(72723460248141) should show it is the 68th Fibonacci number
double a;
a = T*root5;
a = Math.Log(a) / Math.Log(PSI);
a += 0.5;
a = Math.Floor(a);
idx = (Int32)a;
long u = (long)Math.Floor(Math.Pow(PSI, a)/root5 + 0.5);
if (u == T)
{
return true;
}
else
{
idx = 0;
return false;
}
}
Тестирование показывает, что это работает для первых 69 чисел Фибоначчи, но разбивается на 70-е.
F(69) = 117,669,030,460,994 - Works
F(70) = 190,392,490,709,135 - Fails
В целом, если вы не используете какую-либо библиотеку BigInt, вероятно, лучше иметь простую таблицу поиска чисел Фибоначчи и проверить это, а не запускать алгоритм.
Список первых 300 номеров доступен онлайн.
Но этот код действительно описывает работоспособный алгоритм при условии, что вы достаточно точны и не переполняете систему представления чисел.