快速乘法、快速冪 演算法
阿新 • • 發佈:2019-02-03
參考: https://blog.csdn.net/maxichu/article/details/45459715 點選開啟連結
快速乘法:快速計算a*b%mod的結果,對於大數直接乘可能會爆long long,用快速乘法每一步都取餘不會爆掉。
實現原理是:
對於乘數b來說,勢必可以拆成2進位制,比如110101。有一些位為0,有一些位為1。根據乘法分配律:a*b=a*(b1+b2+b3+……)那麼對於a*53 = a*110101(二進位制)= a*(100000+10000+100+1)=a*(100000*1+10000*1+1000*0+100*1+10*0+1*1)。那麼設立一個ans=0用於儲存答案,每一位讓a*=2,在根據b的對應為1看是不是加上此時的a,即可完成快速運算。
快速冪:快速計算a^b%mod的結果。
實現原理是:
把b轉換成二進位制數。
該二進位制數第i位的權為
例如
11的二進位制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我們將a¹¹轉化為算
程式碼如下:
#include <iostream> using namespace std; typedef long long ll; ll q_mul(ll a, ll b, ll mod){ ll ans=0; while(b){ if(b & 1) ans=(ans+a)%mod; a=(a<<1)%mod; b>>=1; } return ans; } ll q_pow(ll a, ll b, ll mod){ ll ans=1; while(b){ if(b & 1) ans=q_mul(ans,a,mod); a=q_mul(a,a,mod); b>>=1; } return ans; } int main(){ ll a=1005345645650000079,b=1256465546534567898,mod=100054604565600; cout<<q_mul(a,b,mod)<<endl; cout<<q_pow(a,b,mod); return 0; }