从 MHZ 转换为长时,我会失去精度吗?
Do I loose precision when converting from MPZ to long?
我写了下面的模幂运算。但是我不确定从 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)
没有
但是使用 gmpy.mpz
类型基本上是不必要的,因为内置的 long
类型具有此功能所需的所有操作。该代码使用内置的 pow
函数而不是说 gmpy.powmod
函数,因此不需要转换为 gmpy.mpz
并且作为 pow
函数 returns a long
代码变为:
def mypowmod(base, power, modulus):
result = pow(base, power, modulus)
return result
哪个更好写为:
mypowmod = pow
免责声明:我是 gmpy
和 gmpy2
的维护者。
Pythonlong类型是任意精度。转换 to/from 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
和 return 一个 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
我写了下面的模幂运算。但是我不确定从 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)
没有
但是使用 gmpy.mpz
类型基本上是不必要的,因为内置的 long
类型具有此功能所需的所有操作。该代码使用内置的 pow
函数而不是说 gmpy.powmod
函数,因此不需要转换为 gmpy.mpz
并且作为 pow
函数 returns a long
代码变为:
def mypowmod(base, power, modulus):
result = pow(base, power, modulus)
return result
哪个更好写为:
mypowmod = pow
免责声明:我是 gmpy
和 gmpy2
的维护者。
Pythonlong类型是任意精度。转换 to/from 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
和 return 一个 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