为什么以浮点数表示的整数会与以整数形式提高相同数字产生不同的结果?
例如:
>>> pow(10,25)%195
10L
>>> pow(10,25.0)%195
64.0
我尝试使用mpmathpower()
,但得到的数字和错误与第二种形式完全相同。
如何在 Python 中提升到非常大的非整数幂并对其执行 mod(例如,使用纯数学执行类似 RSA 的逻辑所采取的步骤)?
为什么以浮点数表示的整数会与以整数形式提高相同数字产生不同的结果?
例如:
>>> pow(10,25)%195
10L
>>> pow(10,25.0)%195
64.0
我尝试使用mpmathpower()
,但得到的数字和错误与第二种形式完全相同。
如何在 Python 中提升到非常大的非整数幂并对其执行 mod(例如,使用纯数学执行类似 RSA 的逻辑所采取的步骤)?
对于整数,您可以使用 pow 的 3 参数形式:
pow(10, 25, 195)
您的问题源于浮点数的精度损失。你需要在decimal.Decimal
这里使用 s :
>>> from decimal import Decimal
>>> pow(10, Decimal('25.0')) % 195
Decimal('10')
要回答您的问题,因为 Python 中的浮点数是IEEE754 浮点数并且精度有限。
>>> int(10**25.0)
10000000000000000905969664L
如您所见,答案很接近但不正确。
如何在 Python 中提升到非常大的非整数幂并对其执行 mod(例如,使用纯数学执行类似 RSA 的逻辑所采取的步骤)?
这是我的建议使用x^(a+b) = x^a * x^b
:
def powmod_f(base, exponent, mod):
return (pow(base, int(exponent), mod) * (base ** (exponent % 1))) % mod
这仅适用于整数基数,但是,如果您的基数也是浮点数,您将不得不自己实现一个 powmod 算法。