矩陣快速冪

矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的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;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章