Python是如何实现内置函数pow()的?

时间:2011-03-09 14:01:18

标签: python algorithm math

我必须编写一个程序来计算a**b % c,其中bc都是非常大的数字。如果我只使用a**b % c,那真的很慢。然后我发现内置函数pow()可以通过调用pow(a, b, c)来快速完成此任务  我很想知道Python是如何实现这一点的?或者我在哪里可以找到实现此功能的源代码文件?

6 个答案:

答案 0 :(得分:38)

如果abc是整数,则binary exponentiation可以提高实施效率,并在每个步骤中减少模c,包括第一个(即在你开始之前减少ac)。这就是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以获得解释