Skip to content
36 changes: 32 additions & 4 deletions maths/matrix_exponentiation.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,21 @@ def modular_exponentiation(a, b):


def fibonacci_with_matrix_exponentiation(n, f1, f2):
"""
Returns the nth number of the Fibonacci sequence that
starts with f1 and f2
Uses the matrix exponentiation
>>> fibonacci_with_matrix_exponentiation(1, 5, 6)
5
>>> fibonacci_with_matrix_exponentiation(2, 10, 11)
11
>>> fibonacci_with_matrix_exponentiation(13, 0, 1)
144
>>> fibonacci_with_matrix_exponentiation(10, 5, 9)
411
>>> fibonacci_with_matrix_exponentiation(9, 2, 3)
89
"""
# Trivial Cases
if n == 1:
return f1
Expand All @@ -50,21 +65,34 @@ def fibonacci_with_matrix_exponentiation(n, f1, f2):


def simple_fibonacci(n, f1, f2):
"""
Returns the nth number of the Fibonacci sequence that
starts with f1 and f2
Uses the definition
>>> simple_fibonacci(1, 5, 6)
5
>>> simple_fibonacci(2, 10, 11)
11
>>> simple_fibonacci(13, 0, 1)
144
>>> simple_fibonacci(10, 5, 9)
411
>>> simple_fibonacci(9, 2, 3)
89
"""
# Trivial Cases
if n == 1:
return f1
elif n == 2:
return f2

fn_1 = f1
fn_2 = f2
n -= 2

while n > 0:
fn_1, fn_2 = fn_1 + fn_2, fn_1
f2, f1 = f1 + f2, f2
n -= 1

return fn_1
return f2


def matrix_exponentiation_time():
Expand Down
Loading