汎用的に方程式の解を求める方法として知られる「ニュートン法」。平方根を求める際も、関数 \(f(x) = x^2 – S\) を置いて、接線の方程式を微分 \(f'(x)\) で求めて……と説明が微積分から入りがちです。
しかし、その正体は紀元前から伝わる「バビロニア法(Babylonian method)」と完全に一致します。今回は、微積分を一切使わない、中学生レベルの代数(展開)だけで数式を導き出し手見ましょう。後でニュートン法との比較もやってみます。

1. バビロニア法で平方根を求める
1.1. 「正解」を「暫定値」と「誤差」に分解する
まず、私たちが求めたい値を \(\sqrt{X}\) とします。
このとき、現在の予測値(暫定値)を \(a\)、本当の答えとのズレ(微小な誤差)を \(b\) と置くと、本当の答えは次のように表せます。
\[\sqrt{X} = a + b\]
私たちのゴールは、この「正解とのズレ \(b\)」がどれくらいかを突き止めることです。
1.2. 両辺を2乗して展開する
ルートを外すために、両辺を2乗してみましょう。
\[X = (a + b)^2\]
\[X = a^2 + 2ab + b^2\]
ここで、現在の値 \(a^2\) と、求めたい目標値 \(X\) の関係が見えてきました。
1.3. 「小さなゴミ」を無視する
ここがバビロニア法(およびニュートン法)の最も面白いポイントです。
誤差 \(b\) が十分に小さいと仮定すると、その2乗である \(b^2\) はさらに極小な値になります。
例:誤差 \(b\) が \(0.01\) なら、\(b^2\) は \(0.0001\)。
プログラミングや実用的な計算において、この \(b^2\) は無視してゼロとみなしても大勢に影響はありません。そこで、式を近似(近似記号 \(\approx\))してしまいます。
\[X \approx a^2 + 2ab\]
1.4. 誤差 b について解き明かす
この式を、知りたかった「誤差 \(b\)」について解き直します。
\[2ab \approx X – a^2\]
\[b \approx \frac{X – a^2}{2a}\]
これで、「今の暫定値 \(a\) から、あとどれくらい修正すればいいか」という差分が求まりました。
1.5. 次の予測値を導き出す
本当の答えに近づくための「新しい予測値(\(a_{new}\))」は、先ほどの \(a + b\) です。
求めた \(b\) を代入して整理してみましょう。
\[a_{new} = a + \frac{X – a^2}{2a}\]
\[a_{new} = \frac{2a^2 + X – a^2}{2a}\]
\[a_{new} = \frac{a^2 + X}{2a}\]
最終的に、以下のシンプルな形にまとまります。
\[a_{new} = \frac{1}{2}\left(a + \frac{X}{a}\right)\]
1.6. 数学的な「平均」としてのバビロニア法
導き出された式\(a_{new} = \frac{1}{2}(a + \frac{X}{a})\) をよく見てください。
これは、「現在の値 \(a\)」と「目標値を \(a\) で割った値 \(\frac{X}{a}\)」の平均をとっているだけなのです。
- \(a\) が \(\sqrt{X}\) より大きければ、\(\frac{X}{a}\) は \(\sqrt{X}\) より小さくなる。
- その「真ん中」をとれば、より正解に近い値になる。
これを繰り返すだけで、精度が爆発的に高まっていく。これがバビロニア法の直感的な仕組みです。
2. 手計算で ルート2 を求めてみる
実際にこの式を使って、手計算で \(\sqrt{2}\)(\(X=2\))を求めてみましょう。最初の予測値を \(a=1.5\) とします。
- 1回目: \(\frac{1}{2}(1.5 + \frac{2}{1.5}) = \frac{1}{2}(1.5 + 1.333…) = 1.4166…\)
- 2回目: \(\frac{1}{2}(1.4166 + \frac{2}{1.4166}) = 1.414215…\)
わずか2回のステップで、私たちが知っている「ひとよひとよに……(1.4142135)」に極めて近い値に到達しました。
3. ニュートン法
一般的なニュートン法(ニュートン・ラフソン法)による導出も並べておきましょう。微積分を使う場合、以下のステップで進めます。
- 関数の定義: 平方根 \(\sqrt{X}\) を求めることは、関数 \(f(x) = x^2 – X\) が \(0\) になる地点を探すことと同じです。
- 微分: この関数を微分すると、接線の傾き \(f'(x) = 2x\) が得られます。
- 公式への代入: ニュートン法の一般公式 \(x_{new} = x – \frac{f(x)}{f'(x)}\) に当てはめます。
\[x_{new} = x – \frac{x^2 – X}{2x}\]
これを整理すると……
\[x_{new} = \frac{2x^2 – (x^2 – X)}{2x}\]
\[x_{new} = \frac{x^2 + X}{2x}\]
\[x_{new} = \frac{1}{2}\left(x + \frac{X}{x}\right)\]
このように、「微小な誤差を無視した代数的なアプローチ(バビロニア法)」と「関数の接線を追う微積分的なアプローチ(ニュートン法)」は、全く同じ結論に辿り着きます。
まとめ:プログラミングへの応用
微積分から導くニュートン法も、この代数的なバビロニア法も、最終的に辿り着く漸化式は同じです。
- 適当な初期値 \(a\) を決める。
- \(a_{new} = \frac{1}{2}(a + \frac{X}{a})\) で更新する。
- \(a\) と \(a_{new}\) の差が十分小さくなるまでループする。
一見難しそうなアルゴリズムも、「現在の値と誤差を平均して詰めていく作業」だと捉えると、案外シンプルで人間味のある手法であることが実感できるのではないでしょうか。
ちなみに、計算機の実装(特に浮動小数点数の逆数平方根など)においては、さらに高速な「高速逆二乗根(Fast Inverse Square Root)」のようなトリッキーな手法も存在します。調査してみると面白いですよ。関連記事のRustで作るTUI電卓の平方根編では、その辺の手法の速度比較なども行っているので、興味があれば見ていってください。
ここまで読んでいただきありがとうございます。
では、次の記事で。 lumenHero
関連記事
Rustで作るTUI電卓の平方根編 : 【Rustで作る電卓】平方根の深淵に挑む。標準関数 vs ニュートン法 + 魔法の数字 #12
【Rustで作る電卓】平方根の深淵に挑む。標準関数 vs ニュートン法 + 魔法の数字 #12
Rustで平方根(sqrt)を自作実装。ニュートン法から伝説の『高速逆平方根』ハックまで4つの手法を比較検証します。自作アルゴリズムが標準関数に勝てない物理的な理由とは?ソフトウェアの知恵がCPU回路(rsqrtss)へと昇華した、計算機の血統を辿るディープな検証記。
Rustで作るTUI電卓多乗根編 : [[article_id:XXX]]