信道会出错,最朴素的对策是重复:每比特发三遍,多数表决——错误率降了,速率却掉到 1/3;要更可靠就发五遍七遍,「几乎不出错」似乎必须让速率趋于 0。
Shannon 说错了。每条信道有一个确定的数 $C$(容量):只要速率 $R<C$,就存在编码让错误率任意接近 0 而速率不必下降;一旦 $R>C$ 则再聪明的编码也注定失败。快与准不是跷跷板,是一道悬崖。秘诀在别逐个比特加固、要整块地编:把长消息整体映射成高维空间里的一个点,点与点隔得够远,噪声推偏它也依然离原点最近。
$I(X;Y)$ 是输入 $X$ 与输出 $Y$ 的互信息——收到 $Y$ 后,关于 $X$ 的不确定性减少了多少(比特)。容量 $C$ 是它在所有输入分布 $p(x)$ 上的最大值:把信道用到极致,一次最多能搬多少比特。对每比特以概率 $p$ 翻转的信道,$C=1-H(p)$,其中 $H(p)=-p\log_2 p-(1-p)\log_2(1-p)$ 是噪声自身的熵——噪声吞掉的份额,正好从满带宽 1 里扣掉。
美在证明方式的离奇。Shannon 没有构造任何一个好码,他证的是:从所有码里随机抓一个,平均表现就已足够好,故好码必然存在——用随机性证明确定性对象的存在,这是「概率方法」最震撼的一次亮相。更深的美在「阈值」这个形状:直觉预期一条平滑的权衡曲线,数学却给出锐利的相变。可靠通信原来和水的沸腾一样,是一种相变现象。
这条极限是通信业的坐标原点:一切编码方案都用「距 Shannon 极限还差几分贝」打分。Turbo 码首次逼近到 0.5 dB 以内,LDPC 码如今坐镇 5G 数据信道与 SSD 控制器。AI 一侧,率失真理论是变分自编码器与「信息瓶颈」的数学母体:训练一个表示,就是在有限容量下决定保留哪些比特。
把每个 7 位串看成 7 维立方体的一个顶点(共 128 个),噪声翻转一位就是沿棱走一步。纠错于是成了几何问题:挑一批顶点当「合法词」,两两至少相距 3 步——这样每个合法词「一步之内」的顶点围成一个小球,球球互不相交,被翻了一位的串必落在唯一一个球里。
Hamming 的构造更叫绝:7 位中留 3 位做校验,各覆盖一组特定位置;三次校验的成败写成三位二进制数,这个数直接就是出错位置的编号——校验结果自己报出了错误的门牌号。
$[n,k,d]$ 线性码把 $k$ 位信息编成 $n$ 位,任意两码字至少相差 $d$ 位(最小汉明距离),可纠 $t=\lfloor (d-1)/2\rfloor$ 个错;Hamming(7,4) 即 $[7,4,3]$。校验矩阵 $H$ 的各列恰是全部 7 个非零三位向量;收到 $\mathbf r$ 后算症状 $s=H\mathbf r$:$s=0$ 无错,否则 $s$ 作为二进制数就是出错列的下标。Hamming 界则说:$2^k$ 个球、每球 $\sum_{i\le t}\binom{n}{i}$ 个点,总和不能超过整个空间。
把数字代进去:$2^4\times(1+7)=128=2^7$。不等式取到了等号——128 个顶点被 16 个小球严丝合缝铺满,无一遗漏、无一重叠。这叫完美码:离散版的 Kepler 堆积问题,答案不是「约 74%」而是精确的 100%。这类宝石极稀少:二元情形只有 Hamming 族与两个 Golay 码,1973 年被证明再无其他。
1947 年,Hamming 的周末批处理作业总因一位错误被贝尔实验室的机器丢弃,他愤而追问:「机器既然能发现错误,为什么不能改正它?」——整个纠错码学科由此而生。今天服务器的 ECC 内存用的是 SECDED(纠一位、检两位),宇宙射线击中 DRAM 造成的比特翻转就在这里被无声修好。
两点确定一条直线。若我要传的信息就是某条直线的两个系数——那我不发系数,而在直线上取 5 个点发出去;丢掉三个也无妨,剩下任意两点就能还原它。冗余不是把消息抄几遍,而是把消息「过采样」。
一般地:$k$ 个数据符号当作 $k-1$ 次多项式的系数,在 $n$ 个点上求值发出去,收到任意 $k$ 个即可插值还原。若某个值被篡改而非丢失,它会「偏离曲线」而格外扎眼——纠一个错因此比补一个空缺贵一倍:先花冗余找出谁在说谎,再花冗余把它改对。
取有限域 $\mathrm{GF}(2^8)$——恰好 256 个元素、加减乘除俱全的「字节世界」,$\alpha$ 是其生成元。$k$ 个消息字节作多项式 $m(x)$ 的系数,在 $n\le 255$ 个点求值即得码字。参数 $[n,k,n-k+1]$:最小距离恰是 $n-k+1$,可纠 $t=\lfloor (n-k)/2\rfloor$ 个错误符号,或补 $n-k$ 个已知位置的丢失。
那个 $n-k+1$ 不是巧妙构造出来的,而是一个初等代数事实的直接推论:两个不同的 $k-1$ 次多项式最多在 $k-1$ 个点上相等,故两码字至少在 $n-k+1$ 个位置不同——而 Singleton 界说任何码的距离都不超过这个数,Reed–Solomon 正顶在天花板上。更美的是视角的转换:Hamming 靠几何摆位置,Reed–Solomon 靠代数保距离。换一副眼镜,最优性就从「精心搜索的结果」变成「定理的顺带推论」。
CD 上一道划痕会连坏几千个比特,但 RS 以字节为符号,一个字节全坏也只算一个错——再加上交织把连续损伤打散到不同码块,2.4 毫米的划痕仍能完整播放。更切身的是分布式存储的纠删码:HDFS、Ceph、S3 用 RS(10,4) 取代三副本,容忍任意 4 块盘同时故障,存储开销却从 200% 降到 40%。云存储的成本曲线,是被一条多项式压下来的。
二维码是前三个概念的工程合体。三角上的大方块是定位图案——手机先找到它们便知码的方向与透视,于是斜着扫、倒着扫都认得。数据沿 Z 字形路径填进方格,再套一层 Reed–Solomon 校验;纠错分四级,最高的 H 级冗余约 30%——这正是为何正中央压一个 logo 仍扫得出:被遮住的区域,数学上等同于一道划痕。
还有一步易被忽略却精妙:掩码。数据可能凑巧出现大片纯黑纯白,甚至误撞出酷似定位图案的花纹。于是编码器试遍 8 种花纹与数据异或,挑出黑白最均匀的那个——用可逆的伪随机打散不祥的规律。
实际的 RS 编码用系统形式:消息多项式 $m(x)$ 左移 $2t$ 位后除以生成多项式 $g(x)$,余数作为校验符号接在消息之后,于是码字 $c(x)$ 恰被 $g(x)$ 整除——即它在 $\alpha^0,\dots,\alpha^{2t-1}$ 上取值全为零。解码时代入这些点:结果不为零即有错,而这几个非零值编织成的方程组能解出错在哪、错了多少。
美在抽象的落地距离。有限域是伽罗瓦二十岁前构想的东西,当年纯为回答「五次方程为何无根式解」;两个世纪后它在你手机镜头前每天运行几十亿次——一件为理解「不可能」而造的工具,最终被用来对抗咖啡渍。
还有一重结构之美:二维码的三层防御彼此正交——定位图案、RS、掩码各守一个失效维度、互不干扰。好工程与好数学同构:把耦合的问题拆成正交的子问题。
移动支付、登机牌、商品溯源都跑在这套上;工业界的 Data Matrix 码用同样的 RS 内核,激光刻在金属零件上,经切削液与高温仍可读。1994 年原昌宏发明它本为追踪汽车零件,电装公司放弃专利收费才有今天的普及。