矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的o(n)的時間複雜度,降到log(n).
最簡單的例子來講,一般我們正常計算實數x的n次冪時,都是從1開始,進行n次的x相乘。
但做下簡單的改進就能減少連乘的次數,方法如下:
把n個矩陣進行兩兩分組,比如:A*A*A*A*A*A => (A*A)*(A*A)*(A*A)
這樣變的好處是,你只需要計算一次A*A,然後將結果(A*A)連乘自己兩次就能得到A^6,即(A*A)^3=A^6.這樣就很容易的實現了時間複雜度的優化。
在上面的問題中,最重要的就是如何選擇間距值,上面的解答給我們展示了間距爲2的示例,但我們還可以有很多其他的選擇。那麼如何選擇出時間複雜度最低的呢,我們應該充分的使用現有的計算結果
回頭看看矩陣的快速冪問題,我們是不是也能把它離散化呢?比如A^19 => (A^16)(A^2)(A^1),顯然採取這樣的方式計算時因子數將是log(n)級別的(原來的因子數是n),不僅這樣,因子間也是存在某種聯繫的,比如A^4能通過(A^2)(A^2)得到,A^8又能通過(A^4)(A^4)得到,這點也充分利用了現有的結果作爲有利條件。
下面舉個例子進行說明:
現在要求A^156,而156(10)=10011100(2)
也就有A^156=>(A^4)(A^8)(A^16)*(A^128)
while(N)
{
if(N&1)
res=res*A;
N>>=1;
A=A*A;
}