_a**b % c
_を計算するプログラムを作成する必要があります。ここで、b
とc
は両方とも非常に大きな数です。 _a**b % c
_を使用するだけの場合、本当に遅いです。次に、組み込み関数pow()
がpow(a, b, c)
を呼び出すことでこれを非常に高速に行えることがわかりました。
Pythonこれをどのように実装しますか?または、この関数を実装するソースコードファイルはどこにありますか?
a
、b
、およびc
が整数の場合、 バイナリべき乗 とc
を法として減らすことにより、実装をより効率的にすることができます。最初のステップを含む各ステップで(つまり、開始前にa
modulo 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;
}
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 説明
Pythonは、一般的な場合にC数学ライブラリを使用し、その概念の一部(無限大など)に独自のロジックを使用します。
私はPythonについては知りませんが、高速なパワーが必要な場合は、二乗してべき乗を使用できます:
http://en.wikipedia.org/wiki/Exponentiation_by_squaring
これは、指数の可換特性を使用する単純な再帰的メソッドです。