web-dev-qa-db-ja.com

どのようにPython組み込み関数pow()を実装しましたか?

_a**b % c_を計算するプログラムを作成する必要があります。ここで、bcは両方とも非常に大きな数です。 _a**b % c_を使用するだけの場合、本当に遅いです。次に、組み込み関数pow()pow(a, b, c)を呼び出すことでこれを非常に高速に行えることがわかりました。
Pythonこれをどのように実装しますか?または、この関数を実装するソースコードファイルはどこにありますか?

47
wong2

ab、およびcが整数の場合、 バイナリべき乗cを法として減らすことにより、実装をより効率的にすることができます。最初のステップを含む各ステップで(つまり、開始前にa modulo cを減らす)。これが long_pow()の実装 が実際に行うことです。

39
Sven Marnach

(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;
}
36
Noctis Skytower

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 説明

0
Akshay Nair

Pythonは、一般的な場合にC数学ライブラリを使用し、その概念の一部(無限大など)に独自のロジックを使用します。

0
cmaynard

このファイル の1426行目は、math.powを実装するPythonコードを示していますが、基本的には、高度に最適化されたバージョンの標準Cライブラリを呼び出すことになります。その機能の。

Pythonは集中的な数値計算のために非常に遅くなる可能性がありますが、 Psyco を使用すると速度が大幅に向上する可能性がありますが、標準ライブラリを呼び出すCコードほど良くありません。

0

私はPythonについては知りませんが、高速なパワーが必要な場合は、二乗してべき乗を使用できます:

http://en.wikipedia.org/wiki/Exponentiation_by_squaring

これは、指数の可換特性を使用する単純な再帰的メソッドです。

0
Jonno_FTW