Merci à l'auteur de ce morceau de code, voilà une fonction efficiente pour calculer le Nième nombre de la suite de Fibonacci.
from math import floor, log
def fib(n):
if n == 0:
return 0
elif n in (1, 2):
return 1
F = 1
L = 1
sign = -1
mask = 2 ** (int(floor(log(n, 2)))-1)
for i in range(1, int(floor(log(n, 2)))):
temp = F ** 2
F = (F + L) / 2
F = 2 * F ** 2 - 3 * temp - 2 * sign
L = 5 * temp + 2 * sign
sign = 1
if n & mask:
temp = F
F = (F + L) / 2
L = F + 2 * temp
sign = -1
mask = mask / 2
if n & mask == 0:
F = F * L
else:
F = (F + L) / 2
F = F * L - sign
return F
Source : Pure Python Fibonacci Numbers.