§D3.21線形符号と誤り訂正

最終更新

00と11の列を送るとき、途中で一部の成分が別の値に変わることがあります。受け取った側が、変わったかどうかを判定し、変わった位置を突き止めて元に戻すには、送る列にあらかじめ制約を入れておく必要があります。この記事では、その制約を「F2n\mathbb{F}_2^nの部分空間に属していること」として定め、部分空間の言葉だけから、いくつの誤りを直すことができるかを決めます。

前の記事「係数の範囲を取り替える」で、掃き出し法、基底の延長、次元定理が、係数を§D3.20 命題 1.2のF2\mathbb{F}_2に取り替えてもそのまま成り立つことを確かめました(§D3.20 命題 3.2)。本記事は、その結果を前提として用います。一方、内積と直交化はF2\mathbb{F}_2の上では働きませんので(§D3.20 例 4.4)、距離は内積から定めず、値が異なる成分の個数として直接定めます。

1 符号を部分空間として定める

はじめに、扱う対象を定めます。以下、ベクトルはすべて列ベクトルとして書きます。

定義 1.1 (線形符号).nnを正の整数とする。F2n\mathbb{F}_2^nの部分空間CCを、長さnnの線形符号という。CCの要素を符号語という。dim⁡C=k\dim C = kであるとき、CCを[n,k][n, k]符号という。

F2n\mathbb{F}_2^nの標準基底e⃗1,…,e⃗n\vec e_1, \dots, \vec e_nは一次独立な生成系ですのでdim⁡F2n=n\dim \mathbb{F}_2^n = nであり、§D3.8 命題 3.5より0≤k≤n0 \le k \le nです。符号語は2k2^k個あります。実際、基底b⃗1,…,b⃗k\vec b_1, \dots, \vec b_kを取ると、§D3.8 命題 2.3より各符号語は∑icib⃗i\sum_i c_i \vec b_iの形にただ一通りに書くことができ、各cic_iの取り方がF2\mathbb{F}_2の22通りだからです。

同じ部分空間を、二つの行列によって表すことができます。一方は像として、他方は核として表します。

定義 1.2 (生成行列と検査行列).CCを長さnnの[n,k][n,k]符号とする。

  • n×kn \times k行列GGがCCの生成行列であるとは、Im⁡G=C\operatorname{Im} G = Cが成り立つことをいう。
  • (n−k)×n(n-k) \times n行列HHがCCの検査行列であるとは、Ker⁡H=C\operatorname{Ker} H = Cが成り立つことをいう。

定理 1.3 (生成行列と検査行列は同じ符号を表す).CCを長さnnの[n,k][n,k]符号とする。

  1. CCの基底b⃗1,…,b⃗k\vec b_1, \dots, \vec b_kを列に並べたn×kn\times k行列GGはCCの生成行列であり、Ker⁡G={0⃗}\operatorname{Ker} G = \{\vec 0\}を満たす。
  2. CCの検査行列HHが存在し、Im⁡H=F2n−k\operatorname{Im} H = \mathbb{F}_2^{n-k}を満たす。
  3. HHをCCの検査行列とすると、x⃗∈F2n\vec x \in \mathbb{F}_2^nが符号語であることとHx⃗=0⃗H\vec x = \vec 0が成り立つことは同値である。

証明. 1について。Gc⃗=∑icib⃗iG\vec c = \sum_{i} c_i \vec b_iであるから、Im⁡G\operatorname{Im}Gはb⃗1,…,b⃗k\vec b_1, \dots, \vec b_kが張る空間、すなわちCCである。またGc⃗=0⃗G\vec c = \vec 0は∑icib⃗i=0⃗\sum_i c_i\vec b_i = \vec 0であり、基底の一次独立性からc⃗=0⃗\vec c = \vec 0である。

2について。CCの基底b⃗1,…,b⃗k\vec b_1, \dots, \vec b_kを取り、§D3.11 補題 1.2によりF2n\mathbb{F}_2^nの基底b⃗1,…,b⃗n\vec b_1, \dots, \vec b_nへ延長する。この補題は§D3.20 命題 3.2の3によりF2\mathbb{F}_2の上でも成り立つ。§D3.8 命題 2.3より、各x⃗∈F2n\vec x \in \mathbb{F}_2^nはx⃗=∑i=1nci(x⃗) b⃗i\vec x = \sum_{i=1}^{n} c_i(\vec x)\,\vec b_iとただ一通りに書くことができる。写像

π:F2n→F2n−k,π(x⃗)=(ck+1(x⃗),…,cn(x⃗))⊤\pi : \mathbb{F}_2^n \to \mathbb{F}_2^{n-k}, \qquad \pi(\vec x) = \bigl(c_{k+1}(\vec x), \dots, c_n(\vec x)\bigr)^{\top}

を定める。x⃗+y⃗\vec x + \vec yとax⃗a\vec xの座標は、表し方の一意性からci(x⃗)+ci(y⃗)c_i(\vec x) + c_i(\vec y)とa ci(x⃗)a\,c_i(\vec x)に等しいので、π\piは線形写像である。π(b⃗k+j)\pi(\vec b_{k+j})はF2n−k\mathbb{F}_2^{n-k}の第jj標準基底ベクトルであるからπ\piは全射である。またπ(x⃗)=0⃗\pi(\vec x) = \vec 0はx⃗=∑i≤kci(x⃗)b⃗i\vec x = \sum_{i\le k}c_i(\vec x)\vec b_iと同値であり、これはx⃗∈C\vec x \in Cと同値であるからKer⁡π=C\operatorname{Ker}\pi = Cである。HHを、F2n\mathbb{F}_2^nとF2n−k\mathbb{F}_2^{n-k}の標準基底に関するπ\piの表現行列(§D3.9 定理 2.2)とすると、すべてのx⃗\vec xについてHx⃗=π(x⃗)H\vec x = \pi(\vec x)であるから、Ker⁡H=C\operatorname{Ker}H = CかつIm⁡H=F2n−k\operatorname{Im}H = \mathbb{F}_2^{n-k}である。HHは(n−k)×n(n-k)\times n行列である。

3について。検査行列の定義そのものである。▨

3は、受け取った列が符号語であるかどうかを、HHを掛けるだけで判定することができることを述べています。この判定は、あとで誤りの位置を求めるためにも使います。行列の大きさは、GGがn×kn \times k、HHが(n−k)×n(n-k)\times nであり、次元定理と整合します。実際、§D3.11 定理 2.1をHHについて適用するとdim⁡Ker⁡H=n−dim⁡Im⁡H=n−(n−k)=k\dim\operatorname{Ker}H = n - \dim\operatorname{Im}H = n - (n-k) = kとなり、dim⁡C=k\dim C = kと一致します。

例 1.4 (偶数個の 1 だけを送る符号).n≥2n \ge 2とし、H=(1 1 ⋯ 1)H = (1\ 1\ \cdots\ 1)を1×n1\times n行列とします。C=Ker⁡HC = \operatorname{Ker}Hはx1+x2+⋯+xn=0x_1 + x_2 + \cdots + x_n = 0を満たすベクトルの全体、すなわち成分に11が偶数個だけ現れるベクトルの全体です。Im⁡H=F2\operatorname{Im}H = \mathbb{F}_2ですので§D3.11 定理 2.1よりdim⁡C=n−1\dim C = n - 1であり、CCは[n,n−1][n, n-1]符号です。n=3n = 3の場合、符号語は(0,0,0)⊤(0,0,0)^{\top}、(1,1,0)⊤(1,1,0)^{\top}、(1,0,1)⊤(1,0,1)^{\top}、(0,1,1)⊤(0,1,1)^{\top}の4=224 = 2^{2}個です。

2 ハミング距離と、訂正することのできる誤りの個数

誤りの個数を測る量を定めます。§D3.20 例 4.4のとおりF2\mathbb{F}_2の上には内積が入りませんので、値が異なる成分の個数を直接数えます。

定義 2.1 (ハミング距離・重み・最小距離).x⃗,y⃗∈F2n\vec x, \vec y \in \mathbb{F}_2^nに対し、xi≠yix_i \ne y_iを満たす添字iiの個数をd(x⃗,y⃗)d(\vec x, \vec y)と書き、x⃗\vec xとy⃗\vec yのハミング距離という。w(x⃗)=d(x⃗,0⃗)w(\vec x) = d(\vec x, \vec 0)、すなわちx⃗\vec xの00でない成分の個数をx⃗\vec xの重みという。

CCを線形符号とし、CCの要素が二つ以上あるとする。相異なる二つの符号語の距離の最小値

d(C)=min⁡{d(c⃗,c⃗′):c⃗,c⃗′∈C, c⃗≠c⃗′}d(C) = \min\{d(\vec c, \vec c') : \vec c, \vec c' \in C,\ \vec c \ne \vec c'\}

をCCの最小距離という。

命題 2.2 (ハミング距離は距離の条件を満たす). すべてのx⃗,y⃗,z⃗∈F2n\vec x, \vec y, \vec z \in \mathbb{F}_2^nについて次が成り立つ。

  1. d(x⃗,y⃗)≥0d(\vec x, \vec y) \ge 0であり、d(x⃗,y⃗)=0d(\vec x, \vec y) = 0となるのはx⃗=y⃗\vec x = \vec yのときに限る。
  2. d(x⃗,y⃗)=d(y⃗,x⃗)d(\vec x, \vec y) = d(\vec y, \vec x)である。
  3. d(x⃗,z⃗)≤d(x⃗,y⃗)+d(y⃗,z⃗)d(\vec x, \vec z) \le d(\vec x, \vec y) + d(\vec y, \vec z)である。
  4. d(x⃗,y⃗)=w(x⃗−y⃗)d(\vec x, \vec y) = w(\vec x - \vec y)である。

証明. 1と2は、個数が00以上であることと、xi≠yix_i \ne y_iという条件がx⃗\vec xとy⃗\vec yについて対称であることによる。

3を示す。xi≠zix_i \ne z_iを満たす添字iiを取る。xi=yix_i = y_iかつyi=ziy_i = z_iとするとxi=zix_i = z_iとなって矛盾するから、xi≠yix_i \ne y_iまたはyi≠ziy_i \ne z_iである。したがって、xi≠zix_i \ne z_iを満たす添字の集合は、xi≠yix_i \ne y_iを満たす添字の集合とyi≠ziy_i \ne z_iを満たす添字の集合の和集合に含まれる。集合の要素の個数を比べて3を得る。

4を示す。F2\mathbb{F}_2ではxi≠yix_i \ne y_iとxi−yi≠0x_i - y_i \ne 0が同値であるから、両辺は同じ添字の個数を数えている。▨

符号が部分空間であることを使うと、最小距離を求める作業が、2k(2k−1)/22^k(2^k-1)/2組の比較から、2k−12^k - 1個の符号語の重みを見る作業へ変わります。

命題 2.3 (最小距離は 0 でない符号語の重みの最小値である).CCを線形符号とし、CCの要素が二つ以上あるとする。このとき

d(C)=min⁡{w(c⃗):c⃗∈C, c⃗≠0⃗}d(C) = \min\{w(\vec c) : \vec c \in C,\ \vec c \ne \vec 0\}

が成り立つ。

証明. 右辺をμ\muと書く。CCには0⃗\vec 0でない要素があるからμ\muは定まる。

d(C)≤μd(C) \le \muを示す。w(c⃗)=μw(\vec c) = \muを満たすc⃗∈C\vec c \in C、c⃗≠0⃗\vec c \ne \vec 0を取ると、命題 2.2の4によりd(c⃗,0⃗)=w(c⃗)=μd(\vec c, \vec 0) = w(\vec c) = \muであり、0⃗∈C\vec 0 \in C、c⃗≠0⃗\vec c \ne \vec 0であるからd(C)≤μd(C) \le \muである。

μ≤d(C)\mu \le d(C)を示す。d(c⃗,c⃗′)=d(C)d(\vec c, \vec c') = d(C)を満たす相異なる符号語c⃗,c⃗′\vec c, \vec c'を取る。CCは部分空間であるからc⃗−c⃗′∈C\vec c - \vec c' \in Cであり、c⃗≠c⃗′\vec c \ne \vec c'よりc⃗−c⃗′≠0⃗\vec c - \vec c' \ne \vec 0である。命題 2.2の4によりw(c⃗−c⃗′)=d(c⃗,c⃗′)=d(C)w(\vec c - \vec c') = d(\vec c, \vec c') = d(C)であるからμ≤d(C)\mu \le d(C)である。▨

次に、受け取った列を符号語へ直す操作と、その操作が正しく働く範囲を定めます。ここで、誤りを訂正することと検出することを分けて定義します。両者は要求が異なり、必要な最小距離も異なります。

定義 2.4 (最近符号語による復号、訂正と検出).CCを線形符号とし、CCの要素が二つ以上あるとする。y⃗∈F2n\vec y \in \mathbb{F}_2^nに対し、d(y⃗,c⃗)d(\vec y, \vec c)を最小にする符号語c⃗∈C\vec c \in Cを、y⃗\vec yの最近符号語という。ttとssを正の整数とする。

  • CCがtt個以下の誤りを訂正することができるとは、すべての符号語c⃗∈C\vec c \in Cと、w(e⃗)≤tw(\vec e) \le tを満たすすべてのe⃗∈F2n\vec e \in \mathbb{F}_2^nについて、c⃗+e⃗\vec c + \vec eの最近符号語がc⃗\vec cただ一つであることをいう。
  • CCがss個以下の誤りを検出することができるとは、すべての符号語c⃗∈C\vec c \in Cと、1≤w(e⃗)≤s1 \le w(\vec e) \le sを満たすすべてのe⃗∈F2n\vec e \in \mathbb{F}_2^nについてc⃗+e⃗∉C\vec c + \vec e \notin Cであることをいう。

定理 2.5 (最小距離が訂正と検出の能力を決める).CCを線形符号、δ=d(C)\delta = d(C)とし、CCの要素は二つ以上あるとする。ttとssを正の整数とする。

  1. CCがtt個以下の誤りを訂正することができることと、δ≥2t+1\delta \ge 2t + 1であることは同値である。
  2. CCがss個以下の誤りを検出することができることと、δ≥s+1\delta \ge s + 1であることは同値である。

証明. 1の十分性を示す。δ≥2t+1\delta \ge 2t+1とする。c⃗∈C\vec c \in C、w(e⃗)≤tw(\vec e) \le tとしy⃗=c⃗+e⃗\vec y = \vec c + \vec eとおく。命題 2.2の4によりd(y⃗,c⃗)=w(e⃗)≤td(\vec y, \vec c) = w(\vec e) \le tである。c⃗′∈C\vec c' \in C、c⃗′≠c⃗\vec c' \ne \vec cとすると、同命題の3により

δ≤d(c⃗,c⃗′)≤d(c⃗,y⃗)+d(y⃗,c⃗′)\delta \le d(\vec c, \vec c') \le d(\vec c, \vec y) + d(\vec y, \vec c')

であるからd(y⃗,c⃗′)≥δ−t≥(2t+1)−t=t+1>t≥d(y⃗,c⃗)d(\vec y, \vec c') \ge \delta - t \ge (2t+1) - t = t+1 > t \ge d(\vec y, \vec c)である。よってc⃗\vec cはy⃗\vec yの最近符号語であり、他のどの符号語もy⃗\vec yとの距離が真に大きいから、最近符号語はc⃗\vec cただ一つである。

1の必要性を、対偶によって示す。δ≤2t\delta \le 2tとする。d(c⃗1,c⃗2)=δd(\vec c_1, \vec c_2) = \deltaを満たす相異なる符号語c⃗1,c⃗2\vec c_1, \vec c_2を取り、SSをc⃗1\vec c_1とc⃗2\vec c_2の成分が異なる添字の集合とする。∣S∣=δ|S| = \deltaである。δ≤2t\delta \le 2tとttが整数であることから⌈δ/2⌉≤t\lceil \delta/2\rceil \le tである。SSの部分集合TTで∣T∣=⌈δ/2⌉|T| = \lceil \delta/2\rceilを満たすものを一つ取り、y⃗\vec yを、TTに属する添字ではc⃗2\vec c_2の成分に等しく、それ以外の添字ではc⃗1\vec c_1の成分に等しいベクトルとする。このとき

d(y⃗,c⃗1)=∣T∣=⌈δ/2⌉,d(y⃗,c⃗2)=∣S∣−∣T∣=δ−⌈δ/2⌉=⌊δ/2⌋d(\vec y, \vec c_1) = |T| = \lceil \delta/2\rceil, \qquad d(\vec y, \vec c_2) = |S| - |T| = \delta - \lceil \delta/2\rceil = \lfloor \delta/2 \rfloor

である。e⃗=y⃗−c⃗1\vec e = \vec y - \vec c_1とおくとw(e⃗)=⌈δ/2⌉≤tw(\vec e) = \lceil\delta/2\rceil \le tであり、y⃗=c⃗1+e⃗\vec y = \vec c_1 + \vec eである。ところがd(y⃗,c⃗2)=⌊δ/2⌋≤⌈δ/2⌉=d(y⃗,c⃗1)d(\vec y, \vec c_2) = \lfloor\delta/2\rfloor \le \lceil\delta/2\rceil = d(\vec y, \vec c_1)であり、c⃗2≠c⃗1\vec c_2 \ne \vec c_1であるから、y⃗\vec yの最近符号語はc⃗1\vec c_1ただ一つではない。よってCCはtt個以下の誤りを訂正することができない。

2の十分性を示す。δ≥s+1\delta \ge s+1とする。c⃗∈C\vec c \in C、1≤w(e⃗)≤s1 \le w(\vec e) \le sとし、c⃗+e⃗∈C\vec c + \vec e \in Cと仮定する。CCは部分空間であるからe⃗=(c⃗+e⃗)−c⃗∈C\vec e = (\vec c + \vec e) - \vec c \in Cであり、w(e⃗)≥1w(\vec e) \ge 1よりe⃗≠0⃗\vec e \ne \vec 0である。命題 2.3によりw(e⃗)≥δ≥s+1w(\vec e) \ge \delta \ge s+1となり、w(e⃗)≤sw(\vec e) \le sに矛盾する。よってc⃗+e⃗∉C\vec c + \vec e \notin Cである。

2の必要性を、対偶によって示す。δ≤s\delta \le sとする。命題 2.3によりw(e⃗)=δw(\vec e) = \deltaを満たすe⃗∈C\vec e \in C、e⃗≠0⃗\vec e \ne \vec 0が存在する。c⃗=0⃗∈C\vec c = \vec 0 \in Cとすると1≤w(e⃗)=δ≤s1 \le w(\vec e) = \delta \le sであり、c⃗+e⃗=e⃗∈C\vec c + \vec e = \vec e \in Cであるから、CCはss個以下の誤りを検出することができない。▨

注意 2.6 (訂正と検出を取り違えない).定理 2.5の1と2で、最小距離に要求される値が異なる。同じ最小距離δ\deltaに対して、訂正することのできる誤りの個数は⌊(δ−1)/2⌋\lfloor (\delta-1)/2 \rfloor個までであり、検出することのできる誤りの個数はδ−1\delta - 1個までである。たとえばδ=4\delta = 4の符号は、11個の誤りを訂正することができ、33個までの誤りを検出することができる。この二つは同時に主張してよいものではない。受け取った列に対して最近符号語へ直す操作を行うか、符号語であるかどうかの判定だけを行うかは、あらかじめ決めておく必要がある。訂正する操作を選んだ場合、実際に起きた誤りがtt個を超えると、定義 2.4の保証は働かず、別の符号語へ直してしまうことがある。

検査行列を使うと、最小距離を符号語の列挙なしに判定することができます。

命題 2.7 (最小距離を検査行列の列から判定する).CCを長さnnの線形符号、HHをその検査行列とし、HHの第jj列をh⃗j\vec h_jと書く。CCの要素は二つ以上あるとする。δ\deltaを2≤δ≤n2 \le \delta \le nを満たす整数とするとき、d(C)≥δd(C) \ge \deltaであることと、HHの相異なるδ−1\delta - 1本の列がどのように選んでも一次独立であることは同値である。

証明.x⃗∈F2n\vec x \in \mathbb{F}_2^nに対し、xj=1x_j = 1を満たす添字jjの集合をS(x⃗)S(\vec x)と書くと、F2\mathbb{F}_2の成分は00か11であるからHx⃗=∑j∈S(x⃗)h⃗jH\vec x = \sum_{j \in S(\vec x)} \vec h_jである。したがって、重みがwwである00でない符号語が存在することと、HHの相異なるww本の列で和が0⃗\vec 0になるものが存在することは同値である。

また、F2\mathbb{F}_2の上では、相異なる列の組h⃗j1,…,h⃗jm\vec h_{j_1}, \dots, \vec h_{j_m}が一次従属であることと、その中の空でない部分の和が0⃗\vec 0になることは同値である。実際、一次関係∑icih⃗ji=0⃗\sum_{i} c_i \vec h_{j_i} = \vec 0で係数がすべて00ではないものを取ると、各cic_iは00か11であるから、ci=1c_i = 1となる添字だけを集めた空でない部分の和が0⃗\vec 0になる。逆も同様である。

以上より、d(C)≤δ−1d(C) \le \delta - 1であること、すなわち命題 2.3により重みがδ−1\delta - 1以下の00でない符号語が存在することは、HHの相異なるδ−1\delta-1本以下の列で一次従属になるものが存在することと同値である。δ−1\delta - 1本より少ない本数の従属な組は、列を付け加えても従属のままであり、HHの列はn≥δ−1n \ge \delta - 1本あるから、これは「HHの相異なるδ−1\delta-1本の列で一次従属になるものが存在する」ことと同値である。対偶を取れば主張を得る。▨

3 ハミング符号

命題 2.7は、最小距離が33以上であることと、HHのどの22本の列も一次独立であることが同値であると述べています。F2\mathbb{F}_2の上で22本のベクトルが一次独立であることは、どちらも0⃗\vec 0でなく、かつ互いに異なることと同じです。そこで、条件を満たす列をできるだけ多く並べた行列を検査行列に取ります。

定義 3.1 (ハミング符号).r≥2r \ge 2を整数とし、n=2r−1n = 2^r - 1とおく。F2r\mathbb{F}_2^rの0⃗\vec 0でないベクトルは2r−1=n2^r - 1 = n個ある。j=1,2,…,nj = 1, 2, \dots, nに対し、h⃗j∈F2r\vec h_j \in \mathbb{F}_2^rを、jjを22進法で表したときの各位の値を上から順に並べたベクトルとし、HHをh⃗1,…,h⃗n\vec h_1, \dots, \vec h_nを列に並べたr×nr \times n行列とする。Cr=Ker⁡HC_r = \operatorname{Ker}Hをハミング符号という。

jjが11から2r−12^r-1までを動くとき、jjの22進表示はF2r\mathbb{F}_2^rの0⃗\vec 0でないベクトルをちょうど一度ずつ与えますので、HHの列は互いに異なり、どれも0⃗\vec 0ではありません。

定理 3.2 (ハミング符号の次元と最小距離).r≥2r \ge 2、n=2r−1n = 2^r-1とし、CrC_rを定義 3.1のハミング符号とする。

  1. dim⁡Cr=n−r=2r−1−r\dim C_r = n - r = 2^r - 1 - rである。すなわちCrC_rは[2r−1, 2r−1−r][2^r-1,\ 2^r-1-r]符号である。
  2. d(Cr)=3d(C_r) = 3である。
  3. CrC_rは11個以下の誤りを訂正することができ、22個以下の誤りを検出することができる。

証明. 1について。F2r\mathbb{F}_2^rの標準基底ベクトルはいずれも0⃗\vec 0でないから、HHの列として現れる。したがってIm⁡H\operatorname{Im}HはF2r\mathbb{F}_2^rの標準基底を含む部分空間であり、Im⁡H=F2r\operatorname{Im}H = \mathbb{F}_2^r、dim⁡Im⁡H=r\dim \operatorname{Im}H = rである。§D3.11 定理 2.1よりdim⁡Cr=dim⁡Ker⁡H=n−r\dim C_r = \dim\operatorname{Ker}H = n - rである。r≥2r \ge 2のときn−r=2r−1−r≥1n - r = 2^r-1-r \ge 1であるから、CrC_rには0⃗\vec 0でない符号語があり、最小距離が定まる。

2について。まずd(Cr)≥3d(C_r) \ge 3を示す。HHの相異なる22本の列h⃗i,h⃗j\vec h_i, \vec h_j(i≠ji \ne j)を取る。c1h⃗i+c2h⃗j=0⃗c_1\vec h_i + c_2\vec h_j = \vec 0とする。c1=1c_1 = 1、c2=0c_2 = 0とするとh⃗i=0⃗\vec h_i = \vec 0となって矛盾し、c1=0c_1 = 0、c2=1c_2 = 1の場合も同様である。c1=c2=1c_1 = c_2 = 1とするとh⃗i=−h⃗j=h⃗j\vec h_i = -\vec h_j = \vec h_jとなり、列が互いに異なることに反する。よってc1=c2=0c_1 = c_2 = 0であり、22本の列は一次独立である。命題 2.7をδ=3\delta = 3として適用するとd(Cr)≥3d(C_r) \ge 3を得る。

次にd(Cr)≤3d(C_r) \le 3を示す。r≥2r \ge 2であるから、F2r\mathbb{F}_2^rには相異なる0⃗\vec 0でないベクトルu⃗,v⃗\vec u, \vec vが存在する。u⃗+v⃗=0⃗\vec u + \vec v = \vec 0とするとu⃗=v⃗\vec u = \vec vとなって矛盾するからu⃗+v⃗≠0⃗\vec u + \vec v \ne \vec 0であり、u⃗+v⃗\vec u + \vec vもHHの列として現れる。u⃗+v⃗=u⃗\vec u + \vec v = \vec uとするとv⃗=0⃗\vec v = \vec 0となって矛盾し、u⃗+v⃗=v⃗\vec u + \vec v = \vec vの場合も同様であるから、u⃗\vec u、v⃗\vec v、u⃗+v⃗\vec u+\vec vは互いに異なる33本の列である。これらの和はu⃗+v⃗+(u⃗+v⃗)=0⃗\vec u + \vec v + (\vec u+\vec v) = \vec 0である。この33本に対応する添字だけが11であるベクトルx⃗\vec xを取ると、Hx⃗=0⃗H\vec x = \vec 0であるからx⃗∈Cr\vec x \in C_rであり、w(x⃗)=3w(\vec x) = 3である。命題 2.3よりd(Cr)≤3d(C_r) \le 3である。以上よりd(Cr)=3d(C_r) = 3である。

3について。d(Cr)=3=2⋅1+1d(C_r) = 3 = 2\cdot 1 + 1であるから定理 2.5の1により11個以下の誤りを訂正することができ、3=2+13 = 2 + 1であるから同定理の2により22個以下の誤りを検出することができる。▨

訂正することができるだけでなく、誤りの位置を求める手順が、検査行列の列の並べ方から直ちに得られます。

命題 3.3 (誤りの位置は H との積から定まる).CrC_rを定義 3.1のハミング符号、HHをその検査行列とする。c⃗∈Cr\vec c \in C_r、w(e⃗)≤1w(\vec e) \le 1とし、y⃗=c⃗+e⃗\vec y = \vec c + \vec eとおく。

  1. Hy⃗=0⃗H\vec y = \vec 0ならばe⃗=0⃗\vec e = \vec 0であり、y⃗=c⃗\vec y = \vec cである。
  2. Hy⃗≠0⃗H\vec y \ne \vec 0ならば、Hy⃗H\vec yを22進表示と読んで得られる整数をjjとするとき、1≤j≤n1 \le j \le nであり、e⃗=e⃗j\vec e = \vec e_j(第jj標準基底ベクトル)である。したがってy⃗\vec yの第jj成分を反対の値に変えるとc⃗\vec cが得られる。

証明.Hc⃗=0⃗H\vec c = \vec 0であるからHy⃗=He⃗H\vec y = H\vec eである。w(e⃗)≤1w(\vec e) \le 1であるから、e⃗=0⃗\vec e = \vec 0であるか、あるjjについてe⃗=e⃗j\vec e = \vec e_jであるかのいずれかである。

e⃗=0⃗\vec e = \vec 0のときHy⃗=0⃗H\vec y = \vec 0である。e⃗=e⃗j\vec e = \vec e_jのときHy⃗=He⃗j=h⃗j≠0⃗H\vec y = H\vec e_j = \vec h_j \ne \vec 0である。よってHy⃗=0⃗H\vec y = \vec 0とe⃗=0⃗\vec e = \vec 0は同値であり、1が従う。

Hy⃗≠0⃗H\vec y \ne \vec 0のときはe⃗=e⃗j\vec e = \vec e_jでありHy⃗=h⃗jH\vec y = \vec h_jである。定義 3.1によりh⃗j\vec h_jはjjの22進表示であるから、Hy⃗H\vec yを22進表示と読んで得られる整数がjjに等しい。y⃗−e⃗j=c⃗\vec y - \vec e_j = \vec cであり、F2\mathbb{F}_2では−1=1-1 = 1であるから、第jj成分を反対の値に変える操作がe⃗j\vec e_jを引く操作である。▨

例 3.4 (r=3 のハミング符号).r=3r = 3とするとn=23−1=7n = 2^3 - 1 = 7であり、定理 3.2の1よりdim⁡C3=7−3=4\dim C_3 = 7 - 3 = 4です。検査行列は、11から77までの22進表示を列に並べた

H=(000111101100111010101)H = \begin{pmatrix} 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 & 1 & 0 & 1 \end{pmatrix}

です。第jj列を上から44の位、22の位、11の位と読むとjjになります。

生成行列を作ります。Hx⃗=0⃗H\vec x = \vec 0の解のうち、次の44本を取ります。第33成分だけが11である解を作るには、h⃗3=(0,1,1)⊤\vec h_3 = (0,1,1)^{\top}を打ち消す必要があり、h⃗1+h⃗2=(0,0,1)⊤+(0,1,0)⊤=(0,1,1)⊤\vec h_1 + \vec h_2 = (0,0,1)^{\top} + (0,1,0)^{\top} = (0,1,1)^{\top}ですので、第1,2,31, 2, 3成分が11であるベクトルが解です。同様にh⃗5=h⃗1+h⃗4\vec h_5 = \vec h_1 + \vec h_4、h⃗6=h⃗2+h⃗4\vec h_6 = \vec h_2+\vec h_4、h⃗7=h⃗1+h⃗2+h⃗4\vec h_7 = \vec h_1+\vec h_2+\vec h_4ですので、

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

の44本の列がいずれもC3C_3に属します。第3,5,6,73, 5, 6, 7行を見ると、各列はその位置にだけ11をもち、他の列はそこで00ですので、44本は一次独立です。この44本が張る部分空間WWはC3C_3に含まれ、dim⁡W=4=dim⁡C3\dim W = 4 = \dim C_3ですので、§D3.8 命題 3.5によりW=C3W = C_3です。したがって44本はC3C_3の基底であり、GGは定理 1.3の1の意味で生成行列です。検算としてHG=OHG = Oを第11列について確かめると、h⃗1+h⃗2+h⃗3=(0,0,1)⊤+(0,1,0)⊤+(0,1,1)⊤=(0,0,0)⊤\vec h_1 + \vec h_2 + \vec h_3 = (0,0,1)^\top + (0,1,0)^\top + (0,1,1)^\top = (0,0,0)^\topとなります。

復号します。c⃗=(0,0,1,0,1,1,0)⊤\vec c = (0,0,1,0,1,1,0)^{\top}とおくと、これはGGの第1,2,31, 2, 3列の和であり、Hc⃗=h⃗3+h⃗5+h⃗6=(0,1,1)⊤+(1,0,1)⊤+(1,1,0)⊤=(0,0,0)⊤H\vec c = \vec h_3 + \vec h_5 + \vec h_6 = (0,1,1)^{\top} + (1,0,1)^{\top} + (1,1,0)^{\top} = (0,0,0)^{\top}ですので符号語です。第22成分に誤りが起きてy⃗=(0,1,1,0,1,1,0)⊤\vec y = (0,1,1,0,1,1,0)^{\top}を受け取ったとします。

Hy⃗=h⃗2+h⃗3+h⃗5+h⃗6=h⃗2=(0,1,0)⊤H\vec y = \vec h_2 + \vec h_3 + \vec h_5 + \vec h_6 = \vec h_2 = (0,1,0)^{\top}

であり、(0,1,0)(0,1,0)を22進表示と読むと22です。命題 3.3の2により誤りの位置は第22成分であり、その成分を反対の値に変えると(0,0,1,0,1,1,0)⊤=c⃗(0,0,1,0,1,1,0)^{\top} = \vec cが得られます。

命題 3.5 (半径 1 の球が空間を過不足なく覆うこと).r≥2r \ge 2、n=2r−1n = 2^r-1とし、CrC_rをハミング符号とする。各符号語c⃗\vec cに対しB(c⃗)={y⃗∈F2n:d(y⃗,c⃗)≤1}B(\vec c) = \{\vec y \in \mathbb{F}_2^n : d(\vec y, \vec c) \le 1\}とおく。このとき、集合B(c⃗)B(\vec c)(c⃗\vec cはCrC_rの全体を動く)は互いに交わらず、その和集合はF2n\mathbb{F}_2^nの全体に一致する。

証明. 互いに交わらないことを示す。y⃗∈B(c⃗)∩B(c⃗′)\vec y \in B(\vec c) \cap B(\vec c')、c⃗≠c⃗′\vec c \ne \vec c'とすると、命題 2.2の3によりd(c⃗,c⃗′)≤d(c⃗,y⃗)+d(y⃗,c⃗′)≤2d(\vec c, \vec c') \le d(\vec c, \vec y) + d(\vec y, \vec c') \le 2となり、定理 3.2の2のd(Cr)=3d(C_r) = 3に反する。

要素の個数を数える。∣B(c⃗)∣=1+n|B(\vec c)| = 1 + nである。c⃗\vec c自身と、nn個の成分のうち一つだけを変えたものが該当するからである。符号語は定理 3.2の1と定義 1.1の直後の計算により2n−r2^{n-r}個ある。互いに交わらないから、和集合の要素の個数は

2n−r(1+n)=2n−r⋅2r=2n2^{n-r}(1+n) = 2^{n-r}\cdot 2^{r} = 2^{n}

である。∣F2n∣=2n|\mathbb{F}_2^n| = 2^nであり、和集合はF2n\mathbb{F}_2^nに含まれるから、両者は一致する。▨

注意 3.6 (本記事が扱わない範囲). 本記事は、係数をF2\mathbb{F}_2に取り、符号語の全体が部分空間になっている場合だけを扱った。次の三つは扱わない。

  1. 元の個数が33以上である体を係数とする符号。命題 2.7の証明は、係数が00か11に限ることを使っているので、そのままでは一般の体へ移らない。
  2. 符号語の全体が部分空間になっていない符号。命題 2.3は部分空間であることを使っているので、この場合には最小距離を重みだけから求めることができない。
  3. 誤りが起こる仕組みを確率的にモデル化したうえで、一定の誤り率のもとで達成することのできる伝送の速さを論じること。

いずれも「情報理論・符号理論」と参考文献へ委ねる。同単元は、通信路の確率的なモデルと、一定の誤り率のもとで達成することのできる伝送の速さの限界を扱う。

5 自分で確かめる

次の三つを、資料を見ずに行ってください。

  1. 例 1.4のn=4n = 4の場合について、符号語をすべて書き出し、最小距離を命題 2.3によって求め、定理 2.5を用いて、訂正することのできる誤りの個数と検出することのできる誤りの個数を述べてください。
  2. 例 3.4のHHについて、y⃗=(1,1,0,1,0,1,1)⊤\vec y = (1,1,0,1,0,1,1)^{\top}を受け取ったとしてHy⃗H\vec yを計算し、命題 3.3に従って復号してください。得られたベクトルがHHの核に属することを検算してください。
  3. r=2r = 2の場合のハミング符号C2C_2を書き下し、定理 3.2の1と2が成り立つことを、符号語をすべて挙げることで確かめてください。

3ではn=3n = 3、dim⁡C2=1\dim C_2 = 1ですので、符号語は22個です。HHの列は(0,1)⊤(0,1)^\top、(1,0)⊤(1,0)^\top、(1,1)⊤(1,1)^\topになります。

参考文献

  1. J. H. van Lint, Introduction to Coding Theory, 3rd ed., Springer, Berlin, 1999.有限体の上の線形代数としての線形符号、ハミング符号および巡回符号を参考にしました。
  2. F. J. MacWilliams and N. J. A. Sloane, The Theory of Error-Correcting Codes, North-Holland Mathematical Library, North-Holland, 1977.組合せ論と代数の双方からの符号の構成と限界を参考にしました。
  3. Richard W. Hamming, Error detecting and error correcting codes, The Bell System Technical Journal 29 (1950), 147–160.ハミング符号の構成を参考にしました。

前提記事