Skip to content

Commit c36bcc7

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent eed5bc7 commit c36bcc7

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

maths/lucas_series.py

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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("\nUsing closed-form formula to calculate lucas series:")
204210
print(" ".join(str(closed_form_lucas_number(i)) for i in range(n)))
205211
print("\nUsing 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

Comments
 (0)