广义快速幂
设:○为一种二元运算且与集合V构成群,a∈V,e为○运算的幺元。
(群有4大性质:1.运算封闭性,2.满足结合律,3.有幺元,4.有逆元)
即e满足对于任意的a,有 e○a=a○e=a
我们可以记
a0=e
an=an-1○a
则有以下性质
an+m=an○am
则此时计算a关于○运算的n次幂的快速幂可以这样写
int quick_pow(int a,int n)
{
res=e;
temp=a;
while(n)
{
if(n&1)
{
res=res ○ temp;
}
temp=temp ○ temp;
n>>=1;
}
return res;
}
然后就像a^b=a*a*a*a*a… 是关于乘法的幂运算,又因为1*a=a*1=a,所以乘法幺元e就是1,带入上面的程序就可以得到最常见的乘法快速幂
同理,a*b=a+a+a+a……,其实就是关于加法的幂运算,至于加法的幺元,因为a+0=0+a=a,所以加法幺元就是0,带入上面程序便可得到快速乘法运算
下面是我自己写得广义快速幂模板,这个模板的写法可以就很多种,你也可以定义一个群的结构体或类,把快速幂,幺元都写进去,再重载运算符之类,大家按自己的喜好写就行了
struct Operator { int e; int calculation(int a,int b) { int res=e; /* 运算内容 */ return res; } }op; int quick_pow(int a,int n,Operator op) { res=op.e; temp=a; while(n) { if(n&1) { res=op.calculation(res,temp); } temp=op.calculation(temp,temp); n>>=1; } return res; }