• 广义快速幂


    设:○为一种二元运算且与集合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;
    }
  • 相关阅读:
    基于XMPP实现的Openfire的配置安装+Android客户端的实现
    Android之基于XMPP协议即时通讯软件
    【Android XMPP】 学习资料收集贴(持续更新)
    R-ArcGIS探秘(1)安装以及Sample执行
    如何打造新媒体微营销平台
    29淘宝论坛推广技巧
    win10 UWP button
    Tomcat 6.x Perm区内存泄露问题
    Android WebView开发常见问题
    创建类模式大PK(总结)
  • 原文地址:https://www.cnblogs.com/qswg/p/6336508.html
Copyright © 2020-2023  润新知