平方根と無理数
「2乗するとxになる数」を図形の面積と数直線から理解する
- 1
- 平方根 √x とは「2乗すると x になる数」のことで、幾何学的には面積 x の正方形の1辺の長さに一致する
- 2
- 多くの平方根(√2, √3 など)は分数で表せない無理数であり、小数点以下が無限に続き循環もしない
- 3
- コンピュータのグラフィックス処理では、平方根の計算を高速に近似する「高速逆平方根」という有名なアルゴリズムが3Dゲームの黎明期に使われた
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
平方根 √x とは「2乗すると x になる数」のことで、幾何学的には面積 x の正方形の1辺の長さに一致する
身につく武器・思考力
多くの平方根(√2, √3 など)は分数で表せない無理数であり、小数点以下が無限に続き循環もしない
実社会・ITでの活躍現場
- •高速逆平方根(Fast Inverse Square Root)による3DCGの高速化
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
スライダーで面積 x を変えると、その面積を持つ正方形が描かれ、1辺の長さが √x になる様子を確認できる。あわせて数直線上に √x の位置がマークされ、どの整数とどの整数の間にあるかがひと目でわかる。
≤ 10 ≤ なので、 は 3 と 4 の間にあります (√10 ≈ 3.1623)。
√10 の値は、どの2つの整数の間にあるか?
Layer 2 — 定義・受験・証明
定義
正の数 に対して、2乗すると になる正の数を「 の正の平方根」といい、記号 で表す。
幾何学的には、 は面積が である正方形の1辺の長さに一致する。 などのように、整数の2乗になっていない数の平方根は、分数 ( は整数)の形で表すことができない「無理数」である。
公式・数理モデル
証明・導出
√2 が無理数であることの証明(背理法): 仮に が有理数であるとし、既約分数(これ以上約分できない分数)( は互いに素な整数)で表せると仮定する。
これより は偶数である。 が偶数ならば 自身も偶数でなければならない(奇数の2乗は奇数になるため)。よって ( は整数)とおける。 これを代入すると、
これより も偶数、したがって も偶数である。 しかし、 も も偶数ということは、両者は公約数2を持つことになり、「 は互いに素(既約)」という最初の仮定に矛盾する。 よって、 を既約分数で表すことはできず、 は無理数である。(同様の議論は など多くの平方根に対して成り立つ)
押さえておきたいポイント
- √x は「面積 x の正方形の1辺の長さ」という図形的な意味を持つ(三平方の定理 pythagoras とも密接に関係)
- 整数の平方根は、その整数が「平方数」(1, 4, 9, 16, 25, ...)でない限り、すべて無理数になる
- √a × √b = √(ab)、√a ÷ √b = √(a/b) という計算規則を使うと、根号の中を簡単な形に整理(根号の簡約化)できる
- 無理数は10進数で表すと小数点以下が無限に続き、かつ循環しない数として定義される(円周率 π も無理数の代表例)
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
高速逆平方根(Fast Inverse Square Root)による3DCGの高速化
3Dグラフィックスでは光の反射計算などのためにベクトルを正規化する際、1/√x の計算が大量に発生する。1990年代のゲーム「Quake III」では、通常の平方根計算より遥かに高速な近似アルゴリズム「高速逆平方根」が使われ、リアルタイム3D描画を可能にした伝説的な最適化技法として知られている。
1// 高速逆平方根 (Fast Inverse Square Root) の再現実装2// 元はQuake IIIのソースコードにあったC言語のマジックナンバーによる近似計算3function fastInverseSqrt(x: number): number {4 const buf = new ArrayBuffer(4);5 const f32 = new Float32Array(buf);6 const i32 = new Int32Array(buf);78 f32[0] = x;9 // ビット表現を整数として扱い、有名なマジックナンバーで初期近似値を作る10 i32[0] = 0x5f3759df - (i32[0] >> 1);1112 let y = f32[0];13 const xHalf = 0.5 * x;1415 // ニュートン法による反復で精度を1回だけ改善する(近似なので誤差はわずかに残る)16 y = y * (1.5 - xHalf * y * y);1718 return y; // 1/√x の近似値19}2021// 通常の1/Math.sqrt(x)と比較22const x = 25;23console.log("正確な 1/√25 =", 1 / Math.sqrt(x)); // 0.224console.log("高速近似 1/√25 ≈", fastInverseSqrt(x)); // ≈ 0.2 (わずかな誤差)2526// ベクトルの正規化 (3DCGでの典型的な利用例)27function normalize(v: { x: number; y: number; z: number }) {28 const lengthSq = v.x * v.x + v.y * v.y + v.z * v.z;29 const invLen = fastInverseSqrt(lengthSq); // 割り算・平方根を避けて高速化30 return { x: v.x * invLen, y: v.y * invLen, z: v.z * invLen };31}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元