fib_cache = {0:0, 1:1, 2:1}
def Fib(n):
global fib_cache
if n in fib_cache:
return fib_cache[n]
else:
result = fast_fib(n)[1]
fib_cache[n] = result
return result
# F(2n) = (F(n-1) + F(n+1)) * F(n)
# = (F(n-1) + F(n-1) + F(n)) * F(n)
# = (2F(n-1) + F(n)) * F(n)
# F(2n-1) = F(n-1)*F(n-1) + F(n)*F(n)
# this returns [F(n-1), F(n)], so
# the implementation should be
# fast_fib(1000)[1]
def fast_fib(n):
global fib_cache
if n==0: return 1,0