矩阵乘法的随机自规约 (平原秀一, 清水伸高, 2023)

随机自规约 (random self-reduction) 说的是这样一件事: 对于一个函数 \(f\), 如果我们有一个算法 \(A\) 能够高效地对于随机的输入以一定概率计算出正确的结果, 那么我们就能通过调用 \(A\)任意输入上都以一定概率计算出正确的结果.

比如限定有限域 \(\mathbb F\) 上的 \(n\) 阶矩阵乘法, 我们就可以得到如下事实: 如果有一个算法 \(M(A, B)\) 能够在 \(O(T(n))\) 时间内, 对于均匀随机的 \(A, B\), 以 \(1-\epsilon\) 的概率正确计算出 \(AB\), 那么就有算法 \(M'\)\(O(T(n))\) 时间内, 对于任意矩阵 \(A, B\), 以 \(1-4\epsilon\) 的概率正确计算出 \(AB\).

构造其实很简单: 将 \(A\) 拆成 \(A_1+A_2\), \(B\) 拆成 \(B_1+B_2\), 那么每个 \((A_i, B_j)\) 都是均匀随机的, 我们计算 \(M(A_i, B_j)\) 的和即可得到 \(AB\). 根据 union bound, 错误率不超过 \(4\epsilon\).

但是这个转化就不够强大, 需要我们本来就有一个计算正确率很高的算法. 我们希望如果能有一个小一些的概率计算出正确答案, 就把它放大到一个有很大概率计算出正确答案的算法.

假设我们有算法 \(M\) 使得 \(\Pr[M(A,B) = AB] \geq \delta\), 能否得到一个很快的矩阵乘法算法呢? 今天我们来考虑 [HS23] 中提到的一个办法:

  • 虽然我们知道计算矩阵乘法比较慢, 但是验证矩阵乘法却是很快的, 我们取随机向量做乘法就得到了一个 \(1/|\mathbb F|\) 错误率的 \(O(n^2/k)\) 复杂度的检验一个 \((n/k) \times n \times (n/k)\) 的矩阵乘法的算法.
  • 我们先把 \(n\times n\) 的矩阵拆成 \(k^2\)\((n/k)\times (n/k)\) 的块, 试图对每个块分别解决.
  • 一个 \(n\times n\) 的矩阵乘法可以嵌入 \(k\) 个互不干扰的 \((n/k) \times n \times (n/k)\) 计算问题, 而这是可以得到远比 \(\delta\) 好的概率的.

最后这一条观察在原文中被称作 直积定理 (direct product theorem). 直观上看, 就是我们想要考察 \(f\colon X\to Y\) 好不好计算, 但是我们只知道直积 \(f^k = (f(x_1), \dots, f(x_k))\)\(\delta\) 的比例是好算的. 直观上说, 如果 \(f^k\)\(\delta\) 的比例好计算, 那 \(f\) 应该有 \(\delta^{1/k}\) 的比例是好计算的.

我们尝试严格说明这一点, 首先考虑如下算法:

  • 算法 \(M'\) 输入为 \(x\).
  • \([k]\) 中随机选取下标 \(i\).
  • 计算 \(M(x_1, \dots, x_k)\), 其中 \(x_i = x\), 其他 \(x_j\) 为均匀随机选取.
  • 输出计算结果的第 \(i\) 个.

显然, 这个算法的正确率还是只有 \(\delta\) 的保证, 但不同在于, "困难的 \(x\)" 应当是少得多的. 现在, 我们有

\[p(x) := \Pr[M'(x) \text{ correct}] = \frac 1 k \sum_{i=1}^k \Pr[M(\dots, x_i=x, \dots) \text{ correct}], \]

假设所有的 \(x\) 里有 \(\rho\) 的比例满足 \(p\geq \epsilon\), 另外 \(1-\rho\) 的比例 \(<\epsilon\), 那么我们有

\[\delta \leq \Pr[M \text{ correct}] \leq \rho^k + k\epsilon, \]

其中第一项是假设 \(p(x_1), \dots, p(x_k)\geq\epsilon\) 皆成立的那部分. 第二项是有任何一项 \(x_i\) 不满足的, 都被 \(p(x_i)\) 的求和占了 \(1/k\) 的贡献. 因此, 我们得到了

\[\rho \geq (\delta - k\epsilon)^{1/k}. \]

\(\epsilon = \delta / 2k\), 我们有

\[\Pr[p(x) \geq \delta / 2k] \geq (\delta/2)^{1/k}. \]

如此一来, 我们只需要重复执行 \(M'\) 这个算法 \(2c k/\delta\) 次, 就可以将这部分容易计算的 \(x\), 计算成功的概率放大到 \(\geq 1 - e^{-c}\). 总共成功的概率就有 \(\geq (1-e^{-c}) (\delta/2)^{1/k}\). 但是我们还得知道哪次算对了, 我们需要检测的时候重复实验 \(\Omega(c(\log(k/\delta) + \log(2/\delta) / k))\) 次, 从而达到 \((1 - e^{-\Omega(c)}) (\delta/2)^{1/k}\) 的总共成功概率, 也即

\[1 - e^{-\Omega(c)} - O\left(\frac{\log(2/\delta)}k \right) . \]

那么, 对于每个 \((n/k, n/k)\) 的块, 通过最初给的弱版规约, 我们就可以令 \(k = \Theta(\log(2/\delta)), c = \Theta(1)\), 使得成功概率 \(=0.99\), 此时调用了 \(\Theta\left(\frac{\log(1/\delta)}{\delta}\right)\) 次矩阵乘法, 调用了 \(\Theta\left(\frac{\log^2(1/\delta)}{\delta}\right)\) 次矩阵乘法的检验. 因此一个小块的复杂度是

\[O\left( \frac{\log(1/\delta)}{\delta} (T(n)+n^2)\right)=O\left( \frac{\log(1/\delta)}{\delta} T(n)\right). \]

既然有 \(0.99\) 的概率输出正确结果, 我们重复 \(\Omega( t\log k)\) 次实验取众数, Chernoff bound 就能给我们 \(k^{-\Omega(t)}\) 的错误率, 抵消总共 \(k^2\) 个子任务.

这样一来, 我们就有

\[O\left( \frac{\log(1/\delta)}{\delta} T(n)\cdot k^2 \log k\right) = O\left( \frac{\log^3(1/\delta) \log\log (1/\delta)}{\delta} T(n)\right) \]

的一个算法, 给定 \(\geq \delta(n)\) 的概率对随机输入计算矩阵乘法的算法, 给出一个对任意输入有 \(\geq 2/3\) 概率输出正确结果的矩阵乘法的算法.


想写这个东西, 另一个原因也是因为这学期学密码学的时候发现这个所谓的 "直积定理" 在密码学里就是从 weak one way function 到 strong one way function 的构造. 也就是说, 如果一个函数 \(f\) "有那么一点不好算", 那么 \(f^k\) 会 "非常不好算". 与此同时, 它还是姚期智 XOR 引理.

[HS23] 平原秀一, 清水伸高. Hardness Self-Amplification: Simplified, Optimized, and Unified.

posted @ 2023-04-11 22:34  EntropyIncreaser  阅读(559)  评论(0编辑  收藏  举报