算法學習(二)——快速冪

快速冪是用來解決n^{k}modN,將其時間複雜度從O(n)減少到O(logn)

原理

首先,瞭解一個模運算的概念

(a+b) mod N = (a mod N + b mod N) mod N

(a*b) mod N = (a mod N * b mod N) mod N

 然後,對於一個數k,

把它轉換爲二進制,

如11 = 1011

那麼n^{11}=n^{8}*n^{2}*n^{1}

於是n^{11} mod N=(n^{8}mod N) *(n^{2}mod N) *( n^{1}modN)

那麼在循環過程中只需要一直記錄n^{2^{m}},每次判斷2^{m}對應k的二進制位是0(不要)是1(要)就可以

代碼 

typedef long long ll;

ll quick_mod(ll n, ll k, ll N)
{
    ll num = 1, t = n;
    while(k){
        if(k&1)
            num = num * t % N;
        t = t * t % N;
        k>>=1;
    }
    return num;
} 

 

對於快速冪的擴展還有一個矩陣快速冪,它是對於矩陣做一個快速冪的處理,可以用於求斐波那契數列第n項模N 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章