問題
符号長7ビット,情報ビット数4ビットのハミング符号による誤り訂正の方法を,次のとおりとする。
受信した7ビットの符号語 $x_1 x_2 x_3 x_4 x_5 x_6 x_7$($x_k=0$ 又は $1$)に対して
$c_0 = x_1 + x_3 + x_5 + x_7$
$c_1 = x_2 + x_3 + x_6 + x_7$
$c_2 = x_4 + x_5 + x_6 + x_7$
(いずれも mod 2 での計算)
を計算し,$c_0, c_1, c_2$ の中に少なくとも一つは0でないものがある場合には,
$i = c_0 + c_1 \times 2 + c_2 \times 4$
を求めて,左から $i$ ビット目を反転することによって誤りを訂正する。
受信した符号語が1000101であった場合,誤り訂正後の符号語はどれか。ア:1000001 イ:1000101 ウ:1001101 エ:1010101
何を聞かれているのか
受信した符号語1000101の誤りを訂正した後の値が何かを聞かれている。
答え
正解は 「エ:1010101」 です。
一見すると複雑な数式に見えますが、これは単なる 「荷物の検品マニュアル」 です。
手順通りに計算(検品)していけば、誰でも確実に「間違っているビット」を見つけ出し、
修復することができます。
解説
まず、問題文にある「mod 2 での計算」とは、
足し算した結果、 「1の数が奇数なら1、偶数なら0」 にするというだけのシンプルなルールです。
届いた荷物(符号語)は 1000101 です。
これを左から順に $x_1$ から $x_7$ の箱に入れます。
- $x_1=1, x_2=0, x_3=0, x_4=0, x_5=1, x_6=0, x_7=1$
$x_n$に各ビットの値を当てはめているだけですね。
手順1:3つのチェック(検品)を実行する
問題文の数式通りに、指定された箱の中身(1か0)を足し合わせます。
(いずれも mod 2 での計算)
を計算し,$c_0, c_1, c_2$ の中に少なくとも一つは0でないものがある場合には,
つまり、mod 2の計算結果が「1(合計が奇数)」になったら「異常あり」と判断します。
-
チェック $c_0$ (1, 3, 5, 7番の箱)
- $1 + 0 + 1 + 1 = 3$
- 奇数なので、$c_0 = 1$ (異常あり!)
-
チェック $c_1$ (2, 3, 6, 7番の箱)
- $0 + 0 + 0 + 1 = 1$
- 奇数なので、$c_1 = 1$ (異常あり!)
-
チェック $c_2$ (4, 5, 6, 7番の箱)
- $0 + 1 + 0 + 1 = 2$
- 偶数なので、$c_2 = 0$ (異常なし)
手順2:犯人(誤り位置)を特定する
問題文の数式通りに、先ほど出した $c_0, c_1, c_2$ の結果を当てはめます。
$$ i = c_0 + c_1 \times 2 + c_2 \times 4 $$
$$ i = 1 + 1 \times 2 + 0 \times 4 $$
$$ i = 1 + 2 + 0 = 3 $$
誤りは 「左から3番目の箱」 だと特定できました!
手順3:誤りを訂正する
元の荷物は 1000101 でした。
左から3番目の箱には「0」が入っていましたが、これが間違い(エラー)になります。
なので、これを「1」に反転(訂正)させます。
- 訂正前: $10\mathbf{0}0101$
- 訂正後: $10\mathbf{1}0101$
したがって、正解は エ:1010101 となります!
まとめ:
通信の世界では、ノイズなどでデータの一部が壊れる(0と1が反転する)ことがよくあります。
ハミング符号は、送りたい純粋なデータ(情報ビット)に、エラーチェック用のオマケ(パリティビット)をくっつけて送ることで、 「受け取った側が自力でエラーを見つけて直せる」 という仕組みです。
