【符号理論 vol.3】誤り訂正の限界を決める「距離」の話―ハミング距離と最小距離


はじめに

こんにちは、TechBulkです。 これまで「符号理論」シリーズとして、生成行列・検査行列の正体(vol.1)や、部分空間による誤り検出(vol.2)についてまとめてきました。

これまでの知識で、「誤りがあるかどうか(検出)」や「どのビットが間違ったか(訂正)」の計算方法は分かりました。 しかし、ふとこんな疑問が湧きませんか?

「そもそも、この符号は何ビットの誤りまでなら直せるの?」

今回は、その「訂正能力の限界」を決める最も重要な概念である「ハミング距離」と、それが「パリティ検査行列 HH」とどう関係しているのかについて、講義で学んだ内容をアウトプットします。

1. 距離の定義:ハミング距離とハミング重み

まず、デジタルデータにおける「距離」を定義します。 我々が普段使うユークリッド距離(2点間の長さ)とは違い、ビットの世界では 「違いの数」を距離と呼びます。

ハミング距離 (Hamming Distance)

2つの同じ長さのベクトル x,y\boldsymbol{x}, \boldsymbol{y} があるとき、値が異なっているビットの個数を「ハミング距離」と呼び、dH(x,y)d_H(\boldsymbol{x}, \boldsymbol{y}) と書きます。

例を見てみましょう。

x=(1,0,0,1)y=(0,1,1,1)\begin{aligned} \boldsymbol{x} &= (1, 0, 0, 1) \\ \boldsymbol{y} &= (0, 1, 1, 1) \end{aligned}

この2つを比べると、

  • 1ビット目:101 \neq 0 (違う)
  • 2ビット目:010 \neq 1 (違う)
  • 3ビット目:010 \neq 1 (違う)
  • 4ビット目:1=11 = 1 (同じ)

異なる場所は3箇所なので、ハミング距離は dH(x,y)=3d_H(\boldsymbol{x}, \boldsymbol{y}) = 3 となります。

ハミング重み (Hamming Weight)

あるベクトル x\boldsymbol{x} の中で、「0ではない成分(つまり1)」の個数を「ハミング重み」と呼び、wH(x)w_H(\boldsymbol{x}) と書きます。

x=(0,1,1,1,0,1)\boldsymbol{x} = (0, 1, 1, 1, 0, 1)

この場合、1が4つあるので、ハミング重みは wH(x)=4w_H(\boldsymbol{x}) = 4 です。

線形符号における重要な性質

ここで、線形代数(vol.2)の知識が活きてきます。 デジタルの世界(GF(2))では、「引き算」と「足し算(XOR)」は同じ操作でした。 そのため、「2つのベクトルの距離」は「その差(和)のベクトルの重み」と等しくなります。

dH(x,y)=wH(xy)=wH(x+y)d_H(\boldsymbol{x}, \boldsymbol{y}) = w_H(\boldsymbol{x} - \boldsymbol{y}) = w_H(\boldsymbol{x} + \boldsymbol{y})

これは、「ある点から別の点への距離」を考えるときに、いちいち2点を比較しなくても、「原点からの距離(重み)」だけを見れば良いということを示唆しています。これが後で非常に効いてきます。

2. 最小距離 dmind_{min} という「防御力」

符号の中に含まれるすべての符号語(正しいデータ)のペアの中で、最も小さいハミング距離を 「最小ハミング距離(または単に最小距離)」と呼び、dmind_{min} と書きます。

dmin=minx,xC,xxdH(x,x)d_{min} = \min_{\boldsymbol{x}, \boldsymbol{x}' \in C, \boldsymbol{x} \neq \boldsymbol{x}'} d_H(\boldsymbol{x}, \boldsymbol{x}')

符号語は必ず「ゼロベクトル 0\boldsymbol{0}」を含みます(線形部分空間だから)。 先ほどの「距離=重み」の性質を使うと、結局のところ線形符号においては、以下のことが言えます。

最小距離 dmind_{min} を求めることは、その符号語の中で(0以外で)最も小さい「ハミング重み」を見つけることと同じである。

つまり、一番「スカスカ(1が少ない)」な符号語の「1の数」が、その符号システム全体の防御力(dmind_{min})になるのです。

3. パリティ検査行列 HHdmind_{min} の関係

さて、ここからが今回の講義のハイライトです。 実は、わざわざ全ての符号語を作って重みを数えなくても、パリティ検査行列 HH を見るだけで dmind_{min} が分かってしまうのです。

HH の列ベクトルと線形独立性

パリティ検査行列 HH を、列ベクトル h1,h2,,hn\boldsymbol{h}_1, \boldsymbol{h}_2, \dots, \boldsymbol{h}_n の集まりとして見ます。

H=(h1,h2,,hn)H = (\boldsymbol{h}_1, \boldsymbol{h}_2, \dots, \boldsymbol{h}_n)

符号理論には以下の美しい定理があります。

パリティ検査行列 HH の任意の d1d-1 個の列が「線形独立」ならば、その符号の最小距離は dmindd_{min} \ge d である。

逆に言うと、「HH の列をいくつか足し合わせてゼロベクトルを作れる(線形従属になる)最小の列の数」が、そのまま最小距離 dmind_{min} になります。

ハミング符号の例で確認

ハミング符号の検査行列 HH は以下のような形でした(列の順番は一例です)。

H=(101110001110100001111)H = \begin{pmatrix} 1 & 0 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{pmatrix}
  1. 1本選ぶ: HH には「全て0の列」はありません。\rightarrow 1本では線形従属にならない(dmin>1d_{min} > 1)。
  2. 2本選ぶ: HH のどの2本の列を見ても、同じものはありません。\rightarrow 2本足しても0にはならない(dmin>2d_{min} > 2)。
  3. 3本選ぶ: 例えば、1列目、2列目、3列目((1,0,0)T,(0,1,0)T,(1,1,0)T(1,0,0)^T, (0,1,0)^T, (1,1,0)^T)を足すと… (100)+(010)+(110)=(000)(mod 2)\begin{pmatrix} 1 \\ 0 \\ 0 \end{pmatrix} + \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix} + \begin{pmatrix} 1 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix} \quad (\text{mod } 2) ゼロになりました!

3本の列で線形従属を作れたので、この符号の最小距離は dmin=3d_{min} = 3 だと数学的に確定します。 行列を見るだけで符号の性能が分かるなんて、線形代数の力はすごいです。

4. なぜ dmin=3d_{min}=3 だと誤りを1つ訂正できるのか?

最後に、なぜ「最小距離が3」だと「1ビットの誤り」を直せるのか、直感的に説明します。

「符号語」という島

情報の海の中に、「正しい符号語」というがいくつか浮いていると想像してください。 dmin=3d_{min}=3 というのは、「どの島と島の間も、最低3ステップ(3ビット分)離れている」ということです。

誤り訂正のメカニズム

  1. 送信者が「島A」からデータを出航させます。
  2. 途中でノイズ(誤り)が 1ビット 発生しました。
  3. データは「島A」から1ステップ離れた場所に漂流します。

さて、受信者は漂流しているデータを見つけました。 この場所は、

  • 「島A」からは 1ステップ の距離です。
  • 隣の「島B」からは、最低でも 2ステップ31=23-1=2)離れています。

受信者は「一番近い島が元のデータだろう」と推測します(最尤復号)。 距離が3離れていれば、「半径1の範囲」は互いに干渉しません。だから、迷わず「島A」に戻す(訂正する)ことができるのです。

一般式

一般に、最小距離 dmind_{min} の符号が訂正できる誤りの数 tt は、以下の式で表されます。

t=dmin12t = \left\lfloor \frac{d_{min} - 1}{2} \right\rfloor

ハミング符号の場合、dmin=3d_{min}=3 なので、

t=(31)/2=1t = \lfloor (3-1)/2 \rfloor = 1

となり、1ビットの誤り訂正が可能であることが証明されます。

5. まとめ

今回の講義の要点は以下の3つです。

  1. データの「違い」はハミング距離、「1の数」はハミング重みで表される。
  2. 符号の性能(最小距離 dmind_{min})は、行列 HH の列の線形独立性で決まる。
  3. dmin=3d_{min}=3 のハミング符号は、符号語同士が適度に離れているため、1ビットの誤りを確実に訂正できる

「行列の列ベクトルが独立か従属か」という線形代数の純粋な数学の話が、「通信の信頼性」という物理的な性能に直結しているのが本当に面白い点だと感じました。

次回は、いよいよこれまでの知識を総動員して、具体的な計算演習か、あるいは「拡大体」などのより高度な代数構造の話に進むかもしれません。 引き続きアウトプットしていきます!