人类喜欢确定性。我们期望键盘上固定位置的按键代表的字母不会随时改变。但在某些场景下,我们也需要随机性,如下所示:
■ 玩游戏;
■ 模拟复杂的系统(如股票市场);
■ 选择与安全有关的配置(例如密码和加密密钥)。
在需要随机性的所有场景下,我们可以描述每个结果出现的可能性。对于随机事件,我们只能描述可能性,直到掷出骰子(或抛出硬币)的一刻才能真正知道结果。在描述每个示例的可能性时,我们会这样说:
■ “如果”我掷出这个骰子,“那么”得到6的“概率”是1/6;
■ “如果”我抛出这枚硬币,“那么”得到正面的“概率”是1/2。
我们还可以描述不同结果概率不同的情况。在“幸运大转轮”中(见图2.2),“如果”我们转动轮子,“那么”会获得100万美元奖金的概率,要比“如果”我们转动轮子,“那么”什么也得不到的概率小得多。
图2.2 “幸运大转轮”中获得100万美元和不中奖的概率。在转动轮子之前,我们不知道它到底会落在哪里,但我们通过观察轮子知道,不中奖的概率要比获得100万美元的概率大得多
正如同这种抽奖游戏,在计算机科学中,有许多情况下随机性是至关重要的,尤其是在需要安全性的时候。如果我们想保持一些信息的私密性,加密技术可以以不同的方式将数据与随机数相结合,从而实现目标。如果我们的随机数生成器不是很好(也就是说,如果攻击者可以预测我们用什么数字来保护私人数据),那么加密技术就没有什么用了。我们也可以想象,用一个差劲的随机数生成器来进行抽奖时,一个攻击者如果弄清了我们的随机数是如何生成的,就可以直接拿走所有奖金。
使用对手可以预知的随机数字,我们可能会损失大量钱财。20世纪80年代流行的游戏节目 Press Your Luck! 的制作人会对此深有体会。
一位参赛者发现,他可以预测游戏中的电子“转盘”会落在哪里,这让他获得了很多收入。要了解更多信息,请阅读扎卡里·克罗克特(Zachary Crockett)撰写的 The Man Who Got No Whammies 。
事实证明,量子力学可以让我们建立一些真正独特的随机性来源。如果我们正确地建立它们,那么结果的随机性是由“物理学”保证的,而不是基于计算机解决一个难题所需时长的假设。这意味着黑客或对手必须打破物理学定律才能破解安全问题!但这并不意味着我们应该将量子随机数用于一切事物,因为人仍然是安全基础设施中的薄弱之处 。
一些保护私人信息的方法基于一个假设:存在一些问题,使得攻击者容易或难以解决。例如,RSA算法是一种常用的加密算法,它基于“大数的质因数很难找到”这个假设。RSA被用于网络和其他场合,以保护用户数据,其前提是对手不能轻易对非常大的数字进行因数分解。到目前为止,这被证明是一个很好的假设,但未来完全有可能发现一种新的因数分解算法,从而破坏RSA的安全性。像量子计算这样的新计算模型也改变了人们对做出“因数分解很难”这样的计算假设是否合理的评价。正如我们将在第11章看到的,一种名为“舒尔算法”的量子算法能够比经典计算机更快地解决某些类型的加密问题,对通常用来承诺计算安全性的假设形成了挑战。
相比之下,如果对手只能随机地猜测秘密,即使有非常强大的计算能力,那么一个安全系统也能更好地保证其保护私人信息的能力。这样的系统被认为是“信息安全的”。在本章后面,我们会看到以一种难以预测的方式生成随机数,使我们能够实现一种名为“一次性密码本”的信息安全程序。
这给了我们一些信心,我们可以将量子随机数用于重要的任务,如保护私人数据、运营彩票,以及玩《龙与地下城》。模拟QRNG的工作原理可以让我们学习许多量子力学的基本概念,所以让我们马上开始吧!
如前所述,开始的好方法是阅读QRNG的程序案例。如果下面的算法(也显示在图2.3中)现在看起来不是太明白,请不要担心,我们会在本章的其余部分解释不同的部分:
1.要求量子设备分配一个量子位;
2.在量子位上应用一个名为“阿达马指令”的指令(本章后面会介绍该指令);
3.测量该量子位,并返回结果。
在本章的其余部分,我们将开发一个名为QuantumDevice的Python类,编写实现类似这种算法的程序。一旦有了QuantumDevice类,我们就可以把QRNG写成一个Python程序,类似于我们常见的经典程序。
图2.3 QRNG算法。为了用量子计算机对随机数进行采样,我们的程序将制备一个新的量子位,然后用阿达马指令来制备需要的叠加,测量并返回最后得到的随机结果
注意 关于如何在设备上设置Python以运行量子程序的说明,请参见附录A。
请注意,在你写完本章的模拟器之前,清单2.1中的示例无法运行 。
def qrng(device : QuantumDevice) -> bool: ◁--- 量子程序的编写就像经典程序一样。在该例中,我们使用Python,所以我们的量子程序是一个 Python 函数 qrng,它实现了一个QRNG
with device.using_qubit() as q: ◁--- 量子程序的工作原理是向量子计算硬件请求量子位,用来进行计算
q.h() ◁--- 一旦我们有了一个量子位,就可以向该量子位发出指令。与汇编语言类似,这些指令通常用简短的缩写来表示。我们将在本章后面看到h()代表的内容
return q.measure() ◁--- 为了从量子位那里获得数据,我们可以测量它们。这里,一半情况下,我们的测量将返回True,而另一半情况下,将返回False
就是这样!4个步骤,我们刚刚创建了我们的第一个量子程序。这个QRNG返回True或False。用Python术语来说,这意味着我们每次运行qrng都会得到一个1或者一个0。它不是一个非常复杂的随机数生成器,但它返回的数字是真随机的。
为了运行qrng程序,我们需要给这个函数提供QuantumDevice,从而提供对量子位的访问,以及实现不同的指令供我们向量子位发送。尽管我们只需要一个量子位,但作为开始,我们要建立自己的量子计算机模拟器。现有的硬件可以用来完成这个不大的任务,但我们后续要考虑的问题将超出现有硬件的范围。它将在本地笔记本计算机或台式机上运行,就如同实际的量子硬件一样。在本章的其余部分,我们会建立所需的不同部分,以编写自己的模拟器并运行qrng。