如題,小生我用矩陣的快速冪已經可以算一般費式數列了,可是若把其變成廣義費式數列我就不知道其中的數學式如何改成程式碼套入我現有的費式數列程式碼,其中的數學式牽扯到矩陣線性代數等等,我都沒學過,網上也看不大懂,想請問各路大神如何寫,還有講解這些
附上我的求一般費式數列的程式碼(py):
def a2in(lis,y):#快速幕算法,雖然程式碼有點多,但可以節省記憶體時間,利用指數分解的原理(就是次方如果非質數可以拆開ex:4=>2*2也就是x的4次方=x的2次方的2次方,如果是就會-1讓其可以/2來拆開來算)
global past
if past.get(y) != None:#如果此次方算過就直接回傳算過的
return past[y]
if y % 2 == 0:ram = 0#如果是奇數次方則再多*一次(因為若n是奇數執行次數和n-1的執行次數一樣)
else:
ram = 1
y -= 1
if y > 2:
ram1 = a2in(lis,y // 2)
else :
if ram == 0:past[y] = faslambda(lis,fas)
else: past[y+1] = faslambda(faslambda(lis,fas),fas)#將算過的存起來
return faslambda(lis,fas)if ram == 0 else faslambda(faslambda(lis,fas),fas)
if ram == 0:past[y] = faslambda(ram1,ram1)
else: past[y+1] = faslambda(faslambda(ram1,ram1),fas)#將算過的存起來
return past[y] if ram == 0 else past[y+1]
faslambda = lambda q,w:[[w[0][0]*q[0][0]+w[0][1]*q[1][0],
w[0][0]*q[0][1]+w[0][1]*q[1][1]],
[w[1][0]*q[0][0]+w[1][1]*q[1][0],
w[1][0]*q[0][1]+w[1][1]*q[1][1]]]#矩陣相*
fas = [[1,1],[1,0]]#初始陣列[[n+1,n(第n項的意思)][n,?]]
past = {}#是否計算過,若要列因出許多時用到
#用法:
#for i in range(起始第幾項,結束第幾項):輸出多項實用到,底下(要的第幾項-1)改成i
print(a2in(fas,要的第幾項-1)[0][0])