快速冪與矩陣快速冪

2021-09-25 14:25:18 字數 1144 閱讀 6076

如果當前的指數是偶數,我們把指數拆成兩半,得到兩個相同的數,然後把這兩個相同的數相乘,可以得到原來的數;

如果當前的指數是奇數,我們把指數拆成兩半,得到兩個相同的數,此時還剩餘乙個底數,把這兩個相同的數和剩餘的底數這三個數相乘,可以得到原來的數。

求解x^n的值

int quickpow(int x,int n)

x*=x;

n = n>>1;

}return ans;

}

首先,我們注意到,不管當前的指數值(n 的值)是奇數還是偶數,一次運算之後 n 都要拆成兩半(n /= 2),所以,我們在每次運算的時候都要讓當前的 x *= x ,也就是執行 x = x^2,這點相信不難理解。

第二,當 n 為奇數的時候,如果執行 n /= 2,結果會使得 n 損失乙個 1。舉個例子:假設此時 n = 9,9 / 2 = 4 ,即使我們之後會執行 x *= x,也只是把 n 的一半 (4) 補回來了,還少了個 1 (4+4+1 = 9)。因此此時要把少了的那乙個 x 存入結果中,即為執行 ans *= x;

第三,只要 n 的初始值是大於 0 的(其餘的數需要特殊處理),那麼在運算過程中一直執行 n >>= 1,也就是將 n 除以 2 ,n 是一定會等於 1 的,此時執行 ans *= x,將最後的結果儲存在 ans中,之後退出迴圈。

最後,整個迴圈每一次執行 n 都變成原來的一半,當 n 等於 0 的時候結束,時間複雜度為 o(logn)。

矩陣快速冪是用於快速求出乙個矩陣的 n 次方的方法。

首先,兩個矩陣能不能相乘是有一定條件的: 矩陣 a 的列數等於矩陣 b 的行數。

對於這裡,我們要求的是乙個矩陣的 n 次方,那麼既然是同乙個矩陣,那麼只有當其為方陣的時候,才可以相乘。

struct matrix ///結構體,矩陣型別

ans,res;

matrix mul(matrix a,matrix b,int n)

}for(itn i=1;i <= n;i++)}}

return tmp;

}///矩陣快速冪,求矩陣res的n次冪

void quickpower(int n,int n)

}while(n)

}

快速冪與矩陣快速冪

1 結論 a b mod c a mod c b mod c mod c a b c a c b c 2 先這樣理解一下 int ans 1 a a c if b 2 1 ans ans a c k a a c for i 0 i return ans c 我們把式子轉化成k b 2 modc 所以...

快速冪與矩陣快速冪

快速冪,顧名思義要快速解決數冪問題 樸素演算法中時間複雜度為o n 在處理大數冪時顯然會爆,這時要使用到快速冪的思想。對於乙個數的6方a 6們通常使用a a a a a a,此時計算機進行5乘法運算,但我們可以將其拆分為 a a a a a a 這樣做的優點在於當我們進行一次a a運算後,只需將其乘...

快速冪與矩陣快速冪

快速冪 o logn 時間複雜度 include includeusing namespace std int qpow int base,int n return ans int main 矩陣快速冪 該演算法只適用於方陣 設 a 為方陣 快速求 a n 的演算法 應用 求遞推式的第n項,例如 斐...