从 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

免责声明:我是 gmpygmpy2 的维护者。

Pythonlong类型是任意精度。转换 to/from longmpz 总是准确的。

由于 long 是任意精度,内置的 pow() 函数将计算出正确的结果,而无需使用 gmpygmpy2。但是,使用 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)

即使包括longmpz之间的转换,它仍然比使用内置的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