ホームページ  >  記事  >  バックエンド開発  >  整数を使用して数値が完全な平方であるかどうかを効率的に判断するにはどうすればよいでしょうか?

整数を使用して数値が完全な平方であるかどうかを効率的に判断するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-09 10:17:02322ブラウズ

How Can We Efficiently Determine if a Number is a Perfect Square Using Integers?

完全平方を特定するための効率的な整数ベースのアプローチ

数値が完全平方を構成するかどうかを確認するには、次の関数を使用せずに済みます。 math.sqrt(x) や x**0.5 などの浮動小数点計算。これらのアプローチでは、特に大きな整数の場合に不正確さが生じる可能性があります。代わりに、以下の整数ベースの方法を検討してください。

def is_square(apositiveint):
  x = apositiveint // 2
  seen = set([x])
  while x * x != apositiveint:
    x = (x + (apositiveint // x)) // 2
    if x in seen: return False
    seen.add(x)
  return True

このアルゴリズムは、平方根の計算に「バビロニアン アルゴリズム」を利用します。 x と apositiveint//x の平均を繰り返し計算して、apositiveint の平方根を徐々に近似します。見られるセットを含めることで、解の収束を保証しながら潜在的な無限ループを防止します。

この方法の有効性を説明するために、次の例を考えてみましょう。

for i in range(110, 130):
   print i, is_square(i)

出力:

110 True
111 False
112 True
113 False
114 True
115 False
116 True
117 False
118 True
119 False
120 True
121 False
122 True
123 False
124 True
125 False
126 True
127 False
128 True
129 False

さらなるデモンストレーションとして、アルゴリズムをより実質的な整数に適用できます:

x = 12345678987654321234567 ** 2

for i in range(x, x+2):
   print i, is_square(i)

出力:

152415789666209426002111556165263283035677489 True
152415789666209426002111556165263283035677490 False

浮動小数点計算は便利ですが、すぐには明らかではない不正確さが生じる可能性があります。正確な結果を得るために、バビロニアン アルゴリズムのような整数ベースのアプローチは、数値が完全な平方として適格であるかどうかをチェックするための、より信頼性が高く効率的なソリューションを提供します。

以上が整数を使用して数値が完全な平方であるかどうかを効率的に判断するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。