8.3 纠错码Error-correcting codes
本页为译文 + 高中讲解合一:黑色正文为忠实翻译;彩色框(目标 / 例 / 分步推演 / 即时自测)与配图为面向高中生的详解,逐步推演、举例、画图,不用比喻。
8.3.1 彼此相距甚远的词Words far apart
即使一间酒吧和一间牙医诊所都缺少了若干平常该有的特征,我们多半仍能把它们区分开来。这两个场所如此不同,以至于只要看到它们的一部分,就足以判断哪个是酒吧、哪个是牙医诊所。事实证明,这一想法在编码理论(Coding Theory)中至关重要。
假设我们想用只含两个字母 \(0\) 和 \(1\) 的二元字母表(binary alphabet),通过手机发送一条消息。比方说我们要发送的是一条“是”或“否”的消息。我们可以与接收方约定:\(1\) 表示“是”,\(0\) 表示“否”。如果双方都确信打字时不会出错,这就足够简单了。
然而,如果错误是可能发生的,那么这种编码消息的方式就不高效了。事实上,仅仅一个错误就能把消息的含义完全颠倒成它的反面。要确保我们的消息不被误解,一种办法是把它反复发送好几遍,写在连续的若干位上。比方说,我们把消息发送三遍。如果消息是“是”,我们就发送数字 \(111\);如果消息是“否”,我们就发送数字 \(000\)。这两个码字(codeword)彼此一点也不相像。因此,只要我们确信至多发生一个打字错误,就可以放心,我们的消息会被正确理解。事实上,如果我们想发送码字 \(111\)(或 \(000\)),且至多犯一个错误,那么收到的词将至少含两个 \(1\)(或至少含两个 \(0\))。所以,只要每个码字中至多有一位是错误的,所有错误都能被纠正。
- 发送方想说“是”,发出 \(111\)。传输中某一位出错,接收方收到 \(101\)。
- 接收方数一数:\(101\) 里有两个 \(1\)、一个 \(0\)。它更接近 \(111\)(只差 \(1\) 位)而非 \(000\)(差 \(2\) 位)。
- 因此判定原消息是 \(111\) = “是”,错误被纠正。
- 反之若只发一位(\(1\) 表“是”,\(0\) 表“否”),收到的 \(0\) 既可能是 \(0\) 本身、也可能是 \(1\) 出错,无从分辨。重复三遍才让两个码字“拉开了距离”。
这个简单的例子可以朝许多不同方向加以推广。第一,可能要发送的消息不止两条。第二,编码字母表里的数字也可能多于两个。第三,打字时可能犯不止一个错误。尽管如此,我们这个简单例子的核心思想仍然至关重要:这个思想就是,如果各码字之间足够互不相似,那么即使犯了几个错误,我们仍能把它们区分开来。
现在,是时候把“足够不相似”和“几个错误”这两个概念变得更精确了。
既然我们已经有了两个词之间的距离概念,就可以仿照欧几里得几何(Euclidean geometry),定义球面与球的概念。
类似地,以 \(x\) 为球心、\(r\) 为半径的球(ball)\(B_r(x)\),是 \(A\) 上所有与 \(x\) 距离至多为 \(r\) 的 \(k\) 字母词组成的集合。
- 把第 1 位 \(1\) 翻成 \(0\):得 \(0010\)。
- 把第 2 位 \(0\) 翻成 \(1\):得 \(1110\)。
- 把第 3 位 \(1\) 翻成 \(0\):得 \(1000\)。
- 把第 4 位 \(0\) 翻成 \(1\):得 \(1011\)。
- 这 4 个词构成球面 \(S_1(x)\)。再补上球心 \(x=1010\) 自己(距离 \(0\)),就得到球 \(B_1(x)\),共 \(5\) 个词。
现在,可以把我们先前的观察用更精确的方式表述出来了。
如果一个码 \(C\) 具有这样的性质:每个码字至多犯 \(r\) 个错误时所有错误都能被纠正,那么我们就称该码为 \(r\)-纠错码(\(r\)-error-correcting)。
读者也许会说,很好,但我们如何能快速地检验:对每一对码字 \((x,y)\),球 \(B_r(x)\) 与 \(B_r(y)\) 的确不相交呢?读者在高中里一定学过三角不等式。这条不等式说,在欧几里得几何中,三角形两边之和总是大于第三边,其本质原因在于两点之间最短的路径是直线段。幸运的是,对有限字母表上的词,也有非常类似的结论成立。
证明见习题 10。
- \(d(x,z)\):\(000\) 与 \(011\) 在第 2、3 位不同,故 \(d(x,z)=2\)。
- \(d(z,y)\):\(011\) 与 \(111\) 在第 1 位不同,故 \(d(z,y)=1\)。
- \(d(x,y)\):\(000\) 与 \(111\) 三位全不同,故 \(d(x,y)=3\)。
- 检验:\(3\le 2+1=3\),不等式成立(此处恰好取等)。♦
现在假设存在 \(z\in B_r(x)\cap B_r(y)\)。那么由三角不等式可得 \[d(x,y)\le d(x,z)+d(z,y)\le r+r=2r,\] 这与 \(d(x,y)\ge 2r+1\) 矛盾。所以这样的 \(z\) 不存在。♦
- 想要的结论:每对码字的半径-\(r\) 球不相交(这样命题 8.22 就保证可纠 \(r\) 个错)。
- 反证:假设某对球相交,取交集中一点 \(z\)。则 \(z\) 离 \(x\) 不超过 \(r\),离 \(y\) 也不超过 \(r\)。
- 用三角不等式:\(d(x,y)\le d(x,z)+d(z,y)\le r+r=2r\)。即两码字相距至多 \(2r\)。
- 撞上前提:但前提是任意两码字相距至少 \(2r+1\),与“至多 \(2r\)”矛盾。
- 收尾:矛盾说明交集中的 \(z\) 根本不存在,即球两两不相交。证毕。
读者也许又会说,很好,但我仍然得检验:没有任何两个码字彼此距离小于 \(2r+1\)。这件事怎样才能快速完成呢?如果空间不成为顾虑,这本来不是问题。事实上,这非常……
(本节原文 PDF 至此处中断。)
- 计算二进制词 \(x=110010\) 与 \(y=011011\) 的汉明距离 \(d(x,y)\)。
- 设字母表为二元、词长 \(k=4\),\(x=0000\)。写出球面 \(S_2(x)\) 的全部元素,并求 \(|B_2(x)|\)。
- 某个二元码只有两个码字 \(00000\) 与 \(11111\)。它们的汉明距离是多少?根据推论 8.24,这个码最多能保证纠正每个码字中的几个错误?
返回 全书目录