经典线性码基础:有限域GF(2)上的线性空间、生成矩阵与校验矩阵、线性码的编码与译码
各位同学,欢迎来到《量子信息处理中的纠错码实战教程》的第一章。
说实话,每次带新人入门纠错码,我都要先问一句:「你懂经典线性码吗?」
很多人一上来就扑向量子纠错,结果被 stabilizer formalism 搞得晕头转向。其实,量子纠错码的骨架,就是从经典线性码里长出来的。今天咱们就把这块地基打牢。
1.1 有限域 GF(2) 上的线性空间
先聊个最简单的域——GF(2)。
这个域里只有两个元素:0 和 1。加法和乘法都按模 2 来算。说白了,加法就是 XOR(异或),乘法就是 AND(与)。
GF(2) 上的加法规则:
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 0 = 1
- 1 + 1 = 0
你想想看,1+1=0 这个规则,是不是跟二进制加法里「逢二进一」的进位规则不一样?没错,GF(2) 上不考虑进位,只保留最低位。这个特性,恰恰是纠错码里最常用的。
那什么叫 GF(2) 上的线性空间呢?
简单说,就是一堆长度为 n 的二进制向量,它们对加法封闭,对数乘封闭。数乘更简单,因为标量只有 0 和 1:1 乘任何向量等于它自己,0 乘任何向量等于全零向量。
举个例子:
设 n=3,考虑集合 V = {000, 010, 101, 111}
验证一下:
010 + 101 = 111 ∈ V
010 + 111 = 101 ∈ V
000 + 任何向量 = 自身 ∈ V
嗯,这是一个线性子空间。
我个人习惯,拿到一个线性空间先看它的维数。维数 k 决定了这个空间里有多少个码字——2^k 个。这个 k 就是后面我们要说的「信息位长度」。
1.2 生成矩阵与校验矩阵
线性空间用集合表示太啰嗦了。我们工程师喜欢用矩阵说话。
1.2.1 生成矩阵 G
生成矩阵 G 是一个 k×n 的矩阵,它的行构成线性空间的一组基。任何一个码字 c,都可以写成:
c = m · G
其中 m 是长度为 k 的信息向量(行向量),G 是 k×n 的生成矩阵。
我在项目中遇到过一个问题:有人把 G 写成列向量组的形式,结果编码时维度搞反了。记住,信息向量左乘生成矩阵,这是约定俗成的习惯。
举个例子,一个 (7,4) 汉明码的生成矩阵:
G = [1 0 0 0 1 1 0]
[0 1 0 0 1 0 1]
[0 0 1 0 0 1 1]
[0 0 0 1 1 1 1]
前 4 列是单位矩阵,后 3 列是校验位生成规则。这种形式叫「系统码形式」,编码后的码字前 k 位直接就是信息位,方便得很。
1.2.2 校验矩阵 H
校验矩阵 H 是一个 (n-k)×n 的矩阵。它的核心性质是:
G · H^T = 0
或者说,对于任意码字 c,有:
c · H^T = 0
这个性质太重要了。它告诉我们:校验矩阵是码空间的正交补空间的基。
还是用 (7,4) 汉明码举例:
H = [1 1 0 1 1 0 0]
[1 0 1 1 0 1 0]
[0 1 1 1 0 0 1]
你可以验证一下,G 的每一行乘以 H^T 都等于零向量。这就是校验关系。
避坑指南:我曾经在实现时把 G 和 H 的转置关系搞反了,结果译码器一直报错。后来 debug 了一整天,才发现是维度没对齐。建议你写代码时,先用小例子手动验证一遍 G·H^T = 0。
1.3 线性码的编码与译码
1.3.1 编码过程
编码说白了就是矩阵乘法。给定信息向量 m,码字 c = m·G。
如果 G 是系统码形式,编码就更直观了:
输入: m = [1 0 1 1]
输出: c = m·G = [1 0 1 1 | 0 1 0]
↑信息位 ↑校验位
你看,前 4 位就是 m 本身,后 3 位是根据 G 的校验规则算出来的。这种设计让编码和解码都变得简单。
1.3.2 译码过程——以伴随式译码为例
译码比编码复杂一些。假设我们收到一个向量 r,它可能是码字 c 加上错误 e 的结果:
r = c + e
第一步,计算伴随式 s:
s = r · H^T
如果 s = 0,说明 r 是合法码字,没有错误(或者错误不可检测)。
如果 s ≠ 0,说明有错误发生。s 的值直接告诉我们错误的位置。
为什么会这样?因为:
s = (c + e)·H^T = c·H^T + e·H^T = 0 + e·H^T = e·H^T
伴随式只依赖于错误模式 e,与发送的码字 c 无关。这就是线性码译码的核心思想。
对于汉明码,每个非零伴随式唯一对应一个错误位置。查表就能找到错误位置,然后翻转对应比特即可。
注意:伴随式译码只能纠正一定数量的错误。对于 (7,4) 汉明码,只能纠正 1 个错误。如果发生 2 个或更多错误,译码结果可能是错的。这在量子纠错里尤其要小心——量子比特的错误率通常比经典比特高。
1.4 本章知识体系
下面我用一张图来总结本章的核心逻辑:
这张图把本章的三个核心模块串起来了。从左到右,从抽象到具体,从理论到实现。你写代码的时候,脑子里要有这张图。
1.5 实战小练习
光说不练假把式。给你留个小作业:
- 给定 (7,4) 汉明码的 G 和 H(上面已经给出了),手动计算信息向量 m = [1 0 1 0] 的码字。
- 假设接收到的向量 r = [1 0 1 0 0 1 1],计算伴随式,判断是否有错误。
- 如果有错误,定位并纠正它。
做完这三步,你对线性码的理解就扎实了。下一章我们会把这些概念搬到量子世界里,你会发现——嗯,很多东西是相通的。
本章要点回顾:
- GF(2) 上线性空间:加法是 XOR,数乘是 AND,维数决定码字数量
- 生成矩阵 G:k×n,行是基,编码用 c = m·G
- 校验矩阵 H:(n-k)×n,满足 G·H^T = 0,译码用 s = r·H^T
- 伴随式译码:s = 0 无错,s ≠ 0 查表纠错