Основываясь на предыдущих ответах по мне и 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 номеров можно легко найти в Интернете.
Но в этом коде описывается работоспособный алгоритм, если у вас есть достаточная точность и не переполняйте систему представления чисел.
Похоже, домашнее задание для меня, так что я добавил домашние задания тегов. –
См. Http://stackoverflow.com/questions/1525521/nth-fibonacci-number-in-sublinear-time для соответствующего вопроса. – mtrw
Пожалуйста, дайте OP возможность самостоятельно добавить тег домашней работы (не стесняйтесь просить разъяснений). Многие вещи выглядят как домашнее задание, а это не так. – danben