整数の平方根が整数であるかどうかを判断する最速の方法は何ですか?
整数の平方根が整数であるかどうかを判断する最速の方法
問題の説明
Long 整数が完全な 2 乗であるかどうか (つまり、その平方根が別の整数であるかどうか) を判断する最速の方法:
- 組み込みの Math.sqrt() 関数を使用して実行しましたが、それを行う方法があるかどうか知りたいです整数フィールドを使用することで速度が向上します。
- ルックアップ テーブルを維持するのは非現実的です (平方が 263 未満である整数が約 231.5 あるため)。
これが私が現在行っている非常にシンプルで簡単な方法です:
{<br> if (n < 0)</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return false;
long tst = (long)(Math.sqrt(n) 0.5);
return tst*tst == n;
}
注: 私はこの関数を多くの Project Euler 問題で使用しています。したがって、今後このコードのメンテナンスは行われません。そして、問題によってはこの関数を何百万回も呼び出す必要があるのに対し、各アルゴリズムを完了するのに 1 分もかからないことが課題の一部であるため、この微細な最適化は実際に違いを生む可能性があります。
この問題に対してさまざまな解決策を試しました:
- 徹底的なテストの結果、少なくとも私のマシンでは Math.sqrt() の結果に 0.5 を加算する必要がないことがわかりました。
- 高速逆平方根は Math.sqrt() より高速ですが、n >= 410881 の場合は誤った結果が得られます。ただし、BobbyShaftoe が示唆したように、n
- Newton のメソッドは Math.sqrt() よりもはるかに遅いです。これはおそらく、Math.sqrt() が Newton のメソッドに似たものを使用しているためですが、ハードウェアで実装されているため、Java よりもはるかに高速であるためです。さらに、ニュートン法では依然として倍精度浮動小数点数を使用する必要があります。 正の 64 ビット符号付き整数)、Math.sqrt() よりも遅くなります。
- 二分探索はさらに遅くなります。二分探索では 64 ビット数値の平方根を見つけるのに平均 16 回のパスが必要なため、これは当然のことです。
- John のテストによると、C では or ステートメントを使用した方がスイッチを使用するより高速ですが、Java と C# では or とスイッチの間に違いはないようです。
- また、ルックアップ テーブル (64 個のブール値のプライベート静的配列として) を作成してみました。次に、switch or or ステートメントを使用する代わりに、 if(lookup[(int)(n&0x3F)]) { test } else return false; と言うだけですが、驚いたことに、これは (わずかに) 遅くなります。これは、Java で配列の境界がチェックされるためです。
以上が整数の平方根が整数であるかどうかを判断する最速の方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。
