pow()筹集浮动

时间:2013-09-21 16:02:15

标签: python math

为什么提升到表示为浮点数的整数会给出以整数形式提高相同数字的不同结果?

E.g:

>>> pow(10,25)%195
10L
>>> pow(10,25.0)%195
64.0

我尝试使用mpmath's power()代替,但获得完全相同的数字 - 和错误 - 作为第二种形式。

如何在Python中提升到非常大的非整数幂并对它们执行mod(例如,使用纯数学执行类似RSA的逻辑的步骤)?

2 个答案:

答案 0 :(得分:6)

对于整数,您可以使用pow的3参数形式:

pow(10, 25, 195)

这里的问题源于浮子的精度损失。您需要在此处使用decimal.Decimal

>>> from decimal import Decimal
>>> pow(10, Decimal('25.0')) % 195
Decimal('10')

答案 1 :(得分:4)

回答你的问题,因为Python中的浮点数是IEEE754 floats and have limited precision

>>> 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算法。