Python是如何实现内置函数pow()的?
我必须编写一个程序来计算a**b % c
,其中b
和c
都是非常大的数字。 如果我只是使用a**b % c
,那真的很慢。 然后我发现内置函数pow()
可以通过调用pow(a, b, c)
。
我很想知道Python是如何实现这个的? 或者我可以在哪里find实现此function的源代码文件?
如果a
, b
和c
是整数,则可以通过二进制幂运算并在每个步骤中减less模c
(包括第一个运算 (即,甚至在启动之前减less模c
))来实现更高的效率。 这就是long_pow()
的实现 。
您可能会考虑以下两种快速计算(x ** y) % z
。
在Python中:
def pow_mod(x, y, z): "Calculate (x ** y) % z efficiently." number = 1 while y: if y & 1: number = number * x % z y >>= 1 x = x * x % z return number
在C:
#include <stdio.h> unsigned long pow_mod(unsigned short x, unsigned long y, unsigned short z) { unsigned long number = 1; while (y) { if (y & 1) number = number * x % z; y >>= 1; x = (unsigned long)x * x % z; } return number; } int main() { printf("%d\n", pow_mod(63437, 3935969939, 20628)); return 0; }
这个文件的第1426行显示了实现math.pow的Python代码,但基本上归结为调用可能具有该函数的高度优化版本的标准C库。
对于密集型数据处理来说,Python可能会很慢,但是Psyco可以提供一个相当快的速度,但不会像调用标准库的C代码那么好。
我不知道python,但是如果你需要快速的权力,你可以使用指数平方:
http://en.wikipedia.org/wiki/Exponentiation_by_squaring
这是一个简单的recursion方法,它使用指数的交换性质。
Python对一般情况使用Cmath库,对其一些概念(如无穷大)使用它自己的逻辑。