# 预言机 · 把经典函数变成量子黑箱

> 量子算法怎么把一个经典函数 f(x) 喂给叠加态？靠「预言机」。这一章讲清可逆预言机的标准构造 |x⟩|y⟩→|x⟩|y⊕f(x)⟩，以及最关键的技巧——相位反冲(phase kickback)：把一个比特翻转的预言机，变成往输入上「盖相位」的印章。

- 作者：David（道雾轩）
- 专栏：写给程序员的量子计算（https://daiw.org/manual/quantum-computing.md）
- 最后更新：2026-07-14
- 原文：https://daiw.org/manual/quantum-computing/oracle
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 预言机 · 把经典函数变成量子黑箱

那几个著名的量子算法（Deutsch-Jozsa、Grover、Shor），都要研究一个经典函数 $f(x)$——判断它的性质、或找它的某个特殊输入。可量子门都是[幺正矩阵](https://daiw.org/manual/quantum-computing/single-gates)，而一个普通的经典函数**未必可逆**。怎么把 $f$ 塞进量子线路，还能作用在**叠加**上？靠一个叫**预言机(oracle)** 的构造。这是所有量子算法的公共前置，值得单独讲清。

## 可逆化：标准构造

一个函数 $f(x)$ 直接算 $\ket{x}\to\ket{f(x)}$ 可能不可逆（比如 $f$ 把多个输入映到同一个输出，信息就丢了，而量子演化[不许丢信息](https://daiw.org/manual/quantum-computing/single-gates)）。标准解法：**加一个「输出寄存器」，用异或写入，让整个操作可逆**：

$$
U_f\,\ket{x}\ket{y} = \ket{x}\ket{y \oplus f(x)}
$$

$\oplus$ 是异或。输入 $\ket{x}$ 原样保留，$f(x)$ 被**异或**进输出寄存器 $\ket{y}$。这个操作一定可逆（再作用一次 $U_f$ 就变回去了，因为 $y\oplus f(x)\oplus f(x)=y$），所以是合法的量子门。**这就是把任意经典函数「量子化」的通用配方。**

## 关键魔术：相位反冲

上面的「比特写入」还不够好用——量子算法真正想要的，往往是把 $f(x)$ 变成一个**相位**($(-1)^{f(x)}$)，因为[相位能干涉](https://daiw.org/manual/quantum-computing/superposition)。有个精巧的技巧能做到，叫**相位反冲(phase kickback)**，是量子算法里最该掌握的一招。

诀窍：把输出寄存器 $\ket{y}$ 预置成 $\ket{-}=\frac{1}{\sqrt2}(\ket0-\ket1)$，再作用 $U_f$。算一下会发生什么：

$$
U_f\,\ket{x}\ket{-} = \ket{x}\cdot\frac{1}{\sqrt2}\big(\ket{0\oplus f(x)} - \ket{1\oplus f(x)}\big) = (-1)^{f(x)}\,\ket{x}\ket{-}
$$

<Callout type="info">
  **看那个 $(-1)^{f(x)}$——它「反冲」到了输入 $\ket{x}$ 上！** 直觉：如果 $f(x)=0$，$\ket{-}$ 原样不动；如果 $f(x)=1$，$U_f$ 把 $\ket{-}$ 里的 $\ket0$ 和 $\ket1$ 对调，而 $\ket{-}=\frac{1}{\sqrt2}(\ket0-\ket1)$ 对调后变成 $\frac{1}{\sqrt2}(\ket1-\ket0)=-\ket{-}$——**多出一个负号**。这个负号不属于输出寄存器（它没变），而是**挂到了整个态的前面，即挂到了 $\ket{x}$ 上**。于是一个「翻转比特」的预言机，摇身变成了「往输入上盖 $(-1)^{f(x)}$ 相位印章」的预言机：
  $$U_f\,\ket{x} \;=\; (-1)^{f(x)}\,\ket{x}$$
  （省略了始终不变的 $\ket{-}$）。**相位反冲，是把 $f$ 变成可干涉的相位的标准手法。**
</Callout>

## 作用在叠加上：一次「盖章」盖所有

现在把相位预言机作用在**所有输入的均匀叠加**上（用 [$n$ 个 H 门](https://daiw.org/manual/quantum-computing/superposition)造出来），神奇的事发生了：

$$
U_f\left(\frac{1}{\sqrt{2^n}}\sum_{x} \ket{x}\right) = \frac{1}{\sqrt{2^n}}\sum_{x} (-1)^{f(x)}\,\ket{x}
$$

**一次调用，就给所有 $2^n$ 个输入项各自盖上了 $(-1)^{f(x)}$ 的相位。** 那些 $f(x)=1$ 的项被标上了负号，$f(x)=0$ 的项保持正号。注意——**这不是「同时算出所有 $f(x)$ 并读出来」**（测量只能得一个），而是把 $f$ 的信息**编码进了相位结构**里。接下来算法的任务，就是用[干涉](https://daiw.org/manual/quantum-computing/superposition)把这些相位「翻译」成一个能测出来的答案。

<Callout type="warn">
  **别把预言机神化成「免费的超级计算」。** 预言机内部其实就是一段**真实实现 $f$ 的量子线路**（有具体的门），不是凭空变出答案的魔盒；分析算法时把它当黑箱、只数「调用了几次」，是为了聚焦「量子相对经典省了多少次查询」。真正的加速不来自「预言机很快」，而来自**用很少的预言机调用 + 干涉，就问出了经典要很多次才能得到的信息**。下一章的 Deutsch-Jozsa，会给你第一个惊艳的例子：**一次**查询搞定经典要指数次的事。
</Callout>

## 小结与下一章

预言机是把经典函数 $f$ 塞进量子线路的通用构造：用异或写入 $\ket{x}\ket{y}\to\ket{x}\ket{y\oplus f(x)}$ 保证可逆；再用**相位反冲**（输出寄存器置 $\ket{-}$）把它变成往输入盖 $(-1)^{f(x)}$ 相位的印章。作用在均匀叠加上，一次就给所有输入编码了相位——接下来靠干涉把它变成答案。

理论备齐，来看第一个真正的量子算法，也是历史上第一个证明「量子能指数级超越经典」的例子。它用的正是「H → 预言机 → H」这个你已经在[两次 H 实验](https://daiw.org/manual/quantum-computing/superposition)里见过内核的干涉套路。👉 [Deutsch-Jozsa：一次查询判定性质](https://daiw.org/manual/quantum-computing/deutsch-jozsa)。

## 参考文献

- [1] Qiskit 官方文档.「Oracles and phase kickback.」https://learning.quantum.ibm.com —— 预言机与相位反冲。
- [2] Nielsen & Chuang.《Quantum Computation and Quantum Information》， §6.1 —— 预言机与量子查询模型。
- [3] Michael Nielsen.「Quantum Computing for the Very Curious.」https://quantum.country —— 相位反冲直觉。
