誤り訂正符号とハミング符号の数学
宇宙探査機からQRコード、Wi-Fi、SSDまで — 壊れたビットを自己修復する数理マジック
- 1
- 通信ノイズで0と1が反転(ビット反転)しても、パリティビットを巧みに配置することで『どのビットが壊れたか』を特定し自動修復できる
- 2
- ハミング(7,4)符号は4ビットのデータに3ビットの冗長検査ビットを加え、1ビットの誤りを100%自動訂正する
- 3
- 数学的にはベクトル空間上の『ハミング距離』とパリティ検査行列 のシンドローム計算()で反転位置を一発検出する
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
NASAのボイジャー探査機が何百億キロ彼方の宇宙から鮮明な木星の写真を送ってこられるのも、汚れたQRコードがスマホで瞬時に読めるのも、すべて誤り訂正符号のおかげです。
身につく武器・思考力
有限体 $\mathbb{F}_2$ 上の線形代数の直感理解、デジタル通信の根幹プロトコルの把握、自己修復アルゴリズムの思考法
実社会・ITでの活躍現場
- •QRコードの汚れ・欠損耐性(リード・ソロモン符号で最大30%欠損しても読める)
- •サーバー用ECCメモリ(宇宙線によるビット反転エラーの自動訂正)
- •5G・Wi-Fi・地上波デジタル放送の伝送路符号化(LDPC符号・ポーラー符号)
- •宇宙深宇宙通信(NASAボイジャー探査機のゴーレイ符号)
Layer 1 — 直感・シミュレーター
4ビットの元データ(例: 1011)を入力すると、自動的に3つのパリティビットが付加されて7ビットの符号語が作られます。送られた7ビットのうち好きな1ビットをクリックして『ノイズ反転』させてみてください。シンドローム計算機が壊れた位置を即座に特定し、元のデータへと自己修復する様子を体験できます。
ハミング(7,4)符号:ビットを1つわざと壊してみよう!数学が瞬時に場所を特定して直します
4ビットのデータに3つの検査ビット(パリティ)を計算して付加。 受信側では連立方程式(シンドローム行列)を計算するだけで、どのビットが壊れたかが自動的に2進数として表示されます。
ハミング(7,4)符号において、受信した7ビットのシンドロームベクトルを2進数で読んだ結果が「(1, 0, 1)₂ = 5」であったとき、どのビットが壊れているか?
Layer 2 — 定義・受験・証明
定義
**ハミング(7,4)符号**とは、4ビットの情報ビット に対し、3ビットのパリティ検査ビット を付加して7ビットの符号語 を構成する線形符号である。
公式・数理モデル
証明・導出
**シンドローム計算による誤り特定原理**
パリティ検査行列 ()の各列は、1から7の整数の2進数表現になっている:
送信語 は を満たすように設計されている。 もし第 ビットに誤り(誤りベクトル )が生じて を受信した場合、シンドローム を計算すると:
の第 列はまさに整数 の2進数表現であるため、シンドローム を2進数として読むだけで、**何ビット目が壊れたかが直接表示される**のである!反転したビットを再度反転()させるだけで、完全なデータが復元される(Q.E.D.)。
押さえておきたいポイント
- 符号語同士の最小ハミング距離が であるため、1ビット誤り訂正・2ビット誤り検出が可能
- 冗長性(ビット数の増加)と信頼性のトレードオフを数理的に極限まで最適化した符号
- 現代のQRコードやCD/DVD/Blu-rayでは、より強力な『リード・ソロモン符号(Reed-Solomon)』が使われている
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
Pythonによるハミング(7,4)符号のエラー注入と自動訂正
通信ノイズシミュレーションとシンドローム復号のPython実装です。
1import numpy as np23# パリティ検査行列 H (3x7)4H = np.array([5 [0, 0, 0, 1, 1, 1, 1],6 [0, 1, 1, 0, 0, 1, 1],7 [1, 0, 1, 0, 1, 0, 1]8])910def decode_hamming(received_bits):11 """received_bits: 長さ7のリスト (0 or 1)"""12 r = np.array(received_bits)13 # シンドローム s = H * r^T mod 214 s = np.dot(H, r) % 21516 # 2進数ベクトルを整数に変換17 error_pos = s[0]*4 + s[1]*2 + s[2]*11819 if error_pos == 0:20 print("エラーなし!正常に受信しました。")21 else:22 print(f"第 {error_pos} ビットに誤りを検出!自己修復します。")23 r[error_pos - 1] = 1 - r[error_pos - 1] # ビット反転修復2425 return r
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元