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

won*_*ng2 48 python algorithm math

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

Sve*_*ach 40

如果a,bc都是整数,实现可以进行通过更高效的二进制幂和减少模c中的每一步,包括第一次(即降低ac,你甚至开始之前).这是实施的long_pow()确实.

  • @BenSandler:因为_a_≡_a'_(mod _c_)和_b_≡_b'_(mod _c_)暗含_ab_≡_a'b'_(mod _c_),或者换句话说,先减少_a_和_b_对_c_取模,然后将它们相乘,或者先相乘,然后对_c_取模。参见[有关模块化算术的Wikipedia文章](https://en.wikipedia.org/wiki/Modular_arithmetic#Integers_modulo_n)。 (2认同)

Noc*_*wer 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
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 谁能解释为什么这个解决方案有效?我无法理解这种算法背后的逻辑. (4认同)
  • @Fabiano我的功能不应该被使用.它只是解释了Python如何在幕后工作,而没有在C中引用它的来源.我试图回答**wong2的关于如何`pow`被褒奖的问题. (3认同)
  • @NoctisSkytower,考虑到原生的python`pow()`内置函数支持这个并且看起来更快,这将是什么好处?`>>> st_pow ='pow(65537L,767587L,14971787L)>>> st_pow_mod ='pow_mod(65537L,767587L,14971787L)'>>> timeit.timeit(st_pow)4.510787010192871 >>> timeit.timeit(st_pow_mod,def_pow_mod )10.135776996612549` (2认同)