把纠错变成几何:码字是立方体的顶点
在他之前,检错码是一条一条想出来的巧办法。他把所有码字摆进一个 n 维立方体,于是「能不能纠错」变成了「点与点隔得够不够远」。
1950 年 4 月《贝尔系统技术杂志》第 29 卷第 2 号 147–160 页,第 5 节《一个几何模型》。在这一节之前,检错的办法是一条一条攒出来的:电话交换里的「五中取二」码、无线电报的「七中取三」码、电报末尾附的字数——每一种都是一个单独的巧思,彼此之间讲不出关系。他做的事只有一步:把一个 n 位的 0-1 串等同于 n 维单位立方体的一个顶点,整个码就是 2ⁿ 个顶点里挑出来的一个子集。然后在这个空间上装一个距离,「D(x, y) 定义为 x 与 y 不相同的坐标的个数」,而紧接着的那一句才是要害:「这与从 x 走到 y 最少要跨过几条棱是同一回事。」代数的定义与几何的走法,在这里被摁成了一件事。他随后逐条验了它确是一个度量:D(x,y)=0 当且仅当 x=y;D(x,y)=D(y,x)>0 当 x≠y;以及三角不等式。本馆把这三行与原刊逐字核过,发现第三行印错了一处:三角不等式的第一项印作 D(z, y),应作 D(x, y)。三条互相独立的判据。其一,按印本写的那样,左边由上一行刚给出的对称性等于 2D(y,z),取 y=z 就成了 0 ≥ D(x,z),只要 x 与 z 不同就是假的。其二,一个不等式的右边出现了左边完全没有的自由变量 x,形式上就不成篇。其三,同一页上 x 与 z 的字形判然有别,而前两行的 x 全部印对,可见不是字模混用;顺带一提,同一行右边那个 D 还误排成了正体,而前两行三个 D 都是斜体——这一行整体排得潦草。接着他给了一个例子:三维立方体里的 001、010、100、111,两两相距两个单位。六对距离本馆复算过,全是 2。有了距离就有了球:以 x 为心、半径 r 的球是所有与 x 相距 r 的点。于是整篇文章的主句可以一句话说完——码点之间的最小距离决定了这个码能做什么。他把它列成了表 V:最小距离 1 只保证唯一,2 能检一位错,3 能纠一位,4 能纠一位同时检两位,5 能纠两位。本馆按「最小距离 d 能检 d−1 位、能纠 (d−1)/2 的下取整位」复算,五行逐行吻合。他还点出一件容易被忽略的事:在同一个最小距离下,纠错的本事可以换成检错的本事——最小距离 5 的码可以用来纠两位,也可以用来纠一位加检三位,还可以纯用来检四位。这一步之后,「找一个好码」不再是灵机一动,而成了一个说得清的几何问题:在立方体的顶点里挑一批两两离得够远的点。今天汉明距离早已走出编码——拼写检查、生物序列比对、局部敏感哈希里用的都是它。
拨 n 看立方体长出来,点开任意两个码点量它们之间隔着几条棱;再把最小距离从 1 拨到 5,看表 V 那五行是怎么从「球碰不碰得着」推出来的
在他之前,检错码是一条一条想出来的巧办法——电话交换的「五中取二」、无线电报的 「七中取三」、电报末尾附的字数——彼此之间讲不出关系。1950 年那篇的第 5 节只做了一步: 把一个 n 位的 0-1 串看成 n 维立方体的一个顶点,再定义D(x, y) 为两者不同的坐标个数。紧接着那一句才是要害——「这与从 x 走到 y 最少要跨过几条棱是同一回事」。 画布上那条金色的路径就是在走棱:此刻不同的坐标有 3 个,而路径走了 3 条棱,两个数永远相等。有了距离就有了球, 于是「这个码能纠几位错」变成了「码点之间隔得够不够远」,也就是下面那张表 V; 而「找一个好码」从灵机一动变成了一个说得清的几何问题: 在立方体的顶点里挑一批两两离得够远的点。 原刊这一页上他还顺手指出,同一个最小距离下纠错的本事可以换成检错的本事: 最小距离 5 可以用来纠两位,也可以纠一位加检三位,还可以纯用来检四位。顺带记一处原文印错:这一页上度量三条件的第三行, 三角不等式的第一项印作 D(z, y),应作 D(x, y)——照印本那样写, 由上一行的对称性左边就等于 2D(y, z),取 y = z 便成了 0 ≥ D(x, z), 而右边还出现了左边根本没有的 x。
