纠错码的构造

综述

纠错码,是指在传输过程中发生错误后能在收端自行发现或纠正的码。而寻找性能良好的纠错码本质上是一个组合学的问题。

如果用 n n n表示码长, K K K表示码字个数, d d d表示码字个数,那么往往就有如下两个问题:

1.对于固定的 n n n K K K d d d最大可以是多少?
2.对于固定的 n n n d d d K K K最大可以是多少?

这两个问题都属于组合极值问题,无外乎两个步骤:1.确定范围,2.给出一个构造。而本篇文章,基于《纠错码的代数理论》上的习题,给出了一些构造的方法。

构造方法

Hamming界的应用

题:第8页的习题2
一个码长为8的二元码,最小距离为5,试问最多能有多少码字?
( q = 2 , n = 8 , d = 5 , K m a x = ? q=2,n=8,d=5,K_{max}=? q=2,n=8,d=5,Kmax=?)

首先可以用定理1.3.1和\定理1.3.3这两个不等式初步估计出范围: K K K的Hamming界是 256 37 \frac{256}{37} 37256,Singleton界是 16 16 16,Hamming界小于Singleton界,而K是正整数,所以 K ≤ 6 K\leq 6 K6
接下来很自然的一个想法是:能否构造出 K = 6 K=6 K=6,答案是否定的,证明如下:
反证法:如果 K = 6 K=6 K=6,那么不妨设 ( 00000000 ) ∈ C (00000000)\in C (00000000)C(码的平移是等价变换)。因为 d > 5 d>5 d>5,所以其余每一个码至少含有5个1。不妨设C中有一个码前5位均为1(分量置换是等价变换)。得到下图:
0 0 0 0 0 0 0 0 1 1 1 1 1 ? ? ? \begin{array}{cccccccc} 0&0&0&0&0&0&0&0 \\ 1&1&1&1&1&?&?&? \end{array} 01010101010?0?0?

接下来进一步分析,因为每一个码至少有5个1,所以前五位至少有2个1,而且至多有3个1,否则与第二个码距离小于5
更进一步得到,不能同时有两个码,前五位只有2个1,否则,后三位相同(都是1),而前五位至少有一位相同,得到这两个码的距离小于5,矛盾!
另一方面,不能同时有两个码,前五位有3个1。否则,因为与第二个码距离为5,而前五位中已经有3个数字相同(都是1),所以这两个码后三位相同,都与第二个码后三位相反,而前五位至少有一位相同,得到这两个码的距离小于5,矛盾!
综上分析

  1. 前五位至少有2个1,至多有3个1
  2. 不能同时有两个码,前五位只有2个1
  3. 不能同时有两个码,前五位有3个1
    ⟹ \Longrightarrow 至多再有两个码,一个码前五位有2个1,另一个码前五位有3个1。
    所以 K ≤ 4 K\leq4 K4
    容易给出一个构造:
    0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 1 \begin{array}{cccccccc} 0&0&0&0&0&0&0&0 \\ 1&1&1&1&1&0&0&0 \\ 1&1&0&0&0&1&1&1\\ 0&0&1&1&1&1&1&1 \end{array} 01100110010101010101001100110011

Singleton界的应用

题:第8页的习题3
一个码长为n的q元码,最小距离为2,试问最多能有多少码字?

首先用定理1.3.1和定理1.3.3这两个不等式初步估计出范围: K K K的Hamming界是 q n q^n qn,Singleton界是 q n − 1 q^{n-1} qn1,Hamming界大于Singleton界,所以 K ≤ q n − 1 K\leq q^{n-1} Kqn1

扫描二维码关注公众号,回复: 11772242 查看本文章

先从简单情况做起,将一般问题特殊化:如果 q = 2 , n = 4 q=2, n=4 q=2,n=4,那么 K ≤ 8 K\leq8 K8。不妨设 ( 0000 ) ∈ C (0000)\in C (0000)C,那么其余每个码至少有2个1,注意到 C 4 2 = 6 C_4^2=6 C42=6,再加上 ( 1111 ) (1111) (1111),容易得到以下构造:
0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 \begin{array}{cccc} 0&0&0&0\\ 1&1&0&0\\ 1&0&1&0\\ 1&0&0&1\\ 0&1&1&0\\ 0&1&0&1\\ 0&0&1&1\\ 1&1&1&1\\ \end{array} 01110001010011010010101100010111

K = 8 K=8 K=8,正好是Singleton界。

接下来考虑 q = 3 , n = 4 q=3,n=4 q=3,n=4,那么 K ≤ 27 K\leq27 K27。能否给出一个 K = 27 K=27 K=27的构造呢,这是解决这道问题的关键。
为什么是27呢,27这个数字意味着什么?很自然地想到 27 = 3 3 27=3^3 27=33,进一步联想到,这正好是所有3位3进制数的个数:
0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0 2 1 1 0 1 1 1 1 2 0 1 2 1 1 2 2 2 0 0 2 0 1 2 0 2 2 1 0 2 1 1 2 2 0 2 2 1 2 2 2 \begin{array}{ccc} 0&0&0\\ 0&0&1\\ 0&0&2\\ 0&1&0\\ 0&1&1\\ 0&2&0\\ 0&2&1\\ 0&2&2\\ \end{array} \quad \begin{array}{ccc} 1&0&0\\ 1&0&1\\ 1&0&2\\ 1&1&0\\ 1&1&1\\ 1&2&0\\ 1&2&1\\ 1&2&2\\ \end{array} \quad \begin{array}{ccc} 2&0&0\\ 2&0&1\\ 2&0&2\\ 2&1&0\\ 2&1&1\\ 2&2&0\\ 2&2&1\\ 2&2&2\\ \end{array} 000000000001122201201012111111110001122201201012222222220001122201201012

在此基础上,很自然地想到,只要再添加一列,使得所有分量之和在模3的意义下为0,那么这就是 K = 27 K=27 K=27的构造!
0 0 0 ∣ 0 0 0 1 ∣ 2 0 0 2 ∣ 1 0 1 0 ∣ 2 0 1 1 ∣ 1 0 2 0 ∣ 1 0 2 1 ∣ 0 0 2 2 ∣ 2 1 0 0 ∣ 2 1 0 1 ∣ 1 1 0 2 ∣ 0 1 1 0 ∣ 1 1 1 1 ∣ 0 1 2 0 ∣ 0 1 2 1 ∣ 2 1 2 2 ∣ 1 2 0 0 ∣ 1 2 0 1 ∣ 0 2 0 2 ∣ 2 2 1 0 ∣ 0 2 1 1 ∣ 2 2 2 0 ∣ 2 2 2 1 ∣ 1 2 2 2 ∣ 0 \begin{array}{cccc} 0&0&0&|0\\ 0&0&1&|2\\ 0&0&2&|1\\ 0&1&0&|2\\ 0&1&1&|1\\ 0&2&0&|1\\ 0&2&1&|0\\ 0&2&2&|2\\ \end{array}\quad\begin{array}{cccc} 1&0&0&|2\\ 1&0&1&|1\\ 1&0&2&|0\\ 1&1&0&|1\\ 1&1&1&|0\\ 1&2&0&|0\\ 1&2&1&|2\\ 1&2&2&|1\\ \end{array}\quad\begin{array}{cccc} 2&0&0&|1\\ 2&0&1&|0\\ 2&0&2&|2\\ 2&1&0&|0\\ 2&1&1&|2\\ 2&2&0&|2\\ 2&2&1&|1\\ 2&2&2&|0\\ \end{array} 000000000001122201201012021211021111111100011222012010122101002122222222000112220120101210202210

再将特殊问题一般化:对于一般的n和q,d=2,那么 K m a x = q n − 1 K_{max}=q^{n-1} Kmax=qn1。首先由\textbf{定理1.3.3}, K ≤ q n − 1 K\leq q^{n-1} Kqn1给出如下构造:
前n-1位为所有n-1位的q进制数排列,最后一位使得所有分量之和在模q的意义下为0
这样,前n-1位至少有一位不相同,而如果前n-1位只有一位不相同,那么他们最后一位必然不相同。所以d=2。

这道题体现了矛盾的普遍性与特殊性是辩证统一的关系。一方面,普遍性寓于特殊性之中,并通过特殊性表现出来,没有特殊性就没有普遍性。另一方面,特殊性也离不开普遍性,不存在不包含普遍性的特殊性。两者彼此相联,不可分割

扩充法

题:第8页的习题4
能否构作一个参数为[8,4,4]的二元码

这题如果直接构造,比较困难,但是如果借助一下他山之石,那么这题就可以迎刃而解。参见第7页例3,如果在这码长为7的基础上,增加一位,增加的这一位,使得每个码所有分量之和在模2意义下为0,那么这就是一个符合条件的构造:
0 0 1 0 1 1 1 ∣ 0 1 0 0 1 0 1 1 ∣ 0 1 1 0 0 1 0 1 ∣ 0 1 1 1 0 0 1 0 ∣ 0 0 1 1 1 0 0 1 ∣ 0 1 0 1 1 1 0 0 ∣ 0 0 1 0 1 1 1 0 ∣ 0 0 0 0 0 0 0 0 ∣ 0 1 1 0 1 0 0 0 ∣ 1 0 1 1 0 1 0 0 ∣ 1 0 0 1 1 0 1 0 ∣ 1 0 0 0 1 1 0 1 ∣ 1 1 0 0 0 1 1 0 ∣ 1 0 1 0 0 0 1 1 ∣ 1 1 0 1 0 0 0 1 ∣ 1 1 1 1 1 1 1 1 ∣ 1 \begin{array}{cccccccc} 0&0&1&0&1&1&1&|0\\ 1&0&0&1&0&1&1&|0\\ 1&1&0&0&1&0&1&|0\\ 1&1&1&0&0&1&0&|0\\ 0&1&1&1&0&0&1&|0\\ 1&0&1&1&1&0&0&|0\\ 0&1&0&1&1&1&0&|0\\ 0&0&0&0&0&0&0&|0\\ \end{array} \quad \begin{array}{cccccccc} 1&1&0&1&0&0&0&|1\\ 0&1&1&0&1&0&0&|1\\ 0&0&1&1&0&1&0&|1\\ 0&0&0&1&1&0&1&|1\\ 1&0&0&0&1&1&0&|1\\ 0&1&0&0&0&1&1&|1\\ 1&0&1&0&0&0&1&|1\\ 1&1&1&1&1&1&1&|1\\ \end{array} 01110100001110101001110001001110101001101101001011101000000000001000101111000101011000111011000101011001001011010001011111111111

抽屉原理

题:第8页的习题4
能否构作一个参数为[8,4,4]的二元码

如果这题要直接构造,又该如何下手呢?首先依然可以不妨设 ( 00000000 ) ∈ C (00000000)\in C (00000000)C,然后就有其余每个码至少含有4个1。接下来可以来算一笔账:剩下15个码中,每个码至少含有4个1,那么总共就有60个1,而码长为8,那么由抽屉原理,存在某一列,至少有8个相同,均为1。不妨设为第一列。
再对这8个码进行分析:这8个码,第二列至第七列每行至少有3个1,总共有 8 × 3 = 24 8\times3=24 8×3=24个1,由抽屉原理,存在某一列,至少有4个相同,均为1,不妨设为第二列。
依次类推,得到下图:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \begin{array}{cccccccc} 1&1&1&1&&&&\\ 1&1&1&&&&&\\ 1&1&&&&&&\\ 1&1&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ \end{array} 111111111111111

接下来,对第一行,第二行进行扩充:
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&&&&&&\\ 1&1&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ \end{array} 111111111111111110101010

再进行如下演变:
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&&&&&&\\ 1&1&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ \end{array} 111111111111111110101010
→ \rightarrow
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ 1&&&&&&&\\ \end{array} 111111111111110011001010101010011001
→ \rightarrow
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&0&&&&&&\\ 1&0&&&&&&\\ 1&0&&&&&&\\ 1&0&&&&&&\\ \end{array} 1111111111110000110011001010101010011001
→ \rightarrow
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&0&1&0&&&&\\ 1&0&1&0&&&&\\ 1&0&0&1&&&&\\ 1&0&0&1&&&&\\ \end{array} 111111111111000011001100110000111010101010011001
→ \rightarrow
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&0&1&0&1&0&1&0\\ 1&0&1&0&0&1&0&1\\ 1&0&0&1&&&&\\ 1&0&0&1&&&&\\ \end{array} 11111111111100001100110011000011101010101001100110100101
→ \rightarrow
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 1 0 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&0&1&0&1&0&1&0\\ 1&0&1&0&0&1&0&1\\ 1&0&0&1&1&0&0&1\\ 1&0&0&1&0&1&1&0\\ \end{array} 1111111111110000110011001100001110101010101001011001100110010110

这里有8个码,再取反,得到另外8个码,容易验证这是符合条件的一种构造:
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 \begin{array}{cccccccc} 1&1&1&1&1&1&1&1\\ 1&1&1&1&0&0&0&0\\ 1&1&0&0&1&1&0&0\\ 1&1&0&0&0&0&1&1\\ 1&0&1&0&1&0&1&0\\ 1&0&1&0&0&1&0&1\\ 1&0&0&1&1&0&0&1\\ 1&0&0&1&0&1&1&0\\ \end{array} \quad\quad \begin{array}{cccccccc} 0&0&0&0&0&0&0&0\\ 0&0&0&0&1&1&1&1\\ 0&0&1&1&0&0&1&1\\ 0&0&1&1&1&1&0&0\\ 0&1&0&1&0&1&0&1\\ 0&1&0&1&1&0&1&0\\ 0&1&1&0&0&1&1&0\\ 0&1&1&0&1&0&0&1\\ \end{array} 11111111111100001100110011000011101010101010010110011001100101100000000000001111001100110011110001010101010110100110011001101001

题:第13页的习题3
试构作参数为(n,K,d) = (9,6,5) 和 (10,6,6)的二元码

先构造(10,6,6),不妨设 ( 0000000000 ) ∈ C (0000000000)\in C (0000000000)C,这样其他五个码,每个码至少含有6个1。这五个码,总共至少有30个1,而一共有10列,每列至少有3个1。注意到 C 5 3 = 10 C_5^3=10 C53=10,罗列出所有3个1,2个0的排列,即得到一种构造!
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 \begin{array}{cccccccccc} 0&0&0&0&0&0&0&0&0&0\\ 1&1&1&1&1&1&0&0&0&0\\ 1&1&1&0&0&0&1&1&1&0\\ 1&0&0&1&1&0&1&1&0&1\\ 0&1&0&1&0&1&1&0&1&1\\ 0&0&1&0&1&1&0&1&1&1\\ \end{array} 011100011010011001010110010101010011001110001101001011000111

若去掉最后一列,即为(9,6,5)的构造

总结

总的来说,纠错码的构造问题往往灵活多变,没有固定的招数。虽然其实可能未必有什么用,但其实不妨看作是思维的游戏。

猜你喜欢

转载自blog.csdn.net/weixin_43084570/article/details/108712472