-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3-fibbonacci.py
40 lines (37 loc) · 1011 Bytes
/
3-fibbonacci.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def my_matrix_multiply(a, b):
m0000 = a[0][0] * b[0][0]
# m0101 = m0110 = m1001 = m1010 = a[0][1] * b[1][0]
m0110 = m1001 = a[0][1] * b[1][0]
# m0001 = m0010 = a[0][0] * b[0][1]
m0001 = a[0][0] * b[0][1]
# m0111 = m1011 = a[0][1] * b[1][1]
m0111 = a[0][1] * b[1][1]
m1111 = a[1][1]*b[1][1]
return [
[m0000 + m0110, m0001 + m0111],
# [a[1][0]*b[0][0] + a[1][1]*b[1][0], a[1][0]*b[0][1] + a[1][1]*b[1][1]]
[m0001 + m0111, m1001 + m1111]
]
def fib(n):
q = 1
if n == 0:
return 0
if n < 0:
n = -1*n
if n % 2 == 0:
q = -1
matrix = [[1, 1], [1, 0]]
result = [[1, 0], [0, 1]]
for c in '{:b}'.format(n-1)[::-1]:
if c == '1':
result = my_matrix_multiply(result, matrix)
matrix = my_matrix_multiply(matrix, matrix)
return q * result[0][0]
print(fib(0))
print(fib(1))
print(fib(2))
print(fib(3))
print(fib(17))
# print(fib(1000000))
print(fib(10))
print(fib(-10))