核心思路
整个计算领域里被吹得最过头的一句话就是:「量子计算机会同时尝试每一个答案。」这话听起来很神奇,可它是错的。没错,一组处于叠加态的量子比特确实可以一次性容纳所有可能答案的某种组合。但你永远没法把它们全部读出来。当你测量时,你只会得到恰好一个答案,而且是按照概率规则随机选出的。如果故事到此为止,那量子计算机不过是一种极其昂贵的猜答案方式罢了。
那么,到底是什么让量子计算机真正有用?老实说就一个词:干涉。叠加态里的每一个可能答案都带有一个*振幅*——一个可以为正、为负、甚至是复数的数。你读出某个答案的概率,就是它振幅的平方。整个量子算法设计的游戏,就是用量子门去推动这些振幅,让指向错误答案的振幅互相抵消,而让指向正确答案的振幅不断累积。然后——也只有到这时——你才去测量。
放大正确答案
我们把「振幅」讲具体些。一个两态的量子比特写作 |psi> = alpha|0> + beta|1>,其中 alpha 和 beta 就是振幅。把它们和你实际看到的结果联系起来的规则,叫玻恩规则:读出 0 的概率是 |alpha|^2,读出 1 的概率是 |beta|^2,而这两者永远加起来等于 1(|alpha|^2 + |beta|^2 = 1)。注意 alpha 和 beta 可以是负的。单独一次测量看不出这个符号——但正是这个符号,让各条路径重新汇合时,振幅能够相加或相减。
把振幅想成水面上的波,因为这个类比在这里是真的贴切。两个波峰对齐,会叠成一个更高的波峰——这就是*相长*干涉,它让某个答案更可能出现。波峰碰上波谷,就会抹平——这就是*相消*干涉,它让某个答案更不可能出现。所谓「放大正确答案」,就是引导你的量子门,让通往正确答案的各条路径同相到达,就像对齐的波峰那样,叠加成一个高高的振幅。
Two paths to the SAME answer:
+0.5 ---\
>--- combine ---> +1.0 (bigger: reinforced)
+0.5 ---/
Probability before: 0.5^2 = 0.25 each
Probability after: 1.0^2 = 1.00 <- amplified抵消错误答案
抵消是另一半,也正是负号大显身手的地方。如果两条路径都通向同一个错误答案,但到达时符号相反——比如 +0.5 和 -0.5——它们相加就是零。这个答案的振幅消失了,于是它的概率(也就是平方)也是零。你根本就永远测不到它。这一点是经典世界里没有对应物的:经典概率在你叠加更多机会时只会往上走,而量子振幅却能被一路压到一无所有,因为振幅被允许取负、被允许相减。
Two paths to a WRONG answer:
+0.5 ---\
>--- combine ---> 0.0 (cancelled)
-0.5 ---/
Probability after: 0.0^2 = 0.00 <- this answer is gone振幅放大
当你有意识地、反复地去做这套「抵消错的、增强对的」模式时,它有个名字:振幅放大。它的思路是施加一连串量子门,每一轮都把一点点振幅从错误答案那里挪开、推向正确答案。做一轮,正确答案就稍微更可能一点。重复正确的次数之后,正确答案的振幅长得高高的,其余的则缩了下去,于是最后一测,多半就把你想要的答案交到你手上。
这正是Grover 搜索内部的引擎,你下一篇就会遇到它。有个不大却很要紧的提醒:你不能就这么没完没了地重复下去。振幅放大本质上是一种旋转,如果你旋转过头,就会从目标旁边*越过去*,正确答案的概率会重新开始下降。存在一个恰到好处的重复次数——大致与条目数量的平方根成正比——而在那里停手,本身就是算法的一部分。
One round of amplitude amplification (schematic):
start: all answers equal, right one buried
| small amp on every answer |
[oracle] flip the sign of the right answer
[diffuse] reflect amplitudes about their average
----------------------------------------
after: right answer's amplitude a bit taller,
wrong answers a bit shorter
repeat ~sqrt(N) times, then MEASURE为什么这不是蛮力穷举
现在我们可以把加速说精确了,而精确意味着不夸大。Grover 式的振幅放大,在一个含 N 个条目、毫无结构的空间里搜索,大约只要 sqrt(N) 步,而不是 N 步。这是一个真实的、已被证明的优势——但它是二次加速,不是指数加速。在一万亿个条目里搜索,大约需要一百万步,而不是一步。它比蛮力穷举快;但它不是那种「瞬间检查一切」的蛮力,因为根本没有谁去检查一切——错误答案是被*抵消*掉的,不是被一一查看的。
更大的、指数级的加速是真实存在的,但很罕见,而且来自另一个源头:问题里深刻的数学*结构*。用于分解因数的Shor 算法就是那个著名的例子——它用量子傅里叶变换,让一个函数的周期以一种尖锐的干涉图样显现出来,这比 Grover 那种温柔的轻推要强得多。要点在于:干涉是普适的机制,但你能赢多大,完全取决于问题的结构有多巧妙地让你去塑造那些振幅。