计算幂的一种高效方法

转载 2014年11月09日 18:31:12

计算x^n次方时,我们首先想到的是递归,时间复杂度为O(n)

public double pow(double x, int n)
{
	if(n==0)
		return 1.0;
	if(n<0)
		return 1.0/pow(x,-n);
	return x*pow(x,n-1);
}


从改善时间复杂度的角度考虑,可以利用pow(x,n) = pow(x,n/2)*pow(x,n-n/2),时间复杂度变为O(logn)

double pow(double x, int n)
{
	if(n==0)
		return 1.0;
	if(n<0)
		return 1.0/pow(x,-n);
	double half = pow(x,n>>1);
	if(n%2==0)
		return half*half;
	else
		return half*half*x;
}

但是上述代码都存在一个bug:当n为int类型的最小值Integer.MIN_VALUE(-2^32)时, -n并不是Integer.MAX_VALUE(2^32-1),减1才是。

Consider the binary representation of n. For example, if it is "10001011", thenx^n = x^(1+2+8+128) = x^1 * x^2 * x^8 * x^128. Thus, we don't want to loop n times to calculate x^n. To speed up, we loop through each bit, if the i-th bit is 1, then we add x^(1 << i) to the result. Since (1 << i) is a power of 2, x^(1<<(i+1)) = square(x^(1<<i)). The loop executes for a maximum of log(n) times.

 public double pow(double x, int n) {
        if(n == 0)
            return 1.0;
        if(n < 0)
        {
            if(n == Integer.MIN_VALUE)
                return 1.0/((pow(x,Integer.MAX_VALUE)*x));
            else
                return 1.0/pow(x, -n);
        }
        double result = 1.0;
        for(;n>0;x*=x,n>>=1)
        {
            if((n&1) > 0)
                result *= x;
        }
        return result;




2的次幂 -- 程序员大数计算必备

最近做IPV6,需要将IPV6转换成一个大数,方便操作。因为ipv6格式是128位,传统处理方式已经不起作用,只要找来大数运算的东东,贴出2的1000以内次幂的值,大家可以参考。...
  • timebomb
  • timebomb
  • 2013年11月27日 09:27
  • 7375

http的安全方法和幂等性

理解HTTP幂等性 转自: 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的W...
  • xyls12345
  • xyls12345
  • 2014年04月17日 18:22
  • 12933

【数值计算】幂法与反幂法

幂法求矩阵模最大的特征值及其对应特征向量 注:需要模最大特征值唯一,矩阵各列线性无关// 幂法求特征值 // 需要保证各列线性无关 #include #include #include #in...
  • qq379548839
  • qq379548839
  • 2016年10月17日 21:49
  • 1305

大数运算(8)——大数幂运算

幂的实现是最为简单的了,因为有了前面的算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束。 下面是C语言代码实现:...
  • lisp1995
  • lisp1995
  • 2016年09月03日 21:31
  • 1230

大数运算之快速幂算法

转自作者: 夜せ︱深在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~所谓的快速幂,实际上是快...
  • ppppublic
  • ppppublic
  • 2017年02月08日 16:26
  • 501

如何计算一个集合的幂集

这是看离散数学的时候想到的问题,如何用程序计算一个集合的幂集 自己想了半天也没想到什么好的办法,于是Google了一下,从Google上得到了两种方法,一种是递归,一种是位图,我不喜欢递归的方法...
  • shangzhihaohao
  • shangzhihaohao
  • 2015年04月12日 16:31
  • 2441

C/C++编程小练习 大数乘方(快速幂算法实现)

将我之前的大数乘方的算法做了些小优化,代码改动很小 快速幂算法实现大数乘方,时间复杂度由O(n^3)降到O(n^2*logn) 快速幂算法原理其实蛮简单的,类似于二分法的思想,扫描指数n的二进制形...
  • lovemylife1234
  • lovemylife1234
  • 2016年12月09日 21:25
  • 1551

实现浮点类型的幂运算,pow(x,n)

实现浮点类型的幂运算,函数原型为: double pow(double x, int n) 下面介绍一下解决该问题的几种方法以及要注意的地方: 1)最直观容易想到的方法就是用递归方法...
  • helen3he
  • helen3he
  • 2015年02月03日 14:01
  • 423

storm是怎么实现高效率的可靠性的?

理解storm的可靠性的最好的方法是来看看tuple和tuple树的生命周期,当一个tuple被创建,不管是spout还是bolt创建的,它会被赋予一个64位的id,而acker就是利用这个id去跟踪...
  • hylqq2008
  • hylqq2008
  • 2013年07月24日 10:59
  • 388

蓝桥杯2的次幂表示(位运算)

任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0。现在约定幂次...
  • try_fei_ge
  • try_fei_ge
  • 2016年12月17日 22:56
  • 375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算幂的一种高效方法
举报原因:
原因补充:

(最多只允许输入30个字)