我写了以下模数指数。但是我不确定从MPZ类型转换为long时是否会失去精度。
def mypowmod(base, power, modulus):
base = gmpy.mpz(base)
power = gmpy.mpz(power)
modulus = gmpy.mpz(modulus)
result = pow(base, power, modulus)
return long(result)
答案 0 :(得分:2)
免责声明:我是gmpy
和gmpy2
的维护者。
Python long类型是任意精度。转换为long
和mpz
的转换始终是准确的。
由于long
是任意精度,因此内置的pow()函数将计算正确的结果,而无需使用gmpy
或gmpy2
。但是,使用mpz
类型会快得多。快速测试显示即使只有10位数字也会更快。
$ python -m timeit -s "import gmpy;a=10;b=gmpy.mpz('1'*a);p=gmpy.mpz('2'*a)-7;m=gmpy.mpz('3'*a)+11" "pow(b,p,m)"
1000000 loops, best of 3: 1.41 usec per loop
$ python -m timeit -s "a=10;b=long('1'*a);p=long('2'*a)-7;m=long('3'*a)+11" "pow(b,p,m)"
100000 loops, best of 3: 8.89 usec per loop
gmpy
没有powmod()函数。该功能是在gmpy2
中引入的。 gmpy2.powmod
会自动将参数转换为mpz
并返回mpz
结果。您的功能可以写成:
def mypowmod(base, power, modulus):
return long(gmpy2.powmod(base, power modulus)
即使包括long
和mpz
之间的转换,它仍然比使用内置long
类型快得多。
python -m timeit -s "import gmpy2;a=10;b=long('1'*a);p=long('2'*a)-7;m=long('3'*a)+11" "long(gmpy2.powmod(b,p,m))"
1000000 loops, best of 3: 1.72 usec per loop
答案 1 :(得分:0)
没有
但是使用gmpy.mpz
类型几乎不需要,因为内置long
类型具有此函数所需的所有操作。代码使用内置的pow
函数而不是gmpy.powmod
函数,因此转换为gmpy.mpz
是不必要的,因为pow
函数返回long
代码变为:
def mypowmod(base, power, modulus):
result = pow(base, power, modulus)
return result
哪个写得更好:
mypowmod = pow