Introducere
Șirul lui Fibonacci este definit astfel:
Fn={1dacă n=1 sau n=2,Fn−1+Fn−2dacă n>2.
Pentru a determina al n
-termen a șirului putem folosi diverse metode. Acest articol prezintă un algoritm de complexitate O(n) care determină al n
-lea termen.
Prezentul articol prezintă un algoritm de complexitate logaritmică, bazat pe înmulțirea rapidă a matricelor.
Matrice Fibonacci
Considerăm următoarea matrice: Q=(1110). Dacă extindem șirul lui Fibonacii cu încă un element, F0=0, observăm că: Q=(F2F1F1F0). Să calculăm Q2 și Q3:
Q2=Q×Q=(F2F1F1F0)×(1110)=(F2⋅1+F1⋅1F2⋅1+F1⋅0F1⋅1+F0⋅1F1⋅1+F0⋅0)=(F2+F1F2F1+F0F1)=(F3F2F2F1)
Similar:
Q3=Q2×Q=(F3F2F2F1)×(1110)=(F3⋅1+F2⋅1F3⋅1+F2⋅0F2⋅1+F1⋅1F2⋅1+F1⋅0)=(F3+F2F3F2+F1F2)=(F4F3F3F2)
Observăm că Qn=(Fn+1FnFnFn−1), lucru ușor de demonstrat prin inducție matematică.
Concluzie: Dacă Q=(1110), atunci Qn=(Fn+1FnFnFn−1).
Algoritm
Pentru a determina Fn, considerăm matricea Q=(1110), pe care o ridicăm la puterea n
. Pentru a efectua repede calculele, folosim exponențierea rapidă.
Problema #Fibonacci2 cere determinarea celui de-al n
-lea termen al șirului lui Fibonacii, modulo 666013
. Succes!