量子计算——一副奇特的牌

130 阅读31分钟

本章是一个可选的、免数学的量子计算核心概念导读。我建议先读完本章,因为这里的背景知识会帮助你熟悉全书后续所用的形式化表达。如果你更想直接进入机制讲解,也可以跳到第 2 章。

量子计算令人振奋!它带来一系列新颖、挑战性强且酷炫的思路。本章旨在帮助你对这些概念有一个直观认识。

这里的讨论有意不谈技术细节。在阅读本章时,我鼓励你放下关注细枝末节的大脑那一部分,让自由联想、大量吸收新奇想法的那部分占据主导。技术细节我们后面再深入。

今天的计算机被称为冯·诺依曼机,以数学家约翰·冯·诺依曼命名【269】。也常称为经典计算机、传统计算机。这些机器的物理实现依赖于早期程序员直接驱动的电子器件。现代编程虽多使用抽象程度更高的高级语言,让我们无需关心底层电子电路。但我们依然会在脑海里将程序视作迭代、子程序等抽象概念,这些概念都是从硬件能力中演化而来。

量子计算基于一种与经典计算机硬件几乎无关的新型硬件模型。这种新硬件催生了全新的算法思想——它仍然是算法性的,却与传统编程语言有着根本不同的思维模式。比如目前还不存在(或尚未成熟)的数据结构、循环或子程序(未来也许会出现)。

要在这样的设备上保持清醒的思路,我们需要一种心智模型来描述它们能做什么以及如何做。在本章中,我将用一个比喻来构建那种心智模型:将量子对象比作“电子扑克牌”。

电子扑克牌

我们用“电子扑克牌”来代表本书后面要重点讨论的量子尺度对象。这些想象中的扑克牌很特别,但并不夸张——如果你愿意,现在就可以用现成元件做出来。

这些扑克牌会近似模拟后面会介绍的真实量子对象的行为,但因为它们只是比喻,模拟并不会完全精准。

我们的扑克牌有四个奇特属性,分别对应量子世界里的叠加(superposition)、测量(measurement)、干涉(interference)和纠缠(entanglement)。本章的目标,就是通过观察这些扑克牌的行为,来熟悉这四个概念。

每张牌都内置一个小型计算机,配有显示屏和其他电子部件,如图 1-1 所示。

image.png

本章中我们使用的每张“电子扑克牌”都与图 1-1 所示的那张一模一样。除了本章末尾会提到的一个例外,我们假定所有出厂的牌在硬件和软件上均完全相同。

每张牌都是一个薄薄的盒子,其最显眼的特征是占据几乎整个面板的显示屏。显示屏旁边有一个光传感器,盒子顶上有根天线用于通信。盒子内部装着一台微型计算机、一点存储器和一块电池。

牌子从厂家出厂时处于待机模式,此时计算机是关闭的,显示屏完全空白。这个显示屏很特殊:它是“写一次后即永久保留”——最初一片空白,一旦在上面“画”上图像,就永远保留该画面。

当我们第一次打开包装、拿出牌来时,每张牌的光传感器都会发现外部环境从漆黑变成有光。后来,当我们将牌面朝下平放在桌上时,传感器又会检测到光线消失。

某一时刻,当我们把牌翻过来面朝上放置,传感器再次检测到光线,于是向计算机发送“牌已翻转”的信号。计算机接到信号后,会根据内部存储(稍后再详述)决定这张牌的点数和花色,然后在显示屏上“画”出相应的扑克牌图案。

为了防止作弊,我们无法直接访问牌内的存储器:只有盒子里的计算机本身才能读写内部存储。不过,我们可以通过天线向计算机发送指令,让它代为操作存储。计算机会执行我们发出的指令,但除了在翻牌时在显示屏上画出图案,它不会以任何方式(包括通过天线)向我们报告存储器中的内容。

在接收并响应该“翻牌”信号、完成图像绘制后,计算机会清空内部存储并切断所有电子线路。此后,盒子内的电路完全失效。这时,显示屏上的图案依然保留,就像印在卡纸上的那张牌,从功能上与普通扑克牌无异。

状态

要“玩”这些牌,我们一开始将它们面朝下平放在桌面。如前所述,当任意一张牌被翻转面朝上时,光传感器立刻感知到环境亮起,并触发内部计算机在显示屏上绘制图案。

计算机绘制哪张牌的图案,全凭其内部存储的信息。例如,若计算机判定这张牌是“方块 3”,它就会在显示屏上画出“方块 3”的花色与点数图案,而该图案将永久保留。

图 1-2 以示意图的方式总结了这些步骤。请注意,一旦光线照到传感器,所有操作便会瞬时完成,到我们抬头看向显示屏时,它已经呈现并固定在最终状态。

image.png

在图 1-2(a) 中,扑克牌面朝下,显示屏一片空白。到步骤 (b) 时,我们想象自己提起了一侧,开始翻牌。光传感器检测到光照变化,立即启动内部电子设备。计算机随即读取内部存储的信息,选定一张牌的值,然后在显示屏上画出对应的图案,随后清除存储并关闭所有电子线路,完成自我关闭。我们可以把步骤 (b) 中的所有动作都看作是瞬时完成的。在 (c) 到 (e) 部分,我们把牌完全翻过来,此时显示屏上已清晰地呈现出所选牌的图案。

由于计算机会根据存储的内容决定在显示屏上画什么,我们接下来详细看看存储里究竟保存了什么。

存储器里保存了一系列“牌值”(state),比如黑桃 A、梅花 3、方块 9 等。每个牌值都关联了一个概率值(0 到 1 之间的实数),表示当翻牌时,计算机“选中”该牌值的可能性。

我们可以用一个更通用的术语来描述这种“值+概率”的对象状态,称之为“态”(state)。当一个对象具有某个特定的值时,我们说它处于那个“态”中。

例如,假设存储里只有“梅花 3”和“方块 9”,且它们各自的概率都是 1/2,如图 1-3 所示。

image.png

因为每个“态”所对应的概率表示计算机选中该态的可能性,且这两种态的概率相同,所以这张牌最终变成梅花三或方块九的机会是相等的。或者,假设存储列表如图 1-4 所示。

image.png

在这里,梅花三的概率是 2/3,而方块九的概率是 1/3,这意味着计算机选中梅花三的可能性是选中方块九的两倍。

叠加态

包含一个或多个“态”及其对应概率的列表称为叠加态(superposition)。叠加态是量子计算的核心概念,几乎所有量子算法都用到了它。叠加态永远不会是空的。在我们的“扑克牌”中,卡片的存储器始终保存一个非空的叠加态——即至少一个“态”,也可能包含更多,每个“态”都有其概率。每张卡片的存储器只能存放这样一个叠加态(一个“态”列表及其概率),别无他物。

虽然我们通常将叠加态写成列表形式,但列表中“态”的顺序并不重要,如图 1-5 所示。

image.png

图 1-5(a) 中的叠加态与 (b) 中的完全相同。将叠加态写成列表时,必须给各个“态”排个序;但实际上,这些“态”的顺序并不重要。为了更贴近这一点,不妨把叠加态想象成装有各种“态”物件的袋子——这些物件可以是立方体、球体、鲸鱼模型等任意形状。想要“选出”一个态时,就闭上眼睛在袋子里随机抓取。某个态的概率越大,其对应物件就做得越大,因此更容易被抓到。

当我们把卡片翻过来时,卡片内部的计算机便会根据叠加态中给定的概率随机“选中”一个态并在显示屏上画出对应图案,因此我们根本无法在翻牌前预测最终的牌面。我们所能做的最好的“预测”,就是把叠加态本身写出来,列出卡片可能落入的每一种态及其概率。

人们有时会说:在翻牌之前,卡片的“态”就是它存储器里的叠加态。也就是说,叠加态本身就是翻牌前卡片所处的状态。但由于翻牌后只有一个图案被固定在显示屏上,我们自然会想“如果知道了最终显示的图案,是否能倒推出翻牌前的叠加态呢?”——答案是否定的!翻牌之后,计算机会绘制图案、抹去存储并关闭自己,之后内部存储永久丢失,我们无法从显示屏上的唯一图像还原出原来的叠加态。

回到面朝下的卡片。如果存储里保存了三个“态”的叠加(以及各自的概率),有人或许会误以为卡片“同时处于这三种态”,但那种描述极具误导性:如果真是同时处于三种态,显示屏上理应同时呈现三种图案。实际上,卡片处于的是“叠加态”——一个由这三种态及其概率共同组成的统计集合,它只是一组可能的结果。

当叠加态中所有“态”的概率都相同时,就称为“等幅叠加态”或“均匀叠加态”。

初始化

制造商在生产这些卡片时,需要决定如何初始化它们,也就是设置每张卡片存储器的初始内容。

  • 如果想让卡片“模拟”传统扑克牌,就可以让制造商生产 52 张卡,每张卡的存储器都只保存一个“态”、概率为 1。这样翻开全部卡片时,就会出现一副普通牌 1 到 K 的 52 张图案。——但这就大材小用,不如直接买普通扑克牌。
  • 我们可以让事情更有趣一些:把每张卡片都初始化为包含 52 种可能“态”的均匀叠加态,即每个“态”都赋予相同概率 1/52,如图 1-6 所示。这样一来,每次翻牌时从 52 种结果中随机均等地选出一张,就打开了全新的玩法空间。

image.png

这可不同于传统扑克牌的洗牌:每张卡都是从自己的存储器中独立随机选取状态,因此多个卡片完全可能选到同样的“态”。例如,如果我们翻开最前面的五张卡,每一张都可能是梅花 J。

用这样初始化的“牌”来玩游戏,绝对需要一套全新的规则。想象一下玩扑克时,你亮出手牌竟是五张红心 A(如图 1-7),结果才发现对手也同样拿到了五张红心 A!

image.png

这就说明,在卡片未被翻开之前,它没有确定的值(显示屏空白)。每张卡翻牌后最终显示的值,彼此互不影响,都是独立随机选出的。

测量

当我们翻开一张卡时,就是在“观察”它;如果使用摄像头等设备来读取卡的状态,也称为“测量”卡片。在实践中,“观察”和“测量”通常可互换使用。

对一张卡进行测量(即翻牌)的过程是:卡内的计算机读取存储器中的叠加态,按照相应概率随机选出一个“态”,将对应的牌面图案永久画到显示屏上,然后清除存储并关闭自身。这一切几乎瞬时完成,不可中断,也不能暂停、窥视中间结果或以任何方式干预。

在数学表述中,我们说测量(观察)会使叠加态“坍缩”。可以将叠加态想象为由各个“态”叠成的一座精致积木塔,而测量就是将这座塔摧毁——最终只剩下一块积木。

如果拿到一张尚未测量的卡片,我们对其叠加态一无所知,因为卡内计算机绝不会向外报告其存储内容。后面我们会看到一些指令可以让计算机替我们修改存储,但并不会有任何反馈。

测量是我们唯一能了解卡片内部存储内容的方法,而且仅限于一个信息——即显示屏上最终出现的那一张牌曾在存储中存在。我们无法获知叠加态中是否还有其他“态”,也无法获知任何“态”的概率(除了确知最终出现的“态”的概率非零)。

由于无法直接读出存储,我们无法确认卡片的初始化是否正确,或卡内计算机是否按我们指令执行。例如,假设我们拿到一张未知状态的卡,翻牌后它显示红心 3。这张卡的叠加态可能仅包含红心 3,概率为 1;也可能包含多个“态”,红心 3 仅是其中之一。我们根本无法分辨。

不过,我们可以“批量”验证制造商的诚意:取出大量同样初始化的卡片并翻开它们,统计各牌面出现的频率。随着样本量足够大,各牌面出现频率将趋近于一开始的统一叠加态所赋予的概率分布,如图 1-8 所示。

image.png

这是一种费时的过程,也是我们了解卡片叠加态的唯一途径。

操作卡片

到目前为止,我只介绍了翻开出厂初始化卡片时会发生什么。接下来,我们希望能真正“操作”卡片,比如用它们来玩游戏。由于无法直接读取卡片内部存储,我们只能根据翻牌时显示的状态来下注。

制造商会告知每张卡在出厂时被初始化的叠加态信息。利用这些信息,我们就能设计有趣的游戏。比如,假设某张卡最初被初始化为 52 种牌面均匀叠加,而你下注“翻牌时出现任意花色的 7”。若想提高获胜几率,就需要增加“7”态的概率、减少其它态的概率。

要改变这些初始概率,我们可以通过卡片顶端的天线向内部计算机发送消息。天线与计算机相连,能够下发指令,让计算机按我们的要求修改存储在叠加态中的概率分布。

想象你和朋友用三张卡玩游戏。三张卡从制造商那里拿来时都是均匀叠加所有 52 种牌面。游戏过程中,你和朋友轮流秘密地对每张卡的叠加态做少量修改。

例如,你下注“三张卡翻牌时牌面都小于 5”,而朋友下注“三张卡翻牌时花色都为方块”。此时,你们都有可能赢——既有可能三张卡都小于 5,也有可能三张卡都为方块。

但如果你下注“三张卡都小于 5”,而朋友下注“三张卡都大于 7”,那么两人至少有一人必输。

你们对任何一张卡发送的消息,都由计算机已知的一段例程名称组成,并可附带若干数字或“态”作为参数,用于指示该例程具体执行哪些操作。

用数学语言来说,我们将这样的例程称为算符(operator);当我们让计算机执行某个算符时,就称为在“对卡片进行操作”或“应用该算符”。随算符一并发送的数字或态就是它的参数(argument)。

下面介绍第一个算符,我称之为 include。它需要两个参数:一个“态”以及一个对应的概率值。

当计算机收到这条消息时,首先检查它当前存储的叠加态中是否已有该“态”。如果没有,计算机会将这个新“态”和它的概率追加到叠加态列表末尾。图 1-9 的 (a) 到 (c) 部分演示了这个过程。

image.png

让我们逐步看图中各部分发生了什么:

  1. (a) 初始叠加态,操作前的概率分布。

  2. (b) 收到 include(♦3, 0.6) 消息,表示要将“方块三”以概率 0.6 添加到叠加态中。

  3. (c) 因为“方块三”尚未存在于叠加态,计算机便将其附加到列表末尾,暂时得到概率和为 0.4+0.6+0.6=1.60.4 + 0.6 + 0.6 = 1.6 的新分布。

  4. (d) 归一化:我们将每个概率除以总和 1.6,使得新的概率之和恢复为 1。结果是:

    • “红桃二”概率变为 0.4/1.6=0.250.4/1.6 = 0.25
    • “梅花 J”概率变为 0.6/1.6=0.3750.6/1.6 = 0.375
    • “方块三”概率变为 0.6/1.6=0.3750.6/1.6 = 0.375

归一化是必要的,因为概率的定义要求所有互斥结果的概率总和必须为 1。从此以后,每当我们对卡片执行任意算符操作后,都会自动进行一次归一化,我会在后续图示中显式标出这一过程。

已有态的处理

如果使用 include 时指定的“态”已经在叠加态中存在,我们可以为算符行为做如下定义:将该“态”原有的概率与新传入的概率相加,再对全体概率归一化。图 1-10 演示了这一情形:

  1. 操作前,叠加态中已包含某个“态”及其概率。
  2. 收到 include(existing_state, p_new) 消息后,计算机将其原概率 poldpnewp_{\text{old}} 与 p_{\text{new}} 相加。
  3. 对更新后的所有概率执行归一化,使它们之和重回 1。

这样,“include”算符既能添加新态,也能在已有态上累积概率。

image.png

我们逐步看图 1-10 中的各部分:

  1. (a) 操作前的叠加态。
  2. (b) 收到 include(♥2, 0.4) 消息,表示要在叠加态中增加“红桃二”的概率 0.4。
  3. (c) 由于“红桃二”已存在且原概率为 0.3,计算机将其更新为 0.3+0.4=0.70.3 + 0.4 = 0.7。
  4. (d) 随后对所有概率执行归一化,使它们之和重回 1。

更多算符示例

算符越多,我们能设计的游戏就越丰富。下面介绍另一个名为 flip 的算符:

  • 作用:针对某个“态”,将其当前概率替换为 1(当前概率)1 - \text{(当前概率)},然后对整个叠加态进行归一化。
  • 若该“态”原本不在叠加态中,则把它“视作”原概率为 0,再追加到列表末尾,其新概率为 10=11 - 0 = 1,最后一起归一化。

例如,假设当前叠加态中“红桃二”的概率是 0.4,调用 flip(♥2) 后,计算机会将 0.4 替换为 1−0.4=0.61 - 0.4 = 0.6,再归一化。图 1-11 演示了这一过程(图中为便于阅读,将数值保留到小数点后两位)。

image.png

让我们逐步看看这个操作:

  1. (a) 卡片初始的概率分布。
  2. (b) 收到 swap(♥2, ♣J) 消息,参数为“红桃二”和“梅花 J”。
  3. (c) 计算机将这两种态的概率互换:原来“红桃二”是 0.40、“梅花 J”是 0.35,交换后分别变成 0.35 和 0.40。
  4. (d) 如常,对新分布进行归一化(尽管交换前后总和已是 1,此步对数值微调仍然执行)。

图 1-12 演示了这一 swap 算符的效果:它仅调换指定两态的概率,而对其他态及整体概率结构不做改动。

image.png

这里,我们只是调换了概率分布,所以在完成操作后归一化并不会带来任何变化。在图中:

  1. (a) 卡片的初始概率分布。
  2. (b) 收到 swap(♥2, ♦Q) 指令,参数为“红桃二”和“方块 Q”。
  3. (c) 执行指令后,两种态的概率互换,“红桃二”变成之前“方块 Q”的概率,“方块 Q”变成之前“红桃二”的概率。
  4. (d) 执行完操作后进行归一化,但因为总和始终为 1,数值保持不变。

要记住:到目前为止我们讨论的所有操作(以及其他可想象的操作),虽然计算机可以随时读写它自己的存储器,但我们永远无法直接读取这些概率值。我们了解存储的唯一方式,就是翻牌(测量)。翻牌后,我们只能知道显示屏上出现的那一张牌在测量前的叠加态中具有非零概率;除此之外一无所知。我们必须信任操作已经被正确执行,否则如果起始叠加态或执行过程有误,图中最后一栏就不再代表卡片真正的存储状态,但我们再也无从得知。

振幅与概率

在游戏过程中,我们常常想增大或减小某些“态”的概率。由于每次操作后都会归一化,保证所有概率和为 1,因此计算机可以依据概率规则随机选取一个“态”。

但如果我们不小心把某个概率调到负数呢?之前的归一化并不会阻止出现负值——这会导致测量(随机选取时)出现不合逻辑的概率,甚至可能让卡片的计算机崩溃。这显然不可取!

为此,我们引入振幅(amplitude)的概念:

  • 每个“态”不再直接存储概率,而是存储一个振幅值,这个值可以是负数。
  • 当需要得到某个“态”的实际概率时,就将其振幅平方(振幅的平方必定在 0 到 1 之间),结果即该“态”的概率。

例如,若某次操作令某“态”的振幅变为 –0.3,那么它对应的概率就是 (–0.3)2=0.09(–0.3)^2 = 0.09,始终合法。这样,我们在操作振幅时无需担心是否跌入负概率的“陷阱”。

对应地,我们的归一化步骤也要做相应调整——从此刻起,归一化指的是对所有振幅做缩放,使它们的平方和为 1(即概率和为 1),而非直接让振幅之和为 1。在后续的示意图中,一律使用这个新的归一化规则。

这样一来,我们就可以自由操纵振幅了。每次归一化之后,振幅的平方总能形成合法的概率分布,测量过程不会出错,卡片也绝不会崩溃。

图 1-13 展示了这一新约定的示例。

image.png

在这里,我们像之前一样使用 include 指令,只不过这次给“方块二”添加的是振幅 –0.7。于是,“方块二”的振幅从 0.1 变为 0.1 + (–0.7) = –0.6。要检查 (c) 列中的振幅是否已归一化,我们先将每个振幅平方再相加,得到 0.65。由于这不等于 1,就需要将 (c) 列中的每个数都除以 √0.65 ≈ 0.8062(等价于将平方和缩放到 1),得到 (d) 列中的新振幅。注意,这些振幅之和并不等于 1,但如果我们将它们平方—也就是转换为概率—再相加,就正好等于 1。

干涉

当两个振幅相加时,我们称之为干涉,借用物理学中描述波动相互作用的术语。

  • 破坏性干涉(destructive interference):若相加后的振幅比原来的小,就称为破坏性干涉。这个“破坏”意味着我们用一个相反方向的变化削弱了原振幅,甚至使其变为负值,如图 1-13 所示。
  • 建设性干涉(constructive interference):若相加后的振幅比原来的大,就称为建设性干涉。“建设”意味着两个振幅相互叠加,生成了更大的新振幅。

通过对叠加态中每个“态”的振幅施加正负变化,我们可以调节概率:让我们想要出现的“态”拥有较大的概率,而其它“态”概率变得很小。这样,翻牌时就更可能出现我们期望的结果。

若我们想将某个“态”彻底从叠加态中移除,就可以用破坏性干涉将其振幅设置为 0。此时,计算机可以选择把这条“态”从存储中删去,或是保留但其振幅为 0——结果相同:该“态”的概率为 0,永远不会被选中,也不会在显示屏上出现。

要移除某个“态”,只需发送一个 include 指令,其振幅参数恰好取该“态”当前振幅的相反数,如图 1-14 所示。

image.png

这个过程是:

  1. (a) 操作前的叠加态。
  2. (b) include(♦9, –0.2) 指令让“方块九”振幅增加 –0.2。
  3. (c) 因为“方块九”原振幅为 0.2,计算机相加得 0.2+(–0.2)=00.2 + (–0.2) = 0。
  4. (d) 然后对所有振幅进行归一化(确保它们的平方和为 1)。

要精确执行这一操作,需要确切知道该“态”的原振幅,才能用相反数完全抵消。如果我们知道卡片的初始振幅及之后所有修改,就能算出发送给卡片的正确参数,使某个“态”的振幅变为 0。但如果你的对手在暗中也对卡片做了修改,我们就只能猜测合适的振幅,这也增加了游戏的乐趣。

在计算结束后测量卡片时,如果我们目标“态”的概率远大于其它“态”,那么我们很可能在显示屏上看到期望的结果。

纠缠(Entanglement)

最后给卡片添加一个能力,称为“纠缠”。纠缠是对象间(此处指两张卡)的一种特殊关联。

这种关联通过卡片的天线来实现。到目前为止,我们仅用天线给卡片下达指令。现在,纠缠的两张卡会互相通过天线通信。

纠缠卡片的初始化

回想图 1-6:每张卡都被初始化为对 52 种牌面均匀叠加。制造商在封装前,任意选出两张卡(哪两张无所谓,因为它们同样初始化),并将它们“链接”在一起。

它在每张卡的内置软件中添加了两段例程:发送例程接收例程

  • 发送例程:当任一张卡(记作“发送方”)被翻开时触发——即使只比另一张卡早翻开一瞬间。发送方的计算机会先像往常一样将叠加态坍缩为一个确定“态”,并画出相应的图案;就在关机前,它通过天线秘密广播一条消息,内容只有它被测量(翻开)以及坍缩到的牌面值。发完消息后,发送方完全断电,不再工作。
  • 接收例程:另一张卡(记作“接收方”)仍面朝下,但一旦收到发送方的秘密消息,就立即将自己的叠加态坍缩至与消息中相同的牌面,画出对应图案,然后关机。整个过程也是瞬时完成。

因此,当我们之后将接收方翻开时,看到的牌面一定与发送方完全一致。

图 1-15 形象地展示了这一过程。

image.png

在图中:(a) 我们从一对纠缠的卡片开始,且它们都是面朝下的。假设先翻开左边的卡片。(b) 这张卡片坍缩为「梅花二」,成为“发送方”,并通过天线向配对的另一张卡(“接收方”)发送消息,内容是它已被测量且显示为梅花二。接到消息后,接收方的计算机立即将自己的叠加态坍缩到相同的“梅花二”,在显示屏上画出该图案,然后关机。(c) 我在这里用“透视图”展示了接收方的显示内容,即使它仍面朝下。(d) 当我们稍后真正翻开接收方时,它也会显示梅花二。

我们称这样通过天线互联、测量时同步坍缩的两张卡为纠缠卡片。制造商可能会在每对纠缠卡背面印上同样的标记——比如第一对标“A”、第二对标“B”……这样可以让我们识别出哪两张卡是纠缠的。如果不想知道哪些卡互相纠缠,就无需标记它们。理论上,每对卡都可以纠缠,因此一副 52 张的牌最多可以有 26 对纠缠卡,也可以保留一些卡不参与纠缠。

请回想:当两张卡都面朝下时,它们各自的叠加态都是对 52 种牌面均匀叠加。翻开第一张卡时,它可能坍缩到任意一种牌面;纠缠的作用就在于,第二张卡会自动与第一张卡显示相同的结果。

纠缠是一种深层关联。尽管每张卡都各有自己的计算机与内存,我们可以把这一对看作共享同一个叠加态:当这个“共享态”坍缩时,两张卡都会立即反映同样的变化。这是一个奇异的概念——两个独立的物理设备,却被一个共同的状态所描述,并且这个状态一旦变化,两者会瞬时同步。

如果把它们当成一个整体,就无法单独讨论其中任意一张卡的叠加态;必须对这对一起进行描述。纠缠卡片可被视为一个共享叠加态的整体单元。

纠缠的实际应用

设想你经营一家小型赌场,专注于二十一点(Blackjack)。游戏流程简要如下:

  1. 庄家有一副面朝下的牌,你作为玩家手中暂无牌。
  2. 你下注后,庄家给你两张私牌(面朝下),自己给一张私牌(面朝下)和一张明牌(面朝上)。
  3. 你可以查看自己的私牌,但不公开。目标是点数尽量接近 21 但不超出,按点数规则决定是否要更多明牌。
  4. 若你要牌超过 21 点即输,正好 21 点即赢。若你停牌,庄家亮出私牌并按固定规则要牌,直至停牌、爆点或正好 21 点。

与你的竞争对手不同,你的赌场使用电子卡——它们在翻开时会以均匀叠加随机坍缩。这样玩家无从算牌,也无法通过记忆提高胜率。

某天,一位著名富豪想远程参赛,他不愿到现场,只提议在家中通过双向视频比赛。你担心视频作弊太多,便灵机一动:利用纠缠卡片

你建议富豪和赌场各自订购两副由制造商连对纠缠的电子卡——第一对、第二对……直到整副 52 张卡一一对应纠缠。这样双方各持一副,且每张牌都有对应的纠缠伙伴,如图 1-16 所示;若需要长时间对局,还可以订购多副。这样,无论何时翻开某张卡,对应的远端卡都会同步显示相同的牌面,完全无需信任对方的摄像头设置。

image.png

你提议,让庄家和玩家各自使用一副这样的纠缠牌。每当庄家从自己的牌堆中发一张牌时,玩家就从自己那副牌堆中同步取出一张,游戏其他流程保持不变。

玩家欣然同意,制造商分别将两副纠缠卡寄给庄家和玩家,游戏正式开始!

现在看看为什么双方都不再需要互相信任。每一局开始时,庄家先给玩家发两张私牌(面朝下),玩家同步从自己的牌堆中也发两张面朝下。因为这些电子卡的初始叠加态是对所有 52 张牌等概率,任何人此刻都无法预知牌面。随后,玩家私下查看自己的两张牌——这会令玩家的两张卡瞬时坍缩并显示具体牌面。与此同时,庄家桌面上那两张面朝下的纠缠卡也会同步坍缩成相同的牌面!

游戏就这样继续。每当玩家要一张明牌,庄家就从自己的牌堆中取一张面朝上放到桌上,玩家同时也同步放出自己那副牌的对应一张面朝上。虽然谁也无法预测它们会显示什么,但因纠缠的缘故,一旦翻开,它们总会显示相同的值。

真正的好处体现在一局结束时——所有人翻开自己的私牌,必定完全一致!如果不一致,要么卡片故障,要么有人作弊。如此一来,双方都不必再互相猜疑。

我们似乎解决了信任问题!

不过,还差一点。虽然我们防止了一种作弊方式,却产生了另一种。想象玩家在收到寄来的那副牌后,立刻把卡片一张张翻开看完。玩家的所有卡片都被测量(坍缩),与之纠缠的庄家那副牌也随之坍缩。然后玩家将这些已知牌面的小盒子重新叠好,放回原盒。等到真正开局时,玩家已完全掌握了整副牌的顺序,能够“完美”打牌,庄家却无法察觉玩家曾经偷看过,因为任何试图查看一张未揭开的卡都会导致其坍缩。庄家始终无法从任何信号中得知对方是否事先已看过卡。

这个例子告诉我们:纠缠的确十分强大——一次测量会即时影响另一张卡的状态——但它的后果也可能非常微妙。

我们还可以在纠缠设计上做个有趣的变体:不让两张卡显示相同的状态,而是显示“相反”的状态。扑克牌本身没有自然的“反牌”,所以这里我们人为定义:同一点数、同色套花的另一套(红桃与方块互为“反”,黑桃与梅花互为“反”)。例如,梅花三的“反”是黑桃三;红桃八的“反”是方块八。

图 1-17 展示了这种“相反态”纠缠的思路:当发送方坍缩到 A 时,接收方必定坍缩到与之定义的“反态” Ā。

image.png

假设玩家 1 先翻开他们的卡牌。如果两副卡牌是“同态纠缠”,那么玩家 2 翻开时会看到一模一样的牌面;如果是“反态纠缠”,玩家 2 则会看到与玩家 1 的每张牌“同点异花”(同一颜色另一套花色)相对应的牌面。

究竟是一致显示相同状态,还是一致显示“反状态”,是制造商在生产纠缠卡牌时预先决定的。

用这些电子扑克牌可以设计出很多有趣的新玩法。如果你感兴趣,可以动手今晚就去制作和编程这些卡牌,或者编写软件来模拟它们。

总结

如果你遇到一个能帮助你理解的类比,那就大胆接受它。但不要太沉湎,也别爱得太久。
— Willy McAllister,《基础电学量:电流、电压、功率》

我们的扑克牌隐喻已经完成了它的使命,现在该向它说再见了。
这些卡牌的目的,就是帮助我们直观地理解“叠加态”、“测量(坍缩)”、“干涉”和“纠缠”这四个量子计算的核心特性。我对这些概念做了一些调整,让它们更适合扑克牌的比喻。接下来的章节,我会回到这些原始概念,用严谨的数学形式来重新呈现它们。

我们之所以要采用这种形式化的方法,是因为量子对象的行为与我们日常经验中对物体的直觉截然不同。精确的、逻辑化的数学表述,将帮助我们严格遵循实验所揭示的量子规律。

从现在起,我们不再谈扑克牌,而是聚焦于真实的量子系统。

在第 2 章里,我们将学习如何表示一个量子比特。为此,我们会介绍一系列概念、术语和数学工具,它们构成了量子计算的核心,今后我们会不断与它们打交道。

准备好吧,这将是一段激动人心的旅程!