Хотя несколько человек указывают на идеальное квадратное решение, оно включает возведение в квадрат числа Фибоначчи, что часто приводит к получению массивного продукта.
Существует менее 80 чисел Фибоначчи, которые можно хранить даже в стандартном 64-разрядном целом числе.
Вот мое решение, которое работает на меньше , чем проверяемое число.
(написано на C # с использованием базовых типов, таких как double
и long
. Но алгоритм должен хорошо работать для больших типов.)
static bool IsFib(long T, out long idx)
{
double root5 = Math.Sqrt(5);
double phi = (1 + root5) / 2;
idx = (long)Math.Floor( Math.Log(T*root5) / Math.Log(phi) + 0.5 );
long u = (long)Math.Floor( Math.Pow(phi, idx)/root5 + 0.5);
return (u == T);
}
Спустя более 4 лет после того, как я написал этот ответ, комментатор спросил о втором параметре, переданном
out
.
Параметр # 2 - это «Индекс» в последовательности Фибоначчи.
Если проверяемое значение, T
- это число Фибоначчи, то idx
будет основанным на 1 индексом этого числа в последовательности Фибоначчи. (с одним заметным исключением)
Последовательность Фибоначчи 1 1 2 3 5 8 13
и т. Д.
3 - это 4-е число в последовательности: IsFib(3, out idx);
вернет true
и значение 4
.
8 является шестым числом в последовательности: IsFib(8, out idx);
вернет true
и значение 6
.
13 - седьмое число; IsFib(13, out idx);
вернет true
и значение 7
.
Единственное исключение - IsFib(1, out idx);
, которое будет возвращать 2
, даже если значение 1 присутствует в индексах 1 и 2.
Если IsFib
передается не-число Фибоначчи, оно вернет false
, а значение idx
будет индексом наибольшего числа Фибоначчи, меньшего T
.
16 не является значением Фибоначчи.
IsFib(16, out idx);
вернет false
и значение 7
.
Вы можете использовать Формула Бине для преобразования индекса 7 в значение 13 Фибоначчи, которое является наибольшим числом меньше 16.