この 章の 目標
巡回符号を F q [ x ] / ( x n − 1 ) \mathbb{F}_q[x]/(x^n - 1) F q [ x ] / ( x n − 1 ) の イデアルと して 扱い、生成多項式と 次元を 求められる。 gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 の 仮定が どこで 必要かを 説明できる
円分剰余類を 使って x n − 1 x^n - 1 x 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 を 見る。
本章では q q q は 標数 p p p の 素数べきと する。
6.1 有限体の 復習と x n − 1 x^n - 1 x n − 1 の 分解
04-algebra 第8章 より、q q q 元体 F q \mathbb{F}_q F q は 同型を 除いてただ 一つで、 F q m \mathbb{F}_{q^m} F q m は F q \mathbb{F}_q F q を 部分体と して 含み(定理 8.41)、 F q m × \mathbb{F}_{q^m}^\times F q m × は 位数 q m − 1 q^m - 1 q m − 1 の 巡回群である(04 第8章 定理 8.40)。 φ ( a ) = a q \varphi(a) = a^q φ ( a ) = a q は F q m \mathbb{F}_{q^m} F q m の 環準同型で( 04-algebra 第5章 命題 5.36 を 繰り返し使う)、 a q = a a^q = a a q = a と なるのは a ∈ F q a \in \mathbb{F}_q a ∈ F q の ときに 限る( x q − x x^q - x x q − x の 根は 高々 q q q 個で、F q \mathbb{F}_q F q の 元は すべて 根)。したがって f ∈ F q [ x ] f \in \mathbb{F}_q[x] f ∈ F q [ x ] なら f ( a ) q = f ( a q ) f(a)^q = f(a^q) f ( a ) q = f ( a q ) である。計算には、α = x ‾ \alpha = \overline{x} α = x が 乗法群の 生成元と なる F 8 = F 2 [ x ] / ( x 3 + x + 1 ) \mathbb{F}_8 = \mathbb{F}_2[x]/(x^3 + x + 1) F 8 = F 2 [ x ] / ( x 3 + x + 1 ) (04 第8章 例 8.42)と F 16 = F 2 [ x ] / ( x 4 + x + 1 ) \mathbb{F}_{16} = \mathbb{F}_2[x]/(x^4 + x + 1) F 16 = F 2 [ x ] / ( x 4 + x + 1 ) (04-algebra 第11章 例 11.1)の 表を 使う。
補題 6.1 (x n − 1 x^n - 1 x n − 1 の 根) n ≥ 1 n \geq 1 n ≥ 1 と する。
p ∤ n p \nmid n p ∤ n (すな わち gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 )なら x n − 1 x^n - 1 x n − 1 は 重根を もたない。 q m ≡ 1 ( m o d n ) q^m \equiv 1 \pmod n q m ≡ 1 ( mod n ) と なる 最小の m ≥ 1 m \geq 1 m ≥ 1 を とると、 F q m \mathbb{F}_{q^m} F q m は 位数 n n n の 元 β \beta β (1 の 原始 n n n 乗根)を 含み、 F q m [ x ] \mathbb{F}_{q^m}[x] F q m [ x ] で x n − 1 = ∏ i = 0 n − 1 ( x − β i ) x^n - 1 = \prod_{i=0}^{n-1}(x - \beta^i) x n − 1 = ∏ i = 0 n − 1 ( x − β i ) である。
p ∣ n p \mid n p ∣ n なら、n = p n ′ n = pn' n = p n ′ と して x n − 1 = ( x n ′ − 1 ) p x^n - 1 = (x^{n'} - 1)^p x n − 1 = ( x n ′ − 1 ) p であり、F q \mathbb{F}_q F q の どの 拡大体にも 位数 n n n の 元は ない。
証明. (1) ( x n − 1 ) ′ = n x n − 1 (x^n - 1)' = nx^{n-1} ( x n − 1 ) ′ = n x n − 1 で n ≠ 0 n \neq 0 n = 0 なので、その 根は 0 0 0 だけで、x n − 1 x^n - 1 x n − 1 の 根ではない。よって 重根は ない(04 第8章 命題 8.36(1))。 q q q は Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z の 単元なので m m m は 存在し、巡回群 F q m × \mathbb{F}_{q^m}^\times F q m × の 位数 q m − 1 q^m - 1 q m − 1 は n n n で 割り切れるから、生成元 γ \gamma γ に ついて β = γ ( q m − 1 ) / n \beta = \gamma^{(q^m - 1)/n} β = γ ( q m − 1 ) / n の 位数は n n n である。β 0 , … , β n − 1 \beta^0, \dots, \beta^{n-1} β 0 , … , β n − 1 は x n − 1 x^n - 1 x n − 1 の 相異なる n n n 個の 根なので、積の 式が 成り立つ。(2) 標数 p p p の 環 F q [ x ] \mathbb{F}_q[x] F q [ x ] で ( x n ′ − 1 ) p = x n − 1 (x^{n'} - 1)^p = x^{n} - 1 ( x n ′ − 1 ) p = x n − 1 (04 第5章 命題 5.36)なので、x n − 1 x^n - 1 x n − 1 の 相異なる 根は n ′ n' n ′ 個以下である。位数 n n n の 元が あれば、そのべきが 相異なる n n n 個の 根に なってしまう。 □ \square □
定義 6.2 (円分剰余類, cyclotomic coset)gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 と する。 s ∈ Z / n Z s \in \mathbb{Z}/n\mathbb{Z} s ∈ Z / n Z に 対し C s = { s , s q , s q 2 , … } ⊂ Z / n Z C_s = \lbrace s, sq, sq^2, \dots \rbrace \subset \mathbb{Z}/n\mathbb{Z} C s = { s , s q , s q 2 , … } ⊂ Z / n Z を、n n n を 法と する q q q の 円分剰余類と いう。
j ↦ j q j \mapsto jq j ↦ j q は Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z の 全単射なので、 Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z は 円分剰余類に 分割される。 s q m = s sq^m = s s q m = s より ∣ C s ∣ ≤ m \lvert C_s \rvert \leq m ∣ C s ∣ ≤ m である。
定理 6.3 (x n − 1 x^n - 1 x n − 1 の 既約分解) gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 とし、β \beta β を 補題 6.1 の 元と する。 M s ( x ) = ∏ j ∈ C s ( x − β j ) M_s(x) = \prod_{j \in C_s}(x - \beta^j) M s ( x ) = ∏ j ∈ C s ( x − β j ) は β s \beta^s β s の F q \mathbb{F}_q F q 上の 最小多項式である。したがって、円分剰余類の 代表 s s s を 1 つずつとると、x n − 1 = ∏ s M s ( x ) x^n - 1 = \prod_s M_s(x) x n − 1 = ∏ s M s ( x ) が F q [ x ] \mathbb{F}_q[x] F q [ x ] に おける 既約分解である。
証明. φ \varphi φ を M s M_s M s の 係数に 施すと ∏ j ∈ C s ( x − β j q ) = M s \prod_{j \in C_s}(x - \beta^{jq}) = M_s ∏ j ∈ C s ( x − β j q ) = M s (j ↦ j q j \mapsto jq j ↦ j q は C s C_s C s の 置換)なので、 M s M_s M s の 係数は F q \mathbb{F}_q F q に 属する。 β s \beta^s β s の 最小多項式を M M M と すると、 M s ( β s ) = 0 M_s(\beta^s) = 0 M s ( β s ) = 0 より M ∣ M s M \mid M_s M ∣ M s (04 第8章 命題 8.7)。逆に j = s q i ∈ C s j = sq^i \in C_s j = s q i ∈ C s なら M ( β j ) = M ( β s ) q i = 0 M(\beta^j) = M(\beta^s)^{q^i} = 0 M ( β j ) = M ( β s ) q i = 0 なので、M s M_s M s の 相異なる 根は すべて M M M の 根であり、 M s ∣ M M_s \mid M M s ∣ M 。どちらも モニックなので M = M s M = M_s M = M s 。円分剰余類は Z / n Z \mathbb{Z}/n\mathbb{Z} Z / n Z を 分割するので、 ∏ s M s = ∏ i = 0 n − 1 ( x − β i ) = x n − 1 \prod_s M_s = \prod_{i=0}^{n-1}(x - \beta^i) = x^n - 1 ∏ s M s = ∏ i = 0 n − 1 ( x − β i ) = x n − 1 。□ \square □
例 6.4
q = 2 q = 2 q = 2 , n = 7 n = 7 n = 7 :m = 3 m = 3 m = 3 で、円分剰余類は { 0 } , { 1 , 2 , 4 } , { 3 , 6 , 5 } \lbrace 0 \rbrace, \lbrace 1, 2, 4 \rbrace, \lbrace 3, 6, 5 \rbrace { 0 } , { 1 , 2 , 4 } , { 3 , 6 , 5 } 。β = α \beta = \alpha β = α (α 3 = α + 1 \alpha^3 = \alpha + 1 α 3 = α + 1 )と すると M 1 = x 3 + x + 1 M_1 = x^3 + x + 1 M 1 = x 3 + x + 1 。M 3 M_3 M 3 の 根 α 3 , α 5 , α 6 \alpha^3, \alpha^5, \alpha^6 α 3 , α 5 , α 6 に ついて、表から 和は 1 1 1 、2 つずつの 積の 和は α 8 + α 9 + α 11 = α + α 2 + α 4 = 0 \alpha^8 + \alpha^9 + \alpha^{11} = \alpha + \alpha^2 + \alpha^4 = 0 α 8 + α 9 + α 11 = α + α 2 + α 4 = 0 、積は α 14 = 1 \alpha^{14} = 1 α 14 = 1 なので M 3 = x 3 + x 2 + 1 M_3 = x^3 + x^2 + 1 M 3 = x 3 + x 2 + 1 。よって x 7 − 1 = ( x + 1 ) ( x 3 + x + 1 ) ( x 3 + x 2 + 1 ) x^7 - 1 = (x + 1)(x^3 + x + 1)(x^3 + x^2 + 1) x 7 − 1 = ( x + 1 ) ( x 3 + x + 1 ) ( x 3 + x 2 + 1 ) 。
q = 2 q = 2 q = 2 , n = 15 n = 15 n = 15 :m = 4 m = 4 m = 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 { 0 } , { 1 , 2 , 4 , 8 } , { 3 , 6 , 12 , 9 } , { 5 , 10 } , { 7 , 14 , 13 , 11 } 。β = α \beta = \alpha β = α (α 4 = α + 1 \alpha^4 = \alpha + 1 α 4 = α + 1 )と すると M 1 = x 4 + x + 1 M_1 = x^4 + x + 1 M 1 = x 4 + x + 1 、M 3 = x 4 + x 3 + x 2 + x + 1 M_3 = x^4 + x^3 + x^2 + x + 1 M 3 = x 4 + x 3 + x 2 + x + 1 (α 3 \alpha^3 α 3 の 位数は 5)、 M 5 = x 2 + x + 1 M_5 = x^2 + x + 1 M 5 = x 2 + x + 1 (α 5 \alpha^5 α 5 の 位数は 3)、 M 7 = x 4 + x 3 + 1 M_7 = x^4 + x^3 + 1 M 7 = x 4 + x 3 + 1 である(計算機で 確かめた)。
6.2 巡回符号と イデアル
ベクトル ( c 0 , c 1 , … , c n − 1 ) ∈ F q n (c_0, c_1, \dots, c_{n-1}) \in \mathbb{F}_q^n ( c 0 , c 1 , … , c n − 1 ) ∈ F q n (成分の 番号は 0 0 0 から)を 多項式 c ( x ) = c 0 + c 1 x + ⋯ + c n − 1 x n − 1 c(x) = c_0 + c_1x + \cdots + c_{n-1}x^{n-1} c ( x ) = c 0 + c 1 x + ⋯ + c n − 1 x n − 1 と 同一視する。 F q [ x ] \mathbb{F}_q[x] F q [ x ] の 元は x n − 1 x^n - 1 x n − 1 で 割った 余りに よって 次数 n n n 未満の 多項式とただ 一つ 対応するので( 04-algebra 第5章 定理 5.28)、F q n \mathbb{F}_q^n F q n は 剰余環 R n = F q [ x ] / ( x n − 1 ) R_n = \mathbb{F}_q[x]/(x^n - 1) R n = F q [ x ] / ( x n − 1 ) と 同一視できる。 R n R_n R n では x n = 1 x^n = 1 x n = 1 なので、x x x 倍は 巡回シフト c 0 + ⋯ + c n − 1 x n − 1 ↦ c n − 1 + c 0 x + ⋯ + c n − 2 x n − 1 c_0 + \cdots + c_{n-1}x^{n-1} \mapsto c_{n-1} + c_0x + \cdots + c_{n-2}x^{n-1} c 0 + ⋯ + c n − 1 x n − 1 ↦ c n − 1 + c 0 x + ⋯ + c n − 2 x n − 1 である。
定義 6.5 (巡回符号, cyclic code)線形符号 C ⊂ F q n C \subset \mathbb{F}_q^n C ⊂ F q n が、( c 0 , … , c n − 1 ) ∈ C ⇒ ( c n − 1 , c 0 , … , c n − 2 ) ∈ C (c_0, \dots, c_{n-1}) \in C \Rightarrow (c_{n-1}, c_0, \dots, c_{n-2}) \in C ( c 0 , … , c n − 1 ) ∈ C ⇒ ( c n − 1 , c 0 , … , c n − 2 ) ∈ C を みたすとき、 C C C を 巡回符号と いう。本章では、巡回符号を 数える ときなどの 便宜の ため、 { 0 } \lbrace 0 \rbrace { 0 } も 巡回符号に 含める(第5章の 定義 5.9 では k ≥ 1 k \geq 1 k ≥ 1 と していた)。
命題 6.6 C ⊂ R n C \subset R_n C ⊂ R n が 巡回符号である ことと、 C C C が R n R_n R n の イデアルである ことは 同値である。
証明. イデアルは 定数倍で 閉じているので 部分 空間であり、 x x x 倍で 閉じている。逆に 巡回符号は x i x^i x i 倍で 閉じており、線形性から ∑ i a i x i \sum_i a_ix^i ∑ i a i x i 倍で 閉じている。 □ \square □
定理 6.7 (生成多項式, generator polynomial)C ≠ { 0 } C \neq \lbrace 0 \rbrace C = { 0 } を 長さ n n n の 巡回符号と する。
C C C の 0 0 0 でない 元(次数 n n n 未満の 多項式)の うち、次数が 最小の モニック多項式 g g g が ただ 一つ ある。これを C C C の 生成多項式と いう。
g g g は F q [ x ] \mathbb{F}_q[x] F q [ x ] に おいて x n − 1 x^n - 1 x n − 1 を 割り切る。
r = deg g r = \deg g r = deg g と すると C = { a ( x ) g ( x ) ∣ deg a < n − r } C = \lbrace a(x)g(x) \mid \deg a < n - r \rbrace C = { a ( x ) g ( x ) ∣ deg a < n − r } であり、g , x g , … , x n − r − 1 g g, xg, \dots, x^{n-r-1}g g , xg , … , x n − r − 1 g は C C C の 基底である。特に dim C = n − r \dim C = n - r dim C = n − r 。
逆に、x n − 1 x^n - 1 x n − 1 の モニックな 約数 g g g (r = deg g < n r = \deg g < n r = deg g < n )に ついて、(3) の 右辺は 生成多項式が g g g の 巡回符号である。
したがって、長さ n n n の 巡回符号と x n − 1 x^n - 1 x n − 1 の モニックな 約数は 1 対 1 に 対応する( { 0 } \lbrace 0 \rbrace { 0 } には x n − 1 x^n - 1 x n − 1 を 対応させる)。
証明. (1) 次数最小の 0 0 0 でない 元を 最高次の 係数で 割ればよい。そのような g , g ′ g, g' g , g ′ が 2 つ あれば、 g − g ′ ∈ C g - g' \in C g − g ′ ∈ C は 次数が より 低いので 0 0 0 。
(2) x n − 1 = Q g + ρ x^n - 1 = Qg + \rho x n − 1 = Q g + ρ (deg ρ < r \deg \rho < r deg ρ < r )と 割る。 R n R_n R n で ρ = − Q g \rho = -Qg ρ = − Q g であり、C C C は イデアルなので ρ ∈ C \rho \in C ρ ∈ C 。次数の 最小性より ρ = 0 \rho = 0 ρ = 0 。
(3) deg a < n − r \deg a < n - r deg a < n − r なら a g ag a g は 次数 n n n 未満で、R n R_n R n の 元 a ⋅ g ∈ C a \cdot g \in C a ⋅ g ∈ C その ものである。逆に c ∈ C c \in C c ∈ C を c = a g + ρ c = ag + \rho c = a g + ρ (deg ρ < r \deg \rho < r deg ρ < r )と 割ると、 deg a < n − r \deg a < n - r deg a < n − r なので a g ∈ C ag \in C a g ∈ C で、ρ = c − a g ∈ C \rho = c - ag \in C ρ = c − a g ∈ C から ρ = 0 \rho = 0 ρ = 0 。x i g x^ig x i g (0 ≤ i < n − r 0 \leq i < n - r 0 ≤ i < n − r )は 次数が 相異なるので 一次独立であり、 C C C を 張る。
(4) C g = { a g ∣ deg a < n − r } C_g = \lbrace ag \mid \deg a < n - r \rbrace C g = { a g ∣ deg a < n − r } は n − r n - r n − r 次元の 部分 空間である。 h = ( x n − 1 ) / g h = (x^n - 1)/g h = ( x n − 1 ) / g とし、a g ∈ C g ag \in C_g a g ∈ C g の a a a の x n − r − 1 x^{n-r-1} x n − r − 1 の 係数を a ′ a' a ′ と すると、 R n R_n R n で x ⋅ a g = x a g − a ′ ( x n − 1 ) = ( x a − a ′ h ) g x \cdot ag = xag - a'(x^n - 1) = (xa - a'h)g x ⋅ a g = x a g − a ′ ( x n − 1 ) = ( x a − a ′ h ) g であり、x a − a ′ h xa - a'h x a − a ′ h は x n − r x^{n-r} x n − r の 項が 消えて 次数 n − r n - r n − r 未満なので、これは C g C_g C g に 属する。よって C g C_g C g は 巡回符号で、 0 0 0 でない 元の 次数は r r r 以上だから 生成多項式は g g g 。(1)〜(4) より、C ↦ g C \mapsto g C ↦ g と g ↦ C g g \mapsto C_g g ↦ C g は 互いに 逆の 対応である。 □ \square □
個数 :gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 なら x n − 1 x^n - 1 x n − 1 は 相異なる モニック既約多項式 s s s 個の 積で、巡回符号は ちょうど 2 s 2^s 2 s 個ある。一般に x n − 1 = ∏ i f i e i x^n - 1 = \prod_i f_i^{e_i} x n − 1 = ∏ i f i e i なら ∏ i ( e i + 1 ) \prod_i(e_i + 1) ∏ i ( e i + 1 ) 個である。
零点に よる 記述 (命題 6.11):生成多項式が 相異なる x − β j x - \beta^j x − β j の 積に なり、符号が 条件「 c ( β j ) = 0 c(\beta^j) = 0 c ( β j ) = 0 」で 書ける。 p ∣ n p \mid n p ∣ n では これが 崩れる。たとえば q = 2 q = 2 q = 2 , n = 4 n = 4 n = 4 では x 4 − 1 = ( x + 1 ) 4 x^4 - 1 = (x + 1)^4 x 4 − 1 = ( x + 1 ) 4 で、生成多項式 ( x + 1 ) e (x + 1)^e ( x + 1 ) e (e = 1 , 2 , 3 e = 1, 2, 3 e = 1 , 2 , 3 )の 3 つの 符号 [ 4 , 3 , 2 ] [4, 3, 2] [ 4 , 3 , 2 ] , { 0000 , 1010 , 0101 , 1111 } \lbrace 0000, 1010, 0101, 1111 \rbrace { 0000 , 1010 , 0101 , 1111 } , { 0000 , 1111 } \lbrace 0000, 1111 \rbrace { 0000 , 1111 } は、どの 拡大体でも 零点が 1 1 1 だけで、零点では 区別できない。
BCH 限界 (定理 6.13):位数 n n n の 元 β \beta β が 必要で、それは p ∤ n p \nmid n p ∤ n の ときに しか 存在しない(補題 6.1)。
例 6.9 (長さ 7 の 2 元巡回符号)x 7 − 1 x^7 - 1 x 7 − 1 は 3 個の 既約因子を もつので(例 6.4)、2 元巡回符号は 2 3 = 8 2^3 = 8 2 3 = 8 個ある。{ 0 } \lbrace 0 \rbrace { 0 } 以外は 次の とおり(最小距離は 計算機で 確かめた)。
生成多項式
[ n , k , d ] [n, k, d] [ n , k , d ]
名前
1 1 1
[ 7 , 7 , 1 ] [7, 7, 1] [ 7 , 7 , 1 ]
全体
x + 1 x + 1 x + 1
[ 7 , 6 , 2 ] [7, 6, 2] [ 7 , 6 , 2 ]
偶数重みの 符号
x 3 + x + 1 x^3 + x + 1 x 3 + x + 1 または x 3 + x 2 + 1 x^3 + x^2 + 1 x 3 + x 2 + 1
[ 7 , 4 , 3 ] [7, 4, 3] [ 7 , 4 , 3 ]
ハミング符号
( x + 1 ) ( x 3 + x + 1 ) (x + 1)(x^3 + x + 1) ( x + 1 ) ( x 3 + x + 1 ) または ( x + 1 ) ( x 3 + x 2 + 1 ) (x + 1)(x^3 + x^2 + 1) ( x + 1 ) ( x 3 + x 2 + 1 )
[ 7 , 3 , 4 ] [7, 3, 4] [ 7 , 3 , 4 ]
( x 3 + x + 1 ) ( x 3 + x 2 + 1 ) (x^3 + x + 1)(x^3 + x^2 + 1) ( x 3 + x + 1 ) ( x 3 + x 2 + 1 )
[ 7 , 1 , 7 ] [7, 1, 7] [ 7 , 1 , 7 ]
繰り返し符号
g = x 3 + x + 1 g = x^3 + x + 1 g = x 3 + x + 1 は α \alpha α の 最小多項式なので、 c ∈ C ⟺ g ∣ c ⟺ ∑ i c i α i = 0 c \in C \iff g \mid c \iff \sum_i c_i\alpha^i = 0 c ∈ C ⟺ g ∣ c ⟺ ∑ i c i α i = 0 。α i \alpha^i α i を 基底 1 , α , α 2 1, \alpha, \alpha^2 1 , α , α 2 の 係数の 縦ベクトルと みると、これは H = ( α 0 α 1 ⋯ α 6 ) H = (\alpha^0 \ \alpha^1 \ \cdots \ \alpha^6) H = ( α 0 α 1 ⋯ α 6 ) を 検査行列と する 条件で、 H H H の 列は F 2 3 \mathbb{F}_2^3 F 2 3 の 0 0 0 でない ベクトル全部だから、 C C C は ハミング符号である(第5章 定義 5.19)。 m m m 次の 原始多項式に ついても 同様である。
例 6.10 (組織的な 符号化)情報 u ( x ) u(x) u ( x ) (deg u < n − r \deg u < n - r deg u < n − r )に 対し、 x r u ( x ) x^ru(x) x r u ( x ) を g g g で 割った 余り ρ ( x ) \rho(x) ρ ( x ) を 求めて c ( x ) = x r u ( x ) − ρ ( x ) c(x) = x^ru(x) - \rho(x) c ( x ) = x r u ( x ) − ρ ( x ) と すると、 c c c は g g g で 割り切れる 次数 n n n 未満の 多項式なので 符号語であり、 x r , … , x n − 1 x^r, \dots, x^{n-1} x r , … , x n − 1 の 係数は u u u の ままである。 g = x 3 + x + 1 g = x^3 + x + 1 g = x 3 + x + 1 , u ( x ) = 1 + x 2 + x 3 u(x) = 1 + x^2 + x^3 u ( x ) = 1 + x 2 + x 3 なら、g g g を 法と して x 3 ≡ x + 1 x^3 \equiv x + 1 x 3 ≡ x + 1 , x 5 ≡ x 2 + x + 1 x^5 \equiv x^2 + x + 1 x 5 ≡ x 2 + x + 1 , x 6 ≡ x 2 + 1 x^6 \equiv x^2 + 1 x 6 ≡ x 2 + 1 なので x 3 u ≡ 1 x^3u \equiv 1 x 3 u ≡ 1 で、c ( x ) = 1 + x 3 + x 5 + x 6 c(x) = 1 + x^3 + x^5 + x^6 c ( x ) = 1 + x 3 + x 5 + x 6 、すな わち c = ( 1 , 0 , 0 , 1 , 0 , 1 , 1 ) 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) u = ( 1 , 0 , 1 , 1 ) である。
6.3 BCH 符号と BCH 限界
この 節と 次の 2 節では gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 とし、β ∈ F q m \beta \in \mathbb{F}_{q^m} β ∈ F q m を 補題 6.1 の 1 の 原始 n n n 乗根と する。 β n = 1 \beta^n = 1 β n = 1 なので、c ∈ R n c \in R_n c ∈ R n に 対し c ( β j ) c(\beta^j) c ( β j ) は 代表の 選び方に よらない。
命題 6.11 (零点に よる 記述)巡回符号 C C C の 生成多項式を g g g とし、Z = { j ∈ Z / n Z ∣ g ( β j ) = 0 } Z = \lbrace j \in \mathbb{Z}/n\mathbb{Z} \mid g(\beta^j) = 0 \rbrace Z = { j ∈ Z / n Z ∣ g ( β j ) = 0 } (C C C の 定義集合)と する。 Z Z Z は 円分剰余類の 和集合で、 g = ∏ j ∈ Z ( x − β j ) g = \prod_{j \in Z}(x - \beta^j) g = ∏ j ∈ Z ( x − β j ) かつ C = { c ∈ R n ∣ c ( β j ) = 0 ( j ∈ Z ) } C = \lbrace c \in R_n \mid c(\beta^j) = 0 \ (j \in Z) \rbrace C = { c ∈ R n ∣ c ( β j ) = 0 ( j ∈ Z )} である。逆に、円分剰余類の 和集合 Z Z Z に ついて、 ∏ j ∈ Z ( x − β j ) \prod_{j \in Z}(x - \beta^j) ∏ j ∈ Z ( x − β j ) を 生成多項式と する n − ∣ Z ∣ n - \lvert Z \rvert n − ∣ Z ∣ 次元の 巡回符号が ある。
証明. g g g は 根が 相異なる x n − 1 = ∏ i ( x − β i ) x^n - 1 = \prod_i(x - \beta^i) x n − 1 = ∏ i ( x − β i ) を 割るので、 g = ∏ j ∈ Z ( x − β j ) g = \prod_{j \in Z}(x - \beta^j) g = ∏ j ∈ Z ( x − β j ) 。j ∈ Z j \in Z j ∈ Z なら g ( β j q ) = g ( β j ) q = 0 g(\beta^{jq}) = g(\beta^j)^q = 0 g ( β j q ) = g ( β j ) q = 0 なので、Z Z Z は 円分剰余類の 和集合である。次数 n n n 未満の c c c に ついて c ∈ C ⟺ g ∣ c c \in C \iff g \mid c c ∈ C ⟺ g ∣ c (定理 6.7(3))。g ∣ c g \mid c g ∣ c なら c ( β j ) = 0 c(\beta^j) = 0 c ( β j ) = 0 (j ∈ Z j \in Z j ∈ Z )。逆に これが 成り立てば、相異なる 1 次式 x − β j x - \beta^j x − β j が すべて c c c を 割るので F q m [ x ] \mathbb{F}_{q^m}[x] F q m [ x ] で g ∣ c g \mid c g ∣ c であり、F q [ x ] \mathbb{F}_q[x] F q [ x ] での 割り算の 商と 余りは F q m [ x ] \mathbb{F}_{q^m}[x] F q m [ x ] でも そのまま 商と 余りなので、 F q [ x ] \mathbb{F}_q[x] F q [ x ] でも g ∣ c g \mid c g ∣ c 。逆の 主張は、 ∏ j ∈ Z ( x − β j ) \prod_{j \in Z}(x - \beta^j) ∏ j ∈ Z ( x − β j ) が M s M_s M s たちの 積である こと(定理 6.3)と 定理 6.7(4) に よる。 □ \square □
定義 6.12 (BCH 符号)整数 b b b と 2 ≤ δ ≤ n 2 \leq \delta \leq n 2 ≤ δ ≤ n を とる。 b , b + 1 , … , b + δ − 2 b, b + 1, \dots, b + \delta - 2 b , b + 1 , … , b + δ − 2 を 含む 最小の 円分剰余類の 和集合を 定義集合と する 巡回符号、すな わち生成多項式が M b , … , M b + δ − 2 M_b, \dots, M_{b+\delta-2} M b , … , M b + δ − 2 の 最小公倍元である 巡回符号を、 設計距離 (designed distance) δ \delta δ の BCH 符号 と いう。 b = 1 b = 1 b = 1 の とき 狭義 (narrow-sense)、n = q m − 1 n = q^m - 1 n = q m − 1 の とき 原始的 (primitive) と いう。
BCH 符号の 名前は、独立に 見つけた Hocquenghem(1959 年)と Bose, Ray-Chaudhuri(1960 年)の 頭文字に よる。最小距離の 評価の 要は 次の 定理である。
定理 6.13 (BCH 限界, BCH bound)C C C を 長さ n n n の 巡回符号とし、ある 整数 b b b と δ ≥ 2 \delta \geq 2 δ ≥ 2 に ついて、すべての c ∈ C c \in C c ∈ C が c ( β b ) = c ( β b + 1 ) = ⋯ = c ( β b + δ − 2 ) = 0 c(\beta^b) = c(\beta^{b+1}) = \cdots = c(\beta^{b+\delta-2}) = 0 c ( β b ) = c ( β b + 1 ) = ⋯ = c ( β b + δ − 2 ) = 0 を みたすと する。この とき d ( C ) ≥ δ d(C) \geq \delta d ( C ) ≥ δ 。
証明. 重み w ≤ δ − 1 w \leq \delta - 1 w ≤ δ − 1 の 符号語 c ≠ 0 c \neq 0 c = 0 が あったとし、その 0 0 0 でない 成分の 位置を i 1 < ⋯ < i w i_1 < \cdots < i_w i 1 < ⋯ < i w (0 ≤ i k < n 0 \leq i_k < n 0 ≤ i k < n )、X k = β i k X_k = \beta^{i_k} X k = β i k と おく。 β \beta β の 位数は n n n なので X 1 , … , X w X_1, \dots, X_w X 1 , … , X w は 相異なり、 0 0 0 でない。j = 0 , 1 , … , w − 1 j = 0, 1, \dots, w - 1 j = 0 , 1 , … , w − 1 (≤ δ − 2 \leq \delta - 2 ≤ δ − 2 )に ついて
0 = c ( β b + j ) = ∑ k = 1 w c i k X k b + j 0 = c(\beta^{b+j}) = \sum_{k=1}^{w} c_{i_k}X_k^{b+j} 0 = c ( β b + j ) = k = 1 ∑ w c i k X k b + j
であり、これは V D v = 0 VDv = 0 V D v = 0 と 書ける。ここで v = ( c i 1 , … , c i w ) ⊤ v = (c_{i_1}, \dots, c_{i_w})^{\top} v = ( c i 1 , … , c i w ) ⊤ 、D = diag ( X 1 b , … , X w b ) D = \operatorname{diag}(X_1^b, \dots, X_w^b) D = diag ( X 1 b , … , X w b ) 、V = ( X k j ) 0 ≤ j < w , 1 ≤ k ≤ w V = (X_k^j)_{0 \leq j < w,\ 1 \leq k \leq w} V = ( X k j ) 0 ≤ j < w , 1 ≤ k ≤ w である。V V V の 転置は ヴァンデルモンド行列なので det V = ∏ k < l ( X l − X k ) ≠ 0 \det V = \prod_{k < l}(X_l - X_k) \neq 0 det V = ∏ k < l ( X l − X k ) = 0 (02-linear-algebra 第4章 定理 4.33, 定理 4.13)。det D ≠ 0 \det D \neq 0 det D = 0 なので v = 0 v = 0 v = 0 と なり、 c i k ≠ 0 c_{i_k} \neq 0 c i k = 0 に 反する。 □ \square □
系 6.14 設計距離 δ \delta δ の BCH 符号は、最小距離が δ \delta δ 以上、次元が n − m ( δ − 1 ) n - m(\delta - 1) n − m ( δ − 1 ) 以上である。q = 2 q = 2 q = 2 , b = 1 b = 1 b = 1 , δ = 2 t + 1 \delta = 2t + 1 δ = 2 t + 1 なら、次元は n − m t n - mt n − m t 以上である。
証明. 最小距離は 命題 6.11 と 定理 6.13 に よる。次元は n − ∣ Z ∣ n - \lvert Z \rvert n − ∣ Z ∣ で、Z Z Z は 高々 δ − 1 \delta - 1 δ − 1 個の 円分剰余類(それぞれ m m m 個以下の 元)の 和集合である。 q = 2 q = 2 q = 2 なら C 2 i = C i C_{2i} = C_i C 2 i = C i なので、1 , … , 2 t 1, \dots, 2t 1 , … , 2 t の 円分剰余類は 奇数 1 , 3 , … , 2 t − 1 1, 3, \dots, 2t - 1 1 , 3 , … , 2 t − 1 の 円分剰余類で 尽くされ、 ∣ Z ∣ ≤ m t \lvert Z \rvert \leq mt ∣ Z ∣ ≤ m t 。□ \square □
例 6.15 (長さ 15 の 2 元 BCH 符号)例 6.4(2) の β = α \beta = \alpha β = α を 使う。
δ = 3 \delta = 3 δ = 3 :定義集合 C 1 C_1 C 1 、g = M 1 = x 4 + x + 1 g = M_1 = x^4 + x + 1 g = M 1 = x 4 + x + 1 。[ 15 , 11 , 3 ] [15, 11, 3] [ 15 , 11 , 3 ] の ハミング符号である。
δ = 5 \delta = 5 δ = 5 :定義集合 C 1 ∪ C 3 = { 1 , 2 , 3 , 4 , 6 , 8 , 9 , 12 } C_1 \cup C_3 = \lbrace 1, 2, 3, 4, 6, 8, 9, 12 \rbrace C 1 ∪ C 3 = { 1 , 2 , 3 , 4 , 6 , 8 , 9 , 12 } 、g = M 1 M 3 = x 8 + x 7 + x 6 + x 4 + 1 g = M_1M_3 = x^8 + x^7 + x^6 + x^4 + 1 g = M 1 M 3 = x 8 + x 7 + x 6 + x 4 + 1 。[ 15 , 7 ] [15, 7] [ 15 , 7 ] 符号で d ≥ 5 d \geq 5 d ≥ 5 であり、g g g 自身が 重み 5 の 符号語なので d = 5 d = 5 d = 5 。
δ = 7 \delta = 7 δ = 7 :定義集合 C 1 ∪ C 3 ∪ C 5 C_1 \cup C_3 \cup C_5 C 1 ∪ C 3 ∪ C 5 、g = M 1 M 3 M 5 = x 10 + x 8 + x 5 + x 4 + x 2 + x + 1 g = M_1M_3M_5 = x^{10} + x^8 + x^5 + x^4 + x^2 + x + 1 g = M 1 M 3 M 5 = x 10 + x 8 + x 5 + x 4 + x 2 + x + 1 (重み 7)。[ 15 , 5 , 7 ] [15, 5, 7] [ 15 , 5 , 7 ] 符号である。
δ = 4 \delta = 4 δ = 4 と しても 定義集合は C 1 ∪ C 3 ⊃ { 1 , 2 , 3 , 4 } C_1 \cup C_3 \supset \lbrace 1, 2, 3, 4 \rbrace C 1 ∪ C 3 ⊃ { 1 , 2 , 3 , 4 } と なり、 δ = 5 \delta = 5 δ = 5 と 同じ 符号に なる。真の 最小距離が 設計距離より 大きいことも あるわけである。 [ 15 , 7 , 5 ] [15, 7, 5] [ 15 , 7 , 5 ] 符号は 2 個の 誤りを 訂正でき、第5章 例 5.27 の ハミング限界 k ≤ 8 k \leq 8 k ≤ 8 に 近い。
6.4 リード–ソロモン符号
定義 6.16 (リード–ソロモン符号, Reed–Solomon code)1 ≤ k ≤ n ≤ q 1 \leq k \leq n \leq q 1 ≤ k ≤ n ≤ q とし、相異なる α 1 , … , α n ∈ F q \alpha_1, \dots, \alpha_n \in \mathbb{F}_q α 1 , … , α n ∈ F q を とる。 RS k = { ( f ( α 1 ) , … , f ( α n ) ) ∣ f ∈ F q [ 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 RS k = {( f ( α 1 ) , … , f ( α n )) ∣ f ∈ F q [ x ] , deg f < k } (f = 0 f = 0 f = 0 を 含む)を リード–ソロモン符号と いう。
リードと ソロモンが 1960 年に 導入した。情報は k k k 個の 係数で、それを n n n 点での 値として 送る。
定理 6.17 RS k \operatorname{RS}_k RS k は [ n , k , n − k + 1 ] [n, k, n - k + 1] [ n , k , n − k + 1 ] 符号、すな わち MDS 符号である。さらに、どの k k k 個の 位置の 値からも 符号語が ただ 一つに 決まる。
証明. f ↦ ( f ( α 1 ) , … , f ( α n ) ) f \mapsto (f(\alpha_1), \dots, f(\alpha_n)) f ↦ ( f ( α 1 ) , … , f ( α n )) は k k k 次元の 空間 { f ∣ deg f < k } \lbrace f \mid \deg f < k \rbrace { f ∣ deg f < k } 上の 線形写像である。 f ≠ 0 f \neq 0 f = 0 の 根は 高々 k − 1 k - 1 k − 1 個なので(04-algebra 第5章 系 5.30)、像の 0 0 0 でない 成分は n − k + 1 n - k + 1 n − k + 1 個以上 ある。よって この 写像は 単射で dim RS k = k \dim \operatorname{RS}_k = k dim RS k = k 、最小距離は n − k + 1 n - k + 1 n − k + 1 以上であり、シングルトン限界(第5章 定理 5.23)より 等号が 成り立つ。 k k k 個の 位置で 一致する 2 つの 符号語は 高々 n − k < d n - k < d n − k < d 個の 位置でしか異ならないので 等しい。 □ \square □
最後の 主張は、 n − k n - k n − k 個までの 消失を 訂正できると いう ことである(第5章 定理 5.7(3))。値を 知っている k k k 点から ラグランジュ補間で f f f を 求めればよい。
定理 6.18 (巡回符号と しての リード–ソロモン符号) n = q − 1 n = q - 1 n = q − 1 とし、β \beta β を F q × \mathbb{F}_q^\times F q × の 生成元と する。評価点を 1 , β , … , β n − 1 1, \beta, \dots, \beta^{n-1} 1 , β , … , β n − 1 の 順に とり、成分の 番号を 0 0 0 から n − 1 n - 1 n − 1 と する(第 i i i 成分は f ( β i ) f(\beta^i) f ( β i ) )。この とき RS k \operatorname{RS}_k RS k は、生成多項式 g ( x ) = ∏ j = 1 n − k ( x − β j ) g(x) = \prod_{j=1}^{n-k}(x - \beta^j) g ( x ) = ∏ j = 1 n − k ( x − β j ) の 巡回符号に 等しい。これは m = 1 m = 1 m = 1 , b = 1 b = 1 b = 1 , 設計距離 n − k + 1 n - k + 1 n − k + 1 の BCH 符号である。
証明. f = ∑ l = 0 k − 1 f l x l f = \sum_{l=0}^{k-1} f_lx^l f = ∑ l = 0 k − 1 f l x l , c i = f ( β i ) c_i = f(\beta^i) c i = f ( β i ) と すると
c ( β j ) = ∑ i = 0 n − 1 f ( β i ) β i j = ∑ l = 0 k − 1 f l ∑ i = 0 n − 1 ( β l + j ) i c(\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 c ( β j ) = i = 0 ∑ n − 1 f ( β i ) β ij = l = 0 ∑ k − 1 f l i = 0 ∑ n − 1 ( β l + j ) i
である。1 ≤ j ≤ n − k 1 \leq j \leq n - k 1 ≤ j ≤ n − k なら 1 ≤ l + j ≤ n − 1 1 \leq l + j \leq n - 1 1 ≤ l + j ≤ n − 1 なので γ = β l + j ≠ 1 \gamma = \beta^{l+j} \neq 1 γ = β l + j = 1 で、γ n = 1 \gamma^n = 1 γ n = 1 より ∑ i = 0 n − 1 γ i = ( γ n − 1 ) / ( γ − 1 ) = 0 \sum_{i=0}^{n-1}\gamma^i = (\gamma^n - 1)/(\gamma - 1) = 0 ∑ i = 0 n − 1 γ i = ( γ n − 1 ) / ( γ − 1 ) = 0 。よって c ( β j ) = 0 c(\beta^j) = 0 c ( β j ) = 0 (1 ≤ j ≤ n − k 1 \leq j \leq n - k 1 ≤ j ≤ n − k )であり、命題 6.11 より RS k \operatorname{RS}_k RS k は 生成多項式 g g g の 巡回符号に 含まれる。次元は どちらも k k k なので 等しい。 m = 1 m = 1 m = 1 では 円分剰余類は 1 点ずつ( q ≡ 1 ( m o d n ) q \equiv 1 \pmod n q ≡ 1 ( mod n ) )なので、最後の 主張も 従う。 □ \square □
例 6.19 (F 7 \mathbb{F}_7 F 7 上の リード–ソロモン符号) q = 7 q = 7 q = 7 , n = 6 n = 6 n = 6 , β = 3 \beta = 3 β = 3 と する。 3 0 , … , 3 5 3^0, \dots, 3^5 3 0 , … , 3 5 は 1 , 3 , 2 , 6 , 4 , 5 1, 3, 2, 6, 4, 5 1 , 3 , 2 , 6 , 4 , 5 で、3 3 3 は F 7 × \mathbb{F}_7^\times F 7 × の 生成元である。 k = 2 k = 2 k = 2 と すると [ 6 , 2 , 5 ] [6, 2, 5] [ 6 , 2 , 5 ] 符号で、2 個の 誤りを 訂正できる。生成多項式は g ( x ) = ( x − 3 ) ( x − 2 ) ( x − 6 ) ( x − 4 ) = x 4 + 6 x 3 + 3 x 2 + 2 x + 4 g(x) = (x - 3)(x - 2)(x - 6)(x - 4) = x^4 + 6x^3 + 3x^2 + 2x + 4 g ( x ) = ( x − 3 ) ( x − 2 ) ( x − 6 ) ( x − 4 ) = x 4 + 6 x 3 + 3 x 2 + 2 x + 4 。情報 f ( x ) = 2 + 3 x f(x) = 2 + 3x f ( x ) = 2 + 3 x は 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 = ( f ( 1 ) , f ( 3 ) , f ( 2 ) , f ( 6 ) , f ( 4 ) , f ( 5 )) = ( 5 , 4 , 1 , 6 , 0 , 3 ) に 符号化され、実際 c ( x ) = 5 + 4 x + x 2 + 6 x 3 + 3 x 5 = ( 3 x + 3 ) g ( x ) c(x) = 5 + 4x + x^2 + 6x^3 + 3x^5 = (3x + 3)g(x) c ( x ) = 5 + 4 x + x 2 + 6 x 3 + 3 x 5 = ( 3 x + 3 ) g ( x ) である。どの 2 成 分からも f f f (2 点を 通る 直線)が 決まるので、4 個までの 消失を 訂正できる。
6.5 復号:ピーターソン–ゴレンシュタイン–ツィーラー法
t ≥ 1 t \geq 1 t ≥ 1 とし、C C C を、すべての 符号語が c ( β j ) = 0 c(\beta^j) = 0 c ( β j ) = 0 (1 ≤ j ≤ 2 t 1 \leq j \leq 2t 1 ≤ j ≤ 2 t )を みた す長さ n n n の 巡回符号と する(狭義の BCH 符号で δ ≥ 2 t + 1 \delta \geq 2t + 1 δ ≥ 2 t + 1 の もの、または n − k = 2 t n - k = 2t n − k = 2 t の 定理 6.18 の 符号)。BCH 限界より d ( C ) ≥ 2 t + 1 d(C) \geq 2t + 1 d ( C ) ≥ 2 t + 1 で、t t t 個までの 誤りが 訂正できるはずである。それを 実行する 手順を 作る。
符号語 c c c を 送り r = c + e r = c + e r = c + e を 受け取ったとする。 e e e の 0 0 0 でない 成分の 位置を i 1 , … , i ν i_1, \dots, i_\nu i 1 , … , i ν (ν ≤ t \nu \leq t ν ≤ t )、値を Y l = e i l Y_l = e_{i_l} Y l = e i l 、誤り位置 (error locator) を X l = β i l X_l = \beta^{i_l} X l = β i l (相異なる)と する。 シンドローム
S j = r ( β j ) = e ( β j ) = ∑ l = 1 ν Y l X l j ( 1 ≤ j ≤ 2 t ) S_j = r(\beta^j) = e(\beta^j) = \sum_{l=1}^{\nu} Y_lX_l^j \qquad (1 \leq j \leq 2t) S j = r ( β j ) = e ( β j ) = l = 1 ∑ ν Y l X l j ( 1 ≤ j ≤ 2 t )
は r r r から 計算できる。 誤り位置多項式 (error-locator polynomial) を Λ ( x ) = ∏ l = 1 ν ( 1 − X l x ) = 1 + Λ 1 x + ⋯ + Λ ν x ν \Lambda(x) = \prod_{l=1}^{\nu}(1 - X_lx) = 1 + \Lambda_1x + \cdots + \Lambda_\nu x^\nu Λ ( x ) = ∏ l = 1 ν ( 1 − X l x ) = 1 + Λ 1 x + ⋯ + Λ ν x ν と する。その 根 X l − 1 X_l^{-1} X l − 1 が わかれば 誤りの 位置が わかる。
補題 6.20 (鍵方程式)1 ≤ j ≤ 2 t − ν 1 \leq j \leq 2t - \nu 1 ≤ j ≤ 2 t − ν に ついて S j + ν + Λ 1 S j + ν − 1 + ⋯ + Λ ν S j = 0 S_{j+\nu} + \Lambda_1S_{j+\nu-1} + \cdots + \Lambda_\nu S_j = 0 S j + ν + Λ 1 S j + ν − 1 + ⋯ + Λ ν S j = 0 。
証明. Λ 0 = 1 \Lambda_0 = 1 Λ 0 = 1 と すると、各 l l l に ついて ∑ i = 0 ν Λ i X l − i = Λ ( X l − 1 ) = 0 \sum_{i=0}^{\nu}\Lambda_iX_l^{-i} = \Lambda(X_l^{-1}) = 0 ∑ i = 0 ν Λ i X l − i = Λ ( X l − 1 ) = 0 。これに Y l X l j + ν Y_lX_l^{j+\nu} Y l X l j + ν を 掛けて l l l に ついて 足すと ∑ i = 0 ν Λ i S j + ν − i = 0 \sum_{i=0}^{\nu}\Lambda_iS_{j+\nu-i} = 0 ∑ i = 0 ν Λ i S j + ν − i = 0 (添字 j + ν − i j + \nu - i j + ν − i は 1 1 1 以上 2 t 2t 2 t 以下)。□ \square □
補題 6.21 1 ≤ μ ≤ t 1 \leq \mu \leq t 1 ≤ μ ≤ t に ついて、 μ × μ \mu \times \mu μ × μ 行列 M μ = ( S i + j − 1 ) 1 ≤ i , j ≤ μ M_\mu = (S_{i+j-1})_{1 \leq i, j \leq \mu} M μ = ( S i + j − 1 ) 1 ≤ i , j ≤ μ は、μ = ν \mu = \nu μ = ν なら 正則、 μ > ν \mu > \nu μ > ν なら 正則でない。
証明. μ × ν \mu \times \nu μ × ν 行列 W = ( X l i − 1 ) i , l W = (X_l^{i-1})_{i, l} W = ( X l i − 1 ) i , l と D = diag ( Y 1 X 1 , … , Y ν X ν ) D = \operatorname{diag}(Y_1X_1, \dots, Y_\nu X_\nu) D = diag ( Y 1 X 1 , … , Y ν X ν ) に ついて、 ( W D W ⊤ ) i j = ∑ l Y l X l i + j − 1 = S i + j − 1 (WDW^{\top})_{ij} = \sum_l Y_lX_l^{i+j-1} = S_{i+j-1} ( W D W ⊤ ) ij = ∑ l Y l X l i + j − 1 = S i + j − 1 、すな わち M μ = W D W ⊤ M_\mu = WDW^{\top} M μ = W D W ⊤ 。μ > ν \mu > \nu μ > ν なら rank M μ ≤ ν < μ \operatorname{rank} M_\mu \leq \nu < \mu rank M μ ≤ ν < μ 。μ = ν \mu = \nu μ = ν なら det M ν = ( det W ) 2 ∏ l Y l X l ≠ 0 \det M_\nu = (\det W)^2\prod_l Y_lX_l \neq 0 det M ν = ( det W ) 2 ∏ l Y l X l = 0 (W W W は ヴァンデルモンド行列の 転置)。 □ \square □
ピーターソン–ゴレンシュタイン–ツィーラー (PGZ) 法
S 1 , … , S 2 t S_1, \dots, S_{2t} S 1 , … , S 2 t を 計算する。すべて 0 0 0 なら r r r を 出力する。
det M μ ≠ 0 \det M_\mu \neq 0 det M μ = 0 と なる 最大の μ ≤ t \mu \leq t μ ≤ t を ν \nu ν と する(なければ 失敗)。
連立一次方程式 M ν ( Λ ν , Λ ν − 1 , … , Λ 1 ) ⊤ = − ( S ν + 1 , … , S 2 ν ) ⊤ M_\nu(\Lambda_\nu, \Lambda_{\nu-1}, \dots, \Lambda_1)^{\top} = -(S_{\nu+1}, \dots, S_{2\nu})^{\top} M ν ( Λ ν , Λ ν − 1 , … , Λ 1 ) ⊤ = − ( S ν + 1 , … , S 2 ν ) ⊤ を 解く。
i = 0 , … , n − 1 i = 0, \dots, n - 1 i = 0 , … , n − 1 に ついて Λ ( β − i ) = 0 \Lambda(\beta^{-i}) = 0 Λ ( β − i ) = 0 かを 調べる( チェン探索 )。根が ちょうど ν \nu ν 個でなければ 失敗と する。
手順 4 で 見つかった 位置を i 1 ′ , … , i ν ′ i'_1, \dots, i'_\nu i 1 ′ , … , i ν ′ とし、X l = β i l ′ X_l = \beta^{i'_l} X l = β i l ′ と して ∑ l Y l X l j = S j \sum_l Y_lX_l^j = S_j ∑ l Y l X l j = S j (1 ≤ j ≤ ν 1 \leq j \leq \nu 1 ≤ j ≤ ν )を 解いて Y l Y_l Y l を 求める。第 i l ′ i'_l i l ′ 成分が Y l Y_l Y l で、ほかの 成分が 0 0 0 の ベクトルを e ^ \hat{e} e ^ と する( q = 2 q = 2 q = 2 なら Y l = 1 Y_l = 1 Y l = 1 )。
r − e ^ r - \hat{e} r − e ^ の シンドローム( j = 1 , … , 2 t j = 1, \dots, 2t j = 1 , … , 2 t )が すべて 0 0 0 なら r − e ^ r - \hat{e} r − e ^ を 出力し、そうでなければ 失敗と する( t t t 個を 超える 誤りに 備える 確認)。
定理 6.22 (PGZ 法の 正しさ) wt ( e ) ≤ t \operatorname{wt}(e) \leq t wt ( e ) ≤ t なら、上の 手順は 送られた 符号語 c c c を 出力する。
証明. ν = 0 \nu = 0 ν = 0 なら シンドロームは すべて 0 0 0 。ν ≥ 1 \nu \geq 1 ν ≥ 1 なら M ν M_\nu M ν は 正則(補題 6.21)なので、シンドロームの どれかは 0 0 0 でない。手順 2:補題 6.21 より 正しい ν \nu ν が 得られる。手順 3:この 連立方程式は 補題 6.20 の j = 1 , … , ν j = 1, \dots, \nu j = 1 , … , ν の 場合( ν ≤ 2 t − ν \nu \leq 2t - \nu ν ≤ 2 t − ν なので 使える)その もので、 M ν M_\nu M ν は 正則だから 解は 真の 係数に 限る。手順 4: Λ \Lambda Λ の 根は 相異なる ν \nu ν 個の X l − 1 = β − i l X_l^{-1} = \beta^{-i_l} X l − 1 = β − i l なので、見つかる 位置は 真の 位置 i 1 , … , i ν i_1, \dots, i_\nu i 1 , … , i ν である。手順 5:係数行列 ( X l j ) j , l (X_l^j)_{j, l} ( X l j ) j , l は ヴァンデルモンド行列の 転置に diag ( X 1 , … , X ν ) \operatorname{diag}(X_1, \dots, X_\nu) diag ( X 1 , … , X ν ) を 掛けた もので 正則なので、真の Y l Y_l Y l が 求まり、 e ^ = e \hat{e} = e e ^ = e と なる。手順 6: r − e ^ = c r - \hat{e} = c r − e ^ = c は 符号語なので 確認を 通り、 c c c が 出力される。 □ \square □
この 方法は ピーターソン(1960 年、2 元 BCH 符号)と ゴレンシュタイン–ツィーラー(1961 年、一般の 場合)に よる。
例 6.23 (例 6.19 の 符号の 復号)符号語 c = ( 5 , 4 , 1 , 6 , 0 , 3 ) 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) r = ( 5 , 6 , 1 , 3 , 0 , 3 ) を 受け取ったとする( t = 2 t = 2 t = 2 )。S j = ∑ i r i β i j S_j = \sum_i r_i\beta^{ij} S j = ∑ i r i β ij を β i j \beta^{ij} β ij の 表から 計算する。
j j j
β i j \beta^{ij} β ij (i = 0 , … , 5 i = 0, \dots, 5 i = 0 , … , 5 )
S j S_j S j
1
1 , 3 , 2 , 6 , 4 , 5 1, 3, 2, 6, 4, 5 1 , 3 , 2 , 6 , 4 , 5
5 + 18 + 2 + 18 + 0 + 15 = 58 ≡ 2 5 + 18 + 2 + 18 + 0 + 15 = 58 \equiv 2 5 + 18 + 2 + 18 + 0 + 15 = 58 ≡ 2
2
1 , 2 , 4 , 1 , 2 , 4 1, 2, 4, 1, 2, 4 1 , 2 , 4 , 1 , 2 , 4
5 + 12 + 4 + 3 + 0 + 12 = 36 ≡ 1 5 + 12 + 4 + 3 + 0 + 12 = 36 \equiv 1 5 + 12 + 4 + 3 + 0 + 12 = 36 ≡ 1
3
1 , 6 , 1 , 6 , 1 , 6 1, 6, 1, 6, 1, 6 1 , 6 , 1 , 6 , 1 , 6
5 + 36 + 1 + 18 + 0 + 18 = 78 ≡ 1 5 + 36 + 1 + 18 + 0 + 18 = 78 \equiv 1 5 + 36 + 1 + 18 + 0 + 18 = 78 ≡ 1
4
1 , 4 , 2 , 1 , 4 , 2 1, 4, 2, 1, 4, 2 1 , 4 , 2 , 1 , 4 , 2
5 + 24 + 2 + 3 + 0 + 6 = 40 ≡ 5 5 + 24 + 2 + 3 + 0 + 6 = 40 \equiv 5 5 + 24 + 2 + 3 + 0 + 6 = 40 ≡ 5
det M 2 = S 1 S 3 − S 2 2 = 1 ≠ 0 \det M_2 = S_1S_3 - S_2^2 = 1 \neq 0 det M 2 = S 1 S 3 − S 2 2 = 1 = 0 なので ν = 2 \nu = 2 ν = 2 。連立方程式
( 2 1 1 1 ) ( Λ 2 Λ 1 ) = ( − 1 − 5 ) = ( 6 2 ) \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 1 1 1 ) ( Λ 2 Λ 1 ) = ( − 1 − 5 ) = ( 6 2 )
を 解くと Λ 2 = 4 \Lambda_2 = 4 Λ 2 = 4 , Λ 1 = 5 \Lambda_1 = 5 Λ 1 = 5 で、Λ ( x ) = 1 + 5 x + 4 x 2 = ( 1 + x ) ( 1 + 4 x ) \Lambda(x) = 1 + 5x + 4x^2 = (1 + x)(1 + 4x) Λ ( x ) = 1 + 5 x + 4 x 2 = ( 1 + x ) ( 1 + 4 x ) 。根 x = − 1 = β 3 x = -1 = \beta^3 x = − 1 = β 3 と x = − 4 − 1 = 5 = β 5 x = -4^{-1} = 5 = \beta^5 x = − 4 − 1 = 5 = β 5 から X = β − 3 = β 3 X = \beta^{-3} = \beta^3 X = β − 3 = β 3 , β − 5 = β 1 \beta^{-5} = \beta^1 β − 5 = β 1 で、誤りは 第 1 成分と 第 3 成分にある。値は S 1 = 3 Y 1 + 6 Y 3 = 2 S_1 = 3Y_1 + 6Y_3 = 2 S 1 = 3 Y 1 + 6 Y 3 = 2 , S 2 = 2 Y 1 + Y 3 = 1 S_2 = 2Y_1 + Y_3 = 1 S 2 = 2 Y 1 + Y 3 = 1 を 解いて Y 1 = 2 Y_1 = 2 Y 1 = 2 , Y 3 = 4 Y_3 = 4 Y 3 = 4 。r r r から 引くと c c c が 復元され、 f ( 1 ) = 5 f(1) = 5 f ( 1 ) = 5 , f ( 3 ) = 4 f(3) = 4 f ( 3 ) = 4 から f ( x ) = 2 + 3 x f(x) = 2 + 3x f ( x ) = 2 + 3 x を 得る。
注意
誤りが t t t 個を 超えると、復号器は 失敗を 報告する ことも あれば、別の 符号語を 出力して 気づかない こともある。例 6.23 の c c c に 3 個の 誤りを 加える 20 ⋅ 6 3 = 4320 20 \cdot 6^3 = 4320 20 ⋅ 6 3 = 4320 通りを 調べると、PGZ 法は 3960 通りで 失敗を 報告し、360 通りで 別の 符号語を 出力した(計算機で 確かめた。手順 6 の 確認を 省くと、3960 通りの うち 360 通りでは、失敗を 報告せずに 符号語でない 語を 出力してしまう)。たとえば 第 0, 2, 5 成分に 1 1 1 を 加えると、 Λ ( x ) = 1 + x + 4 x 2 \Lambda(x) = 1 + x + 4x^2 Λ ( x ) = 1 + x + 4 x 2 は F 7 \mathbb{F}_7 F 7 に 根を もたず、失敗が 検出される。上位の 層で 誤り検出(CRC など)を 併用するのは この ためである。
6.6 応用
実用の リード–ソロモン符号の 多くは F 2 8 \mathbb{F}_{2^8} F 2 8 上の もので、1 バイトを 1 記号と して 扱う。記号単位で 訂正するので、連続する 8 ビット以内の バースト誤りは 高々 2 個の 記号の 誤りに すぎない。さらに 複数の 符号語の 記号を 交互に 並べる インターリーブ (interleaving) を 使うと、 D D D 個の 符号語を 交互に 送る 場合、長さ L L L 記号の バーストは 各符号語に 高々 ⌈ L / D ⌉ \lceil L/D \rceil ⌈ L / D ⌉ 個の 誤りしか 与えない。
QR コード (規格 ISO/IEC 18004)は、F 2 8 = F 2 [ x ] / ( x 8 + x 4 + x 3 + x 2 + 1 ) \mathbb{F}_{2^8} = \mathbb{F}_2[x]/(x^8 + x^4 + x^3 + x^2 + 1) F 2 8 = 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)は、F 2 8 \mathbb{F}_{2^8} F 2 8 上の 2 つの 短縮 RS 符号 [ 32 , 28 , 5 ] [32, 28, 5] [ 32 , 28 , 5 ] と [ 28 , 24 , 5 ] [28, 24, 5] [ 28 , 24 , 5 ] (どちらも [ 255 , 251 , 5 ] [255, 251, 5] [ 255 , 251 , 5 ] の RS 符号を 短縮した もの)を、インターリーブを はさんで 組み合わせる。ここで、線形符号の、特定の 位置が 0 0 0 の 符号語だけを 集めて その 位置を 除く ことを 短縮と いう。 [ n , k , n − k + 1 ] [n, k, n - k + 1] [ n , k , n − k + 1 ] の MDS 符号(k ≥ 2 k \geq 2 k ≥ 2 )を 短縮すると、重みは 変わらないので 最小距離は 減らず、次元は ちょうど k − 1 k - 1 k − 1 に なる(減らないと すると、その 位置は どの 符号語でも 0 0 0 で、それを 除いた [ n − 1 , k , n − k + 1 ] [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] [ n − 1 , k − 1 , n − k + 1 ] の MDS 符号に なる。よく 使われる 復号法では、内側の 符号で 訂正しきれなかった 記号を 消失と して 外側の 符号に 渡す。
DVD (DVD-ROM の 規格 ECMA-267)では、 F 2 8 \mathbb{F}_{2^8} F 2 8 上の 短縮 RS 符号 [ 182 , 172 , 11 ] [182, 172, 11] [ 182 , 172 , 11 ] と [ 208 , 192 , 17 ] [208, 192, 17] [ 208 , 192 , 17 ] を、データを 並べた 表の 行と 列に それぞれ使う 積符号 (product code) で 誤りを 訂正する。
RAID 6 は、n n n 台の データディスクに 2 台の 検査用ディスクを 加え、どの 2 台が 同時に 故障しても 復元できるように する。Linux カーネルの 実装では、各バイトを QR コードと 同じ F 2 8 \mathbb{F}_{2^8} F 2 8 の 元と みて、 g = x ‾ g = \overline{x} g = x , n ≤ 255 n \leq 255 n ≤ 255 と して P = ∑ i D i P = \sum_i D_i P = ∑ i D i , Q = ∑ i g i D i Q = \sum_i g^iD_i Q = ∑ i g i D i を 記録する。これは [ n + 2 , n , 3 ] [n + 2, n, 3] [ n + 2 , n , 3 ] の MDS 符号である(問題 6.5)。
分散ストレージ では、データを k k k 個の 断片に 分け、MDS 符号で n n n 個の 断片に 符号化して 別々の サーバーに 置く。どの k k k 個からも 復元できるので(定理 6.17)、 n − k n - k n − k 台までの 故障に 耐える。 ( n , k ) = ( 9 , 6 ) (n, k) = (9, 6) ( n , k ) = ( 9 , 6 ) なら 容量 1.5 倍で 3 台の 故障に 耐える(3 重の 複製は 容量 3 倍で 2 台まで)。ただし素朴な 方法では、失った 1 個の 断片を 作り直すのにも k k k 個の 断片を 読む 必要が ある(複製なら 1 個で 済む)。
ヒント
実務では
符号の パラメータは、想定する 誤りの モデル(ランダムな 誤りか、バーストか、位置の わかる 消失か)から 決める。消失は 誤りの 半分の 冗長性で 直せる(第5章 問題 5.4)ので、故障した ディスクのように 位置が わかるなら、その 情報を 復号器に 渡すべきである。また RAID 6 が 保証するのは「同時に 2 台までの 故障」からの 復元であり、誤操作に よる 削除や、ソフトウェアの 不具合で 書かれた 誤った データは 検査用ディスクにも そのまま 反映される。冗長化は バックアップの 代わりに ならない。
6.7 CRC:誤り検出
04-algebra 第11章 11.10 節の CRC (巡回冗長検査)を、巡回符号の 言葉で 見直す。ビット列を F 2 [ x ] \mathbb{F}_2[x] F 2 [ x ] の 多項式と みて(左端を 最高次)、 r r r 次の 生成多項式 G G G (G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 )を 決める。メッセージ M M M に 対し、 x r M x^rM x r M を G G G で 割った 余り R R R を 付けた T = x r M + R T = x^rM + R T = x r M + R を 送り、受信側は 受け取った 多項式が G G G で 割り切れるかを 調べる。これは 例 6.10 の 組織的な 符号化と 同じ 計算で、 G = x 3 + x + 1 G = x^3 + x + 1 G = x 3 + x + 1 , M = 1101 M = 1101 M = 1101 なら R = 001 R = 001 R = 001 、送信列 1101001 1101001 1101001 は 例 6.10 の 符号語 1 + x 3 + x 5 + x 6 1 + x^3 + x^5 + x^6 1 + x 3 + x 5 + x 6 を 高次から 並べた ものである。 G ∣ x e − 1 G \mid x^e - 1 G ∣ x e − 1 と なる 最小の e e e を とると( G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 より 存在する)、長さ e e e 以下の 送信列の 全体は、長さ e e e の 巡回符号 ( G ) (G) ( G ) を 短縮した ものに なる。
誤りの パターンを E E E (反転した ビットを 多項式と みた もの)と すると、誤りを 見逃すのは G ∣ E G \mid E G ∣ E の ときに 限る。04 第11章 命題 11.22 では、長さ r r r 以下の バースト誤り、 ( x + 1 ) ∣ G (x + 1) \mid G ( x + 1 ) ∣ G の ときの 奇数個の 誤り、間隔が e e e 未満の 2 ビットの 誤りが 検出される ことを 示した。バースト誤りに ついては、もう 一歩 正確に 言える。
定理 6.25 (CRC の バースト誤り検出) G ∈ F 2 [ x ] G \in \mathbb{F}_2[x] G ∈ F 2 [ x ] を r r r 次(r ≥ 1 r \geq 1 r ≥ 1 )で G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 と する。送信列に 収まる E = x i B E = x^iB E = x i B (deg B = b − 1 \deg B = b - 1 deg B = b − 1 , B ( 0 ) = 1 B(0) = 1 B ( 0 ) = 1 )の 形の 誤り、すな わち反転した 最初と 最後の ビットを 含む 区間の 長さが b b b の 誤りを、長さ b b b の バースト誤り (burst error) と いう。
b ≤ r b \leq r b ≤ r なら、長さ b b b の バースト誤りは すべて 検出される。
開始位置 i i i を 固定すると、長さ r + 1 r + 1 r + 1 の バースト誤り 2 r − 1 2^{r-1} 2 r − 1 通りの うち、検出されないのは E = x i G E = x^iG E = x i G の 1 通りだけである。
b ≥ r + 2 b \geq r + 2 b ≥ r + 2 なら、開始位置 i i i を 固定した 長さ b b b の バースト誤り 2 b − 2 2^{b-2} 2 b − 2 通りの うち、検出されないのは ちょうど 2 b − r − 2 2^{b-r-2} 2 b − r − 2 通りである。
証明. G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 より gcd ( G , x i ) = 1 \gcd(G, x^i) = 1 g cd( G , x i ) = 1 なので、G ∣ x i B ⟺ G ∣ B G \mid x^iB \iff G \mid B G ∣ x i B ⟺ G ∣ B 。長さ b ≥ 2 b \geq 2 b ≥ 2 の B B B は、定数項と x b − 1 x^{b-1} x b − 1 の 係数が 1 1 1 で、間の b − 2 b - 2 b − 2 個が 自由なので 2 b − 2 2^{b-2} 2 b − 2 通りある。(1) B ≠ 0 B \neq 0 B = 0 , deg B < r \deg B < r deg B < r なら G ∤ B G \nmid B G ∤ B 。(2) deg B = r \deg B = r deg B = r で G ∣ B G \mid B G ∣ B なら B = G B = G B = G で、G G G は G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 を みたす。(3) G ∣ B G \mid B G ∣ B なら B = G Q B = GQ B = GQ , deg Q = b − 1 − r ≥ 1 \deg Q = b - 1 - r \geq 1 deg Q = b − 1 − r ≥ 1 , Q ( 0 ) = B ( 0 ) = 1 Q(0) = B(0) = 1 Q ( 0 ) = B ( 0 ) = 1 。逆に この 形の Q Q Q から 作った B = G Q B = GQ B = GQ は 条件を みたす。そのような Q Q Q は、最高次と 定数項の 係数が 1 1 1 で 間の b − r − 2 b - r - 2 b − r − 2 個が 自由なので 2 b − r − 2 2^{b-r-2} 2 b − r − 2 通り。□ \square □
バーストの 中身が 一様に ランダムだと 仮定すれば、見逃す確率は b = r + 1 b = r + 1 b = r + 1 で 2 − ( r − 1 ) 2^{-(r-1)} 2 − ( r − 1 ) 、b ≥ r + 2 b \geq r + 2 b ≥ r + 2 で 2 − r 2^{-r} 2 − r に なる。この 確率は「中身が 一様」と いう 仮定のもとでの 値である。 G = x 4 + x + 1 G = x^4 + x + 1 G = x 4 + x + 1 と ( x + 1 ) ( x 3 + x + 1 ) (x + 1)(x^3 + x + 1) ( x + 1 ) ( x 3 + x + 1 ) に ついて、開始位置 0 0 0 、b ≤ 9 b \leq 9 b ≤ 9 の バーストを すべて 調べても 定理の 通りの 個数に なる(計算機で 確かめた)。
イーサネット(IEEE 802.3)、ZIP、PNG などで 使われる CRC-32 の 生成多項式 G = 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 G = 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 G = 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 は 原始多項式である( x x x の 位数が 2 32 − 1 2^{32} - 1 2 32 − 1 である ことを 計算機で 確かめた)。したがって 長さ 32 以下の バーストと、長さ 2 32 − 1 2^{32} - 1 2 32 − 1 以下の 送信列での 2 ビットの 誤りを すべて 検出する。 G ( 1 ) = 1 G(1) = 1 G ( 1 ) = 1 なので、奇数個の 誤りの 検出は 04 第11章 命題 11.22(2) からは 保証されない。
実際の CRC-32 には、(i) 各バイトの 下位ビットを 高次の 係数と みる( G G G の ビットを 逆順に した 定数 0xEDB88320 を 使う)、(ii) 初期値を 全ビット 1 1 1 に する、(iii) 最後に 全ビットを 反転する、と いう 約束が ある。(ii) は、先頭に 0 0 0 の ビットが 加わっても 値が 変わらないと いう 素朴な 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) crc ( m ⊕ Δ ) = crc ( m ) ⊕ crc ( Δ ) ⊕ crc ( 0 ) (⊕ \oplus ⊕ は ビットごとの 排他的論理和、 0 0 0 は 同じ 長さの 零ビット列)が 成り立つので、誤りを 見逃す条件は m m m に よらず、素朴な 割り算の 場合と 同じである。次の コードで、ビットごとの 計算が 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 行目は、 m m m を 知らなくても 差分 Δ \Delta Δ だけから CRC の 変化が 計算できる ことを 示している。
注意
CRC は 偶然の 誤りを 検出する ための もので、改ざんの 検出には 使えない。上の 等式から、攻撃者は メッセージの 中身を 知らなくても、好きな ビットを 反転させたうえで CRC を 正しく 直せる。無線 LAN の 旧方式 WEP は、暗号化した データの 完全性を CRC-32 で 守ろうと して、この 種の 攻撃を 受けた(2001 年に 指摘された)。改ざんの 検出には、鍵を 使う メッセージ認証符号( 第7章 の HMAC など)や デジタル署名を 使う。
まとめ
gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 なら x n − 1 x^n - 1 x n − 1 は 重根を もたず、円分剰余類ごとの 最小多項式 M s M_s M s の 積に 分解する。
巡回符号は F q [ x ] / ( x n − 1 ) \mathbb{F}_q[x]/(x^n - 1) F q [ x ] / ( x n − 1 ) の イデアルで、 x n − 1 x^n - 1 x n − 1 の モニックな 約数(生成多項式 g g g )と 1 対 1 に 対応し、次元は n − deg g n - \deg g n − deg g 。この 対応に gcd ( n , q ) = 1 \gcd(n, q) = 1 g cd( n , q ) = 1 は 要らないが、個数の 数え方・零点に よる 記述・BCH 限界には 要る。
BCH 限界:連続する β b , … , β b + δ − 2 \beta^b, \dots, \beta^{b+\delta-2} β b , … , β b + δ − 2 を 零点に もつ巡回符号の 最小距離は δ \delta δ 以上(ヴァンデルモンドの 行列式)。
リード–ソロモン符号は [ n , k , n − k + 1 ] [n, k, n - k + 1] [ n , k , n − k + 1 ] の MDS 符号で、n = q − 1 n = q - 1 n = q − 1 なら 零点 β , … , β n − k \beta, \dots, \beta^{n-k} β , … , β n − k の 巡回符号に なる。
PGZ 法は t t t 個以下の 誤りを 必ず正しく 直す。 t t t 個を 超えると 失敗や 誤訂正が 起こる。
1 バイトを 1 記号と する RS 符号と インターリーブは バーストや 消失に 強く、QR コード、CD・DVD、RAID 6、分散ストレージで 使われている。
CRC は 短縮した 巡回符号で、 r r r 次の G G G (G ( 0 ) = 1 G(0) = 1 G ( 0 ) = 1 )は 長さ r r r 以下の バーストを すべて 検出し、長さ r + 1 r + 1 r + 1 では 2 − ( r − 1 ) 2^{-(r-1)} 2 − ( r − 1 ) 、それより 長いと 2 − r 2^{-r} 2 − r の 割合の バーストを 見逃す。CRC は アフィンなので 改ざん検出には 使えない。
演習問題
問題 6.1 ★ F 2 \mathbb{F}_2 F 2 上で x 9 − 1 x^9 - 1 x 9 − 1 を 円分剰余類を 使って 既約分解し、長さ 9 の 2 元巡回符号の 個数と、とりうる 次元を すべて 求めよ。
解答
2 1 , … , 2 6 m o d 9 2^1, \dots, 2^6 \bmod 9 2 1 , … , 2 6 mod 9 は 2 , 4 , 8 , 7 , 5 , 1 2, 4, 8, 7, 5, 1 2 , 4 , 8 , 7 , 5 , 1 なので m = 6 m = 6 m = 6 。円分剰余類は { 0 } \lbrace 0 \rbrace { 0 } , { 1 , 2 , 4 , 8 , 7 , 5 } \lbrace 1, 2, 4, 8, 7, 5 \rbrace { 1 , 2 , 4 , 8 , 7 , 5 } , { 3 , 6 } \lbrace 3, 6 \rbrace { 3 , 6 } で、既約因子の 次数は 1 , 6 , 2 1, 6, 2 1 , 6 , 2 である。x 9 − 1 = ( x 3 − 1 ) ( x 6 + x 3 + 1 ) x^9 - 1 = (x^3 - 1)(x^6 + x^3 + 1) x 9 − 1 = ( x 3 − 1 ) ( x 6 + x 3 + 1 ) , x 3 − 1 = ( x + 1 ) ( x 2 + x + 1 ) x^3 - 1 = (x + 1)(x^2 + x + 1) x 3 − 1 = ( x + 1 ) ( x 2 + x + 1 ) なので、定理 6.3 より 6 次の 既約因子は x 6 + x 3 + 1 x^6 + x^3 + 1 x 6 + x 3 + 1 で、x 9 − 1 = ( x + 1 ) ( x 2 + x + 1 ) ( x 6 + x 3 + 1 ) x^9 - 1 = (x + 1)(x^2 + x + 1)(x^6 + x^3 + 1) x 9 − 1 = ( x + 1 ) ( x 2 + x + 1 ) ( x 6 + x 3 + 1 ) 。巡回符号は 2 3 = 8 2^3 = 8 2 3 = 8 個({ 0 } \lbrace 0 \rbrace { 0 } と 全体を 含む)。生成多項式の 次数は { 1 , 2 , 6 } \lbrace 1, 2, 6 \rbrace { 1 , 2 , 6 } の 部分集合の 和 0 , 1 , 2 , 3 , 6 , 7 , 8 , 9 0, 1, 2, 3, 6, 7, 8, 9 0 , 1 , 2 , 3 , 6 , 7 , 8 , 9 なので、次元は 9 , 8 , 7 , 6 , 3 , 2 , 1 , 0 9, 8, 7, 6, 3, 2, 1, 0 9 , 8 , 7 , 6 , 3 , 2 , 1 , 0 。
問題 6.2 ★ 例 6.4(1) の β = α \beta = \alpha β = α を 使う。BCH 限界を 使って、長さ 7 の 2 元巡回符号の うち、生成多項式が x 3 + x + 1 x^3 + x + 1 x 3 + x + 1 , ( x + 1 ) ( x 3 + x + 1 ) (x + 1)(x^3 + x + 1) ( x + 1 ) ( x 3 + x + 1 ) , ( x 3 + x + 1 ) ( x 3 + x 2 + 1 ) (x^3 + x + 1)(x^3 + x^2 + 1) ( x 3 + x + 1 ) ( x 3 + x 2 + 1 ) の ものの 最小距離が、それぞれ 3, 4, 7 以上である ことを 示せ。
解答
定義集合は それぞれ C 1 = { 1 , 2 , 4 } C_1 = \lbrace 1, 2, 4 \rbrace C 1 = { 1 , 2 , 4 } , C 0 ∪ C 1 = { 0 , 1 , 2 , 4 } C_0 \cup C_1 = \lbrace 0, 1, 2, 4 \rbrace C 0 ∪ C 1 = { 0 , 1 , 2 , 4 } , C 1 ∪ C 3 = { 1 , … , 6 } C_1 \cup C_3 = \lbrace 1, \dots, 6 \rbrace C 1 ∪ C 3 = { 1 , … , 6 } である(命題 6.11)。連続する 零点の 指数は { 1 , 2 } \lbrace 1, 2 \rbrace { 1 , 2 } , { 0 , 1 , 2 } \lbrace 0, 1, 2 \rbrace { 0 , 1 , 2 } (b = 0 b = 0 b = 0 ), { 1 , … , 6 } \lbrace 1, \dots, 6 \rbrace { 1 , … , 6 } を 含むので、定理 6.13 より 最小距離は それぞれ 3 , 4 , 7 3, 4, 7 3 , 4 , 7 以上である。例 6.9 の 表の とおり、どれも 等号が 成り立つ。
問題 6.3 ★ ★ 1 個の 誤りだけを 訂正する 場合( t = 1 t = 1 t = 1 )、PGZ 法は「X = S 2 / S 1 X = S_2/S_1 X = S 2 / S 1 , Y = S 1 2 / S 2 Y = S_1^2/S_2 Y = S 1 2 / S 2 」と なる ことを 示せ。これを 使って、 F 8 \mathbb{F}_8 F 8 (例 6.4(1) の α \alpha α )上の [ 7 , 5 , 3 ] [7, 5, 3] [ 7 , 5 , 3 ] リード–ソロモン符号(零点 α , α 2 \alpha, \alpha^2 α , α 2 )で、受信語 r = ( α 3 , α 6 , α 5 , 1 , 0 , α 2 , 0 ) r = (\alpha^3, \alpha^6, \alpha^5, 1, 0, \alpha^2, 0) r = ( α 3 , α 6 , α 5 , 1 , 0 , α 2 , 0 ) を 復号せよ。
解答
誤りが 1 個なら S 1 = Y X S_1 = YX S 1 = Y X , S 2 = Y X 2 S_2 = YX^2 S 2 = Y X 2 で、X , Y ≠ 0 X, Y \neq 0 X , Y = 0 なので X = S 2 / S 1 X = S_2/S_1 X = S 2 / S 1 , Y = S 1 2 / S 2 Y = S_1^2/S_2 Y = S 1 2 / S 2 (手順 3 は S 1 Λ 1 = − S 2 S_1\Lambda_1 = -S_2 S 1 Λ 1 = − S 2 で、Λ ( x ) = 1 − ( S 2 / S 1 ) x \Lambda(x) = 1 - (S_2/S_1)x Λ ( x ) = 1 − ( S 2 / S 1 ) x の 根の 逆数が X X X )。
04 第8章 例 8.42 の 表( α 3 = α + 1 \alpha^3 = \alpha + 1 α 3 = α + 1 , α 4 = α 2 + α \alpha^4 = \alpha^2 + \alpha α 4 = α 2 + α , α 5 = α 2 + α + 1 \alpha^5 = \alpha^2 + \alpha + 1 α 5 = α 2 + α + 1 , α 6 = α 2 + 1 \alpha^6 = \alpha^2 + 1 α 6 = α 2 + 1 , α 7 = 1 \alpha^7 = 1 α 7 = 1 )を 使うと
S 1 = r ( α ) = α 3 + α 7 + α 7 + α 3 + α 7 = 1 , S 2 = 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} S 1 S 2 = r ( α ) = α 3 + α 7 + α 7 + α 3 + α 7 = 1 , = r ( α 2 ) = α 3 + α 8 + α 9 + α 6 + α 12 = ( α + 1 ) + α + α 2 + ( α 2 + 1 ) + ( α 2 + α + 1 ) = α 5
よって X = α 5 X = \alpha^5 X = α 5 (第 5 成分)、Y = α − 5 = α 2 Y = \alpha^{-5} = \alpha^2 Y = α − 5 = α 2 。第 5 成 分から α 2 \alpha^2 α 2 を 引いて c = ( α 3 , α 6 , α 5 , 1 , 0 , 0 , 0 ) c = (\alpha^3, \alpha^6, \alpha^5, 1, 0, 0, 0) c = ( α 3 , α 6 , α 5 , 1 , 0 , 0 , 0 ) 。検算: これは ( 1 + x ) ( x + α ) ( x + α 2 ) = ( 1 + x ) ( x 2 + α 4 x + α 3 ) (1 + x)(x + \alpha)(x + \alpha^2) = (1 + x)(x^2 + \alpha^4x + \alpha^3) ( 1 + x ) ( x + α ) ( x + α 2 ) = ( 1 + x ) ( x 2 + α 4 x + α 3 ) の 係数に 等しい。
問題 6.4 ★ ★ ★ 例 6.15 の 2 元 BCH 符号 [ 15 , 7 , 5 ] [15, 7, 5] [ 15 , 7 , 5 ] で 2 個の 誤りを 訂正する。
2 元の 場合 S 2 = S 1 2 S_2 = S_1^2 S 2 = S 1 2 である ことを 示し、誤りが ちょうど 2 個なら Λ ( x ) = 1 + S 1 x + S 3 + S 1 3 S 1 x 2 \Lambda(x) = 1 + S_1x + \dfrac{S_3 + S_1^3}{S_1}x^2 Λ ( x ) = 1 + S 1 x + S 1 S 3 + S 1 3 x 2 と なる ことを 示せ。
受信語 r ( x ) = 1 + x 2 + x 4 + x 6 + x 7 + x 8 + x 10 r(x) = 1 + x^2 + x^4 + x^6 + x^7 + x^8 + x^{10} r ( x ) = 1 + x 2 + x 4 + x 6 + x 7 + x 8 + x 10 を 復号せよ( F 16 \mathbb{F}_{16} F 16 の 表は 04 第11章 例 11.1(2))。
解答
r r r の 係数は F 2 \mathbb{F}_2 F 2 に 属するので r ( a ) 2 = r ( a 2 ) r(a)^2 = r(a^2) r ( a ) 2 = r ( a 2 ) 、よって S 2 = S 1 2 S_2 = S_1^2 S 2 = S 1 2 。誤りが 2 個なら Y l = 1 Y_l = 1 Y l = 1 で、S 1 = X 1 + X 2 S_1 = X_1 + X_2 S 1 = X 1 + X 2 , S 3 = X 1 3 + X 2 3 S_3 = X_1^3 + X_2^3 S 3 = X 1 3 + X 2 3 。標数 2 では ( X 1 + X 2 ) 3 = X 1 3 + X 2 3 + X 1 X 2 ( X 1 + X 2 ) (X_1 + X_2)^3 = X_1^3 + X_2^3 + X_1X_2(X_1 + X_2) ( X 1 + X 2 ) 3 = X 1 3 + X 2 3 + X 1 X 2 ( X 1 + X 2 ) なので S 1 3 = S 3 + X 1 X 2 S 1 S_1^3 = S_3 + X_1X_2S_1 S 1 3 = S 3 + X 1 X 2 S 1 。X 1 ≠ X 2 X_1 \neq X_2 X 1 = X 2 より S 1 ≠ 0 S_1 \neq 0 S 1 = 0 で、X 1 X 2 = ( S 3 + S 1 3 ) / S 1 X_1X_2 = (S_3 + S_1^3)/S_1 X 1 X 2 = ( S 3 + S 1 3 ) / S 1 。Λ ( x ) = 1 + ( X 1 + X 2 ) x + X 1 X 2 x 2 \Lambda(x) = 1 + (X_1 + X_2)x + X_1X_2x^2 Λ ( x ) = 1 + ( X 1 + X 2 ) x + X 1 X 2 x 2 から 主張が 従う。
α k \alpha^k α k を 4 桁の 2 進数(α 3 , α 2 , α , 1 \alpha^3, \alpha^2, \alpha, 1 α 3 , α 2 , α , 1 の 係数)で 表す。 S 1 = α 0 + α 2 + α 4 + α 6 + α 7 + α 8 + α 10 S_1 = \alpha^0 + \alpha^2 + \alpha^4 + \alpha^6 + \alpha^7 + \alpha^8 + \alpha^{10} S 1 = α 0 + α 2 + α 4 + α 6 + α 7 + α 8 + α 10 は 0001 ⊕ 0100 ⊕ 0011 ⊕ 1100 ⊕ 1011 ⊕ 0101 ⊕ 0111 = 0011 = α 4 0001 \oplus 0100 \oplus 0011 \oplus 1100 \oplus 1011 \oplus 0101 \oplus 0111 = 0011 = \alpha^4 0001 ⊕ 0100 ⊕ 0011 ⊕ 1100 ⊕ 1011 ⊕ 0101 ⊕ 0111 = 0011 = α 4 。S 3 = r ( α 3 ) S_3 = r(\alpha^3) S 3 = r ( α 3 ) の 指数 0 , 6 , 12 , 18 , 21 , 24 , 30 0, 6, 12, 18, 21, 24, 30 0 , 6 , 12 , 18 , 21 , 24 , 30 を 15 で 割った 余りは 0 , 6 , 12 , 3 , 6 , 9 , 0 0, 6, 12, 3, 6, 9, 0 0 , 6 , 12 , 3 , 6 , 9 , 0 で、同じ 指数の 2 項は 打ち消し合うので S 3 = α 12 + α 3 + α 9 = 1111 ⊕ 1000 ⊕ 1010 = 1101 = α 13 S_3 = \alpha^{12} + \alpha^3 + \alpha^9 = 1111 \oplus 1000 \oplus 1010 = 1101 = \alpha^{13} S 3 = α 12 + α 3 + α 9 = 1111 ⊕ 1000 ⊕ 1010 = 1101 = α 13 。S 1 3 = α 12 S_1^3 = \alpha^{12} S 1 3 = α 12 より S 3 + S 1 3 = 1101 ⊕ 1111 = 0010 = α S_3 + S_1^3 = 1101 \oplus 1111 = 0010 = \alpha S 3 + S 1 3 = 1101 ⊕ 1111 = 0010 = α 、Λ 2 = α / α 4 = α 12 \Lambda_2 = \alpha/\alpha^4 = \alpha^{12} Λ 2 = α / α 4 = α 12 。α 2 + α 10 = 0100 ⊕ 0111 = α 4 \alpha^2 + \alpha^{10} = 0100 \oplus 0111 = \alpha^4 α 2 + α 10 = 0100 ⊕ 0111 = α 4 , α 2 α 10 = α 12 \alpha^2\alpha^{10} = \alpha^{12} α 2 α 10 = α 12 なので Λ ( x ) = ( 1 + α 2 x ) ( 1 + α 10 x ) \Lambda(x) = (1 + \alpha^2x)(1 + \alpha^{10}x) Λ ( x ) = ( 1 + α 2 x ) ( 1 + α 10 x ) で、誤りは 第 2 成分と 第 10 成分である。訂正すると c ( x ) = 1 + x 4 + x 6 + x 7 + x 8 = g ( x ) c(x) = 1 + x^4 + x^6 + x^7 + x^8 = g(x) c ( x ) = 1 + x 4 + x 6 + x 7 + x 8 = g ( x ) で、確かに 符号語である。
問題 6.5 ★ ★ g ∈ F 2 8 g \in \mathbb{F}_{2^8} g ∈ F 2 8 の 位数を 255 とし、 n ≤ 255 n \leq 255 n ≤ 255 と する。データ D 0 , … , D n − 1 ∈ F 2 8 D_0, \dots, D_{n-1} \in \mathbb{F}_{2^8} D 0 , … , D n − 1 ∈ F 2 8 に P = ∑ i D i P = \sum_i D_i P = ∑ i D i , Q = ∑ i g i D i Q = \sum_i g^iD_i Q = ∑ i g i D i を 加えた ( D 0 , … , D n − 1 , P , Q ) (D_0, \dots, D_{n-1}, P, Q) ( D 0 , … , D n − 1 , P , Q ) 全体は [ n + 2 , n , 3 ] [n + 2, n, 3] [ n + 2 , n , 3 ] の MDS 符号である ことを 示せ。また、データ D x , D y D_x, D_y D x , D y (x ≠ y x \neq y x = y )が 同時に 失われた ときの 復元の 式を 求めよ。
解答
標数 2 なので、条件は ∑ i D i + P = 0 \sum_i D_i + P = 0 ∑ i D i + P = 0 , ∑ i g i D i + Q = 0 \sum_i g^iD_i + Q = 0 ∑ i g i D i + Q = 0 で、検査行列の 列は ( 1 , g i ) ⊤ (1, g^i)^{\top} ( 1 , g i ) ⊤ (0 ≤ i < n 0 \leq i < n 0 ≤ i < n )、( 1 , 0 ) ⊤ (1, 0)^{\top} ( 1 , 0 ) ⊤ 、( 0 , 1 ) ⊤ (0, 1)^{\top} ( 0 , 1 ) ⊤ である。データの 列どうしは det = g j − g i ≠ 0 \det = g^j - g^i \neq 0 det = g j − g i = 0 (0 ≤ i < j < 255 0 \leq i < j < 255 0 ≤ i < j < 255 で g g g の 位数は 255)、データと P P P の 列は det = − g i ≠ 0 \det = -g^i \neq 0 det = − g i = 0 、残りの 組は det = ± 1 \det = \pm 1 det = ± 1 なので、どの 2 本の 列も 一次独立である。第5章 定理 5.13 より d ≥ 3 = ( n + 2 ) − n + 1 d \geq 3 = (n + 2) - n + 1 d ≥ 3 = ( n + 2 ) − n + 1 で MDS 符号であり、2 個の 消失を 訂正できる。
残った データから P ′ = P + ∑ i ≠ x , y D i = D x + D y P' = P + \sum_{i \neq x, y} D_i = D_x + D_y P ′ = P + ∑ i = x , y D i = D x + D y , Q ′ = Q + ∑ i ≠ x , y g i D i = g x D x + g y D y Q' = Q + \sum_{i \neq x, y} g^iD_i = g^xD_x + g^yD_y Q ′ = Q + ∑ i = x , y g i D i = g x D x + g y D y を 計算すると、 g y P ′ + Q ′ = ( g x + g y ) D x g^yP' + Q' = (g^x + g^y)D_x g y P ′ + Q ′ = ( g x + g y ) D x なので
D x = g y P ′ + Q ′ g x + g y , D y = P ′ + D x D_x = \frac{g^yP' + Q'}{g^x + g^y}, \qquad D_y = P' + D_x D x = g x + g y g y P ′ + Q ′ , D y = P ′ + D x
(g x + g y ≠ 0 g^x + g^y \neq 0 g x + g y = 0 )。データと P P P が 失われたら Q Q Q から、データと Q Q Q なら P P P から 復元し、 P P P と Q Q Q なら 再計算すればよい。
問題 6.6 ★ ★ ファームウェアの 更新ファイルに CRC-32 を 付け、機器は CRC が 一致した ものだけを 書き込む、と いう 設計で「改ざんも 防げる」と 説明された。この 説明の 誤りを、6.7 節の 等式を 使って 指摘せよ。CRC を 含む データ全体を、鍵ストリームとの 排他的論理和で 暗号化した(ストリーム暗号)場合は どうか。
解答
CRC の 計算方法は 公開されていて 鍵を 使わないので、攻撃者は 改ざんした ファイルの CRC を 計算し直して 付ければよい。中身を 知らなくても、差分 Δ \Delta Δ を 加えた m ⊕ Δ m \oplus \Delta m ⊕ Δ の CRC は crc ( m ) ⊕ crc ( Δ ) ⊕ crc ( 0 ) \operatorname{crc}(m) \oplus \operatorname{crc}(\Delta) \oplus \operatorname{crc}(0) crc ( m ) ⊕ crc ( Δ ) ⊕ crc ( 0 ) で、Δ \Delta Δ だけから 計算できる。CRC は 偶然の 誤りの 検出に しか 役立たない。
ストリーム暗号で 暗号化しても 防げない。暗号文の ビットを 反転すると、復号後の 平文の 同じ ビットが 反転するので、攻撃者は 平文に 差分 Δ \Delta Δ を 加え、暗号化された CRC の 部分を crc ( Δ ) ⊕ crc ( 0 ) \operatorname{crc}(\Delta) \oplus \operatorname{crc}(0) crc ( Δ ) ⊕ crc ( 0 ) だけ 反転させればよい。復号後の CRC は 改ざん後の データと 一致する(WEP が 受けた 攻撃と 同じ 原理)。改ざん検出には、メッセージ認証符号や デジタル署名(ファームウェアなら 署名の 検証)が 必要である。