独自の平方根関数を作成する
質問
整数の最も正確な平方根を求めるための独自の関数をどのように書けばよいのでしょうか?
ググってみたところ この (その オリジナル・リンク を参照)、第一に、完全に理解できなかったこと、第二に、これも近似値であることです。
平方根を最も近い整数(実際の根に)または浮動小数点数として仮定する。
どのように解決するのですか?
以下は、N > 0 に対して floor(sqrt(N)) を計算するものです。
x = 2^ceil(numbits(N)/2)
loop:
y = floor((x + floor(N/x))/2)
if y >= x
return x
x = y
これはCrandall & Pomerance, "Prime Numbersで示されたNewtonの方法のバージョンである。A Computational Perspective"で述べられているニュートンの方法のバージョンです。この方法を使うべき理由は、この方法が平方根の底に正確に収束することを、よく知っている人たちが証明しているからである。また、高速でもあります(さらに高速なアルゴリズムを構築することは可能ですが、それを正しく行うことははるかに複雑です)。適切に実装されたバイナリサーチは非常に小さな N に対してより高速になりますが、そこではルックアップテーブルを使用したほうがよいでしょう。
に丸めるには 最も近い 整数に丸めるには、上記のアルゴリズムで t = floor(sqrt(4N)) を計算すればよいのです。tの最下位ビットが設定されていれば、x = (t+1)/2を選択し、そうでなければt/2を選択します。余りが0でないかどうか(すなわち、t^2 == 4Nであるかどうか)を見ることによって、切り捨てる(または偶数に丸める)こともできます。
浮動小数点演算を使用する必要がないことに注意してください。実際、使うべきではありません。このアルゴリズムは完全に整数を使用して実装されるべきです(特に、floor()関数は、通常の整数の除算が使用されるべきであることを示すだけです)。
関連
-
[解決済み] ベルマンフォードとダイクストラの比較。どのような状況下でベルマンフォードが優れているか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み] 40 億の整数以外の整数を生成する。
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】関数f(f(n))を設計する == -n
-
[解決済み] 検索語句の上位10位を見つけるアルゴリズム
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クイックソートとヒープソートの比較
-
[解決済み] グラフにおいて最小容量が最大となる経路の探索
-
[解決済み] ビッグシータ記法の証明
-
[解決済み] 隣接リスト表現の時間複雑性?
-
[解決済み] 最小ボトルネックスパニングツリーと最小スパニングツリーはどう違うのですか?
-
[解決済み] 整数の絶対値の計算方法
-
[解決済み] ハッシュテーブルは本当にO(1)になるのか?
-
[解決済み] ブルームフィルターを使用するメリットは何ですか?
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[クローズド]
-
[解決済み] MapReduceのソートアルゴリズムはどのように動作するのですか?