我必须编写一个程序来计算a**b % c
,其中b
和c
都是非常大的数字。如果我只使用a**b % c
,那真的很慢。然后我发现内置函数pow()
可以通过调用pow(a, b, c)
来快速完成此任务
我很想知道Python是如何实现这一点的?或者我在哪里可以找到实现此功能的源代码文件?
答案 0 :(得分:38)
如果a
,b
和c
是整数,则binary exponentiation可以提高实施效率,并在每个步骤中减少模c
,包括第一个(即在你开始之前减少a
模c
)。这就是the implementation of long_pow()
的确做法。
答案 1 :(得分:36)
您可以考虑以下两种快速计算(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;
}
答案 2 :(得分:0)
Python将C数学库用于一般情况,并将其自身的逻辑用于某些概念(例如无穷大)。
答案 3 :(得分:0)
this file的第1426行显示了实现math.pow的Python代码,但基本上归结为调用标准C库,该库可能具有该函数的高度优化版本。
对于密集数字运算来说,Python可能会非常慢,但是Psyco可以提高速度,但它不如调用标准库的C代码那么好。答案 4 :(得分:0)
我不知道python,但是如果你需要快速的权力,你可以通过平方来使用取幂:
http://en.wikipedia.org/wiki/Exponentiation_by_squaring
这是一个简单的递归方法,它使用指数的交换属性。
答案 5 :(得分:0)
在Python中实现pow(x,n)
def myPow(x, n):
p = 1
if n<0:
x = 1/x
n = abs(n)
# Exponentiation by Squaring
while n:
if n%2:
p*= x
x*=x
n//=2
return p
在Python中实现pow(x,n,m)
def myPow(x,n,m):
p = 1
if n<0:
x = 1/x
n = abs(n)
while n:
if n%2:
p*= x%m
x*=x%m
n//=2
return p
查看此link以获得解释