1. 程式人生 > >快速冪(取模)演算法

快速冪(取模)演算法

對於普通型別的求a^n,我們的求法是不是a*a*a*a....,這樣乘以n次,時間複雜度為O(n),對於普通n比較小的我們可以接受,然而當n比較大的時候,計算就慢了,所以我們就去尋找更快捷的計算方法!

例如:我們要求2^8,我們通過當為偶數的時候,a^n=(a*a)^(n/2),當n為奇數時,a^n=a*(a*a)^(n/2)的形式,是不是可以轉化為4^4->8^2->64^1,就可以了,2^5的話2*4^2->2*16^1。(把冪化為底數,減少乘法的次數)

int power(int a, int n)//a^n
{
    int ans = 1;
    while(n > 0) 
    {
        if(n&1) //當n為奇數時,乘以餘下的一個a
            ans *= a;
        a *= a;
        n /= 2;
    }
    return ans;
}

但是當n比較大時往往我們的結果都非常大,如果直接算的話就會溢位,所以我們在計算的過程中會對結果取模,然後我們就有了快速冪取模演算法。控制資料的大小,對於取模我們有(a*b)%c = ((a%c)*(b%c))%c,給出程式碼。 

int power(long long a, int n)
{
    long long ans = 1;
    while(n > 0) 
    {
        if(n&1) 
        {
            ans *= a;
            ans %= mod;
        }
        a *= a%mod;
        a %= mod;
        n /= 2;
    }
    return ans%mod;
}