- 时间:2022-11-01 00:09 编辑: 来源: 阅读:307
- 扫一扫,手机访问
摘要:二进制取幂算法:快速完成取幂运算。
[源码交易]
将幂除以2是计算幂运算的快速方法。 简单的计算方式是乘以倍数,代码如下:int result = 1;for(int I = 0;我!= b;i++)结果* = a;这个需要计算次数,但是真的需要计算那么多次吗?答案是否定的,我们可以用二分幂法让运算次数比次数少很多。 那么什么是二等分幂法呢?我们先考虑一个具体的计算: 首先,我们需要考虑: 这说明我们在计算值的时候,并不需要把计算出来的值乘以16倍。我们只需要乘以一次,大大减少了计算步骤。 如果我们想到了,那么我们自然可以进一步想到,这也大大简化了计算步骤:当我们得到数值时,只需要再乘以一次,而不是连续乘以八次。 如果继续这样推导,可以得到下面的公式:我们可以发现用二进制取幂的方法只需要6次运算就可以得到结果,而在简单的取幂方法中需要32次!但是我们发现了一个问题:32恰好是2的5次方,所以32可以分成两部分直到1。如果失去了这种特殊性,我们还能用二分法寻找权力吗?答案也是肯定的。以计算为例:当我们得到上面的拆分结果后,再计算就容易多了。 当我们得到的值,我们可以得到一次,然后我们可以再次得到它,然后我们可以再次得到它,然后我们可以再次得到它。最后,我们将这些中间结果相乘来计算。 使用二进制取幂,只需要5次运算,而简单取幂需要31次!现在,我们已经充分认识到了二分取幂的强大,但是要想完全掌握这种方法,我们还需要克服一个核心问题——如何正确分解指数,使其满足二分取幂的运算过程(比如上面一对的分解)。 为了一般化,我们可以这样考虑:显然,这样分解的指数满足二分法求幂的运算过程。 因为,在二进制取幂的过程中,从一开始,我们就可以得到:,因此,我们分解出来的属于取幂的序列,也就是指数,等于。看到这里,我们只需要走最后一步——与二进制联想,即可以完全掌握二进制取幂法。 对于任何索引,我们都可以将其转换为二进制形式。这个二进制串中所有取值为1的位置所代表的值就是二进制取幂法所要求的分解结果。 现在,从这样一个角度回过头来看指数以前的二进制形式,这个二进制串中每个1的值从低到高如下:我们可以发现这些值只是分解的结果,也就是说,我们可以很容易地用二等分幂法快速计算出结果。 再分析一个具体的例子:计算值。 指数的二进制形式是,所有位置的值为1所表示的值是:这样,就可以把分解成,然后用二分法求幂。从开始可以乘以一次,再乘以一次,如此类推,直到得到。 在这些中间结果中,对我们有用的是,当我们将它们相乘时,我们可以计算出 从程序运行的角度来看,用二进制取幂运算得到这个结果需要8个周期,但是如果要用简单的取幂算法得到这个结果,需要运行177次!显然,要计算的幂指数越大,平分幂的优势就越明显。 最后简单表达一下如何用编程语言计算:int fun(int a,int b){ int result = 1;while(b){ if(b % 2 = = 1)result * = a;a * = ab/= 2;}返回结果;}参考资料:王道论坛分组。王道论坛上机考试指南[M]。:, 2013.101-105.