【符号理論 vol.2】線形代数で解き明かす「誤り検出」の仕組み―部分空間と直交補空間


はじめに

こんにちは、TechBulkです。 前回の記事では、符号理論における生成行列 GG とパリティ検査行列 HH の関係について触れました。

今回は、大学の講義「符号理論」の第2回で扱われた内容をもとに、その背後にある線形代数の概念をさらに深掘りしていきます。 具体的には、**「線形独立」「部分空間」そして「直交補空間」**という数学用語が、どのようにして通信の誤りを検出するロジックにつながっているのかを整理します。

※今回の内容は、講義資料の誤り訂正に入る前(誤り検出)までの範囲です。

1. 準備:ベクトルの「線形独立」とは?

まず、基本となる「線形独立(1次独立)」の復習から始まりました。

nn 個のベクトル a1,a2,,an\boldsymbol{a}_1, \boldsymbol{a}_2, \dots, \boldsymbol{a}_n があるとき、以下の式(線形結合)を考えます。

0=λ1a1+λ2a2++λnan\boldsymbol{0} = \lambda_1 \boldsymbol{a}_1 + \lambda_2 \boldsymbol{a}_2 + \dots + \lambda_n \boldsymbol{a}_n

この式を満たす係数が、λ1=λ2==λn=0\lambda_1 = \lambda_2 = \dots = \lambda_n = 0 以外に存在しない場合、これらのベクトルは**「線形独立」**であるといいます。

直感的なイメージ

数式だと堅苦しいですが、イメージはシンプルです。

  • 2次元の場合: 2つのベクトルが「平行でない」なら線形独立。これらを使えば、平面上のあらゆる点を表現できます。
  • 3次元の場合: 2本のベクトルだけでは「平面」しか作れませんが、その平面上にない3本目のベクトルがあれば、3次元空間のあらゆる点を表現できます。

符号理論では、この「線形独立なベクトル」を組み合わせて、情報を表現する「空間」を作っていきます。

2. 「部分空間」という考え方

次に重要なのが**「部分空間」**です。

例えば、3次元空間(R3\mathbb{R}^3)の中に、2本の線形独立なベクトル a1,a2\boldsymbol{a}_1, \boldsymbol{a}_2 があるとします。この2本を使って作れるすべてのベクトル(線形結合)の集合を考えます。

b=λ1a1+λ2a2\boldsymbol{b} = \lambda_1 \boldsymbol{a}_1 + \lambda_2 \boldsymbol{a}_2

この集合は、3次元空間の中にある**「原点を通る平面」になります。これを、a1,a2\boldsymbol{a}_1, \boldsymbol{a}_2 が張る部分空間**と呼びます。

符号理論への接続

ここがポイントです。 私たちが送信したいデータ(符号語)は、適当なビット列ではありません。 「生成行列 GG の各行(基底ベクトル)によって張られる部分空間」に含まれるベクトルだけを、正しい符号語として扱います。

つまり、「正しいデータの世界」は、広大な全空間の中の、特定の「平面(部分空間)」の上にしか存在しないのです。

【補足】3次元ベクトルなのに「2次元」? 具体例でイメージする

符号理論を学んでいると、「3つの成分を持つベクトル(3次元)なのに、なぜ『2次元の部分空間』と呼ぶのか?」という点で少し混乱するかもしれません。

ここで、シンプルな例を使って、この**「自由度」と「空間」**の感覚を掴んでみましょう。

シンプルな生成行列で実験

例えば、以下のような生成行列 GG' を考えてみます。

G=(110011)G' = \begin{pmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \end{pmatrix}

2ビットのメッセージ w=[w1,w2]\boldsymbol{w} = [w_1, w_2] をこの行列に通すと、符号語 x\boldsymbol{x} は次のように計算されます。

x=[w1,w2](110011)=[w1, w1+w2, w2](mod 2)\boldsymbol{x} = [w_1, w_2] \begin{pmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \end{pmatrix} = [w_1, \ w_1+w_2, \ w_2] \quad (\text{mod } 2)

この計算結果を見ると、符号語 x\boldsymbol{x} はたしかに3つの数字が並んだ**「3次元ベクトル」**です。 しかし、この3つの数字は好き勝手に決まるわけではありません。

全パターンを書き出してみる

元のメッセージ(w1,w2w_1, w_2)の組み合わせは全部で4通りしかありません。それぞれどうなるか計算してみましょう。

メッセージ w\boldsymbol{w}計算プロセス [w1, w1+w2, w2][w_1, \ w_1+w_2, \ w_2]符号語 x\boldsymbol{x} (3次元)
[0,0][0, 0][0, 0+0, 0][0, \ 0+0, \ 0][0,0,0][0, 0, 0]
[0,1][0, 1][0, 0+1, 1][0, \ 0+1, \ 1][0,1,1][0, 1, 1]
[1,0][1, 0][1, 1+0, 0][1, \ 1+0, \ 0][1,1,0][1, 1, 0]
[1,1][1, 1][1, 1+1, 1][1, \ 1+1, \ 1][1,0,1][1, 0, 1]

「空間」としての意味

3次元空間(ビットの世界)には、本来 23=82^3 = 8 個の点([0,0,0][0,0,0] から [1,1,1][1,1,1] まで)が存在します。 しかし、この生成行列 GG' というルールを使って作れる「正しい符号語」は、表にあるたった4個だけです。

  • 見かけは3次元: 座標の成分は3つある。
  • 中身は2次元: 自由に決められる要素(自由度)は、元の w1,w2w_1, w_2 の2つだけ。

これは、広大な3次元空間の中に、「4つの点だけが乗っている薄い板(平面)」が浮いているようなイメージです。 この「薄い板」こそが、2次元の部分空間なのです。

誤り検出とは、受信したデータが「この板の上に乗っているか?(=正しい部分空間にいるか?)」を確認する作業と言い換えることができます。もし板から外れた位置にある点を受け取ったら、「あ、ノイズで板から落ちたな(誤りがある)」と気づけるわけです。

3. 「直交」と「直交補空間」

では、受信したデータが「正しい部分空間」にいるかどうかを、どうやって判定するのでしょうか? そこで登場するのが**「直交(Orthogonal)」**です。

2つのベクトル a,b\boldsymbol{a}, \boldsymbol{b} の内積が 0 になるとき、これらは直交しているといいます。

ab=0\boldsymbol{a} \cdot \boldsymbol{b} = 0

直交補空間 WW^{\perp}

ある部分空間 WW に含まれるすべてのベクトルと直交するようなベクトルを集めた集合を、直交補空間WW^{\perp})と呼びます。

イメージとしては、床(2次元部分空間)に対して垂直に立つ「柱」のようなものです。床の上のどんな矢印とも、柱の矢印は必ず直交(90度)しますよね。

4. mod 2 演算による誤り検出への応用

ここまでの数学知識を、デジタルの世界(0と1、mod 2演算)に適用します。

送信側のルール

送信側は、生成行列 GG を使って符号語を作ります。これは数学的には**「生成行列 GG が張る部分空間の中にデータを置く」**ことを意味します。

受信側のルール:パリティ検査行列 HH

受信側は、パリティ検査行列 HH を持っています。 実はこの HH は、GG が作る部分空間の「直交補空間」の基底になるように設計されているのです。

つまり、送信された正しい符号語 x\boldsymbol{x} と、検査行列 HH の各行(基底)は、必ず直交します。

HxT=0(mod 2)H \boldsymbol{x}^T = \boldsymbol{0} \quad (\text{mod } 2)

誤り検出のロジック

通信路でノイズが入り、受信データ y\boldsymbol{y} に誤りが混入したとします。すると、そのベクトルはもはや元の「正しい部分空間」からはみ出してしまいます。

受信側では、以下の計算(シンドローム ss の計算)を行います。

s=HyT\boldsymbol{s} = H \boldsymbol{y}^T

この計算は、**「受信データが、直交補空間の基底と直交しているか?」**をチェックしていることになります。

  1. s=0\boldsymbol{s} = \boldsymbol{0} の場合: 受信データは HH と直交している \rightarrow 正しい部分空間に存在する \rightarrow **「誤りなし」**と判断。
  2. s0\boldsymbol{s} \neq \boldsymbol{0} の場合: 受信データは HH と直交していない \rightarrow 正しい部分空間から外れている \rightarrow 「誤りあり(検出)」

5. まとめ:なぜ誤りが見つかるのか

今回の講義で、誤り検出ができる数学的条件がハッキリしました。

  • 送信側: データをある「部分空間」に閉じ込めて送る。
  • 受信側: データがその「部分空間」からはみ出していないかを、「直交補空間(検査行列 HH)」を使ってチェックする。

はみ出していれば内積が 0 にならず、アラート(シンドローム)が鳴る。これが誤り検出の正体でした。

この「部分空間」と「直交補空間」の関係を理解することで、単なる行列計算だった符号化・復号化のプロセスが、幾何学的なイメージとして捉えられるようになりました。

次回は、単に誤りを見つけるだけでなく、**「具体的にどのビットが間違っているのか(誤り訂正)」**を特定する仕組みについて、さらに掘り下げていきたいと思います。