@@ -24,7 +24,7 @@ def recursive_lucas_number(n_th_number: int) -> int:
2424 """
2525 if not isinstance (n_th_number , int ):
2626 raise TypeError ("recursive_lucas_number accepts only integer arguments." )
27-
27+
2828 # Use memoization to cache results and avoid redundant calculations
2929 @functools .cache
3030 def _recursive_lucas (n : int ) -> int :
@@ -33,7 +33,7 @@ def _recursive_lucas(n: int) -> int:
3333 if n == 1 :
3434 return 1
3535 return _recursive_lucas (n - 1 ) + _recursive_lucas (n - 2 )
36-
36+
3737 return _recursive_lucas (n_th_number )
3838
3939
@@ -55,16 +55,16 @@ def dynamic_lucas_number(n_th_number: int) -> int:
5555 """
5656 if not isinstance (n_th_number , int ):
5757 raise TypeError ("dynamic_lucas_number accepts only integer arguments." )
58-
58+
5959 if n_th_number == 0 :
6060 return 2
6161 if n_th_number == 1 :
6262 return 1
63-
63+
6464 a , b = 2 , 1
6565 for _ in range (2 , n_th_number + 1 ):
6666 a , b = b , a + b
67-
67+
6868 return b
6969
7070
@@ -86,35 +86,41 @@ def matrix_power_lucas_number(n_th_number: int) -> int:
8686 """
8787 if not isinstance (n_th_number , int ):
8888 raise TypeError ("matrix_power_lucas_number accepts only integer arguments." )
89-
89+
9090 if n_th_number == 0 :
9191 return 2
9292 if n_th_number == 1 :
9393 return 1
94-
94+
9595 def matrix_mult (a : list [list [int ]], b : list [list [int ]]) -> list [list [int ]]:
9696 return [
97- [a [0 ][0 ] * b [0 ][0 ] + a [0 ][1 ] * b [1 ][0 ], a [0 ][0 ] * b [0 ][1 ] + a [0 ][1 ] * b [1 ][1 ]],
98- [a [1 ][0 ] * b [0 ][0 ] + a [1 ][1 ] * b [1 ][0 ], a [1 ][0 ] * b [0 ][1 ] + a [1 ][1 ] * b [1 ][1 ]],
97+ [
98+ a [0 ][0 ] * b [0 ][0 ] + a [0 ][1 ] * b [1 ][0 ],
99+ a [0 ][0 ] * b [0 ][1 ] + a [0 ][1 ] * b [1 ][1 ],
100+ ],
101+ [
102+ a [1 ][0 ] * b [0 ][0 ] + a [1 ][1 ] * b [1 ][0 ],
103+ a [1 ][0 ] * b [0 ][1 ] + a [1 ][1 ] * b [1 ][1 ],
104+ ],
99105 ]
100-
106+
101107 def matrix_power (matrix : list [list [int ]], power : int ) -> list [list [int ]]:
102108 # Start with identity matrix
103109 result : list [list [int ]] = [[1 , 0 ], [0 , 1 ]]
104110 base = matrix
105-
111+
106112 while power > 0 :
107113 if power % 2 == 1 :
108114 result = matrix_mult (result , base )
109115 base = matrix_mult (base , base )
110116 power //= 2
111-
117+
112118 return result
113-
119+
114120 # Lucas number matrix form: [[1, 1], [1, 0]]
115121 base_matrix = [[1 , 1 ], [1 , 0 ]]
116122 powered_matrix = matrix_power (base_matrix , n_th_number - 1 )
117-
123+
118124 # L(n) = powered_matrix[0][0] * L(1) + powered_matrix[0][1] * L(0)
119125 # Where L(1) = 1, L(0) = 2
120126 return powered_matrix [0 ][0 ] * 1 + powered_matrix [0 ][1 ] * 2
@@ -138,17 +144,17 @@ def closed_form_lucas_number(n_th_number: int) -> int:
138144 """
139145 if not isinstance (n_th_number , int ):
140146 raise TypeError ("closed_form_lucas_number accepts only integer arguments." )
141-
147+
142148 if n_th_number == 0 :
143149 return 2
144150 if n_th_number == 1 :
145151 return 1
146-
152+
147153 # Golden ratio
148154 phi = (1 + math .sqrt (5 )) / 2
149155 # Conjugate of golden ratio
150156 psi = (1 - math .sqrt (5 )) / 2
151-
157+
152158 # Lucas number closed form: L(n) = phi^n + psi^n
153159 return round (phi ** n_th_number + psi ** n_th_number )
154160
@@ -175,16 +181,16 @@ def cached_lucas_number(n_th_number: int) -> int:
175181 """
176182 if not isinstance (n_th_number , int ):
177183 raise TypeError ("cached_lucas_number accepts only integer arguments." )
178-
184+
179185 if n_th_number in _lucas_cache :
180186 return _lucas_cache [n_th_number ]
181-
187+
182188 # Calculate using the fastest method for uncached values
183189 if n_th_number < 70 : # For smaller values, closed form is efficient
184190 result = closed_form_lucas_number (n_th_number )
185191 else : # For larger values, matrix exponentiation is more stable
186192 result = matrix_power_lucas_number (n_th_number )
187-
193+
188194 _lucas_cache [n_th_number ] = result
189195 return result
190196
@@ -203,4 +209,4 @@ def cached_lucas_number(n_th_number: int) -> int:
203209 print ("\n Using closed-form formula to calculate lucas series:" )
204210 print (" " .join (str (closed_form_lucas_number (i )) for i in range (n )))
205211 print ("\n Using cached function to calculate lucas series:" )
206- print (" " .join (str (cached_lucas_number (i )) for i in range (n )))
212+ print (" " .join (str (cached_lucas_number (i )) for i in range (n )))
0 commit comments