经典线性码基础:有限域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 本章知识体系

下面我用一张图来总结本章的核心逻辑:

经典线性码知识体系 GF(2) 线性空间 元素: 0, 1 加法: XOR 乘法: AND 维数 k → 2^k 个码字 矩阵表示 生成矩阵 G (k×n) 校验矩阵 H ((n-k)×n) G·H^T = 0 系统码: 前k位为信息位 编码与译码 编码: c = m·G 接收: r = c + e 伴随式: s = r·H^T 查表纠错 核心逻辑总结 线性空间 → 基向量 → 生成矩阵 G 正交补空间 → 校验矩阵 H 编码: 信息向量 × G → 码字 译码: 接收向量 × H^T → 伴随式 → 纠错

这张图把本章的三个核心模块串起来了。从左到右,从抽象到具体,从理论到实现。你写代码的时候,脑子里要有这张图。

1.5 实战小练习

光说不练假把式。给你留个小作业:

  1. 给定 (7,4) 汉明码的 G 和 H(上面已经给出了),手动计算信息向量 m = [1 0 1 0] 的码字。
  2. 假设接收到的向量 r = [1 0 1 0 0 1 1],计算伴随式,判断是否有错误。
  3. 如果有错误,定位并纠正它。

做完这三步,你对线性码的理解就扎实了。下一章我们会把这些概念搬到量子世界里,你会发现——嗯,很多东西是相通的。

本章要点回顾:

  • 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 查表纠错

专注资料整理