快速幂与快速幂取模

快速幂与快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提升。而快速幂取模就是对幂运算后结果进行取模运算。在编程过程当中可能会遇到要求一个很大的数的模,为了获得一个能计算更大范围,速度更快的算法,快速幂取模算法应运而生。算法

快速幂

一.编程

计算幂,计算a^b有不少种方法函数

①有一个pow函数能够用于计算a^b学习

pow(a,b);

②利用for循环计算ui

int sum=1;
    for(int i=0;i<b;i++)
    {
        sum=sum*a;
    }

接下来就是快速幂的各类方法。spa

快速幂,仍是很好懂的一个算法。3d

快速幂就是把指数进行一次log(N)级别的变换
code

好比咱们要求3^11blog

咱们能够把指数用二进制数替换11,11的二进制数也就是1011。11 = 1011=2^3+2^1+2^0for循环

而3^11就能够写成(3^8)*(3^2)*(3^1)。

只须要算3^1和3^2还有3^8,这样,是否是复杂度就降了。这就是快速幂。

 1,当b为偶数时,a^b能够转为a^2的b/2次方。

 2.当b为奇数时,a^b能够转为a^2的b/2次方,再乘以a。

   而a^2的b/2次方,以可使用上述方式转为a^4的b/4次方再乘以某个数。

咱们看看代码

int Quick(int a,int b)
{
    int ans = 1,base = a;
    while(b!=0)
    {
        if(b%2)  //若是b是奇数这两步就至关于((a^2)^(b/2))*a
       ans *= base;
        base *= base;  //这两步至关于(a^2)^(b/2)
        b/=2;
    }
    return ans;
}

在每一次进行循环时,若是b为奇数,则a^b能够转为a^2的b/2次方乘以a。因此每一次进行a^2计算时,须要根据b是否为奇数决定是否在最终的结果上乘以a。

base *= base;  此步计算完成后,则base是下一个进行平方运算的数。这样当全部的循环结束后,base就是a^k,其中k是离b最近的,且为2的整数次方的数。

快速幂取模

这个也是利用了快速幂的算法,可是在写程序以前,你得知道一个知识


证实:


则咱们计算(a^b)%m时就能得出


int QuickMod(int a, int b, int m)
{
    int ans = 1;
    int base = a;
    base = base % m;
    while(b>0) {
        if(b % 2 == 1)
        ans = (ans * base) % m;//怕溢出以下
        b = b/2;
        base = (base * base) % m;//若是怕溢出,那能够写成base = (base % m * base % m) % m;
    }
    return ans;
}

大同小异

水平限制,只能写成这样了。但愿能对大家学习有帮助,为你在编程之路献上绵薄之力。