1. 程式人生 > >根據遞推公式構造係數矩陣用於快速冪

根據遞推公式構造係數矩陣用於快速冪

簡單的例子

Fibonacci數列

考慮Fibonacci數列,

F(n)=F(n1)+F(n2)
將右邊兩項看做是一個列向量的形式,令
Xn1={Fn1Fn2}
很容易得到Xn的形式,即
Xn={FnFn1}
現在的任務就是找到一個係數矩陣A,使得AXn1=Xn,且A需與n無關。
如果能夠找到這個A,則易知An1X1=Xn,於是可以利用矩陣快速冪計算出Xn。這樣就可以在O(logn)的時間內計算出指定的Fibonacci數。
這個矩陣很容易找,觀察易得
A={1110}(1)

Fibonacci數列變種

推廣一下,如果令Fn=aFn1+bFn2

,則係數矩陣為

A={a1b0}(2)

利用二項式展開構造矩陣

計算k次方和

Fibonacci數列只是最簡單的例子,對於稍微複雜一點的例子,二項式展開是常用的一項技術。
考慮計算:

Sn=i=1nik
易得
Sn=nk+Sn1
如果仿照Fibonacci數列,令
Xn1={nkSn1}

Xn={(n+1)kSn}
此時,可求出
A=(n+1n)k101
這個係數矩陣很明顯是不能用的,因為它與n有關,無法將遞推公式轉化為矩陣的冪運算。
這裡需要使用二項式展開。
Sn=(n1+1)k+Sn1=C0k(n1)k+C1k