填充半径和堆积半径

线性空间 G F ( q ) n GF(q)^n GF(q)n中的关于 v \pmb v vvv的半径为 t t t汉明球(Hamming Sphere),它是一个集合,包含所有的与 v \pmb v vvv有至多 t t t个不同分量的点。体积定义为包含的点数:
V ( t ;   q ) = ∑ i = 0 t ( n i ) ( q − 1 ) i V(t;\,q) = \sum_{i=0}^t {n \choose i} (q-1)^i V(t;q)=i=0t(in)(q1)i
汉明球不像(欧几里得)球,它使用的距离是汉明距离,只关心不同位置的数量。

填充半径(packing radius):令所有码字 c ∈ C \pmb c \in \mathscr C cccC上都有相同整数半径的汉明球,不断增大半径,直到继续增大会导致汉明球相交。

覆盖半径(covering radius):令所有码字 c ∈ C \pmb c \in \mathscr C cccC上都有相同整数半径的汉明球,不断减小半径,直到继续减小会导致存在 v ∈ G F ( q ) n \pmb v \in GF(q)^n vvvGF(q)n不落在任何一个汉明球内部。

完美码(perfect code):关于码字的汉明球可以完全覆盖整个空间,同时这些汉明球不相交。即,填充半径等于覆盖半径。

Hamming Bound:对于任意 ( n , k , d ) q (n,k,d)_q (n,k,d)q码,有
k ≤ n − log ⁡ q ( ∑ i = 0 t ( n i ) ( q − 1 ) i ) ,   t = ⌊ ( d − 1 ) / 2 ⌋ k \le n - \log_q \left( \sum_{i=0}^{t} {n \choose i} (q-1)^i \right),\, t=\lfloor(d-1)/2\rfloor knlogq(i=0t(in)(q1)i),t=(d1)/2

易知,完美码达到汉明界,码率为
R = k n = 1 − log ⁡ q V ( t ;   q ) n R=\frac{k}{n} = 1 - \frac{\log_q V(t;\,q)}{n} R=nk=1nlogqV(t;q)

全部的非平凡完美码为:

  • Hamming Code ( ( q m − 1 ) / ( q − 1 ) ,   ( q m − 1 ) / ( q − 1 ) − m ) ((q^m-1)/(q-1),\, (q^m-1)/(q-1)-m) ((qm1)/(q1),(qm1)/(q1)m)汉明码

  • Golay Code ( 23 , 12 , 7 ) (23,12,7) (23,12,7)二元格雷码, ( 11 , 6 , 5 ) (11,6,5) (11,6,5)三元格雷码

Hamming Code

设计思路

定理:编码 C \mathscr C C包含汉明重量为 w w w的非零码字    ⟺    \iff 校验矩阵 H H H中存在线性相关的 w w w列。推出,码 C \mathscr C C的最小距离 d m i n d_{min} dmin等于 H H H中线性相关的最少列数。

思路:一个 G F ( q ) GF(q) GF(q)上的 m m m元组,它包含 q m q^m qm种可能。由非零元按列组合,得到校验矩阵 H H H。为了使得编码的极小距离至少为 3 3 3,需要 H H H中的任意 2 2 2列线性不相关,因此要 G F ( q ) m GF(q)^m GF(q)m的每个一维子空间中只能选取至多一个向量。最终, H ∈ G F ( q ) m × ( q m − 1 ) / ( q − 1 ) H \in GF(q)^{m \times (q^m-1)/(q-1)} HGF(q)m×(qm1)/(q1)

汉明码(Hamming Code):将 n = ( q m − 1 ) / ( q − 1 ) n=(q^m-1)/(q-1) n=(qm1)/(q1) ( n , n − m ) (n,n-m) (n,nm)线性码叫做汉明码。

作为循环码

大多数汉明码是循环码,其构造方法为:

  1. α \alpha α G F ( q m ) GF(q^m) GF(qm)的本原元, β = α q − 1 \beta = \alpha^{q-1} β=αq1,那么 o r d ( β ) = ( q m − 1 ) / ( q − 1 ) ord(\beta)=(q^m-1)/(q-1) ord(β)=(qm1)/(q1),记 n = ( q m − 1 ) / ( q − 1 ) n=(q^m-1)/(q-1) n=(qm1)/(q1)
  2. 计算 β \beta β的极小多项式 g ( x ) ∣ x n − 1 g(x) | x^n-1 g(x)xn1,因此 g ( x ) g(x) g(x) n n n长循环码的生成多项式。
  3. β \beta β g ( x ) g(x) g(x)的零点,因此校验矩阵为 H = [ β 0 , β 1 , ⋯   , β n − 1 ] H=[\beta^0,\beta^1,\cdots,\beta^{n-1}] H=[β0,β1,,βn1]
  4. 容易看出, H H H作为 G F ( q ) GF(q) GF(q)上矩阵,它的形状是 m × n m \times n m×n的,因此得到的循环码是 ( n , n − m ) (n,n-m) (n,nm)线性码(就是汉明码)。

定理:令 α \alpha α G F ( q m ) GF(q^m) GF(qm)的本原元, β = α q − 1 \beta = \alpha^{q-1} β=αq1,构造校验矩阵 H = [ β 0 , β 1 , ⋯   , β n − 1 ] H=[\beta^0,\beta^1,\cdots,\beta^{n-1}] H=[β0,β1,,βn1],对应的 G F ( q ) GF(q) GF(q) n = ( q m − 1 ) / ( q − 1 ) n=(q^m-1)/(q-1) n=(qm1)/(q1)长的循环码,有
d m i n ≥ 3    ⟺    g c d ( n , q − 1 ) = 1    ⟺    g c d ( m , q − 1 ) = 1 d_{min} \ge 3 \iff gcd(n, q-1)=1 \iff gcd(m, q-1)=1 dmin3gcd(n,q1)=1gcd(m,q1)=1
定理:汉明码是可以纠正 1 1 1位错(error correction)、检出 2 2 2位错(error detection)的完美码

非循环汉明码的例子: G F ( 4 ) GF(4) GF(4)上的 ( 21 , 18 ) (21,18) (21,18)汉明码,因为 g c d ( 21 , 4 − 1 ) = 3 gcd(21,4-1)=3 gcd(21,41)=3

Golay Code

格雷码(?)这是 Golay Code(一种纠错码),不是 Gray Code(一种编码,任意两个相邻的代码只有一位二进制数不同),专有名词翻译好难啊 ╮(╯﹏╰)╭

( 23 , 12 , 7 ) (23,12,7) (23,12,7)二元格雷码(binary Golay code),其生成多项式为:
g ( x ) = x 11 + x 10 + x 6 + x 5 + x 4 + x 2 + 1 ∈ G F ( 2 ) [ x ] g(x) = x^{11}+x^{10}+x^6+x^5+x^4+x^2+1 \in GF(2)[x] g(x)=x11+x10+x6+x5+x4+x2+1GF(2)[x]
容易计算它的互反多项式(reciprocal polynomial),
g ~ ( x ) = x 11 + x 9 + x 7 + x 6 + x 5 + x + 1 ∈ G F ( 2 ) [ x ] \tilde g(x) = x^{11}+x^9+x^7+x^6+x^5+x+1 \in GF(2)[x] g~(x)=x11+x9+x7+x6+x5+x+1GF(2)[x]
且满足
( x − 1 ) g ( x ) g ~ ( x ) = x 23 − 1 (x-1) g(x) \tilde g(x) = x^{23}-1 (x1)g(x)g~(x)=x231
由于 g , g ~ g,\tilde g g,g~都是不可约多项式,因此只有两个 ( 23 , 12 ) (23,12) (23,12)二元循环码。且由 g ( x ) g(x) g(x)生成的码 C \mathscr C C(cyclic Golay code)和由 g ~ ( x ) \tilde g(x) g~(x)生成的码 C ′ \mathscr C' C(reciprocal cyclic Golay code)同构,确切地 c ( x ) ∈ C    ⟺    c ~ ( x ) ∈ C ′ c(x) \in \mathscr C \iff \tilde c(x) \in \mathscr C' c(x)Cc~(x)C

定理1:二元格雷码的任意非零码字的汉明重量至少是 5 5 5,并且其中的任意偶数重量都被 4 4 4整除。即,二元格雷码是 ( 23 , 12 , 7 ) (23,12,7) (23,12,7)线性码。

定理2: ( 23 , 12 , 7 ) (23,12,7) (23,12,7)二元格雷码是可以纠正 3 3 3位错误的完美码(perfect triple-error-correcting code), ( 11 , 6 , 5 ) (11,6,5) (11,6,5)三元格雷码是可以纠正 2 2 2位错误的完美码(perfect ternary Golay code),这两个编码是唯二的可纠正至少 2 2 2位错误的非平凡完美码

Cyclic Redundancy Codes

突发错误

一个 t t t长的循环突发错误(cyclic burst)是指,一个长度为 t t t的循环连续分量,它的第一位和最后一位非零。它可以被描述为 e ( x ) = x i b ( x ) m o d    x n − 1 e(x) = x^i b(x) \mod x^n-1 e(x)=xib(x)modxn1,其中 b ( x ) b(x) b(x)是度数为 t − 1 t-1 t1且常数项非零的某多项式。

如果一个循环码 C \mathscr C C的生成多项式为 g ( x ) g(x) g(x),且对于所有的长度至多为 t t t的突发错误 e ( x ) e(x) e(x),使得校验子 s ( x ) = R g ( x ) [ e ( x ) ] s(x) = R_{g(x)}[e(x)] s(x)=Rg(x)[e(x)]两两不同,那么我们说循环码 C \mathscr C C能够纠正长度至多为 t t t的所有循环突发错误

假设 ( n , k ) (n,k) (n,k)循环码 C \mathscr C C可以纠正长度至多为 t t t的所有循环突发错误,那么可以通过交叉符号(interleaving the symbols)来构造一个 ( j n , j k ) (jn,jk) (jn,jk)循环码 C ′ \mathscr C' C,它可以纠正长度至多为 j t jt jt的所有循环突发错误:假设 C \mathscr C C的生成多项式是 g ( x ) ∣ x n − 1 g(x)|x^n-1 g(x)xn1,则 C ′ \mathscr C' C的生成多项式是 g ( x j ) ∣ x j n − 1 g(x^j)|x^{jn}-1 g(xj)xjn1

CRC

循环码常被用来检出随机错误(error detection,不必纠正), 这时常被叫做循环冗余码(cyclic redundancy codes)

循环冗余码可以写作由 g ( x ) = ( x + 1 ) p ( x ) ∈ G F ( 2 ) [ x ] g(x) = (x+1)p(x) \in GF(2)[x] g(x)=(x+1)p(x)GF(2)[x]生成的循环码,其中 p ( x ) p(x) p(x)是度数为 m m m的本原多项式。因此,它是 ( 2 m − 1 , 2 m − m − 2 ) (2^m-1,2^m-m-2) (2m1,2mm2)循环码。

注意到 x + 1 ∣ c ( x ) x+1|c(x) x+1c(x),而 x + 1 x+1 x+1的汉明重量为 2 2 2,因此码字的重量都是偶数。另外 p ( x ) ∣ c ( x ) p(x)|c(x) p(x)c(x),因此它符合汉明码字的性质。即:循环冗余码是汉明码的偶数重量的码字,其最小距离为 d m i n = 4 d_{min}=4 dmin=4

校验方法:简单计算除法, s ( x ) = R g ( x ) [ c ( x ) + e ( x ) ] s(x) = R_{g(x)}[c(x)+e(x)] s(x)=Rg(x)[c(x)+e(x)],检查校验子 s ( x ) s(x) s(x)是否为零。

定理:最小距离为 d m i n d_{min} dmin ( n , k ) (n,k) (n,k)二元循环码,它可以检出所有的重量小于 d m i n d_{min} dmin的错误(因为非零码字的汉明重量不小于 d m i n d_{min} dmin),以及检出所有的长度小于 n − k n-k nk的循环突发错误(这会使得 R g ( x ) [ b ( x ) ] ≠ 0 R_{g(x)}[b(x)] \neq 0 Rg(x)[b(x)]=0,因为 deg ⁡ g = n − k \deg g=n-k degg=nk

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐