快速冪與快速模冪

快速冪

3 ^ 999 = 3 * 3 * 3 * … * 3 算法

直接乘要作998次乘法。但事實上能夠這樣作: 函數

3 ^ 2 = 3 * 3 ui

3 ^ 4 = (3 ^ 2) * (3 ^ 2) spa

…………code

3 ^ 256 = (3 ^ 128) * (3 ^ 128) 遞歸

3 ^ 512 = (3 ^ 256) * (3 ^ 256) class

再相乘: while

3 ^ 999 co

= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1) 位運算

= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^  2) * 3 

這樣只要作16次乘法。

把999轉爲2進制數:1111100111,其各位就是要乘的數。

1 1 1 1 1 0 0 1 1 1

9 8 7 6 5 4 3 2 1 0

對應的位置號是k就是3^(2^k)

模冪算法

1.遞歸解 
利用模運算規則,採用遞歸方式,計算X^N(% P)   
函數名:PowerMod   
輸入值:unsigned int x,底數x   
unsigned int n,指數n   
unsigned int p,模p   
返回值:unsigned int,X^N(% P)的結果   
*/   
unsigned int PowerMod(unsigned int x, unsigned int n, unsigned int p)   
{   
    if (n == 0){   
        return 1;   
    }   
    unsigned int temp = PowerMod((x * x)%p, n/2, p); //遞歸計算(X*X)^[N/2]   
    if ((n & 1) != 0) //判斷n的奇偶性   
    {   
        temp = (temp * x) % p;   
    }   
    return temp;   
}  
                          

2 非遞歸解
long long  quickpow(long long   m , long long   n , long long   k){ 
     long long   ans = 1; 
     while(n){ 
         if(n&1)//若是n是奇數 
             ans = (ans * m ) % k; 
         n = n >> 1;//位運算「右移1相似除2」 
         m = (m * m) % k; 
     } 
     return ans; 

 }
相關文章
相關標籤/搜索