

"""simple docstring"""




import functools
from math import sqrt
from time import time

def 		A    (       snake_case__						,			*snake_case__						,			**snake_case__      ):




			'''simple docstring'''


			SCREAMING_SNAKE_CASE__									= time()
			SCREAMING_SNAKE_CASE__									= func(*snake_case__						,			**snake_case__      )
			SCREAMING_SNAKE_CASE__									= time()
			if int(end - start      ) > 0:
						print(f"""{func.__name__} runtime: {(end - start):0.4f} s"""      )
			else:
						print(f"""{func.__name__} runtime: {(end - start) * 10_00:0.4f} ms"""      )
			return output

def 		A    (       snake_case__      ):




			'''simple docstring'''


			if n < 0:
						raise Exception("""n is negative"""      )
			if n == 0:
						return [0]
			SCREAMING_SNAKE_CASE__									= [0, 1]
			for _ in range(n - 1      ):
						fib.append(fib[-1] + fib[-2]      )
			return fib

def 		A    (       snake_case__      ):




			'''simple docstring'''


			def fib_recursive_term(snake_case__      ) -> int:
						if i < 0:
									raise Exception("""n is negative"""      )
						if i < 2:
									return i
						return fib_recursive_term(i - 1      ) + fib_recursive_term(i - 2      )

			if n < 0:
						raise Exception("""n is negative"""      )
			return [fib_recursive_term(snake_case__      ) for i in range(n + 1      )]

def 		A    (       snake_case__      ):




			'''simple docstring'''


			@functools.cache
			def fib_recursive_term(snake_case__      ) -> int:
						if i < 0:
									raise Exception("""n is negative"""      )
						if i < 2:
									return i
						return fib_recursive_term(i - 1      ) + fib_recursive_term(i - 2      )

			if n < 0:
						raise Exception("""n is negative"""      )
			return [fib_recursive_term(snake_case__      ) for i in range(n + 1      )]

def 		A    (       snake_case__      ):




			'''simple docstring'''


			if n < 0:
						raise Exception("""n is negative"""      )
			# Cache must be outside recursuive function
			# other it will reset every time it calls itself.
			SCREAMING_SNAKE_CASE__									= {0: 0, 1: 1, 2: 1}  # Prefilled cache

			def rec_fn_memoized(snake_case__      ) -> int:
						if num in cache:
									return cache[num]

						SCREAMING_SNAKE_CASE__									= rec_fn_memoized(num - 1      ) + rec_fn_memoized(num - 2      )
						SCREAMING_SNAKE_CASE__									= value
						return value

			return [rec_fn_memoized(snake_case__      ) for i in range(n + 1      )]

def 		A    (       snake_case__      ):




			'''simple docstring'''


			if n < 0:
						raise Exception("""n is negative"""      )
			if n >= 14_75:
						raise Exception("""n is too large"""      )
			SCREAMING_SNAKE_CASE__									= sqrt(5      )
			SCREAMING_SNAKE_CASE__									= (1 + sqrt_a) / 2
			return [round(phi**i / sqrt_a      ) for i in range(n + 1      )]


if __name__ == "__main__":
						A_							:     Dict     =	30
						time_func(fib_iterative, num)
						time_func(fib_recursive, num)  # Around 3s runtime
						time_func(fib_recursive_cached, num)  # Around 0ms runtime
						time_func(fib_memoization, num)
						time_func(fib_binet, num)





"""simple docstring"""




import importlib.metadata
import subprocess
import sys

def 		A    (       snake_case__ = False      ):




			'''simple docstring'''


			SCREAMING_SNAKE_CASE__									= False
			if "IPython" in sys.modules:
						SCREAMING_SNAKE_CASE__									= """google.colab""" in str(sys.modules["""IPython"""].get_ipython()      )

			if in_colab:
						if upgrade:
									SCREAMING_SNAKE_CASE__									= ["""pip""", """install""", """-U""", """torch"""]
									subprocess.run(snake_case__						,			check=snake_case__      )
						# get the current version of torch
						SCREAMING_SNAKE_CASE__									= importlib.metadata.version("""torch"""      )
						SCREAMING_SNAKE_CASE__									= torch_version[: torch_version.rindex("""."""      )]
						SCREAMING_SNAKE_CASE__									= f"""https://storage.googleapis.com/tpu-pytorch/wheels/colab/torch_xla-{torch_version_trunc}-cp37-cp37m-linux_x86_64.whl"""
						SCREAMING_SNAKE_CASE__									= ["""pip""", """install""", xla_wheel]
						subprocess.run(snake_case__						,			check=snake_case__      )
			else:
						raise RuntimeError("""`install_xla` utility works only on google colab."""      )


