广义快速幂

设:○为一种二元运算且与集合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;
}

 

转载于:https://www.cnblogs.com/qswg/p/6336508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值