5

浮動小数点数として表現された整数への累乗が、同じ数値を整数形式で累算するのと異なる結果になるのはなぜですか?

例えば:

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

代わりにmpmathpower()を使用してみましたが、2 番目の形式とまったく同じ数値とエラーが得られます。

Python で非常に大きな非整数ベキを累乗して mod を実行するにはどうすればよいですか (たとえば、純粋な数学を使用して RSA のようなロジックを実行するための手順)。

4

2 に答える 2

4

To answer your question, because floats in Python are IEEE754 floats and have limited precision.

>>> int(10**25.0)
10000000000000000905969664L

As you can see, the answer is close but incorrect.

How can I raise to very large non-integer powers and perform mod on them (e.g. steps taken to perform RSA-like logic using pure math) in Python?

This is my suggestion using x^(a+b) = x^a * x^b:

def powmod_f(base, exponent, mod):
    return (pow(base, int(exponent), mod) * (base ** (exponent % 1))) % mod

This only works with an integer base however, if your base is a float as well you're going to have to implement a powmod algorithm yourself.

于 2013-09-21T16:14:26.023 に答える