• 广义快速幂


    设:○为一种运算且与集合V构成群,a∈V,e为○运算的幺元。

    即e满足对于任意的a,有 e○a=a○e=a

    我们可以记

    a0=e

    an=an-1○a

    则有以下性质

    an+m=an○am

    则此时计算a关于○运算的n次幂的快速幂可以这样写

    res=e;temp=a;

    while(n)

    {

            if(n&1)

                    res=res○temp;

            temp=temp○temp;

            n>>=1;

    }

    return res;

    其中 加法幺元为 0 ,乘法 为 1

      因为 n+0 不变, n*1 不变

    加法幂运算

    ll quick_mul(ll a, ll b, ll c)    
    {
    	ll res = 0;
    	while (b != 0)
    	{
    		if (b % 2 == 1)
    			res = (a + res) % c;
    		a = (a + a) % c;
    		b /= 2;
    	}
    	return res;
    }
    

    乘法幂运算

    ll quick_pow(ll a, ll b, ll c)
    {
        ll res = 1;
        while (b != 0)
        {
            if (b % 2 == 1)
                res=(res*a)%c    //优化   res = quick_mul(res, a, c);
            a = cq(a, a, c);
            b /= 2;
        }
        return res;
    }

    首先,要知道 (a*b)%c==(a%c)*(b%c)  (a+b)%c==a%c+b%c

      具体可以理解为  先把 取余c     看成不断减c,直至不够减

      (a*b)%c==( ((a%c)*(c*x))  *  ((b%c)(c*y))  )%c               a+b)%c==( (a%c+a*x) +( b%c+b*y) )%c

      其中  ((a%c)*(c*x)) 表示 a, x表示无关结果的未知数  ,所以 (c*x) 就给减没了   同理可证

             

    对于 a的b次方

    若 b为 奇数    则 a的b次方 == a的b/2次方  *  a的b/2次方  * a

    若 b为 偶数    则 a的b次方 == a的b/2次方  *  a的b/2次方  

    所以代码如上

    另外还有一点   就是乘法幂运算 可以运用 加法幂运算 进行优化

  • 相关阅读:
    软件构造 第七章第三节 断言和防御性编程
    软件构造 第七章第二节 错误与异常处理
    软件构造 第七章第一节 健壮性和正确性的区别
    软件构造 第六章第三节 面向可维护的构造技术
    软件构造 第六章第二节 可维护的设计模式
    欧拉函数代码实现及扩展--快速矩阵幂
    编译原理
    算法设计与分析总结
    人工智能简答总结
    感想
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12110176.html
Copyright © 2020-2023  润新知