Skip to content

Commit

Permalink
Added fastfibonacci.py
Browse files Browse the repository at this point in the history
  • Loading branch information
Kilian Rueß committed Oct 12, 2017
1 parent f9156cf commit a07baad
Showing 1 changed file with 42 additions and 0 deletions.
42 changes: 42 additions & 0 deletions dynamic_programming/fastfibonacci.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
This program calculates the nth Fibonacci number in O(log(n)).
It's possible to calculate F(1000000) in less than a second.
"""
import sys


# returns F(n)
def fibonacci(n: int):
if n < 0:
raise ValueError("Negative arguments are not supported")
return _fib(n)[0]


# returns (F(n), F(n-1))
def _fib(n: int):
if n == 0:
# (F(0), F(1))
return (0, 1)
else:
# F(2n) = F(n)[2F(n+1) − F(n)]
# F(2n+1) = F(n+1)^2+F(n)^2
a, b = _fib(n // 2)
c = a * (b * 2 - a)
d = a * a + b * b
if n % 2 == 0:
return (c, d)
else:
return (d, c + d)


if __name__ == "__main__":
args = sys.argv[1:]
if len(args) != 1:
print("Too few or too much parameters given.")
exit(1)
try:
n = int(args[0])
except ValueError:
print("Could not convert data to an integer.")
exit(1)
print("F(%d) = %d" % (n, fibonacci(n)))

0 comments on commit a07baad

Please sign in to comment.