数值算法——快速幂

在上一篇素性检验中,我们运用了库函数pow来求得n^{p-1}的值,这是非常方便快速的。

如果不使用pow,我们如何编写一个函数来求得一个数的整数次幂呢?

第一种方法

这是最简单的思路,对于x^{n},我们有:

当n大于0时,我们使n个x相乘

n小于0时,我们使n个x相乘,最后取其倒数

该算法的时间复杂度为O(n)

当n很大时,我们需要迭代的次数将会非常多

第二种方法——快速幂

我们先来观察一个式子——3^{5}

3^{5}=3*3*3*3*3=3^{2}*3^{2}*3=9^{2}*3=81*3

由此可以发现:迭代的次数分别为5,3,2

由规律,对于快速幂函数Mypow(x,n)我们有:

当n为偶数时 Mypow(x,n)=Mypow(x^{2},n/2)

n为奇数时,Mypow(x,n)=Mypow(x^{2},n/2)*x

其中/为整数除法

不难发现,这是一个递推式,我们可以使用递归的方法来实现

也可以使用迭代的方法,从而减少占用的空间

实现代码如下:

double pow2(double x, long long n){//先算n>=0的情况
    double ans=1.0;
    double c=x;
    while(n>0){
        if(n&1){//n为奇数
            ans*=c;//答案乘上多出的x
        }
        c*=c;//x变为x的平方
        n>>=1;//n缩小一半
    }
    return ans;
}

double Mypow(double x, int n){
    long long N=n;
    return N>0?pow2(x,N):1.0/pow2(x,-N)
}
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值