循环码的一些实例:Hamming码、Golay码、CRC码
填充半径和堆积半径线性空间GF(q)nGF(q)^nGF(q)n中的关于v\pmb vvvv的半径为ttt的汉明球(Hamming Sphere),它是一个集合,包含所有的与v\pmb vvvv有至多ttt个不同分量的点。体积定义为包含的点数:V=∑i=0t(ni)(q−1)iV = \sum_{i=0}^t {n \choose i} (q-1)^iV=i=0∑t(in)(q−1)i汉明球不
填充半径和堆积半径
线性空间
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=0∑t(in)(q−1)i
汉明球不像(欧几里得)球,它使用的距离是汉明距离,只关心不同位置的数量。
填充半径(packing radius):令所有码字 c ∈ C \pmb c \in \mathscr C ccc∈C上都有相同整数半径的汉明球,不断增大半径,直到继续增大会导致汉明球相交。
覆盖半径(covering radius):令所有码字 c ∈ C \pmb c \in \mathscr C ccc∈C上都有相同整数半径的汉明球,不断减小半径,直到继续减小会导致存在 v ∈ G F ( q ) n \pmb v \in GF(q)^n vvv∈GF(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
k≤n−logq(i=0∑t(in)(q−1)i),t=⌊(d−1)/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=1−nlogqV(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) ((qm−1)/(q−1),(qm−1)/(q−1)−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)} H∈GF(q)m×(qm−1)/(q−1)
汉明码(Hamming Code):将 n = ( q m − 1 ) / ( q − 1 ) n=(q^m-1)/(q-1) n=(qm−1)/(q−1), ( n , n − m ) (n,n-m) (n,n−m)线性码叫做汉明码。
作为循环码
大多数汉明码是循环码,其构造方法为:
- 令 α \alpha α是 G F ( q m ) GF(q^m) GF(qm)的本原元, β = α q − 1 \beta = \alpha^{q-1} β=αq−1,那么 o r d ( β ) = ( q m − 1 ) / ( q − 1 ) ord(\beta)=(q^m-1)/(q-1) ord(β)=(qm−1)/(q−1),记 n = ( q m − 1 ) / ( q − 1 ) n=(q^m-1)/(q-1) n=(qm−1)/(q−1)
- 计算 β \beta β的极小多项式 g ( x ) ∣ x n − 1 g(x) | x^n-1 g(x)∣xn−1,因此 g ( x ) g(x) g(x)是 n n n长循环码的生成多项式。
- β \beta β是 g ( x ) g(x) g(x)的零点,因此校验矩阵为 H = [ β 0 , β 1 , ⋯ , β n − 1 ] H=[\beta^0,\beta^1,\cdots,\beta^{n-1}] H=[β0,β1,⋯,βn−1]
- 容易看出, H H H作为 G F ( q ) GF(q) GF(q)上矩阵,它的形状是 m × n m \times n m×n的,因此得到的循环码是 ( n , n − m ) (n,n-m) (n,n−m)线性码(就是汉明码)。
定理:令
α
\alpha
α是
G
F
(
q
m
)
GF(q^m)
GF(qm)的本原元,
β
=
α
q
−
1
\beta = \alpha^{q-1}
β=αq−1,构造校验矩阵
H
=
[
β
0
,
β
1
,
⋯
,
β
n
−
1
]
H=[\beta^0,\beta^1,\cdots,\beta^{n-1}]
H=[β0,β1,⋯,βn−1],对应的
G
F
(
q
)
GF(q)
GF(q)上
n
=
(
q
m
−
1
)
/
(
q
−
1
)
n=(q^m-1)/(q-1)
n=(qm−1)/(q−1)长的循环码,有
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
dmin≥3⟺gcd(n,q−1)=1⟺gcd(m,q−1)=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,4−1)=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+1∈GF(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+1∈GF(2)[x]
且满足
(
x
−
1
)
g
(
x
)
g
~
(
x
)
=
x
23
−
1
(x-1) g(x) \tilde g(x) = x^{23}-1
(x−1)g(x)g~(x)=x23−1
由于
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)∈C⟺c~(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)modxn−1,其中 b ( x ) b(x) b(x)是度数为 t − 1 t-1 t−1且常数项非零的某多项式。
如果一个循环码 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)∣xn−1,则 C ′ \mathscr C' C′的生成多项式是 g ( x j ) ∣ x j n − 1 g(x^j)|x^{jn}-1 g(xj)∣xjn−1
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) (2m−1,2m−m−2)循环码。
注意到 x + 1 ∣ c ( x ) x+1|c(x) x+1∣c(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 n−k的循环突发错误(这会使得 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=n−k)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)