Fingerprinting

从确定性到随机性

在经典算法设计中,我们习惯于追求确定性的正确答案。然而,许多看似简单的问题在确定性框架下却有着不可逾越的复杂度下界。随机化为我们提供了突破这些下界的可能——只要允许极小的错误概率,就能获得确定性算法无法企及的效率。

本讲的核心概念是 fingerprinting(指纹技术),一种贯穿随机算法设计的基本范式。

什么是 Fingerprinting

Fingerprinting 的核心思想是:不直接比较两个庞大的对象,而是将它们映射为短小的「指纹」,通过比较指纹来间接判断相等性。

Fingerprinting 的形式化定义

一个 fingerprinting 方案是一个(随机化的)函数 FING ⁣:UV\text{FING}\colon \mathcal{U} \to \mathcal{V},其中 VU|\mathcal{V}| \ll |\mathcal{U}|,满足:

  1. 无假阴性a=b    FING(a)=FING(b)a = b \implies \text{FING}(a) = \text{FING}(b)(确定性保证)
  2. 假阳性概率小ab    Pr[FING(a)=FING(b)]a \neq b \implies \Pr[\text{FING}(a) = \text{FING}(b)] 很小
  3. 指纹短小FING(a)\text{FING}(a) 的表示长度远小于 aa 本身

性质 1 保证了单边错误(one-sided error):当算法判定「不等」时一定正确,只在判定「相等」时可能犯错(假阳性)。

这一思想贯穿本讲所有内容——从多项式恒等检验、通信复杂性中的相等性问题,到矩阵乘法验证和字符串匹配,fingerprinting 都扮演着关键角色。

多项式恒等检验

问题定义

多项式恒等检验(Polynomial Identity Testing, PIT)是代数计算中的一个基本问题:给定两个多项式 PPQQ(以算术电路的形式表示),判断它们是否计算同一个多项式,即 PQP \equiv Q。等价地,令 Q=P1P2Q = P_1 - P_2,问题转化为判断 QQ 是否为零多项式。

算术电路

PIT 中,多项式不是以展开形式(如 3x2+2x+13x^2 + 2x + 1)给出的——因为展开后可能有指数多个项,无法显式列出。多项式的输入形式是算术电路(Arithmetic Circuit),它描述的不是多项式「长什么样」,而是如何从变量和常数出发,通过一系列加、减、乘操作一步步算出它。

算术电路

算术电路是一个有向无环图(DAG),其中:

  • 输入节点(叶节点)标记为变量 x1,x2,x_1, x_2, \ldots 或常数
  • 内部节点标记为 ++-×\times 运算
  • 有一个指定的输出节点,其计算结果即为电路所表示的多项式
flowchart BT
    x1["x₁"] --> plus1["+"]
    y1["y₁"] --> plus1
    x2["x₂"] --> plus2["+"]
    y2["y₂"] --> plus2
    xn["xₙ"] --> plusn["+"]
    yn["yₙ"] --> plusn
    plus1 --> mul["× · · · ×"]
    plus2 --> mul
    plusn --> mul
    mul --> out(("输出"))

    classDef var fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef op fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
    classDef output fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px

    class x1,y1,x2,y2,xn,yn var
    class plus1,plus2,plusn,mul op
    class out output

算术电路的关键特性在于它可以指数级压缩多项式的表示。例如:

i=1n(xi+yi)\prod_{i=1}^{n} (x_i + y_i)

这个电路的描述长度仅为 O(n)O(n),但展开后有 2n2^n 个单项式。因此,将多项式显式展开再逐项比较系数在计算上是不可行的——我们需要一种能直接在电路表示上工作的算法。

PIT 问题至今没有已知的高效确定性算法,这是计算复杂性理论中的一个重大未解问题。如果存在多项式时间的确定性 PIT 算法,则意味着 NEXPP/poly\textsf{NEXP} \neq \textsf{P/poly}#PFP\#\textsf{P} \neq \textsf{FP}——这两个都是尚未被证明的重大复杂性分离猜想。

Schwartz-Zippel 引理

PIT 有一个优雅的随机化解法,其核心是以下引理:

Schwartz-Zippel 引理

Q(x1,x2,,xn)Q(x_1, x_2, \ldots, x_n) 是域 F\mathbb{F} 上的一个非零多项式,总次数(total degree)为 dd。设 SSF\mathbb{F} 的一个有限子集。若 r1,r2,,rnr_1, r_2, \ldots, r_n 独立均匀地从 SS 中随机选取,则

Pr[Q(r1,r2,,rn)=0]dS\Pr[Q(r_1, r_2, \ldots, r_n) = 0] \le \frac{d}{|S|}

这个结论非常惊人:无论多项式有多少个变量、结构多复杂,只要在一个足够大的集合中随机取值,非零多项式求值为零的概率就很小。而且这个界只依赖于多项式的总次数和取值集合的大小,与变量个数 nn 完全无关。

这里需要注意总次数个体次数(individual degree)的区别。总次数是所有单项式中变量幂次之和的最大值。例如 x12x23+x1x34x_1^2 x_2^3 + x_1 x_3^4 的总次数为 max(2+3,1+4)=5\max(2+3, 1+4) = 5

证明

对变量个数 nn 进行归纳。

基础情形n=1n = 1):单变量多项式 Q(x1)Q(x_1) 的次数为 dd,由代数基本定理(或更一般地,域上多项式的性质),它至多有 dd 个根。因此:

Pr[Q(r1)=0]dS\Pr[Q(r_1) = 0] \le \frac{d}{|S|}

归纳步骤:假设引理对 n1n-1 个变量成立。将 QQx1x_1 的幂次展开:

Q(x1,x2,,xn)=i=0kx1iQi(x2,,xn)Q(x_1, x_2, \ldots, x_n) = \sum_{i=0}^{k} x_1^i \cdot Q_i(x_2, \ldots, x_n)

其中 kdk \le dx1x_1QQ 中出现的最高次数,Qk(x2,,xn)Q_k(x_2, \ldots, x_n) 是非零多项式(作为 x1kx_1^k 的系数)。注意 QkQ_k 的总次数至多为 dkd - k,因为 QQ 中包含 x1kx_1^k 的任何单项式,其余变量的次数之和至多为 dkd - k

利用全概率公式。令事件 AA 为「Qk(r2,,rn)=0Q_k(r_2, \ldots, r_n) = 0」,事件 BB 为「Q(r1,r2,,rn)=0Q(r_1, r_2, \ldots, r_n) = 0」:

Pr[B]=Pr[BA]Pr[A]+Pr[BAˉ]Pr[Aˉ]\Pr[B] = \Pr[B \mid A] \cdot \Pr[A] + \Pr[B \mid \bar{A}] \cdot \Pr[\bar{A}]

  • 由归纳假设,QkQ_kn1n-1 个变量的非零多项式,总次数 dk\le d - k,故 Pr[A]dkS\Pr[A] \le \dfrac{d - k}{|S|}
  • Aˉ\bar{A} 发生时,即 Qk(r2,,rn)0Q_k(r_2, \ldots, r_n) \neq 0。此时将 r2,,rnr_2, \ldots, r_n 的值代入,Q(x1,r2,,rn)Q(x_1, r_2, \ldots, r_n) 成为关于 x1x_1 的单变量多项式,且因为 x1kx_1^k 的系数 Qk(r2,,rn)0Q_k(r_2, \ldots, r_n) \neq 0,它确实是一个次数为 kk 的非零多项式。由基础情形,Pr[BAˉ]kS\Pr[B \mid \bar{A}] \le \dfrac{k}{|S|}

由此:

Pr[B]1dkS+kS1=dS\Pr[B] \le 1 \cdot \frac{d - k}{|S|} + \frac{k}{|S|} \cdot 1 = \frac{d}{|S|}

应用于 PIT

要检验 Q0Q \equiv 0,只需从足够大的集合 SS 中随机选取一个点 (r1,,rn)(r_1, \ldots, r_n),利用算术电路计算 Q(r1,,rn)Q(r_1, \ldots, r_n)

  • 若结果 0\neq 0QQ 一定不是零多项式(确定性结论)
  • 若结果 =0= 0QQ 大概率是零多项式,但有至多 d/Sd/|S| 的假阳性概率

这正是 fingerprinting 的范式:FING(Q)=Q(r1,,rn)\text{FING}(Q) = Q(r_1, \ldots, r_n),将一个可能有指数多项的多项式压缩为一个域元素。

降低错误概率

通过独立重复 tt 次检验(每次独立随机选取新的取值点),错误概率降低到 (d/S)t(d/|S|)^t。选取 S2d|S| \ge 2d 即可使单次错误概率 1/2\le 1/2,重复 tt 次后错误概率 2t\le 2^{-t},指数级衰减。

Schwartz-Zippel 引理的应用远不止 PIT。它还可以用于判断图是否有完美匹配、验证矩阵乘法、检验有根树同构、分析 Reed-Muller 码的距离性质、构造概率可检验证明(PCP)等。本讲后续的几个应用都是它的直接推论。

通信复杂性与相等性问题

问题模型

通信复杂性(Communication Complexity)研究以下场景:Alice 持有输入 aa,Bob 持有输入 bb,他们需要通过通信来协作计算某个函数 f(a,b)f(a, b)。通信复杂度衡量的是完成计算所需的最小通信比特数(在最坏情况下)。

考虑最基本的相等性问题(Equality):Alice 有一个 nn 比特字符串 a{0,1}na \in \{0,1\}^n,Bob 有一个 nn 比特字符串 b{0,1}nb \in \{0,1\}^n,他们需要判断 a=ba = b 是否成立。

flowchart LR
    A["Alice<br/>持有 a ∈ {0,1}ⁿ"] -- "交换消息" --> B["Bob<br/>持有 b ∈ {0,1}ⁿ"]
    B -- "a = b?" --> C["输出"]

    classDef person fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef output fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px

    class A,B person
    class C output

确定性下界

在确定性协议中,相等性问题的确定性通信复杂度为 Θ(n)\Theta(n)——Alice 和 Bob 必须交换线性于 nn 的比特数。

直观理解:如果 Alice 发送的消息总共不到 nn 比特(比如只有 k<nk < n 比特),那么她的 2n2^n 种可能输入中必有两个不同输入产生了相同的消息。对于这两个输入,Bob 收到相同的消息,无法区分它们,因此至少对其中一个给出错误答案。

这个直觉可以用组合矩形(Combinatorial Rectangle)的语言严格化。

组合矩形

想象一个 2n×2n2^n \times 2^n 的表格,行对应 Alice 的所有可能输入 aa,列对应 Bob 的所有可能输入 bb,格子 (a,b)(a, b) 标记为 f(a,b)f(a,b) 的值。

确定性协议中,每个叶节点(输出节点)对应的输入集合构成一个组合矩形 R×CR \times C,其中 R{0,1}nR \subseteq \{0,1\}^n 是使 Alice 到达该叶节点的输入集合,C{0,1}nC \subseteq \{0,1\}^n 是使 Bob 到达该叶节点的输入集合。

为什么是笛卡尔积的形状?因为 Alice 发送的消息只取决于她自己的输入 aa,Bob 发送的消息也只取决于他自己的输入 bb。如果两个不同的输入 a1,a2a_1, a_2 让 Alice 产生完全相同的消息序列,那么无论 Bob 的输入 bb 是什么,(a1,b)(a_1, b)(a2,b)(a_2, b) 都会走到同一个叶节点——因为 Bob 看到的交互完全一样。因此到达同一叶节点的输入集合必然是 R×CR \times C 的形式。

一个正确的协议要求每个矩形内的所有输入都有相同的正确输出。

现在将这一工具应用于相等函数。所有使 f(a,b)=1f(a,b) = 1(即 a=ba = b)的输入恰好是对角线 {(a,a):a{0,1}n}\{(a,a) : a \in \{0,1\}^n\}——共 2n2^n 个点。关键观察:对角线上的每个组合矩形最多只包含 1 个点

为什么?假设某个标记为「相等」的矩形 R×CR \times C 包含两个不同的对角线点 (a1,a1)(a_1, a_1)(a2,a2)(a_2, a_2)a1a2a_1 \ne a_2)。那么 a1,a2Ra_1, a_2 \in Ra1,a2Ca_1, a_2 \in C,由笛卡尔积的性质,(a1,a2)(a_1, a_2) 也在这个矩形中。但 a1a2a_1 \ne a_2,所以 (a1,a2)(a_1, a_2) 应该输出「不等」——与该矩形标记为「相等」矛盾。

因此,协议至少需要 2n2^n 个标记为「相等」的叶节点来覆盖所有 2n2^n 个对角线点,决策树至少有 2n2^n 个叶节点,通信量 log22n=n\ge \log_2 2^n = n

随机化协议

随机化可以将通信复杂度从 Θ(n)\Theta(n) 大幅降低到 O(logn)O(\log n)。根据随机性是共享的还是私有的,有两种不同的协议。

公共随机协议

公共随机(public coin)模型中,Alice 和 Bob 共享一个随机源(如一个公开的随机比特串),但各自的输入是私有的。

模运算与域

后续频繁使用 Zp\mathbb{Z}_p:这是模素数 pp 的整数集合 {0,1,,p1}\{0, 1, \ldots, p-1\},加法和乘法都在模 pp 下进行。例如在 Z7\mathbb{Z}_7 中,3+5=1,3×4=53 + 5 = 1,\, 3 \times 4 = 5。当 pp 为素数时,每个非零元素都有乘法逆元,因此 Zp\mathbb{Z}_p 构成一个(Field)——支持加减乘除。Zp[x]\mathbb{Z}_p[x] 表示系数在 Zp\mathbb{Z}_p 中的多项式。

a{0,1}na \in \{0,1\}^n 编码为多项式 fa(x)=i=1naixiZp[x]f_a(x) = \sum_{i=1}^{n} a_i \cdot x^i \in \mathbb{Z}_p[x],其中 pp 是一个公开的素数(p=Θ(n2)p = \Theta(n^2))。类似地,Bob 将 bb 编码为 fb(x)f_b(x)

协议

  1. Alice 和 Bob 共享随机元素 rZpr \in \mathbb{Z}_p
  2. Alice 计算 fa(r)=i=1nairimodpf_a(r) = \sum_{i=1}^{n} a_i \cdot r^i \bmod p,发送给 Bob
  3. Bob 计算 fb(r)=i=1nbirimodpf_b(r) = \sum_{i=1}^{n} b_i \cdot r^i \bmod p,检查 fa(r)=fb(r)f_a(r) = f_b(r)

通信量仅为 O(logp)=O(logn)O(\log p) = O(\log n) 比特(Alice 发送一个 Zp\mathbb{Z}_p 中的元素)。

错误分析:若 aba \neq b,则 fafbf_a - f_bZp[x]\mathbb{Z}_p[x] 上次数 n\le n 的非零多项式。由 Schwartz-Zippel 引理:

Pr[fa(r)=fb(r)]np\Pr[f_a(r) = f_b(r)] \le \frac{n}{p}

p=Θ(n2)p = \Theta(n^2),错误概率 1/n\le 1/n

另一种更极端的公共随机协议只需 1 比特通信:Alice 和 Bob 共享随机向量 r{0,1}n\bm{r} \in \{0,1\}^n,Alice 发送 a,rmod2\langle a, \bm{r} \rangle \bmod 2(内积模 2),Bob 检查是否等于 b,rmod2\langle b, \bm{r} \rangle \bmod 2。若 aba \neq b,则 ab,rmod2\langle a - b, \bm{r} \rangle \bmod 2 是一个关于 r\bm{r} 的非零线性多项式(因为 aba - b 有某个分量非零),由 Schwartz-Zippel 引理(d=1,S=2d = 1,\, |S| = 2),碰撞概率 1/2\le 1/2。单次错误概率较高,但重复几十次即可将错误概率降到任意小。

这里的 fingerprint 是 FING(a)=fa(r)=airimodp\text{FING}(a) = f_a(r) = \sum a_i \cdot r^i \bmod p——将 nn 比特的字符串压缩为一个 O(logn)O(\log n) 比特的域元素。

私有随机协议

私有随机(private coin)模型中,Alice 和 Bob 各自拥有独立的随机源,不共享随机性。

a,b{0,1}na, b \in \{0,1\}^n 视为 [0,2n)[0, 2^n) 中的整数。

协议

  1. Alice 从不超过 kk 的素数中均匀随机选取一个素数 ppkk 待定)
  2. Alice 将 (p,amodp)(p, \, a \bmod p) 发送给 Bob
  3. Bob 检查 amodpbmodpa \bmod p \equiv b \bmod p,输出结果

通信量为 O(logk)=O(logn)O(\log k) = O(\log n) 比特。这里的 fingerprint 是 FINGp(a)=amodp\text{FING}_p(a) = a \bmod p

私有随机协议的错误分析

  • a=ba = b,则 amodp=bmodpa \bmod p = b \bmod p 一定成立,不会产生假阴性。
  • aba \neq b,令 z=abz = |a - b|,则 0<z<2n0 < z < 2^n。假阳性发生当且仅当 pzp \mid z。我们需要估计随机素数 pp 整除 zz 的概率。

关键观察:zz 的不同素因子个数是有限的。由于 z<2nz < 2^n,而最小的 nn 个素数的乘积满足 2×3×5××pn2n2 \times 3 \times 5 \times \cdots \times p_n \ge 2^n(素数阶乘 primorial 的增长速度),若 zznn 个或更多不同素因子,则 zz 至少等于前 nn 个素数之积,即 z2nz \ge 2^n,与 z<2nz < 2^n 矛盾。因此 zz 至多有 n1n - 1 个不同的素因子。

素数计数函数与素数定理

素数定理(Prime Number Theorem),不超过 NN 的素数个数满足

π(N)NlnN(N)\pi(N) \sim \frac{N}{\ln N} \quad (N \to \infty)

这意味着 [1,k][1, k] 范围内约有 klnk\dfrac{k}{\ln k} 个素数。

对于我们的分析,更有用的一个推论是:对于足够大的 NNπ(N)N2lnN\pi(N) \ge \dfrac{N}{2\ln N}

错误概率为:

Pr[error]=#{pk:p 是素数且 pz}π(k)n1π(k)nlnkk\Pr[\text{error}] = \frac{\#\{p \le k : p \text{ 是素数且 } p \mid z\}}{\pi(k)} \le \frac{n - 1}{\pi(k)} \approx \frac{n \ln k}{k}

选取 k=n3k = n^3

Pr[error]n3lnnn3=3lnnn2=O(1n)\Pr[\text{error}] \le \frac{n \cdot 3\ln n}{n^3} = \frac{3\ln n}{n^2} = O\left(\frac{1}{n}\right)

注意 fingerprint 函数 FINGp(a)=amodp\text{FING}_p(a) = a \bmod p 是一个随机化的映射——随机性来自素数 pp 的选择。两种协议使用了不同的 fingerprinting 方案:公共随机协议基于多项式求值和 Schwartz-Zippel 引理,私有随机协议基于模运算和素数定理,但它们的共同点是将 nn 比特的信息压缩为 O(logn)O(\log n) 比特的指纹。

Newman 定理

Newman 定理

公共随机和私有随机两种模型的通信复杂度之间有什么关系?显然私有随机不弱于公共随机(后者可以模拟前者),因为若有一个 private-coin 协议 Π\Pi,其中 Alice 和 Bob 分别使用独立随机串 RA,RBR_{A}, R_{B},那么构造 public-coin 协议 Π\Pi'

  • 取公共随机串 R=(RA,RB)R=\left(R_{A}, R_{B}\right)
  • Alice 在 Π\Pi' 中把 RAR_{A} 当作自己原来的私有随机性
  • Bob 在 Π\Pi' 中把 RBR_{B} 当作自己原来的私有随机性

Π\Pi' 对任意输入 (x,y)(x, y) 的行为分布与 Π\Pi 相同。因此

Rpub(f)Rpriv(f)R^{\mathrm{pub}}(f) \le R^{\mathrm{priv}}(f)

即 public-coin 的随机通信复杂度不大于 private-coin。

但反过来呢?

Newman 定理

对于任意函数 ff,令 Rϵpub(f)R^{\text{pub}}_\epsilon(f)Rϵpriv(f)R^{\text{priv}}_\epsilon(f) 分别表示错误概率至多为 ϵ\epsilon 的公共随机和私有随机通信复杂度。则:

Rϵpriv(f)Rϵpub(f)+O(logn)R^{\text{priv}}_\epsilon(f) \le R^{\text{pub}}_\epsilon(f) + O(\log n)

Newman 定理告诉我们,私有随机最多比公共随机多 O(logn)O(\log n) 的通信量

其证明思想如下:假设已有一个公共随机协议 Π\Pi,使用公共随机串 ss,错误概率 ϵ\le \epsilon。虽然可能的随机串有指数多个,但我们并不需要所有的——只需从中挑选出 t=poly(n)t = \text{poly}(n) 个「有代表性的」随机串 s1,,sts_1, \ldots, s_t 即可。通过概率论中的抽样论证,可以证明随机选取 tt 个串后,对所有输入对 (a,b)(a,b) 的平均错误率与使用全部随机串时接近。

有了这组串,Alice 和 Bob 事先约定好 s1,,sts_1, \ldots, s_t(这不需要通信,因为是协议的一部分)。协议开始时,Alice 用私有随机性选取 i[t]i \in [t],将 ii 发送给 Bob(需要 log2t=O(logn)\lceil \log_2 t \rceil = O(\log n) 比特),双方随后使用 sis_i 执行原协议。额外通信开销仅为 O(logn)O(\log n)

对于相等性问题,两种模型的通信复杂度都是 Θ(logn)\Theta(\log n),差距在常数因子内。

应用:二部图完美匹配

问题与经典方法

给定一个二部图(Bipartite Graph)G=(U,V,E)G = (U, V, E),其中 U=V=n|U| = |V| = n,判断 GG 是否存在完美匹配(Perfect Matching),即一个边集 MEM \subseteq E,使得 UUVV 中的每个顶点都恰好被 MM 中的一条边覆盖。

二部图与完美匹配

二部图是指顶点可以分成两组 UUVV,且所有边都跨组连接(组内没有边)的图。完美匹配是一种配对方案:将 UU 中每个顶点恰好与 VV 中一个顶点配对,且每个顶点恰好被配对一次(要求 U=V|U| = |V|)。

一个直观例子:nn 个学生和 nn 门课程,每个学生只对部分课程感兴趣(用边表示)。完美匹配就是给每个学生恰好分配一门他感兴趣的课,且每门课恰好分配给一个学生。不是所有二部图都有完美匹配——可能有些学生竞争同一门课,导致无法全部满足。

经典的确定性算法基于增广路径(从一个未匹配的顶点出发,沿交替使用匹配边和非匹配边的路径扩展当前匹配):如 Hopcroft-Karp 算法,时间复杂度为 O(mn)O(m\sqrt{n}),其中 m=Em = |E|。利用 fingerprinting 和代数方法,可以得到一个截然不同的随机判定算法。

Edmonds 定理与 Edmonds 矩阵

Edmonds 定理(Edmonds' Theorem)建立了图的匹配与矩阵行列式之间的深刻联系,将组合问题转化为代数问题。

定义二部图 GGEdmonds 矩阵 M\bm{M}n×nn \times n 矩阵,其中每条边对应一个独立的形式变量:

Mij={xijif (ui,vj)E0otherwiseM_{ij} = \begin{cases} x_{ij} & \text{if } (u_i, v_j) \in E \\ 0 & \text{otherwise} \end{cases}

其中 {xij}\{x_{ij}\} 是相互独立的形式变量(indeterminates)——它们不是具体的数值,而是纯粹的符号占位符。可以把每个 xijx_{ij} 理解为边 (ui,vj)(u_i, v_j) 的「标签」:行列式 det(M)\det(\bm{M}) 就成为一个关于这些标签的多项式。使用形式变量而非具体数值,是为了让不同的边保持可区分——这样不同匹配对应的乘积项涉及不同的变量组合,彼此不会相消。后面的随机算法就是给这些变量随机赋值,然后利用 Schwartz-Zippel 引理检验行列式是否恒为零。

具体例子

考虑一个 3×33 \times 3 的二部图,U={u1,u2,u3},V={v1,v2,v3}U = \{u_1, u_2, u_3\},\, V = \{v_1, v_2, v_3\},边集 E={(u1,v1),(u1,v2),(u2,v1),(u2,v3),(u3,v2),(u3,v3)}E = \{(u_1,v_1), (u_1,v_2), (u_2,v_1), (u_2,v_3), (u_3,v_2), (u_3,v_3)\}。Edmonds 矩阵为:

M=(x11x120x210x230x32x33)\bm{M} = \begin{pmatrix} x_{11} & x_{12} & 0 \\ x_{21} & 0 & x_{23} \\ 0 & x_{32} & x_{33} \end{pmatrix}

行列式展开后,6 个排列中只有对应完美匹配的排列贡献非零项。例如排列 σ=(1,2,3)\sigma = (1,2,3)(恒等排列)对应匹配 {(u1,v1),(u2,v2),(u3,v3)}\{(u_1,v_1),(u_2,v_2),(u_3,v_3)\},但 M2,2=0M_{2,2} = 0,所以这个排列贡献为零。排列 σ=(1,3,2)\sigma = (1,3,2) 对应 {(u1,v1),(u2,v3),(u3,v2)}\{(u_1,v_1),(u_2,v_3),(u_3,v_2)\},所有边都存在,贡献 x11x23x32-x_{11}x_{23}x_{32}。排列 σ=(2,1,3)\sigma = (2,1,3) 对应 {(u1,v2),(u2,v1),(u3,v3)}\{(u_1,v_2),(u_2,v_1),(u_3,v_3)\},贡献 x12x21x33-x_{12}x_{21}x_{33}。因此 det(M)=x11x23x32x12x21x33≢0\det(\bm{M}) = -x_{11}x_{23}x_{32} - x_{12}x_{21}x_{33} \not\equiv 0,说明该图有完美匹配。

对于一般图(非二部图),对应的概念是 Tutte 矩阵,定义为反对称矩阵:

Tij={xijif (i,j)E and i<jxijif (i,j)E and i>j0if (i,j)E or i=jT_{ij} = \begin{cases} x_{ij} & \text{if } (i,j) \in E \text{ and } i < j \\ -x_{ij} & \text{if } (i,j) \in E \text{ and } i > j \\ 0 & \text{if } (i,j) \notin E \text{ or } i = j \end{cases}

Edmonds 矩阵可以看作 Tutte 矩阵在二部图上的简化版本。Edmonds 定理同样适用于一般图:GG 有完美匹配当且仅当其 Tutte 矩阵的行列式(作为形式变量的多项式)不恒为零。

Edmonds 定理

二部图 GG 存在完美匹配,当且仅当 det(M)\det(\bm{M}) 作为 {xij}\{x_{ij}\} 的多项式不恒为零。

为什么 Edmonds 定理成立

行列式的定义为:

det(M)=σSnsgn(σ)i=1nMi,σ(i)\det(\bm{M}) = \sum_{\sigma \in S_n} \operatorname{sgn}(\sigma) \prod_{i=1}^{n} M_{i,\sigma(i)}

其中求和遍历所有 n!n! 个排列 σSn\sigma \in S_nsgn(σ){+1,1}\operatorname{sgn}(\sigma) \in \{+1, -1\} 是排列的符号(偶排列取 +1+1,奇排列取 1-1)。每个排列 σ\sigma 对应 UUVV 的一个一一映射:将 uiu_i 映射到 vσ(i)v_{\sigma(i)}

乘积 i=1nMi,σ(i)\prod_{i=1}^{n} M_{i,\sigma(i)} 非零当且仅当对所有 ii 都有 (ui,vσ(i))E(u_i, v_{\sigma(i)}) \in E,即 {(ui,vσ(i)):i=1,,n}\{(u_i, v_{\sigma(i)}) : i = 1, \ldots, n\} 构成 GG 的一个完美匹配。

  • GG 没有完美匹配,则行列式中每一项的乘积都包含至少一个零因子,故 det(M)0\det(\bm{M}) \equiv 0
  • GG 完美匹配 σ\sigma^*,则对应项 sgn(σ)ixi,σ(i)\operatorname{sgn}(\sigma^*) \prod_{i} x_{i,\sigma^*(i)} 是一个非零的单项式。关键在于,由于各 xijx_{ij} 是独立的形式变量,不同匹配对应的单项式一定不同(因为它们涉及不同的变量子集),所以非零项之间不会相消,det(M)\det(\bm{M}) 作为多项式不恒为零

随机算法

Edmonds 定理将完美匹配的存在性归结为多项式是否恒为零,而这正是 PIT 问题。结合 Schwartz-Zippel 引理,得到如下算法:

  1. 将每个形式变量 xijx_{ij} 独立均匀地替换为 S={1,2,,2n}S = \{1, 2, \ldots, 2n\} 中的随机值
  2. 计算数值矩阵的行列式(高斯消元 O(n3)O(n^3),或利用矩阵乘法算法 O(nω)O(n^\omega)
  3. 若行列式为 00,输出「无完美匹配」;否则输出「有完美匹配」

det(M)\det(\bm{M}) 的总次数为 nn(每个乘积项恰好是 nn 个变量之积),取 S=2n|S| = 2n。由 Schwartz-Zippel 引理,当存在完美匹配时,随机赋值后行列式恰好为零的概率 n/(2n)=1/2\le n/(2n) = 1/2

这个算法虽然在判定问题上并不比 Hopcroft-Karp 更快,但它揭示了匹配问题与线性代数之间的深刻联系。更重要的是,这一代数方法可以推广到并行算法:计算行列式可以高效并行化(属于复杂性类 NC\textsf{NC},即可以用多项式个处理器在 O(polylogn)O(\operatorname{polylog} n)O((logn)k)O\left((\log n)^k\right) 时间内完成),因此二部图完美匹配判定也可以随机并行化(属于 RNC\textsf{RNC})——这是经典增广路径方法难以达到的。

一个至今未解的问题是:完美匹配判定是否可以确定性并行化(即属于 NC\textsf{NC})?目前只知道它在 RNC\textsf{RNC} 中,去随机化仍然是一个重大挑战。

应用:矩阵乘法验证

问题背景

给定三个 n×nn \times n 矩阵 A,B,C\bm{A}, \bm{B}, \bm{C},判断是否 AB=C\bm{A}\bm{B} = \bm{C}

直接计算 AB\bm{A}\bm{B} 再逐项比较需要矩阵乘法的时间。令 ω\omega 为矩阵乘法指数,即 n×nn \times n 矩阵乘法的最优时间复杂度为 O(nω)O(n^\omega)。长期以来,降低 ω\omega 的上界是算法理论的核心课题之一:

年份 作者 ω\omega 上界
- 朴素算法 33
1969 Strassen 2.8072.807
2024 Williams, Xu, Xu, Zhou 2.37162.3716

目前 ω>2\omega > 2 仍然成立。长期以来广泛猜想 ω=2\omega = 2,但近年来也有研究者开始质疑这一猜想。无论如何,验证 AB=C\bm{AB} = \bm{C} 似乎理应比计算 AB\bm{AB} 更容易——事实上,Freivalds 给出了一个 O(n2)O(n^2) 的随机验证算法。

Freivalds 算法

Freivalds 算法的核心思想是对矩阵做 fingerprinting:FING(M)=Mr\text{FING}(\bm{M}) = \bm{M}\bm{r},将一个 n×nn \times n 的矩阵压缩为一个 nn 维向量。

  1. 随机选取向量 r{0,1}n\bm{r} \in \{0,1\}^n,每个分量独立均匀地取 0011
  2. 计算 A(Br)\bm{A}(\bm{B}\bm{r})Cr\bm{C}\bm{r}
  3. A(Br)Cr\bm{A}(\bm{B}\bm{r}) \neq \bm{C}\bm{r},输出「ABC\bm{AB} \neq \bm{C}」;否则输出「AB=C\bm{AB} = \bm{C}

计算顺序

步骤 2 中必须先计算 Br\bm{B}\bm{r}(矩阵乘向量,O(n2)O(n^2)),再计算 A\bm{A} 乘以结果(又一次矩阵乘向量,O(n2)O(n^2))。若直接计算 (AB)r(\bm{A}\bm{B})\bm{r},则 AB\bm{A}\bm{B} 本身就是矩阵乘法,退化为 O(nω)O(n^\omega)。总计算量为 O(n2)O(n^2)

正确性分析

D=ABC\bm{D} = \bm{AB} - \bm{C}。算法检验的等价条件是 Dr=0\bm{D}\bm{r} = \bm{0}

D=0\bm{D} = \bm{0}(即 AB=C\bm{AB} = \bm{C}),则 Dr=0\bm{D}\bm{r} = \bm{0} 恒成立,算法不会出错。

D0\bm{D} \neq \bm{0},我们需要证明 Pr[Dr=0]1/2\Pr[\bm{D}\bm{r} = \bm{0}] \le 1/2

由于 D0\bm{D} \neq \bm{0},存在某个非零行,不妨设第 iidi0\bm{d}_i \neq \bm{0},且 dij0d_{ij} \neq 0。考虑 (Dr)i(\bm{D}\bm{r})_i

(Dr)i=k=1ndikrk=dijrj+kjdikrkW(\bm{D}\bm{r})_i = \sum_{k=1}^{n} d_{ik} r_k = d_{ij} r_j + \underbrace{\sum_{k \neq j} d_{ik} r_k}_{\coloneqq\, W}

这里使用了延迟决策原则(Principle of Deferred Decisions):我们可以假设先确定所有 rkr_kkjk \neq j)的值,再考虑 rjr_j 的选择。一旦 rkr_kkjk \neq j)固定,WW 就成为一个确定的常数,于是:

(Dr)i=0    rj=Wdij(\bm{D}\bm{r})_i = 0 \iff r_j = -\frac{W}{d_{ij}}

无论 WW 的值是什么,(Dr)i=0(\bm{D}\bm{r})_i = 0 等价于 dijrj+W=0d_{ij} r_j + W = 0,即 rjr_j 必须取某个特定值。而 rjr_j{0,1}\{0,1\} 上均匀分布且独立于其他 rkr_k{0,1}\{0,1\} 只有两个元素,所以 rjr_j 恰好命中那个特定值的概率至多为 1/21/2(如果那个值不在 {0,1}\{0,1\} 中,概率为 00)。

也可以从计数的角度看:满足 Dr=0\bm{D}\bm{r} = \bm{0}r{0,1}n\bm{r} \in \{0,1\}^n 至多有 2n12^{n-1} 个(因为每组固定的 rjr_{-j},即除了 rjr_j 后其余分量的集合,至多对应一个 rjr_j 的取值,至多有一个满足条件),而 r\bm{r} 的总选取数为 2n2^n,所以:

Pr[Dr=0]2n12n=12\Pr[\bm{D}\bm{r} = \bm{0}] \le \frac{2^{n-1}}{2^n} = \frac{1}{2}

独立重复 tt 次(每次独立随机选取 r\bm{r}),错误概率降为 2t2^{-t},总时间 O(tn2)O(tn^2)。取 t=O(logn)t = O(\log n),即可在 O(n2logn)O(n^2 \log n) 时间内以高概率得到正确结果。

Schwartz-Zippel 视角

Freivalds 算法也可以从 Schwartz-Zippel 引理的角度统一理解。将 (Dr)i=kdikrk(\bm{D}\bm{r})_i = \sum_k d_{ik} r_k 看作变量 r1,,rnr_1, \ldots, r_n 的多元多项式,它是一个总次数为 11 的多项式。若它不恒为零,由 Schwartz-Zippel 引理(d=1,S=2d = 1,\, |S| = 2),在 S={0,1}S = \{0,1\} 上随机取值为零的概率 1/S=1/2\le 1/|S| = 1/2

Karp-Rabin 字符串匹配

问题定义

模式匹配(Pattern Matching)是字符串算法中的经典问题:给定文本串 T[1n]T[1 \ldots n] 和模式串 P[1m]P[1 \ldots m]mnm \le n),找到 PPTT 中所有出现的位置,即所有满足 T[jj+m1]=PT[j \ldots j+m-1] = P 的位置 jj

朴素算法逐位置对齐并逐字符比较,最坏时间 O(nm)O(nm)。确定性线性算法(如 KMP、Boyer-Moore)可以达到 O(n+m)O(n + m),但需要预处理模式串,空间 O(m)O(m)

通用框架:Fingerprinting 方法

在介绍具体算法之前,先看 fingerprinting 方法解决模式匹配的一般框架:

  1. 计算模式的指纹 FING(P)\text{FING}(P)
  2. 对每个位置 jj,计算子串的指纹 FING(Tj)\text{FING}(T_j)(其中 Tj=T[jj+m1]T_j = T[j \ldots j+m-1]
  3. 比较 FING(Tj)\text{FING}(T_j)FING(P)\text{FING}(P)

这个框架要求指纹函数满足一个额外条件:增量可计算性——能够从 FING(Tj)\text{FING}(T_j)O(1)O(1) 时间内递推出 FING(Tj+1)\text{FING}(T_{j+1})。这是因为如果每个位置都从头计算指纹,总时间仍为 O(nm)O(nm),没有改进。

Karp-Rabin 算法

Karp-Rabin 算法给出了一个满足增量可计算性的 fingerprinting 方案。

将二进制字符串 s=s1s2sms = s_1 s_2 \ldots s_m 视为整数 sˉ=i=1msi2mi\bar{s} = \sum_{i=1}^{m} s_i \cdot 2^{m-i}。定义指纹:

FINGp(s)=sˉmodp\text{FING}_p(s) = \bar{s} \bmod p

其中 pp 是从不超过 mn3mn^3 的素数中均匀随机选取的素数。

滑动窗口与增量更新

关键观察:相邻位置的子串 TjT_jTj+1T_{j+1} 高度重叠,仅相差首尾各一个字符。在整数表示下:

Tˉj+1=2(TˉjT[j]2m1)+T[j+m]\bar{T}_{j+1} = 2\big(\bar{T}_j - T[j] \cdot 2^{m-1}\big) + T[j+m]

直觉很简单:从 TjT_jTj+1T_{j+1},去掉最高位 T[j]T[j],其余位左移一位(乘以 22),再加上新的最低位 T[j+m]T[j+m]

由于模运算与加法、乘法兼容(即 (a+b)modp=((amodp)+(bmodp))modp(a + b) \bmod p = ((a \bmod p) + (b \bmod p)) \bmod p,乘法同理),同一递推关系在模 pp 下也成立:

FINGp(Tj+1)=(2(FINGp(Tj)T[j]2m1)+T[j+m])modp\text{FING}_p(T_{j+1}) = \big(2 \cdot (\text{FING}_p(T_j) - T[j] \cdot 2^{m-1}) + T[j+m]\big) \bmod p

只需预计算 2m1modp2^{m-1} \bmod p,之后每次更新只涉及 O(1)O(1) 次模运算。

算法流程

flowchart LR
    A["随机选取素数 p ≤ mn³"] --> B["预计算 FING(P) 和 FING(T₁)<br/>以及 2^(m-1) mod p"]
    B --> C{"FING(T_j) = FING(P)?"}
    C -- 是 --> D["报告位置 j 匹配"]
    C -- 否 --> E["跳过"]
    D --> F{"j < n - m + 1?"}
    E --> F
    F -- 是 --> G["O(1) 递推 FING(T_{j+1})"]
    G --> C
    F -- 否 --> H["结束"]

    classDef init fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef decision fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
    classDef match fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
    classDef skip fill:#f8f9fa,stroke:#495057,stroke-width:2px
    classDef endclass fill:#ffebee,stroke:#c62828,stroke-width:2px

    class A,B init
    class C,F decision
    class D match
    class E,G skip
    class H endclass

复杂度

  • 时间:预处理 O(m)O(m),匹配阶段每步 O(1)O(1),共 nm+1n - m + 1 步,总计 O(n)O(n)
  • 空间:O(log(mn))O(\log(mn))——只需存储当前指纹、素数 pp、预计算的 2m1modp2^{m-1} \bmod p

错误分析

对于某个固定位置 jj,若 TjPT_j \neq P,假阳性发生当且仅当 p(TˉjPˉ)p \mid (\bar{T}_j - \bar{P})。令 zj=TˉjPˉz_j = |\bar{T}_j - \bar{P}|,则 0<zj<2m0 < z_j < 2^m,所以 zjz_j 至多有 mm 个不同的素因子(理由同前)。

Pr[位置 j 假阳性]=#{pmn3:p 是素数且 pzj}π(mn3)mπ(mn3)mln(mn3)mn3\Pr[\text{位置 } j \text{ 假阳性}] = \frac{\#\{p \le mn^3 : p \text{ 是素数且 } p \mid z_j\}}{\pi(mn^3)} \le \frac{m}{\pi(mn^3)} \approx \frac{m \cdot \ln(mn^3)}{mn^3}

这里有 nm+1nn - m + 1 \le n 个位置需要检查。由联合界(union bound:多个事件中至少一个发生的概率不超过各自概率之和,即 Pr[iAi]iPr[Ai]\Pr[\bigcup_i A_i] \le \sum_i \Pr[A_i]):

Pr[存在假阳性]nmln(mn3)mn3=ln(mn3)n2=O(lognn2)=O(1n)\Pr[\text{存在假阳性}] \le n \cdot \frac{m \cdot \ln(mn^3)}{mn^3} = \frac{\ln(mn^3)}{n^2} = O\left(\frac{\log n}{n^2}\right) = O\left(\frac{1}{n}\right)

Karp-Rabin 的优势

与 KMP 等确定性算法相比,Karp-Rabin 的主要优势在于:

  • 实现极简:核心仅涉及模运算,无需复杂的预处理数据结构
  • 空间极小:仅需 O(logn)O(\log n) 空间,远小于 KMP 的 O(m)O(m)
  • 泛化能力强:天然适用于多模式匹配(同时搜索多个模式串)、二维模式匹配、以及大字母表上的匹配问题
  • 数据流友好:文本可以逐字符流式输入,无需预先存储

一般字母表

上述描述假设二进制字母表 {0,1}\{0,1\}。对于大小为 Σ|\Sigma| 的一般字母表,只需将 22 替换为 Σ|\Sigma|:将字符串视为 Σ|\Sigma| 进制数,递推公式变为 FINGp(Tj+1)=(Σ(FINGp(Tj)T[j]Σm1)+T[j+m])modp\text{FING}_p(T_{j+1}) = (|\Sigma| \cdot (\text{FING}_p(T_j) - T[j] \cdot |\Sigma|^{m-1}) + T[j+m]) \bmod p。分析完全类似。

多重集相等性检验与元素唯一性

问题定义

给定一个序列 A=(a1,a2,,an)A = (a_1, a_2, \ldots, a_n),其中 ai[n]={1,2,,n}a_i \in [n] = \{1, 2, \ldots, n\},判断 AA 中的元素是否两两不同(元素唯一性问题,Checking Distinctness)。

等价地,如果元素两两不同,则 AA 恰好是 {1,2,,n}\{1, 2, \ldots, n\} 的一个排列。因此问题可以表述为:判断多重集(Multiset)AA 是否等于集合 I={1,2,,n}I = \{1, 2, \ldots, n\}(作为多重集相等)。

排序后逐个比较需要 O(nlogn)O(n \log n) 时间。哈希表方法需要 O(n)O(n) 时间但空间也是 O(n)O(n)。利用 fingerprinting,可以在 O(n)O(n) 时间、O(logn)O(\log n) 空间内完成——这在数据流模型下尤为重要。

多项式编码

将多重集编码为多项式是 Lipton 的核心思想。定义:

fA(x)=i=1n(xai)fI(x)=i=1n(xi)f_A(x) = \prod_{i=1}^{n} (x - a_i) \qquad f_I(x) = \prod_{i=1}^{n} (x - i)

fAf_AfIf_I 都是 R\R 上的首一(最高次系数为 1)nn 次多项式。AA 中元素两两不同(且均在 [n][n] 中),当且仅当 fAfIf_A \equiv f_I。这是因为首一多项式可以唯一分解为 (xri)\prod (x - r_i),其根集合(含重数)完全确定了这个多项式。

定义指纹:

FING(A)=fA(r)modp=i=1n(rai)modp\text{FING}(A) = f_A(r) \bmod p = \prod_{i=1}^{n} (r - a_i) \bmod p

其中参数 rrpp 的选取需要仔细设计。

两类错误源

AA 中有重复元素时(即 fA≢fIf_A \not\equiv f_IR\R 上),假阳性 FING(A)=FING(I)\text{FING}(A) = \text{FING}(I) 可以由两个不同的原因引起:

两层随机性

仅用随机素数 pp(固定 rr)或仅用随机取值点 rr(固定 pp)都不足以保证低错误概率。需要同时随机化 rrpp

错误源 1:fAfIf_A \equiv f_IZp\mathbb{Z}_p

虽然 fAfIf_A \neq f_IR\R 上,但有可能在取模 pp 之后两个多项式变得相同。这发生在 pp 整除 fAfIf_A - f_I 的某个非零系数的时候。

fA(x)fI(x)=k=0nckxkf_A(x) - f_I(x) = \sum_{k=0}^{n} c_k x^k,其中 ckZc_k \in \mathbb{Z} 且不全为零。每个系数 ck|c_k| 至多为 (nk)nknn\binom{n}{k} \cdot n^k \le n^nai[n]a_i \in [n],选择 kk 个元素的组合数乘以每个元素的最大值 nnkk 次方)。素因子至少为 2,因此 ckc_k 的不同素因子个数至多为:

log2ck=lnckln2nlnnln2=O(nlogn)\log_2 |c_k| = \frac{\ln |c_k|}{\ln 2} \le \frac{n \ln n}{\ln 2} = O(n \log n)

错误源 2:fA≢fIf_A \not\equiv f_IZp\mathbb{Z}_p 上,但 fA(r)fI(r)(modp)f_A(r) \equiv f_I(r) \pmod{p}

此时 g(x)=fA(x)fI(x)g(x) = f_A(x) - f_I(x) 作为 Zp\mathbb{Z}_p 上的多项式不恒为零,次数至多为 nn。由 Schwartz-Zippel 引理(或直接由域上多项式的根的个数),随机 rZpr \in \mathbb{Z}_p 满足 g(r)0(modp)g(r) \equiv 0 \pmod{p} 的概率至多为 n/pn/p

Lipton 算法与参数选择

Lipton 算法(Lipton's Algorithm)的具体参数如下:

  • 随机选取素数 pp,满足 (nlogn)22p(nlogn)2\dfrac{(n\log n)^2}{2} \le p \le (n\log n)^2
  • 随机选取 rZpr \in \mathbb{Z}_p
  • 计算 FING(A)=i=1n(rai)modp\text{FING}(A) = \prod_{i=1}^{n} (r - a_i) \bmod p
  • 计算 FING(I)=i=1n(ri)modp\text{FING}(I) = \prod_{i=1}^{n} (r - i) \bmod p
  • 检查 FING(A)=FING(I)\text{FING}(A) = \text{FING}(I)

参数范围的选取

选取素数范围为 [L,U][L, U](其中 L=(nlogn)2/2,U=(nlogn)2L = (n\log n)^2/2,\, U = (n\log n)^2),而非从 [1,U][1, U] 中选取,是为了保证所有素数都足够大,从而控制错误源 2。

由素数定理,区间 [L,U][L, U] 中的素数个数约为:

π(U)π(L)UlnULlnLLlnL=Θ((nlogn)2log(nlogn))=Θ(n2(logn)2logn)=Θ(n2logn)\pi(U) - \pi(L) \approx \frac{U}{\ln U} - \frac{L}{\ln L} \approx \frac{L}{\ln L} = \Theta\left(\frac{(n\log n)^2}{\log(n\log n)}\right) = \Theta\left(\frac{n^2 (\log n)^2}{\log n}\right) = \Theta(n^2 \log n)

错误源 1 的概率:对于某个非零系数 ckc_k,它至多有 O(nlogn)O(n\log n) 个素因子。在 [L,U][L, U] 内约有 Θ(n2logn)\Theta(n^2 \log n) 个素数中,pp 恰好整除 ckc_k 的概率:

Pr[错误源 1]O(nlogn)Θ(n2logn)=O(1n)\Pr[\text{错误源 1}] \le \frac{O(n \log n)}{\Theta(n^2 \log n)} = O\left(\frac{1}{n}\right)

错误源 2 的概率:由 Schwartz-Zippel 引理,随机 rZpr \in \mathbb{Z}_p 使得非零多项式 g(x)modpg(x) \bmod p 取值为零的概率至多为 n/pn/Ln/p \le n/L

Pr[错误源 2]n(nlogn)2/2=2n(logn)2=O(1n)\Pr[\text{错误源 2}] \le \frac{n}{(n\log n)^2 / 2} = \frac{2}{n(\log n)^2} = O\left(\frac{1}{n}\right)

由联合界,总错误概率为 O(1/n)O(1/n)

复杂度与数据流适用性

指标 复杂度
时间 O(n)O(n)——遍历所有元素,逐步累乘 (rai)modp(r - a_i) \bmod p
空间 O(logn)O(\log n)——只需存储当前部分积、rrpp
错误 O(1/n)O(1/n)(单边错误,仅假阳性)

Lipton 算法的一个重要优势是天然适合数据流模型(Data Stream Model):元素 a1,a2,,ana_1, a_2, \ldots, a_n 逐个到达,算法只需维护当前部分积 i=1k(rai)modp\prod_{i=1}^{k}(r - a_i) \bmod p,每到达一个新元素只需一次乘法和一次取模。这在处理大规模数据时尤为有用——数据可能太大而无法全部存储在内存中。

推广:一般多重集相等性

Lipton 算法不局限于元素唯一性,可以推广到一般的多重集相等性检验:给定两个多重集 A=(a1,,an)A = (a_1, \ldots, a_n)B=(b1,,bn)B = (b_1, \ldots, b_n),判断 A=BA = B。只需分别计算 FING(A)=(rai)modp\text{FING}(A) = \prod(r - a_i) \bmod pFING(B)=(rbi)modp\text{FING}(B) = \prod(r - b_i) \bmod p,然后比较即可。分析完全类似。

Fingerprinting 的统一视角

回顾本讲的所有算法,它们共享一个统一的范式:

问题 对象 指纹 FING\text{FING} 随机源 时间
PIT 多项式 QQ Q(r1,,rn)Q(r_1, \ldots, r_n) 随机取值点 取决于电路
字符串相等(公共随机) a{0,1}na \in \{0,1\}^n airimodp\sum a_i r^i \bmod p 随机 rZpr \in \mathbb{Z}_p O(n)O(n)
字符串相等(私有随机) a{0,1}na \in \{0,1\}^n amodpa \bmod p 随机素数 pp O(n)O(n)
二部图匹配 Edmonds 矩阵 M\bm{M} det(M)xij=rij\det(\bm{M})\big\|_{x_{ij}=r_{ij}} 随机赋值 O(nω)O(n^\omega)
矩阵乘法验证 矩阵 D\bm{D} Dr\bm{D}\bm{r} 随机向量 r\bm{r} O(n2)O(n^2)
字符串匹配 子串 TjT_j Tˉjmodp\bar{T}_j \bmod p 随机素数 pp O(n)O(n)
多重集相等 多项式 fAf_A fA(r)modpf_A(r) \bmod p 随机 rrpp O(n)O(n)

Fingerprinting 的本质是一种「降维」策略:将高维或大规模的对象映射到低维空间中,利用随机性保证「保距性」——不同对象大概率映射为不同指纹。错误分析的核心工具是两个:

  • Schwartz-Zippel 引理:非零多项式在随机点处为零的概率有上界
  • 素数定理:控制随机素数整除特定整数的概率

这一思想不仅是随机算法的基石,也是后续课程中哈希技术、数据流算法、降维方法(如 Johnson-Lindenstrauss 引理)的核心起点。