快速冪之快速乘法優化
阿新 • • 發佈:2019-02-09
**學快速冪之前先來學習一下快速乘法,這樣對理解快速冪會有很大的幫助。**
首先,為什麼要用快速乘法呢?一看快速乘法,肯定算的比較快的啦。當然,你可能不會這樣認為,但是計算機卻能更快的計算。
好了,言歸正傳。快速乘法的本質是利用二進位制的性質把一個乘數化成二進位制進行操作。
看了這個例子你相信聰明的你已經理解快速乘法的原理了。
那就看一下程式碼怎麼實現的把:
long long q_cheng( long long a, long long b, long long mod ) //快速計算 (a*b) % mod
{
long long ans = 0; // 初始化
while(b)
{
if(b&1) //與運算,不會的自行學習,此時判斷當前位為1執行。
{
ans=(ans+a)%mod; //取模防止數太多溢位
}
b>>=1; //b=b>>1,相當於b=b/2;
a=(a+a) % mod;
}
return ans;
}
理解完快速乘法,那趁熱打鐵來看一看快速冪把。
快速冪的原理和快速乘法一樣,而快速冪是用快速乘法做了一個優化
這樣看會不會思路清晰一點,每次兩個數相乘時用快速乘法。
long long q_pow( long long a, long long b, long long mod ) //快速計算 (a^b) % mod,a為底數,b為指數
{
long long ans = 1; // 初始化
while(b)
{
if(b & 1)
{
ans = q_chegn( ans, a, mod ); //ans*=a
}
b=<<1; //b=b/2;
a = q_cheng( a, a, mod ); //更新a
}
return ans;
}
現在在看一下不用快速乘法以前寫的快速冪:
long long modexp(long long a, long long b, int mod)
{
long long res=1;
while(b>0)
{
//a=a%mod;(有時候n的值太大了會超出long long的儲存,所以要先取餘)
if(b&1)//&位運算:判斷二進位制最後一位是0還是1,&的運算規則為前後都是1的時候才是1;
res=res*a%mod;
b=b>>1;//相當於除以2;
a=a*a%mod;
}
return res;
}