Lemma

第6章巡回符号とリード–ソロモン符号

目安 9〜12 時間定理など 13演習 6 問
ここまでの道

この章の目標

  • 巡回符号を Fq[x]/(xn−1)\mathbb{F}_q[x]/(x^n - 1) のイデアルとして扱い、生成多項式と次元を求められる。gcd⁡(n,q)=1\gcd(n, q) = 1 の仮定がどこで必要かを説明できる
  • 円分剰余類を使って xn−1x^n - 1 を既約分解し、BCH 符号を構成して BCH 限界を証明できる
  • リード–ソロモン符号が MDS 符号であることを証明し、ピーターソン–ゴレンシュタイン–ツィーラー法で復号できる
  • QR コード・CD・DVD・RAID 6・分散ストレージでリード–ソロモン符号が何をしているかを説明できる
  • CRC のバースト誤り検出能力を正確に述べて証明し、CRC が改ざん検出に使えない理由を説明できる

前提:第5章、04-algebra 第5章(剰余環とイデアル)、04-algebra 第8章(有限体の基本定理・乗法群の巡回性)。6.3 節(BCH 限界)と 6.5 節(PGZ 法)の証明では02-linear-algebra 第4章のヴァンデルモンドの行列式を使う。有限体上の既約多項式・原始多項式・CRC は04-algebra 第11章でも扱っている。

第5章で見たように、一般の線形符号の復号は難しい。実用の符号は、復号が「有限体上の方程式を解く」問題になるように、多項式の構造をもたせて作る。その代表が巡回符号で、符号語を多項式とみると符号は多項式環のイデアルになる。中でもリード–ソロモン符号は、シングルトン限界を等号で達成し(MDS)、連立一次方程式で復号できる。QR コード、CD・DVD、RAID 6、分散ストレージは、どれもこの符号を使っている。最後に、同じ多項式の割り算を誤り検出に使う CRC を見る。

本章では qq は標数 pp の素数べきとする。

6.1 有限体の復習と xn−1x^n - 1 の分解

04-algebra 第8章より、qq 元体 Fq\mathbb{F}_q は同型を除いてただ一つで、Fqm\mathbb{F}_{q^m} は Fq\mathbb{F}_q を部分体として含み(定理 8.41)、Fqm×\mathbb{F}_{q^m}^\times は位数 qm−1q^m - 1 の巡回群である(04 第8章 定理 8.40)。φ(a)=aq\varphi(a) = a^q は Fqm\mathbb{F}_{q^m} の環準同型で(04-algebra 第5章 命題 5.36 を繰り返し使う)、aq=aa^q = a となるのは a∈Fqa \in \mathbb{F}_q のときに限る(xq−xx^q - x の根は高々 qq 個で、Fq\mathbb{F}_q の元はすべて根)。したがって f∈Fq[x]f \in \mathbb{F}_q[x] なら f(a)q=f(aq)f(a)^q = f(a^q) である。計算には、α=x‾\alpha = \overline{x} が乗法群の生成元となる F8=F2[x]/(x3+x+1)\mathbb{F}_8 = \mathbb{F}_2[x]/(x^3 + x + 1)(04 第8章 例 8.42)と F16=F2[x]/(x4+x+1)\mathbb{F}_{16} = \mathbb{F}_2[x]/(x^4 + x + 1)(04-algebra 第11章 例 11.1)の表を使う。

補題 6.1(xn−1x^n - 1 の根)n≥1n \geq 1 とする。

  1. p∤np \nmid n(すなわち gcd⁡(n,q)=1\gcd(n, q) = 1)なら xn−1x^n - 1 は重根をもたない。qm≡1(modn)q^m \equiv 1 \pmod n となる最小の m≥1m \geq 1 をとると、Fqm\mathbb{F}_{q^m} は位数 nn の元 β\beta(1 の原始 nn 乗根)を含み、Fqm[x]\mathbb{F}_{q^m}[x] で xn−1=∏i=0n−1(x−βi)x^n - 1 = \prod_{i=0}^{n-1}(x - \beta^i) である。
  2. p∣np \mid n なら、n=pn′n = pn' として xn−1=(xn′−1)px^n - 1 = (x^{n'} - 1)^p であり、Fq\mathbb{F}_q のどの拡大体にも位数 nn の元はない。

証明. (1) (xn−1)′=nxn−1(x^n - 1)' = nx^{n-1} で n≠0n \neq 0 なので、その根は 00 だけで、xn−1x^n - 1 の根ではない。よって重根はない(04 第8章 命題 8.36(1))。qq は Z/nZ\mathbb{Z}/n\mathbb{Z} の単元なので mm は存在し、巡回群 Fqm×\mathbb{F}_{q^m}^\times の位数 qm−1q^m - 1 は nn で割り切れるから、生成元 γ\gamma について β=γ(qm−1)/n\beta = \gamma^{(q^m - 1)/n} の位数は nn である。β0,…,βn−1\beta^0, \dots, \beta^{n-1} は xn−1x^n - 1 の相異なる nn 個の根なので、積の式が成り立つ。(2) 標数 pp の環 Fq[x]\mathbb{F}_q[x] で (xn′−1)p=xn−1(x^{n'} - 1)^p = x^{n} - 1(04 第5章 命題 5.36)なので、xn−1x^n - 1 の相異なる根は n′n' 個以下である。位数 nn の元があれば、そのべきが相異なる nn 個の根になってしまう。□\square

定義 6.2(円分剰余類, cyclotomic coset)gcd⁡(n,q)=1\gcd(n, q) = 1 とする。s∈Z/nZs \in \mathbb{Z}/n\mathbb{Z} に対し Cs={s,sq,sq2,… }⊂Z/nZC_s = \lbrace s, sq, sq^2, \dots \rbrace \subset \mathbb{Z}/n\mathbb{Z} を、nn を法とする qq の円分剰余類という。

j↦jqj \mapsto jq は Z/nZ\mathbb{Z}/n\mathbb{Z} の全単射なので、Z/nZ\mathbb{Z}/n\mathbb{Z} は円分剰余類に分割される。sqm=ssq^m = s より ∣Cs∣≤m\lvert C_s \rvert \leq m である。

定理 6.3(xn−1x^n - 1 の既約分解)gcd⁡(n,q)=1\gcd(n, q) = 1 とし、β\beta を補題 6.1 の元とする。Ms(x)=∏j∈Cs(x−βj)M_s(x) = \prod_{j \in C_s}(x - \beta^j) は βs\beta^s の Fq\mathbb{F}_q 上の最小多項式である。したがって、円分剰余類の代表 ss を 1 つずつとると、xn−1=∏sMs(x)x^n - 1 = \prod_s M_s(x) が Fq[x]\mathbb{F}_q[x] における既約分解である。

証明. φ\varphi を MsM_s の係数に施すと ∏j∈Cs(x−βjq)=Ms\prod_{j \in C_s}(x - \beta^{jq}) = M_s(j↦jqj \mapsto jq は CsC_s の置換)なので、MsM_s の係数は Fq\mathbb{F}_q に属する。βs\beta^s の最小多項式を MM とすると、Ms(βs)=0M_s(\beta^s) = 0 より M∣MsM \mid M_s(04 第8章 命題 8.7)。逆に j=sqi∈Csj = sq^i \in C_s なら M(βj)=M(βs)qi=0M(\beta^j) = M(\beta^s)^{q^i} = 0 なので、MsM_s の相異なる根はすべて MM の根であり、Ms∣MM_s \mid M。どちらもモニックなので M=MsM = M_s。円分剰余類は Z/nZ\mathbb{Z}/n\mathbb{Z} を分割するので、∏sMs=∏i=0n−1(x−βi)=xn−1\prod_s M_s = \prod_{i=0}^{n-1}(x - \beta^i) = x^n - 1。□\square

例 6.4

  1. q=2q = 2, n=7n = 7:m=3m = 3 で、円分剰余類は {0},{1,2,4},{3,6,5}\lbrace 0 \rbrace, \lbrace 1, 2, 4 \rbrace, \lbrace 3, 6, 5 \rbrace。β=α\beta = \alpha(α3=α+1\alpha^3 = \alpha + 1)とすると M1=x3+x+1M_1 = x^3 + x + 1。M3M_3 の根 α3,α5,α6\alpha^3, \alpha^5, \alpha^6 について、表から和は 11、2 つずつの積の和は α8+α9+α11=α+α2+α4=0\alpha^8 + \alpha^9 + \alpha^{11} = \alpha + \alpha^2 + \alpha^4 = 0、積は α14=1\alpha^{14} = 1 なので M3=x3+x2+1M_3 = x^3 + x^2 + 1。よって x7−1=(x+1)(x3+x+1)(x3+x2+1)x^7 - 1 = (x + 1)(x^3 + x + 1)(x^3 + x^2 + 1)。
  2. q=2q = 2, n=15n = 15:m=4m = 4 で、円分剰余類は {0},{1,2,4,8},{3,6,12,9},{5,10},{7,14,13,11}\lbrace 0 \rbrace, \lbrace 1, 2, 4, 8 \rbrace, \lbrace 3, 6, 12, 9 \rbrace, \lbrace 5, 10 \rbrace, \lbrace 7, 14, 13, 11 \rbrace。β=α\beta = \alpha(α4=α+1\alpha^4 = \alpha + 1)とすると M1=x4+x+1M_1 = x^4 + x + 1、M3=x4+x3+x2+x+1M_3 = x^4 + x^3 + x^2 + x + 1(α3\alpha^3 の位数は 5)、M5=x2+x+1M_5 = x^2 + x + 1(α5\alpha^5 の位数は 3)、M7=x4+x3+1M_7 = x^4 + x^3 + 1 である(計算機で確かめた)。

6.2 巡回符号とイデアル

ベクトル (c0,c1,…,cn−1)∈Fqn(c_0, c_1, \dots, c_{n-1}) \in \mathbb{F}_q^n(成分の番号は 00 から)を多項式 c(x)=c0+c1x+⋯+cn−1xn−1c(x) = c_0 + c_1x + \cdots + c_{n-1}x^{n-1} と同一視する。Fq[x]\mathbb{F}_q[x] の元は xn−1x^n - 1 で割った余りによって次数 nn 未満の多項式とただ一つ対応するので(04-algebra 第5章 定理 5.28)、Fqn\mathbb{F}_q^n は剰余環 Rn=Fq[x]/(xn−1)R_n = \mathbb{F}_q[x]/(x^n - 1) と同一視できる。RnR_n では xn=1x^n = 1 なので、xx 倍は巡回シフト c0+⋯+cn−1xn−1↦cn−1+c0x+⋯+cn−2xn−1c_0 + \cdots + c_{n-1}x^{n-1} \mapsto c_{n-1} + c_0x + \cdots + c_{n-2}x^{n-1} である。

定義 6.5(巡回符号, cyclic code)線形符号 C⊂FqnC \subset \mathbb{F}_q^n が、(c0,…,cn−1)∈C⇒(cn−1,c0,…,cn−2)∈C(c_0, \dots, c_{n-1}) \in C \Rightarrow (c_{n-1}, c_0, \dots, c_{n-2}) \in C をみたすとき、CC を巡回符号という。本章では、巡回符号を数えるときなどの便宜のため、{0}\lbrace 0 \rbrace も巡回符号に含める(第5章の定義 5.9 では k≥1k \geq 1 としていた)。

命題 6.6 C⊂RnC \subset R_n が巡回符号であることと、CC が RnR_n のイデアルであることは同値である。

証明. イデアルは定数倍で閉じているので部分空間であり、xx 倍で閉じている。逆に巡回符号は xix^i 倍で閉じており、線形性から ∑iaixi\sum_i a_ix^i 倍で閉じている。□\square

定理 6.7(生成多項式, generator polynomial)C≠{0}C \neq \lbrace 0 \rbrace を長さ nn の巡回符号とする。

  1. CC の 00 でない元(次数 nn 未満の多項式)のうち、次数が最小のモニック多項式 gg がただ一つある。これを CC の生成多項式という。
  2. gg は Fq[x]\mathbb{F}_q[x] において xn−1x^n - 1 を割り切る。
  3. r=deg⁡gr = \deg g とすると C={a(x)g(x)∣deg⁡a<n−r}C = \lbrace a(x)g(x) \mid \deg a < n - r \rbrace であり、g,xg,…,xn−r−1gg, xg, \dots, x^{n-r-1}g は CC の基底である。特に dim⁡C=n−r\dim C = n - r。
  4. 逆に、xn−1x^n - 1 のモニックな約数 gg(r=deg⁡g<nr = \deg g < n)について、(3) の右辺は生成多項式が gg の巡回符号である。

したがって、長さ nn の巡回符号と xn−1x^n - 1 のモニックな約数は 1 対 1 に対応する({0}\lbrace 0 \rbrace には xn−1x^n - 1 を対応させる)。

証明. (1) 次数最小の 00 でない元を最高次の係数で割ればよい。そのような g,g′g, g' が 2 つあれば、g−g′∈Cg - g' \in C は次数がより低いので 00。

(2) xn−1=Qg+ρx^n - 1 = Qg + \rho(deg⁡ρ<r\deg \rho < r)と割る。RnR_n で ρ=−Qg\rho = -Qg であり、CC はイデアルなので ρ∈C\rho \in C。次数の最小性より ρ=0\rho = 0。

(3) deg⁡a<n−r\deg a < n - r なら agag は次数 nn 未満で、RnR_n の元 a⋅g∈Ca \cdot g \in C そのものである。逆に c∈Cc \in C を c=ag+ρc = ag + \rho(deg⁡ρ<r\deg \rho < r)と割ると、deg⁡a<n−r\deg a < n - r なので ag∈Cag \in C で、ρ=c−ag∈C\rho = c - ag \in C から ρ=0\rho = 0。xigx^ig(0≤i<n−r0 \leq i < n - r)は次数が相異なるので一次独立であり、CC を張る。

(4) Cg={ag∣deg⁡a<n−r}C_g = \lbrace ag \mid \deg a < n - r \rbrace は n−rn - r 次元の部分空間である。h=(xn−1)/gh = (x^n - 1)/g とし、ag∈Cgag \in C_g の aa の xn−r−1x^{n-r-1} の係数を a′a' とすると、RnR_n で x⋅ag=xag−a′(xn−1)=(xa−a′h)gx \cdot ag = xag - a'(x^n - 1) = (xa - a'h)g であり、xa−a′hxa - a'h は xn−rx^{n-r} の項が消えて次数 n−rn - r 未満なので、これは CgC_g に属する。よって CgC_g は巡回符号で、00 でない元の次数は rr 以上だから生成多項式は gg。(1)〜(4) より、C↦gC \mapsto g と g↦Cgg \mapsto C_g は互いに逆の対応である。□\square

注意 6.8(gcd⁡(n,q)=1\gcd(n, q) = 1 の役割)定理 6.7 は gcd⁡(n,q)=1\gcd(n, q) = 1 を仮定せずに成り立つ。この仮定が効くのは次の 3 点である。

  1. 個数:gcd⁡(n,q)=1\gcd(n, q) = 1 なら xn−1x^n - 1 は相異なるモニック既約多項式 ss 個の積で、巡回符号はちょうど 2s2^s 個ある。一般に xn−1=∏ifieix^n - 1 = \prod_i f_i^{e_i} なら ∏i(ei+1)\prod_i(e_i + 1) 個である。
  2. 零点による記述(命題 6.11):生成多項式が相異なる x−βjx - \beta^j の積になり、符号が条件「c(βj)=0c(\beta^j) = 0」で書ける。p∣np \mid n ではこれが崩れる。たとえば q=2q = 2, n=4n = 4 では x4−1=(x+1)4x^4 - 1 = (x + 1)^4 で、生成多項式 (x+1)e(x + 1)^e(e=1,2,3e = 1, 2, 3)の 3 つの符号 [4,3,2][4, 3, 2], {0000,1010,0101,1111}\lbrace 0000, 1010, 0101, 1111 \rbrace, {0000,1111}\lbrace 0000, 1111 \rbrace は、どの拡大体でも零点が 11 だけで、零点では区別できない。
  3. BCH 限界(定理 6.13):位数 nn の元 β\beta が必要で、それは p∤np \nmid n のときにしか存在しない(補題 6.1)。

例 6.9(長さ 7 の 2 元巡回符号)x7−1x^7 - 1 は 3 個の既約因子をもつので(例 6.4)、2 元巡回符号は 23=82^3 = 8 個ある。{0}\lbrace 0 \rbrace 以外は次のとおり(最小距離は計算機で確かめた)。

生成多項式 [n,k,d][n, k, d] 名前
11 [7,7,1][7, 7, 1] 全体
x+1x + 1 [7,6,2][7, 6, 2] 偶数重みの符号
x3+x+1x^3 + x + 1 または x3+x2+1x^3 + x^2 + 1 [7,4,3][7, 4, 3] ハミング符号
(x+1)(x3+x+1)(x + 1)(x^3 + x + 1) または (x+1)(x3+x2+1)(x + 1)(x^3 + x^2 + 1) [7,3,4][7, 3, 4]
(x3+x+1)(x3+x2+1)(x^3 + x + 1)(x^3 + x^2 + 1) [7,1,7][7, 1, 7] 繰り返し符号

g=x3+x+1g = x^3 + x + 1 は α\alpha の最小多項式なので、c∈C  ⟺  g∣c  ⟺  ∑iciαi=0c \in C \iff g \mid c \iff \sum_i c_i\alpha^i = 0。αi\alpha^i を基底 1,α,α21, \alpha, \alpha^2 の係数の縦ベクトルとみると、これは H=(α0 α1 ⋯ α6)H = (\alpha^0 \ \alpha^1 \ \cdots \ \alpha^6) を検査行列とする条件で、HH の列は F23\mathbb{F}_2^3 の 00 でないベクトル全部だから、CC はハミング符号である(第5章 定義 5.19)。mm 次の原始多項式についても同様である。

例 6.10(組織的な符号化)情報 u(x)u(x)(deg⁡u<n−r\deg u < n - r)に対し、xru(x)x^ru(x) を gg で割った余り ρ(x)\rho(x) を求めて c(x)=xru(x)−ρ(x)c(x) = x^ru(x) - \rho(x) とすると、cc は gg で割り切れる次数 nn 未満の多項式なので符号語であり、xr,…,xn−1x^r, \dots, x^{n-1} の係数は uu のままである。g=x3+x+1g = x^3 + x + 1, u(x)=1+x2+x3u(x) = 1 + x^2 + x^3 なら、gg を法として x3≡x+1x^3 \equiv x + 1, x5≡x2+x+1x^5 \equiv x^2 + x + 1, x6≡x2+1x^6 \equiv x^2 + 1 なので x3u≡1x^3u \equiv 1 で、c(x)=1+x3+x5+x6c(x) = 1 + x^3 + x^5 + x^6、すなわち c=(1,0,0,1,0,1,1)c = (1, 0, 0, 1, 0, 1, 1) を得る。後半 4 成分が u=(1,0,1,1)u = (1, 0, 1, 1) である。

6.3 BCH 符号と BCH 限界

この節と次の 2 節では gcd⁡(n,q)=1\gcd(n, q) = 1 とし、β∈Fqm\beta \in \mathbb{F}_{q^m} を補題 6.1 の 1 の原始 nn 乗根とする。βn=1\beta^n = 1 なので、c∈Rnc \in R_n に対し c(βj)c(\beta^j) は代表の選び方によらない。

命題 6.11(零点による記述)巡回符号 CC の生成多項式を gg とし、Z={j∈Z/nZ∣g(βj)=0}Z = \lbrace j \in \mathbb{Z}/n\mathbb{Z} \mid g(\beta^j) = 0 \rbrace(CC の定義集合)とする。ZZ は円分剰余類の和集合で、g=∏j∈Z(x−βj)g = \prod_{j \in Z}(x - \beta^j) かつ C={c∈Rn∣c(βj)=0 (j∈Z)}C = \lbrace c \in R_n \mid c(\beta^j) = 0 \ (j \in Z) \rbrace である。逆に、円分剰余類の和集合 ZZ について、∏j∈Z(x−βj)\prod_{j \in Z}(x - \beta^j) を生成多項式とする n−∣Z∣n - \lvert Z \rvert 次元の巡回符号がある。

証明. gg は根が相異なる xn−1=∏i(x−βi)x^n - 1 = \prod_i(x - \beta^i) を割るので、g=∏j∈Z(x−βj)g = \prod_{j \in Z}(x - \beta^j)。j∈Zj \in Z なら g(βjq)=g(βj)q=0g(\beta^{jq}) = g(\beta^j)^q = 0 なので、ZZ は円分剰余類の和集合である。次数 nn 未満の cc について c∈C  ⟺  g∣cc \in C \iff g \mid c(定理 6.7(3))。g∣cg \mid c なら c(βj)=0c(\beta^j) = 0(j∈Zj \in Z)。逆にこれが成り立てば、相異なる 1 次式 x−βjx - \beta^j がすべて cc を割るので Fqm[x]\mathbb{F}_{q^m}[x] で g∣cg \mid c であり、Fq[x]\mathbb{F}_q[x] での割り算の商と余りは Fqm[x]\mathbb{F}_{q^m}[x] でもそのまま商と余りなので、Fq[x]\mathbb{F}_q[x] でも g∣cg \mid c。逆の主張は、∏j∈Z(x−βj)\prod_{j \in Z}(x - \beta^j) が MsM_s たちの積であること(定理 6.3)と定理 6.7(4) による。□\square

定義 6.12(BCH 符号)整数 bb と 2≤δ≤n2 \leq \delta \leq n をとる。b,b+1,…,b+δ−2b, b + 1, \dots, b + \delta - 2 を含む最小の円分剰余類の和集合を定義集合とする巡回符号、すなわち生成多項式が Mb,…,Mb+δ−2M_b, \dots, M_{b+\delta-2} の最小公倍元である巡回符号を、設計距離 (designed distance) δ\delta の BCH 符号という。b=1b = 1 のとき狭義 (narrow-sense)、n=qm−1n = q^m - 1 のとき原始的 (primitive) という。

BCH 符号の名前は、独立に見つけた Hocquenghem(1959 年)と Bose, Ray-Chaudhuri(1960 年)の頭文字による。最小距離の評価の要は次の定理である。

定理 6.13(BCH 限界, BCH bound)CC を長さ nn の巡回符号とし、ある整数 bb と δ≥2\delta \geq 2 について、すべての c∈Cc \in C が c(βb)=c(βb+1)=⋯=c(βb+δ−2)=0c(\beta^b) = c(\beta^{b+1}) = \cdots = c(\beta^{b+\delta-2}) = 0 をみたすとする。このとき d(C)≥δd(C) \geq \delta。

証明. 重み w≤δ−1w \leq \delta - 1 の符号語 c≠0c \neq 0 があったとし、その 00 でない成分の位置を i1<⋯<iwi_1 < \cdots < i_w(0≤ik<n0 \leq i_k < n)、Xk=βikX_k = \beta^{i_k} とおく。β\beta の位数は nn なので X1,…,XwX_1, \dots, X_w は相異なり、00 でない。j=0,1,…,w−1j = 0, 1, \dots, w - 1(≤δ−2\leq \delta - 2)について

0=c(βb+j)=∑k=1wcikXkb+j0 = c(\beta^{b+j}) = \sum_{k=1}^{w} c_{i_k}X_k^{b+j}

であり、これは VDv=0VDv = 0 と書ける。ここで v=(ci1,…,ciw)⊤v = (c_{i_1}, \dots, c_{i_w})^{\top}、D=diag⁡(X1b,…,Xwb)D = \operatorname{diag}(X_1^b, \dots, X_w^b)、V=(Xkj)0≤j<w, 1≤k≤wV = (X_k^j)_{0 \leq j < w,\ 1 \leq k \leq w} である。VV の転置はヴァンデルモンド行列なので det⁡V=∏k<l(Xl−Xk)≠0\det V = \prod_{k < l}(X_l - X_k) \neq 0(02-linear-algebra 第4章 定理 4.33, 定理 4.13)。det⁡D≠0\det D \neq 0 なので v=0v = 0 となり、cik≠0c_{i_k} \neq 0 に反する。□\square

系 6.14 設計距離 δ\delta の BCH 符号は、最小距離が δ\delta 以上、次元が n−m(δ−1)n - m(\delta - 1) 以上である。q=2q = 2, b=1b = 1, δ=2t+1\delta = 2t + 1 なら、次元は n−mtn - mt 以上である。

証明. 最小距離は命題 6.11 と定理 6.13 による。次元は n−∣Z∣n - \lvert Z \rvert で、ZZ は高々 δ−1\delta - 1 個の円分剰余類(それぞれ mm 個以下の元)の和集合である。q=2q = 2 なら C2i=CiC_{2i} = C_i なので、1,…,2t1, \dots, 2t の円分剰余類は奇数 1,3,…,2t−11, 3, \dots, 2t - 1 の円分剰余類で尽くされ、∣Z∣≤mt\lvert Z \rvert \leq mt。□\square

例 6.15(長さ 15 の 2 元 BCH 符号)例 6.4(2) の β=α\beta = \alpha を使う。

  • δ=3\delta = 3:定義集合 C1C_1、g=M1=x4+x+1g = M_1 = x^4 + x + 1。[15,11,3][15, 11, 3] のハミング符号である。
  • δ=5\delta = 5:定義集合 C1∪C3={1,2,3,4,6,8,9,12}C_1 \cup C_3 = \lbrace 1, 2, 3, 4, 6, 8, 9, 12 \rbrace、g=M1M3=x8+x7+x6+x4+1g = M_1M_3 = x^8 + x^7 + x^6 + x^4 + 1。[15,7][15, 7] 符号で d≥5d \geq 5 であり、gg 自身が重み 5 の符号語なので d=5d = 5。
  • δ=7\delta = 7:定義集合 C1∪C3∪C5C_1 \cup C_3 \cup C_5、g=M1M3M5=x10+x8+x5+x4+x2+x+1g = M_1M_3M_5 = x^{10} + x^8 + x^5 + x^4 + x^2 + x + 1(重み 7)。[15,5,7][15, 5, 7] 符号である。

δ=4\delta = 4 としても定義集合は C1∪C3⊃{1,2,3,4}C_1 \cup C_3 \supset \lbrace 1, 2, 3, 4 \rbrace となり、δ=5\delta = 5 と同じ符号になる。真の最小距離が設計距離より大きいこともあるわけである。[15,7,5][15, 7, 5] 符号は 2 個の誤りを訂正でき、第5章 例 5.27 のハミング限界 k≤8k \leq 8 に近い。

6.4 リード–ソロモン符号

定義 6.16(リード–ソロモン符号, Reed–Solomon code)1≤k≤n≤q1 \leq k \leq n \leq q とし、相異なる α1,…,αn∈Fq\alpha_1, \dots, \alpha_n \in \mathbb{F}_q をとる。RS⁡k={(f(α1),…,f(αn))∣f∈Fq[x], deg⁡f<k}\operatorname{RS}_k = \lbrace (f(\alpha_1), \dots, f(\alpha_n)) \mid f \in \mathbb{F}_q[x],\ \deg f < k \rbrace(f=0f = 0 を含む)をリード–ソロモン符号という。

リードとソロモンが 1960 年に導入した。情報は kk 個の係数で、それを nn 点での値として送る。

定理 6.17 RS⁡k\operatorname{RS}_k は [n,k,n−k+1][n, k, n - k + 1] 符号、すなわち MDS 符号である。さらに、どの kk 個の位置の値からも符号語がただ一つに決まる。

証明. f↦(f(α1),…,f(αn))f \mapsto (f(\alpha_1), \dots, f(\alpha_n)) は kk 次元の空間 {f∣deg⁡f<k}\lbrace f \mid \deg f < k \rbrace 上の線形写像である。f≠0f \neq 0 の根は高々 k−1k - 1 個なので(04-algebra 第5章 系 5.30)、像の 00 でない成分は n−k+1n - k + 1 個以上ある。よってこの写像は単射で dim⁡RS⁡k=k\dim \operatorname{RS}_k = k、最小距離は n−k+1n - k + 1 以上であり、シングルトン限界(第5章 定理 5.23)より等号が成り立つ。kk 個の位置で一致する 2 つの符号語は高々 n−k<dn - k < d 個の位置でしか異ならないので等しい。□\square

最後の主張は、n−kn - k 個までの消失を訂正できるということである(第5章 定理 5.7(3))。値を知っている kk 点からラグランジュ補間で ff を求めればよい。

定理 6.18(巡回符号としてのリード–ソロモン符号)n=q−1n = q - 1 とし、β\beta を Fq×\mathbb{F}_q^\times の生成元とする。評価点を 1,β,…,βn−11, \beta, \dots, \beta^{n-1} の順にとり、成分の番号を 00 から n−1n - 1 とする(第 ii 成分は f(βi)f(\beta^i))。このとき RS⁡k\operatorname{RS}_k は、生成多項式 g(x)=∏j=1n−k(x−βj)g(x) = \prod_{j=1}^{n-k}(x - \beta^j) の巡回符号に等しい。これは m=1m = 1, b=1b = 1, 設計距離 n−k+1n - k + 1 の BCH 符号である。

証明. f=∑l=0k−1flxlf = \sum_{l=0}^{k-1} f_lx^l, ci=f(βi)c_i = f(\beta^i) とすると

c(βj)=∑i=0n−1f(βi)βij=∑l=0k−1fl∑i=0n−1(βl+j)ic(\beta^j) = \sum_{i=0}^{n-1} f(\beta^i)\beta^{ij} = \sum_{l=0}^{k-1} f_l\sum_{i=0}^{n-1}(\beta^{l+j})^i

である。1≤j≤n−k1 \leq j \leq n - k なら 1≤l+j≤n−11 \leq l + j \leq n - 1 なので γ=βl+j≠1\gamma = \beta^{l+j} \neq 1 で、γn=1\gamma^n = 1 より ∑i=0n−1γi=(γn−1)/(γ−1)=0\sum_{i=0}^{n-1}\gamma^i = (\gamma^n - 1)/(\gamma - 1) = 0。よって c(βj)=0c(\beta^j) = 0(1≤j≤n−k1 \leq j \leq n - k)であり、命題 6.11 より RS⁡k\operatorname{RS}_k は生成多項式 gg の巡回符号に含まれる。次元はどちらも kk なので等しい。m=1m = 1 では円分剰余類は 1 点ずつ(q≡1(modn)q \equiv 1 \pmod n)なので、最後の主張も従う。□\square

例 6.19(F7\mathbb{F}_7 上のリード–ソロモン符号)q=7q = 7, n=6n = 6, β=3\beta = 3 とする。30,…,353^0, \dots, 3^5 は 1,3,2,6,4,51, 3, 2, 6, 4, 5 で、33 は F7×\mathbb{F}_7^\times の生成元である。k=2k = 2 とすると [6,2,5][6, 2, 5] 符号で、2 個の誤りを訂正できる。生成多項式は g(x)=(x−3)(x−2)(x−6)(x−4)=x4+6x3+3x2+2x+4g(x) = (x - 3)(x - 2)(x - 6)(x - 4) = x^4 + 6x^3 + 3x^2 + 2x + 4。情報 f(x)=2+3xf(x) = 2 + 3x は c=(f(1),f(3),f(2),f(6),f(4),f(5))=(5,4,1,6,0,3)c = (f(1), f(3), f(2), f(6), f(4), f(5)) = (5, 4, 1, 6, 0, 3) に符号化され、実際 c(x)=5+4x+x2+6x3+3x5=(3x+3)g(x)c(x) = 5 + 4x + x^2 + 6x^3 + 3x^5 = (3x + 3)g(x) である。どの 2 成分からも ff(2 点を通る直線)が決まるので、4 個までの消失を訂正できる。

6.5 復号:ピーターソン–ゴレンシュタイン–ツィーラー法

t≥1t \geq 1 とし、CC を、すべての符号語が c(βj)=0c(\beta^j) = 0(1≤j≤2t1 \leq j \leq 2t)をみたす長さ nn の巡回符号とする(狭義の BCH 符号で δ≥2t+1\delta \geq 2t + 1 のもの、または n−k=2tn - k = 2t の定理 6.18 の符号)。BCH 限界より d(C)≥2t+1d(C) \geq 2t + 1 で、tt 個までの誤りが訂正できるはずである。それを実行する手順を作る。

符号語 cc を送り r=c+er = c + e を受け取ったとする。ee の 00 でない成分の位置を i1,…,iνi_1, \dots, i_\nu(ν≤t\nu \leq t)、値を Yl=eilY_l = e_{i_l}、誤り位置 (error locator) を Xl=βilX_l = \beta^{i_l}(相異なる)とする。シンドローム

Sj=r(βj)=e(βj)=∑l=1νYlXlj(1≤j≤2t)S_j = r(\beta^j) = e(\beta^j) = \sum_{l=1}^{\nu} Y_lX_l^j \qquad (1 \leq j \leq 2t)

は rr から計算できる。誤り位置多項式 (error-locator polynomial) を Λ(x)=∏l=1ν(1−Xlx)=1+Λ1x+⋯+Λνxν\Lambda(x) = \prod_{l=1}^{\nu}(1 - X_lx) = 1 + \Lambda_1x + \cdots + \Lambda_\nu x^\nu とする。その根 Xl−1X_l^{-1} がわかれば誤りの位置がわかる。

補題 6.20(鍵方程式)1≤j≤2t−ν1 \leq j \leq 2t - \nu について Sj+ν+Λ1Sj+ν−1+⋯+ΛνSj=0S_{j+\nu} + \Lambda_1S_{j+\nu-1} + \cdots + \Lambda_\nu S_j = 0。

証明. Λ0=1\Lambda_0 = 1 とすると、各 ll について ∑i=0νΛiXl−i=Λ(Xl−1)=0\sum_{i=0}^{\nu}\Lambda_iX_l^{-i} = \Lambda(X_l^{-1}) = 0。これに YlXlj+νY_lX_l^{j+\nu} を掛けて ll について足すと ∑i=0νΛiSj+ν−i=0\sum_{i=0}^{\nu}\Lambda_iS_{j+\nu-i} = 0(添字 j+ν−ij + \nu - i は 11 以上 2t2t 以下)。□\square

補題 6.21 1≤μ≤t1 \leq \mu \leq t について、μ×μ\mu \times \mu 行列 Mμ=(Si+j−1)1≤i,j≤μM_\mu = (S_{i+j-1})_{1 \leq i, j \leq \mu} は、μ=ν\mu = \nu なら正則、μ>ν\mu > \nu なら正則でない。

証明. μ×ν\mu \times \nu 行列 W=(Xli−1)i,lW = (X_l^{i-1})_{i, l} と D=diag⁡(Y1X1,…,YνXν)D = \operatorname{diag}(Y_1X_1, \dots, Y_\nu X_\nu) について、(WDW⊤)ij=∑lYlXli+j−1=Si+j−1(WDW^{\top})_{ij} = \sum_l Y_lX_l^{i+j-1} = S_{i+j-1}、すなわち Mμ=WDW⊤M_\mu = WDW^{\top}。μ>ν\mu > \nu なら rank⁡Mμ≤ν<μ\operatorname{rank} M_\mu \leq \nu < \mu。μ=ν\mu = \nu なら det⁡Mν=(det⁡W)2∏lYlXl≠0\det M_\nu = (\det W)^2\prod_l Y_lX_l \neq 0(WW はヴァンデルモンド行列の転置)。□\square

ピーターソン–ゴレンシュタイン–ツィーラー (PGZ) 法

  1. S1,…,S2tS_1, \dots, S_{2t} を計算する。すべて 00 なら rr を出力する。
  2. det⁡Mμ≠0\det M_\mu \neq 0 となる最大の μ≤t\mu \leq t を ν\nu とする(なければ失敗)。
  3. 連立一次方程式 Mν(Λν,Λν−1,…,Λ1)⊤=−(Sν+1,…,S2ν)⊤M_\nu(\Lambda_\nu, \Lambda_{\nu-1}, \dots, \Lambda_1)^{\top} = -(S_{\nu+1}, \dots, S_{2\nu})^{\top} を解く。
  4. i=0,…,n−1i = 0, \dots, n - 1 について Λ(β−i)=0\Lambda(\beta^{-i}) = 0 かを調べる(チェン探索)。根がちょうど ν\nu 個でなければ失敗とする。
  5. 手順 4 で見つかった位置を i1′,…,iν′i'_1, \dots, i'_\nu とし、Xl=βil′X_l = \beta^{i'_l} として ∑lYlXlj=Sj\sum_l Y_lX_l^j = S_j(1≤j≤ν1 \leq j \leq \nu)を解いて YlY_l を求める。第 il′i'_l 成分が YlY_l で、ほかの成分が 00 のベクトルを e^\hat{e} とする(q=2q = 2 なら Yl=1Y_l = 1)。
  6. r−e^r - \hat{e} のシンドローム(j=1,…,2tj = 1, \dots, 2t)がすべて 00 なら r−e^r - \hat{e} を出力し、そうでなければ失敗とする(tt 個を超える誤りに備える確認)。

定理 6.22(PGZ 法の正しさ)wt⁡(e)≤t\operatorname{wt}(e) \leq t なら、上の手順は送られた符号語 cc を出力する。

証明. ν=0\nu = 0 ならシンドロームはすべて 00。ν≥1\nu \geq 1 なら MνM_\nu は正則(補題 6.21)なので、シンドロームのどれかは 00 でない。手順 2:補題 6.21 より正しい ν\nu が得られる。手順 3:この連立方程式は補題 6.20 の j=1,…,νj = 1, \dots, \nu の場合(ν≤2t−ν\nu \leq 2t - \nu なので使える)そのもので、MνM_\nu は正則だから解は真の係数に限る。手順 4:Λ\Lambda の根は相異なる ν\nu 個の Xl−1=β−ilX_l^{-1} = \beta^{-i_l} なので、見つかる位置は真の位置 i1,…,iνi_1, \dots, i_\nu である。手順 5:係数行列 (Xlj)j,l(X_l^j)_{j, l} はヴァンデルモンド行列の転置に diag⁡(X1,…,Xν)\operatorname{diag}(X_1, \dots, X_\nu) を掛けたもので正則なので、真の YlY_l が求まり、e^=e\hat{e} = e となる。手順 6:r−e^=cr - \hat{e} = c は符号語なので確認を通り、cc が出力される。□\square

この方法はピーターソン(1960 年、2 元 BCH 符号)とゴレンシュタイン–ツィーラー(1961 年、一般の場合)による。

例 6.23(例 6.19 の符号の復号)符号語 c=(5,4,1,6,0,3)c = (5, 4, 1, 6, 0, 3) を送り、r=(5,6,1,3,0,3)r = (5, 6, 1, 3, 0, 3) を受け取ったとする(t=2t = 2)。Sj=∑iriβijS_j = \sum_i r_i\beta^{ij} を βij\beta^{ij} の表から計算する。

jj βij\beta^{ij}(i=0,…,5i = 0, \dots, 5) SjS_j
1 1,3,2,6,4,51, 3, 2, 6, 4, 5 5+18+2+18+0+15=58≡25 + 18 + 2 + 18 + 0 + 15 = 58 \equiv 2
2 1,2,4,1,2,41, 2, 4, 1, 2, 4 5+12+4+3+0+12=36≡15 + 12 + 4 + 3 + 0 + 12 = 36 \equiv 1
3 1,6,1,6,1,61, 6, 1, 6, 1, 6 5+36+1+18+0+18=78≡15 + 36 + 1 + 18 + 0 + 18 = 78 \equiv 1
4 1,4,2,1,4,21, 4, 2, 1, 4, 2 5+24+2+3+0+6=40≡55 + 24 + 2 + 3 + 0 + 6 = 40 \equiv 5

det⁡M2=S1S3−S22=1≠0\det M_2 = S_1S_3 - S_2^2 = 1 \neq 0 なので ν=2\nu = 2。連立方程式

(2111)(Λ2Λ1)=(−1−5)=(62)\begin{pmatrix} 2 & 1 \\ 1 & 1 \end{pmatrix}\begin{pmatrix} \Lambda_2 \\ \Lambda_1 \end{pmatrix} = \begin{pmatrix} -1 \\ -5 \end{pmatrix} = \begin{pmatrix} 6 \\ 2 \end{pmatrix}

を解くと Λ2=4\Lambda_2 = 4, Λ1=5\Lambda_1 = 5 で、Λ(x)=1+5x+4x2=(1+x)(1+4x)\Lambda(x) = 1 + 5x + 4x^2 = (1 + x)(1 + 4x)。根 x=−1=β3x = -1 = \beta^3 と x=−4−1=5=β5x = -4^{-1} = 5 = \beta^5 から X=β−3=β3X = \beta^{-3} = \beta^3, β−5=β1\beta^{-5} = \beta^1 で、誤りは第 1 成分と第 3 成分にある。値は S1=3Y1+6Y3=2S_1 = 3Y_1 + 6Y_3 = 2, S2=2Y1+Y3=1S_2 = 2Y_1 + Y_3 = 1 を解いて Y1=2Y_1 = 2, Y3=4Y_3 = 4。rr から引くと cc が復元され、f(1)=5f(1) = 5, f(3)=4f(3) = 4 から f(x)=2+3xf(x) = 2 + 3x を得る。

注意

誤りが tt 個を超えると、復号器は失敗を報告することもあれば、別の符号語を出力して気づかないこともある。例 6.23 の cc に 3 個の誤りを加える 20⋅63=432020 \cdot 6^3 = 4320 通りを調べると、PGZ 法は 3960 通りで失敗を報告し、360 通りで別の符号語を出力した(計算機で確かめた。手順 6 の確認を省くと、3960 通りのうち 360 通りでは、失敗を報告せずに符号語でない語を出力してしまう)。たとえば第 0, 2, 5 成分に 11 を加えると、Λ(x)=1+x+4x2\Lambda(x) = 1 + x + 4x^2 は F7\mathbb{F}_7 に根をもたず、失敗が検出される。上位の層で誤り検出(CRC など)を併用するのはこのためである。

注意 6.24(実用の復号法。概略)S(x)=∑j=12tSjxj−1S(x) = \sum_{j=1}^{2t} S_jx^{j-1}, Ω(x)=∑lYlXl∏k≠l(1−Xkx)\Omega(x) = \sum_l Y_lX_l\prod_{k \neq l}(1 - X_kx) とおくと、S(x)≡∑lYlXl/(1−Xlx)(modx2t)S(x) \equiv \sum_l Y_lX_l/(1 - X_lx) \pmod{x^{2t}} から Λ(x)S(x)≡Ω(x)(modx2t)\Lambda(x)S(x) \equiv \Omega(x) \pmod{x^{2t}} が従い、その係数を比べたものが補題 6.20 である。実用の復号器は、この合同式をみたす Λ\Lambda をバーレカンプ–マッシー法(1968・1969 年)や拡張ユークリッド互除法(杉山ら, 1975 年)で O(t2)O(t^2) 回程度の演算で求め、誤りの値をフォーニーの公式 Yl=−Ω(Xl−1)/Λ′(Xl−1)Y_l = -\Omega(X_l^{-1})/\Lambda'(X_l^{-1}) で求める(例 6.23 では Ω(x)=2+4x\Omega(x) = 2 + 4x で、同じ値になる)。これらの正しさの証明は省略する(Roth の教科書を参照)。

6.6 応用

実用のリード–ソロモン符号の多くは F28\mathbb{F}_{2^8} 上のもので、1 バイトを 1 記号として扱う。記号単位で訂正するので、連続する 8 ビット以内のバースト誤りは高々 2 個の記号の誤りにすぎない。さらに複数の符号語の記号を交互に並べるインターリーブ (interleaving) を使うと、DD 個の符号語を交互に送る場合、長さ LL 記号のバーストは各符号語に高々 ⌈L/D⌉\lceil L/D \rceil 個の誤りしか与えない。

  • QR コード(規格 ISO/IEC 18004)は、F28=F2[x]/(x8+x4+x3+x2+1)\mathbb{F}_{2^8} = \mathbb{F}_2[x]/(x^8 + x^4 + x^3 + x^2 + 1) 上のリード–ソロモン符号を使う(この多項式が原始多項式であることは計算機で確かめた)。誤り訂正レベルは L, M, Q, H の 4 段階で、それぞれ符号語のおよそ 7%, 15%, 25%, 30% を復元できるとされる。レベルを上げるほど検査記号が増え、入るデータは減る。
  • CD(規格 IEC 60908)の CIRC(cross-interleaved Reed–Solomon code)は、F28\mathbb{F}_{2^8} 上の 2 つの短縮 RS 符号 [32,28,5][32, 28, 5] と [28,24,5][28, 24, 5](どちらも [255,251,5][255, 251, 5] の RS 符号を短縮したもの)を、インターリーブをはさんで組み合わせる。ここで、線形符号の、特定の位置が 00 の符号語だけを集めてその位置を除くことを短縮という。[n,k,n−k+1][n, k, n - k + 1] の MDS 符号(k≥2k \geq 2)を短縮すると、重みは変わらないので最小距離は減らず、次元はちょうど k−1k - 1 になる(減らないとすると、その位置はどの符号語でも 00 で、それを除いた [n−1,k,n−k+1][n - 1, k, n - k + 1] 符号がシングルトン限界に反する)。よって、シングルトン限界から [n−1,k−1,n−k+1][n - 1, k - 1, n - k + 1] の MDS 符号になる。よく使われる復号法では、内側の符号で訂正しきれなかった記号を消失として外側の符号に渡す。
  • DVD(DVD-ROM の規格 ECMA-267)では、F28\mathbb{F}_{2^8} 上の短縮 RS 符号 [182,172,11][182, 172, 11] と [208,192,17][208, 192, 17] を、データを並べた表の行と列にそれぞれ使う積符号 (product code) で誤りを訂正する。
  • RAID 6 は、nn 台のデータディスクに 2 台の検査用ディスクを加え、どの 2 台が同時に故障しても復元できるようにする。Linux カーネルの実装では、各バイトを QR コードと同じ F28\mathbb{F}_{2^8} の元とみて、g=x‾g = \overline{x}, n≤255n \leq 255 として P=∑iDiP = \sum_i D_i, Q=∑igiDiQ = \sum_i g^iD_i を記録する。これは [n+2,n,3][n + 2, n, 3] の MDS 符号である(問題 6.5)。
  • 分散ストレージでは、データを kk 個の断片に分け、MDS 符号で nn 個の断片に符号化して別々のサーバーに置く。どの kk 個からも復元できるので(定理 6.17)、n−kn - k 台までの故障に耐える。(n,k)=(9,6)(n, k) = (9, 6) なら容量 1.5 倍で 3 台の故障に耐える(3 重の複製は容量 3 倍で 2 台まで)。ただし素朴な方法では、失った 1 個の断片を作り直すのにも kk 個の断片を読む必要がある(複製なら 1 個で済む)。

ヒント

実務では 符号のパラメータは、想定する誤りのモデル(ランダムな誤りか、バーストか、位置のわかる消失か)から決める。消失は誤りの半分の冗長性で直せる(第5章 問題 5.4)ので、故障したディスクのように位置がわかるなら、その情報を復号器に渡すべきである。また RAID 6 が保証するのは「同時に 2 台までの故障」からの復元であり、誤操作による削除や、ソフトウェアの不具合で書かれた誤ったデータは検査用ディスクにもそのまま反映される。冗長化はバックアップの代わりにならない。

6.7 CRC:誤り検出

04-algebra 第11章 11.10 節の CRC(巡回冗長検査)を、巡回符号の言葉で見直す。ビット列を F2[x]\mathbb{F}_2[x] の多項式とみて(左端を最高次)、rr 次の生成多項式 GG(G(0)=1G(0) = 1)を決める。メッセージ MM に対し、xrMx^rM を GG で割った余り RR を付けた T=xrM+RT = x^rM + R を送り、受信側は受け取った多項式が GG で割り切れるかを調べる。これは例 6.10 の組織的な符号化と同じ計算で、G=x3+x+1G = x^3 + x + 1, M=1101M = 1101 なら R=001R = 001、送信列 11010011101001 は例 6.10 の符号語 1+x3+x5+x61 + x^3 + x^5 + x^6 を高次から並べたものである。G∣xe−1G \mid x^e - 1 となる最小の ee をとると(G(0)=1G(0) = 1 より存在する)、長さ ee 以下の送信列の全体は、長さ ee の巡回符号 (G)(G) を短縮したものになる。

誤りのパターンを EE(反転したビットを多項式とみたもの)とすると、誤りを見逃すのは G∣EG \mid E のときに限る。04 第11章 命題 11.22 では、長さ rr 以下のバースト誤り、(x+1)∣G(x + 1) \mid G のときの奇数個の誤り、間隔が ee 未満の 2 ビットの誤りが検出されることを示した。バースト誤りについては、もう一歩正確に言える。

定理 6.25(CRC のバースト誤り検出)G∈F2[x]G \in \mathbb{F}_2[x] を rr 次(r≥1r \geq 1)で G(0)=1G(0) = 1 とする。送信列に収まる E=xiBE = x^iB(deg⁡B=b−1\deg B = b - 1, B(0)=1B(0) = 1)の形の誤り、すなわち反転した最初と最後のビットを含む区間の長さが bb の誤りを、長さ bb のバースト誤り (burst error) という。

  1. b≤rb \leq r なら、長さ bb のバースト誤りはすべて検出される。
  2. 開始位置 ii を固定すると、長さ r+1r + 1 のバースト誤り 2r−12^{r-1} 通りのうち、検出されないのは E=xiGE = x^iG の 1 通りだけである。
  3. b≥r+2b \geq r + 2 なら、開始位置 ii を固定した長さ bb のバースト誤り 2b−22^{b-2} 通りのうち、検出されないのはちょうど 2b−r−22^{b-r-2} 通りである。

証明. G(0)=1G(0) = 1 より gcd⁡(G,xi)=1\gcd(G, x^i) = 1 なので、G∣xiB  ⟺  G∣BG \mid x^iB \iff G \mid B。長さ b≥2b \geq 2 の BB は、定数項と xb−1x^{b-1} の係数が 11 で、間の b−2b - 2 個が自由なので 2b−22^{b-2} 通りある。(1) B≠0B \neq 0, deg⁡B<r\deg B < r なら G∤BG \nmid B。(2) deg⁡B=r\deg B = r で G∣BG \mid B なら B=GB = G で、GG は G(0)=1G(0) = 1 をみたす。(3) G∣BG \mid B なら B=GQB = GQ, deg⁡Q=b−1−r≥1\deg Q = b - 1 - r \geq 1, Q(0)=B(0)=1Q(0) = B(0) = 1。逆にこの形の QQ から作った B=GQB = GQ は条件をみたす。そのような QQ は、最高次と定数項の係数が 11 で間の b−r−2b - r - 2 個が自由なので 2b−r−22^{b-r-2} 通り。□\square

バーストの中身が一様にランダムだと仮定すれば、見逃す確率は b=r+1b = r + 1 で 2−(r−1)2^{-(r-1)}、b≥r+2b \geq r + 2 で 2−r2^{-r} になる。この確率は「中身が一様」という仮定のもとでの値である。G=x4+x+1G = x^4 + x + 1 と (x+1)(x3+x+1)(x + 1)(x^3 + x + 1) について、開始位置 00、b≤9b \leq 9 のバーストをすべて調べても定理の通りの個数になる(計算機で確かめた)。

イーサネット(IEEE 802.3)、ZIP、PNG などで使われる CRC-32 の生成多項式 G=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1G = x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 は原始多項式である(xx の位数が 232−12^{32} - 1 であることを計算機で確かめた)。したがって長さ 32 以下のバーストと、長さ 232−12^{32} - 1 以下の送信列での 2 ビットの誤りをすべて検出する。G(1)=1G(1) = 1 なので、奇数個の誤りの検出は 04 第11章 命題 11.22(2) からは保証されない。

実際の CRC-32 には、(i) 各バイトの下位ビットを高次の係数とみる(GG のビットを逆順にした定数 0xEDB88320 を使う)、(ii) 初期値を全ビット 11 にする、(iii) 最後に全ビットを反転する、という約束がある。(ii) は、先頭に 00 のビットが加わっても値が変わらないという素朴な CRC の欠点を補う。長さを固定すると CRC は線形写像に定数を加えた写像になり、crc⁡(m⊕Δ)=crc⁡(m)⊕crc⁡(Δ)⊕crc⁡(0)\operatorname{crc}(m \oplus \Delta) = \operatorname{crc}(m) \oplus \operatorname{crc}(\Delta) \oplus \operatorname{crc}(0)(⊕\oplus はビットごとの排他的論理和、00 は同じ長さの零ビット列)が成り立つので、誤りを見逃す条件は mm によらず、素朴な割り算の場合と同じである。次のコードで、ビットごとの計算が zlib.crc32 と一致することと、この等式を確かめる。

import zlib

def crc32(data: bytes) -> int:
    crc = 0xFFFFFFFF                      # 初期値(全ビット 1)
    for byte in data:
        crc ^= byte
        for _ in range(8):                # 1 ビットずつ G で割る(ビットの並びは逆順)
            crc = (crc >> 1) ^ (0xEDB88320 if crc & 1 else 0)
    return crc ^ 0xFFFFFFFF               # 最後に全ビットを反転

m = b"123456789"
print(hex(crc32(m)), hex(zlib.crc32(m)))
d = bytes([0, 0, 0, 0, 0x10, 0, 0, 0, 0])            # 5 バイト目の 1 ビットを反転する差分
x = bytes(a ^ b for a, b in zip(m, d))
print(hex(crc32(x) ^ crc32(m)), hex(crc32(d) ^ crc32(bytes(9))))
0xcbf43926 0xcbf43926
0x60e09782 0x60e09782

1 行目の 0xcbf43926 は CRC-32 の検査値としてよく知られた値である。2 行目は、mm を知らなくても差分 Δ\Delta だけから CRC の変化が計算できることを示している。

注意

CRC は偶然の誤りを検出するためのもので、改ざんの検出には使えない。上の等式から、攻撃者はメッセージの中身を知らなくても、好きなビットを反転させたうえで CRC を正しく直せる。無線 LAN の旧方式 WEP は、暗号化したデータの完全性を CRC-32 で守ろうとして、この種の攻撃を受けた(2001 年に指摘された)。改ざんの検出には、鍵を使うメッセージ認証符号(第7章の HMAC など)やデジタル署名を使う。

まとめ

  • gcd⁡(n,q)=1\gcd(n, q) = 1 なら xn−1x^n - 1 は重根をもたず、円分剰余類ごとの最小多項式 MsM_s の積に分解する。
  • 巡回符号は Fq[x]/(xn−1)\mathbb{F}_q[x]/(x^n - 1) のイデアルで、xn−1x^n - 1 のモニックな約数(生成多項式 gg)と 1 対 1 に対応し、次元は n−deg⁡gn - \deg g。この対応に gcd⁡(n,q)=1\gcd(n, q) = 1 は要らないが、個数の数え方・零点による記述・BCH 限界には要る。
  • BCH 限界:連続する βb,…,βb+δ−2\beta^b, \dots, \beta^{b+\delta-2} を零点にもつ巡回符号の最小距離は δ\delta 以上(ヴァンデルモンドの行列式)。
  • リード–ソロモン符号は [n,k,n−k+1][n, k, n - k + 1] の MDS 符号で、n=q−1n = q - 1 なら零点 β,…,βn−k\beta, \dots, \beta^{n-k} の巡回符号になる。
  • PGZ 法は tt 個以下の誤りを必ず正しく直す。tt 個を超えると失敗や誤訂正が起こる。
  • 1 バイトを 1 記号とする RS 符号とインターリーブはバーストや消失に強く、QR コード、CD・DVD、RAID 6、分散ストレージで使われている。
  • CRC は短縮した巡回符号で、rr 次の GG(G(0)=1G(0) = 1)は長さ rr 以下のバーストをすべて検出し、長さ r+1r + 1 では 2−(r−1)2^{-(r-1)}、それより長いと 2−r2^{-r} の割合のバーストを見逃す。CRC はアフィンなので改ざん検出には使えない。

演習問題

問題 6.1 ★ F2\mathbb{F}_2 上で x9−1x^9 - 1 を円分剰余類を使って既約分解し、長さ 9 の 2 元巡回符号の個数と、とりうる次元をすべて求めよ。

解答

21,…,26 mod 92^1, \dots, 2^6 \bmod 9 は 2,4,8,7,5,12, 4, 8, 7, 5, 1 なので m=6m = 6。円分剰余類は {0}\lbrace 0 \rbrace, {1,2,4,8,7,5}\lbrace 1, 2, 4, 8, 7, 5 \rbrace, {3,6}\lbrace 3, 6 \rbrace で、既約因子の次数は 1,6,21, 6, 2 である。x9−1=(x3−1)(x6+x3+1)x^9 - 1 = (x^3 - 1)(x^6 + x^3 + 1), x3−1=(x+1)(x2+x+1)x^3 - 1 = (x + 1)(x^2 + x + 1) なので、定理 6.3 より 6 次の既約因子は x6+x3+1x^6 + x^3 + 1 で、x9−1=(x+1)(x2+x+1)(x6+x3+1)x^9 - 1 = (x + 1)(x^2 + x + 1)(x^6 + x^3 + 1)。巡回符号は 23=82^3 = 8 個({0}\lbrace 0 \rbrace と全体を含む)。生成多項式の次数は {1,2,6}\lbrace 1, 2, 6 \rbrace の部分集合の和 0,1,2,3,6,7,8,90, 1, 2, 3, 6, 7, 8, 9 なので、次元は 9,8,7,6,3,2,1,09, 8, 7, 6, 3, 2, 1, 0。

問題 6.2 ★ 例 6.4(1) の β=α\beta = \alpha を使う。BCH 限界を使って、長さ 7 の 2 元巡回符号のうち、生成多項式が x3+x+1x^3 + x + 1, (x+1)(x3+x+1)(x + 1)(x^3 + x + 1), (x3+x+1)(x3+x2+1)(x^3 + x + 1)(x^3 + x^2 + 1) のものの最小距離が、それぞれ 3, 4, 7 以上であることを示せ。

解答

定義集合はそれぞれ C1={1,2,4}C_1 = \lbrace 1, 2, 4 \rbrace, C0∪C1={0,1,2,4}C_0 \cup C_1 = \lbrace 0, 1, 2, 4 \rbrace, C1∪C3={1,…,6}C_1 \cup C_3 = \lbrace 1, \dots, 6 \rbrace である(命題 6.11)。連続する零点の指数は {1,2}\lbrace 1, 2 \rbrace, {0,1,2}\lbrace 0, 1, 2 \rbrace(b=0b = 0), {1,…,6}\lbrace 1, \dots, 6 \rbrace を含むので、定理 6.13 より最小距離はそれぞれ 3,4,73, 4, 7 以上である。例 6.9 の表のとおり、どれも等号が成り立つ。

問題 6.3 ★★ 1 個の誤りだけを訂正する場合(t=1t = 1)、PGZ 法は「X=S2/S1X = S_2/S_1, Y=S12/S2Y = S_1^2/S_2」となることを示せ。これを使って、F8\mathbb{F}_8(例 6.4(1) の α\alpha)上の [7,5,3][7, 5, 3] リード–ソロモン符号(零点 α,α2\alpha, \alpha^2)で、受信語 r=(α3,α6,α5,1,0,α2,0)r = (\alpha^3, \alpha^6, \alpha^5, 1, 0, \alpha^2, 0) を復号せよ。

解答

誤りが 1 個なら S1=YXS_1 = YX, S2=YX2S_2 = YX^2 で、X,Y≠0X, Y \neq 0 なので X=S2/S1X = S_2/S_1, Y=S12/S2Y = S_1^2/S_2(手順 3 は S1Λ1=−S2S_1\Lambda_1 = -S_2 で、Λ(x)=1−(S2/S1)x\Lambda(x) = 1 - (S_2/S_1)x の根の逆数が XX)。

04 第8章 例 8.42 の表(α3=α+1\alpha^3 = \alpha + 1, α4=α2+α\alpha^4 = \alpha^2 + \alpha, α5=α2+α+1\alpha^5 = \alpha^2 + \alpha + 1, α6=α2+1\alpha^6 = \alpha^2 + 1, α7=1\alpha^7 = 1)を使うと

S1=r(α)=α3+α7+α7+α3+α7=1,S2=r(α2)=α3+α8+α9+α6+α12=(α+1)+α+α2+(α2+1)+(α2+α+1)=α5\begin{aligned} S_1 &= r(\alpha) = \alpha^3 + \alpha^7 + \alpha^7 + \alpha^3 + \alpha^7 = 1, \\ S_2 &= r(\alpha^2) = \alpha^3 + \alpha^8 + \alpha^9 + \alpha^6 + \alpha^{12} = (\alpha + 1) + \alpha + \alpha^2 + (\alpha^2 + 1) + (\alpha^2 + \alpha + 1) = \alpha^5 \end{aligned}

よって X=α5X = \alpha^5(第 5 成分)、Y=α−5=α2Y = \alpha^{-5} = \alpha^2。第 5 成分から α2\alpha^2 を引いて c=(α3,α6,α5,1,0,0,0)c = (\alpha^3, \alpha^6, \alpha^5, 1, 0, 0, 0)。検算:これは (1+x)(x+α)(x+α2)=(1+x)(x2+α4x+α3)(1 + x)(x + \alpha)(x + \alpha^2) = (1 + x)(x^2 + \alpha^4x + \alpha^3) の係数に等しい。

問題 6.4 ★★★ 例 6.15 の 2 元 BCH 符号 [15,7,5][15, 7, 5] で 2 個の誤りを訂正する。

  1. 2 元の場合 S2=S12S_2 = S_1^2 であることを示し、誤りがちょうど 2 個なら Λ(x)=1+S1x+S3+S13S1x2\Lambda(x) = 1 + S_1x + \dfrac{S_3 + S_1^3}{S_1}x^2 となることを示せ。
  2. 受信語 r(x)=1+x2+x4+x6+x7+x8+x10r(x) = 1 + x^2 + x^4 + x^6 + x^7 + x^8 + x^{10} を復号せよ(F16\mathbb{F}_{16} の表は 04 第11章 例 11.1(2))。
解答
  1. rr の係数は F2\mathbb{F}_2 に属するので r(a)2=r(a2)r(a)^2 = r(a^2)、よって S2=S12S_2 = S_1^2。誤りが 2 個なら Yl=1Y_l = 1 で、S1=X1+X2S_1 = X_1 + X_2, S3=X13+X23S_3 = X_1^3 + X_2^3。標数 2 では (X1+X2)3=X13+X23+X1X2(X1+X2)(X_1 + X_2)^3 = X_1^3 + X_2^3 + X_1X_2(X_1 + X_2) なので S13=S3+X1X2S1S_1^3 = S_3 + X_1X_2S_1。X1≠X2X_1 \neq X_2 より S1≠0S_1 \neq 0 で、X1X2=(S3+S13)/S1X_1X_2 = (S_3 + S_1^3)/S_1。Λ(x)=1+(X1+X2)x+X1X2x2\Lambda(x) = 1 + (X_1 + X_2)x + X_1X_2x^2 から主張が従う。
  2. αk\alpha^k を 4 桁の 2 進数(α3,α2,α,1\alpha^3, \alpha^2, \alpha, 1 の係数)で表す。S1=α0+α2+α4+α6+α7+α8+α10S_1 = \alpha^0 + \alpha^2 + \alpha^4 + \alpha^6 + \alpha^7 + \alpha^8 + \alpha^{10} は 0001⊕0100⊕0011⊕1100⊕1011⊕0101⊕0111=0011=α40001 \oplus 0100 \oplus 0011 \oplus 1100 \oplus 1011 \oplus 0101 \oplus 0111 = 0011 = \alpha^4。S3=r(α3)S_3 = r(\alpha^3) の指数 0,6,12,18,21,24,300, 6, 12, 18, 21, 24, 30 を 15 で割った余りは 0,6,12,3,6,9,00, 6, 12, 3, 6, 9, 0 で、同じ指数の 2 項は打ち消し合うので S3=α12+α3+α9=1111⊕1000⊕1010=1101=α13S_3 = \alpha^{12} + \alpha^3 + \alpha^9 = 1111 \oplus 1000 \oplus 1010 = 1101 = \alpha^{13}。S13=α12S_1^3 = \alpha^{12} より S3+S13=1101⊕1111=0010=αS_3 + S_1^3 = 1101 \oplus 1111 = 0010 = \alpha、Λ2=α/α4=α12\Lambda_2 = \alpha/\alpha^4 = \alpha^{12}。α2+α10=0100⊕0111=α4\alpha^2 + \alpha^{10} = 0100 \oplus 0111 = \alpha^4, α2α10=α12\alpha^2\alpha^{10} = \alpha^{12} なので Λ(x)=(1+α2x)(1+α10x)\Lambda(x) = (1 + \alpha^2x)(1 + \alpha^{10}x) で、誤りは第 2 成分と第 10 成分である。訂正すると c(x)=1+x4+x6+x7+x8=g(x)c(x) = 1 + x^4 + x^6 + x^7 + x^8 = g(x) で、確かに符号語である。

問題 6.5 ★★ g∈F28g \in \mathbb{F}_{2^8} の位数を 255 とし、n≤255n \leq 255 とする。データ D0,…,Dn−1∈F28D_0, \dots, D_{n-1} \in \mathbb{F}_{2^8} に P=∑iDiP = \sum_i D_i, Q=∑igiDiQ = \sum_i g^iD_i を加えた (D0,…,Dn−1,P,Q)(D_0, \dots, D_{n-1}, P, Q) 全体は [n+2,n,3][n + 2, n, 3] の MDS 符号であることを示せ。また、データ Dx,DyD_x, D_y(x≠yx \neq y)が同時に失われたときの復元の式を求めよ。

解答

標数 2 なので、条件は ∑iDi+P=0\sum_i D_i + P = 0, ∑igiDi+Q=0\sum_i g^iD_i + Q = 0 で、検査行列の列は (1,gi)⊤(1, g^i)^{\top}(0≤i<n0 \leq i < n)、(1,0)⊤(1, 0)^{\top}、(0,1)⊤(0, 1)^{\top} である。データの列どうしは det⁡=gj−gi≠0\det = g^j - g^i \neq 0(0≤i<j<2550 \leq i < j < 255 で gg の位数は 255)、データと PP の列は det⁡=−gi≠0\det = -g^i \neq 0、残りの組は det⁡=±1\det = \pm 1 なので、どの 2 本の列も一次独立である。第5章 定理 5.13 より d≥3=(n+2)−n+1d \geq 3 = (n + 2) - n + 1 で MDS 符号であり、2 個の消失を訂正できる。

残ったデータから P′=P+∑i≠x,yDi=Dx+DyP' = P + \sum_{i \neq x, y} D_i = D_x + D_y, Q′=Q+∑i≠x,ygiDi=gxDx+gyDyQ' = Q + \sum_{i \neq x, y} g^iD_i = g^xD_x + g^yD_y を計算すると、gyP′+Q′=(gx+gy)Dxg^yP' + Q' = (g^x + g^y)D_x なので

Dx=gyP′+Q′gx+gy,Dy=P′+DxD_x = \frac{g^yP' + Q'}{g^x + g^y}, \qquad D_y = P' + D_x

(gx+gy≠0g^x + g^y \neq 0)。データと PP が失われたら QQ から、データと QQ なら PP から復元し、PP と QQ なら再計算すればよい。

問題 6.6 ★★ ファームウェアの更新ファイルに CRC-32 を付け、機器は CRC が一致したものだけを書き込む、という設計で「改ざんも防げる」と説明された。この説明の誤りを、6.7 節の等式を使って指摘せよ。CRC を含むデータ全体を、鍵ストリームとの排他的論理和で暗号化した(ストリーム暗号)場合はどうか。

解答

CRC の計算方法は公開されていて鍵を使わないので、攻撃者は改ざんしたファイルの CRC を計算し直して付ければよい。中身を知らなくても、差分 Δ\Delta を加えた m⊕Δm \oplus \Delta の CRC は crc⁡(m)⊕crc⁡(Δ)⊕crc⁡(0)\operatorname{crc}(m) \oplus \operatorname{crc}(\Delta) \oplus \operatorname{crc}(0) で、Δ\Delta だけから計算できる。CRC は偶然の誤りの検出にしか役立たない。

ストリーム暗号で暗号化しても防げない。暗号文のビットを反転すると、復号後の平文の同じビットが反転するので、攻撃者は平文に差分 Δ\Delta を加え、暗号化された CRC の部分を crc⁡(Δ)⊕crc⁡(0)\operatorname{crc}(\Delta) \oplus \operatorname{crc}(0) だけ反転させればよい。復号後の CRC は改ざん後のデータと一致する(WEP が受けた攻撃と同じ原理)。改ざん検出には、メッセージ認証符号やデジタル署名(ファームウェアなら署名の検証)が必要である。

この章を読み終えたら

「読了」にすると、学習記録と地図に反映されます。

この章の誤りを報告GitHub で見る