通常の平方根方法は、計算を行う前に、float値にパラメータを変換します。あなたが見たように、これは非常に大きな整数ではうまく動作しません。
したがって、任意の大きな整数で動作するように設計された関数を使用してください。正の整数の平方根の正しい整数部分を返すことが保証されています。この関数は、結果の小数部分を削除します。この関数は反復を使用するので、組み込みの平方根ルーチンよりも遅くなります。 Decimalモジュールはビルトインルーチンより大きな整数で動作しますが、値の精度はあらかじめ定義されている必要がありますので、任意の大きな値では機能しません。
import math
_1_50 = 1 << 50 # 2**50 == 1,125,899,906,842,624
def isqrt(x):
"""Return the integer part of the square root of x, even for very
large integer values."""
if x < 0:
raise ValueError('square root not defined for negative numbers')
if x < _1_50:
return int(math.sqrt(x)) # use math's sqrt() for small parameters
n = int(x)
if n <= 1:
return n # handle sqrt(0)==0, sqrt(1)==1
# Make a high initial estimate of the result (a little lower is slower!!!)
r = 1 << ((n.bit_length() + 1) >> 1)
while True:
newr = (r + n // r) >> 1 # next estimate by Newton-Raphson
if newr >= r:
return r
r = newr
「10^2000」または「10 ** 2000」を意味しますか? – RoadRunner