From 777ddca2e9b63c294c49883518fc0723de2c11e0 Mon Sep 17 00:00:00 2001 From: Sanders Lin <45224617+SandersLin@users.noreply.github.com> Date: Wed, 20 May 2020 01:31:52 +0800 Subject: [PATCH] Update fast_fibonacci.py (#1889) * Update fast_fibonacci.py * Update fast_fibonacci.py Co-authored-by: Christian Clauss --- dynamic_programming/fast_fibonacci.py | 47 ++++++++++++--------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/dynamic_programming/fast_fibonacci.py b/dynamic_programming/fast_fibonacci.py index 77094a403..63481fe70 100644 --- a/dynamic_programming/fast_fibonacci.py +++ b/dynamic_programming/fast_fibonacci.py @@ -1,44 +1,37 @@ -#!/usr/bin/python +#!/usr/bin/env python3 """ This program calculates the nth Fibonacci number in O(log(n)). -It's possible to calculate F(1000000) in less than a second. +It's possible to calculate F(1_000_000) in less than a second. """ import sys +from typing import Tuple -# returns F(n) -def fibonacci(n: int): # noqa: E999 This syntax is Python 3 only +def fibonacci(n: int) -> int: + """ + return F(n) + >>> [fibonacci(i) for i in range(13)] + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] + """ if n < 0: raise ValueError("Negative arguments are not supported") return _fib(n)[0] # returns (F(n), F(n-1)) -def _fib(n: int): # noqa: E999 This syntax is Python 3 only - if n == 0: - # (F(0), F(1)) +def _fib(n: int) -> Tuple[int, 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) + + # 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 + return (d, c + d) if n % 2 else (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))) + n = int(sys.argv[1]) + print(f"fibonacci({n}) is {fibonacci(n)}")