从MHZ转换为长时,我会失去精度吗?

时间:2015-02-15 06:27:18

标签: python gmpy

我写了以下模数指数。但是我不确定从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)

2 个答案:

答案 0 :(得分:2)

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

Python long类型是任意精度。转换为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并返回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

答案 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