快速幂

来源:互联网 发布:淘宝上伊芙丽假货多吗 编辑:程序博客网 时间:2024/06/14 05:44

传统的的求幂的计算方法例如2的13次方,程序需要进行一步步运算2*2*2*2。。。。。*2,我们会发现这样在时间线上计算机会推的很远,导致时间复杂度较高,不适合大数据量的运算,所以引入快速幂的概念,设想一下,假设我们先对这个公式进行拆分,计算每一部分的2*2=4,那么公式可以转化为4*4*4*4*4*4*2(后面剩余一个2),同样再往上计算4*4=16,使得公式变为16*16*16*2,在每一小部分同时进行计算的时候,我们可以发现同一时间分段我们完成了更高效的计算,这样可以有效的降低时间复杂度,那么怎样去做到分小部分进行运算呢,这就要求我们的程序不能单纯的执行单线任务,而要进行多运算同时处理,类似于树一样,进行层层运算,所以我们可以运用递归来实现。

下面是基本快速幂代码,采用的就是上述思想

long long  pow(long long a,long long b){    if(b==0)        return 1;    else if(b==1)        return a;    else    {        int c=pow(a,b/2);        if(b%2==0)            return c*c;        else            return c*c*a;    }}

下面是我从书中找到的用位运算对快速幂进行优化

long long  pow(long long x,long long n){    long long result;    if(n==0)        return 1;    else    {        while((n&1)==0)//n&1=0说明n为偶数        {            n>>=1;//即n/=2            x*=x;        }    }    result=x;    n>>=1;    while(n!=0)    {        x*=x;        if((n&1)!=0)            result*=x;        n>>=1;    }    return result;}

快速幂取模

long long int text(long long int a,long long int b,long long int c){    long long int ans=1;    a=a%c;    while(b>0)    {        if(b%2==1)            ans=(ans*a)%c;        b/=2;        a=(a*a)%c;    }    return ans;}