some new things, mostly not working or finished
This commit is contained in:
41
fib/fib.py
Normal file
41
fib/fib.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# tiny class to hold a 2x2 matrix
|
||||
class Matrix2x2:
|
||||
def __init__(self, m00, m01, m10, m11):
|
||||
self.m00 = m00
|
||||
self.m01 = m01
|
||||
self.m10 = m10
|
||||
self.m11 = m11
|
||||
|
||||
# multiply two 2x2 matrices
|
||||
def multiply(a, b):
|
||||
return Matrix2x2(
|
||||
a.m00 * b.m00 + a.m01 * b.m10, # top-left
|
||||
a.m00 * b.m01 + a.m01 * b.m11, # top-right
|
||||
a.m10 * b.m00 + a.m11 * b.m10, # bottom-left
|
||||
a.m10 * b.m01 + a.m11 * b.m11 # bottom-right
|
||||
)
|
||||
|
||||
# raise a matrix to the power n using binary exponentiation
|
||||
def matrix_pow(base, n):
|
||||
result = Matrix2x2(1, 0, 0, 1) # start with identity matrix
|
||||
while n > 0:
|
||||
if n % 2 == 1: # if n is odd, multiply once
|
||||
result = multiply(result, base)
|
||||
base = multiply(base, base) # square the base
|
||||
n //= 2 # integer division
|
||||
return result
|
||||
|
||||
# get nth fibonacci number using matrix exponentiation
|
||||
def fibonacci_matrix(n):
|
||||
if n == 0:
|
||||
return 0 # edge case
|
||||
base = Matrix2x2(1, 1, 1, 0) # Fibonacci Q-matrix
|
||||
result = matrix_pow(base, n - 1)
|
||||
return result.m00 # top-left is F(n)
|
||||
|
||||
# print first n fibonacci numbers
|
||||
if __name__ == "__main__":
|
||||
n = 50
|
||||
for i in range(n):
|
||||
print(fibonacci_matrix(i), end=" ")
|
||||
print()
|
||||
Reference in New Issue
Block a user