線形再発順序
カラム(列)の番号場合\(A_N \)を満足\(A_N \)によって\(A_N \)と呼ばれる線形世代のk個の前に、\(A_N \)は、線形再帰的な配列であり、即ち:
[A_N = b_1a_ {N- \ -1} + b_2a_ {N-2 } + ... + b_ka_ {NK} \]
前記\(B_i \)が一定であります
- +力の原理を用いた高速行列乗算はO(logN個)の時間に答えることができます
- 式を用いて配列をO(1)時間的に答えることができます
2 Pythonのコード
列の数にその行為を例として数列をフィボナッチ
import numpy as np
import datetime
A = [[1,1], [1, 0]]
a1 = [[1],[1]]
mat_a1 = np.asarray(a1)
for n in range(3, 39+1):
# 矩阵乘法 + 快速幂
t1_s = datetime.datetime.now()
mat_R = np.asarray([[1,0], [0,1]])
mat_A = np.asarray(A)
r = n - 2
while r > 0 :
if r & 1 == 1:
mat_R = mat_R.dot(mat_A)
mat_A = mat_A.dot(mat_A)
r >>= 1
F_n = mat_R.dot(mat_a1)[0][0]
t1_e = datetime.datetime.now()
print("F_%d = %d\t cost time(1E-6s):%d" % (n, F_n, (t1_e - t1_s).microseconds))
図1は、コードの実行を示します