Exponentiation 的 O(logn) 算法

求幂的O(logn)算法应该已经众所周知了。这里就不做深入地分析,只是简单介绍下并提供两个样板程序。在写下O(logn)算法之前,还是先补充介绍下算法的数学背景。

Exponentiation

显然,上面的数学式具有递归形式。所以,递归实现可以写成:

另外,我们也可以把递归式转化为非递归的循环实现方式。先用一个例子来阐述下循环的特点。我用a^15为例。

  1. 令 res = a^15,base = a,exponent = 15。因为exponent是奇数,所以 res = a^14 * a。
  2. 令 res1 = a^14,则 base = a,exponent = 14,res = res1 * a。
  3. 分析 res1,因为exponent为偶数,所以 res1 = (a^2)^7。
  4. 令 b = a^2,则 res1 = b^7,base = b,exponent = 7。重复步骤1。因为exponent是奇数,所以 res1 = b^6 * b。
  5. 重复步骤2。令res2 = b^6。则 base = b,exponent = 6,res1 = res2 * b。
  6. 重复步骤3。res2 = (b^2)^3。
  7. 重复步骤4。令c = b^2。则res2 = c^3,base = c, exponent = 3。因为exponent是奇数,所以res2 =  c^2 * c。
  8. 重复步骤2。令 res3 = c^2。则 res2 = res3 * c。
  9. 从以上的分析,我们看到 res = res1 * a = res2 * b * a = res3 * c * b * a。

可以发现,res3 * c * b * a中,每次乘法操作都发生在exponent为奇数时。而每次当exponent为偶数时,我们都是在计算b,c和res3,而且b,c和res3都是a的偶次幂。再结合最开头的数学式,我们可以得到如下的代码:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值