Идея заключается в следующем.
F_n = F_(n-1) + F_(n-2)
F_(n+1) = F_n + F_(n-1) = 2*F_(n-1) + F_(n-2)
Можно пользоваться этими формулами в исходном виде, а можно еще подумать:
Имеем матричное уравнение
| F_n | | 1 1 | | F_(n-2)|
| | = | | | |
| F_(n+1)| | 1 2 | | F_(n-1)|.
Если через A обозначить матрицу
| 1 1 |
A = | |
| 1 2 |,
то получаем
| F_(2n) | | 1 |
| | = A^n * | |
| F_(2n+1)| | 1 |.
Итак, чтобы вычислить 2n-е/2n+1-е число Фибоначчи, надо матрицу A возвести в n-ую степень, а это можно сделать за O(log n) операций (известный фокус с возведением в квадрат/домножением на A в зависимости от двоичного разложения показателя n).
P.S Мне присылались письма по поводу якобы более простой и успешной формулы n-го члена:
Дело в том, что считать по этой формуле быстрее чем за log n нельзя, так как здесь также есть возведение в n-ю степень. С другой стороны, ошибки округления в этом случае будут колоссальны. Поэтому этой формулой пользоваться НЕ СЛЕДУЕТ.
|