本章内容涵盖:
- 设定量子计算的预期
- 了解哪种问题适合量子计算机
- Java开发者在量子计算方面的工作选项
有关量子计算的书籍、文章和博客帖子的数量不断增加。即使您只阅读了关于量子计算(QC)的基本信息,也很明显这不仅仅是经典计算的渐进性增强。QC的核心概念是根本不同的,它的应用领域也是不同的。在某些领域,量子计算机预计能够解决经典计算机无法解决的问题。
此外,由于QC是基于量子物理学的,因此通常与一些神秘现象相关联。量子物理学并非物理学中最简单的部分,其中一些方面非常难以理解。
因此,QC经常被描绘为一种神秘的处理数据的新方法,将会彻底改变世界。至少根据我们目前所知,后者是正确的。许多分析师认为在实际有用的QC出现之前还需要5到10年的时间,而且大多数人认为其影响将是巨大的。
在本书中,我们试图保持现实。我们希望向现有和新的Java开发者解释如何在现有和新的应用程序中使用QC。正如我们将要展示的,QC确实对IT行业的许多重要问题产生了巨大的影响。我们还将解释为什么准备迎接真实的量子计算机至关重要,以及您如何使用Java和您喜欢的工具集(如IDE和构建工具)来做到这一点。尽管真实的量子硬件尚未广泛推出,开发人员应该意识到使用QC构建软件也需要时间。借助量子模拟器和早期原型,您可以开始在您的项目中探索QC,没有什么可以阻止您在今天就开始这样做。这样做将增加您的软件在硬件可用时准备就绪的可能性。
预期管理
量子计算的潜在影响是巨大的。研究人员仍在努力估计其影响,但至少在理论上,这可能对IT行业、安全、医疗保健和科学研究产生重大后果,从而对整个人类有影响。由于其巨大影响,有时会错误地将量子计算机描绘成一个巨大的经典计算机。然而,这是不正确的。要能够看到量子计算的相关性,必须理解为什么量子计算与经典计算如此根本不同。必须强调的是,在实现这些宏大目标之前仍然存在许多需要解决的障碍。
量子计算的潜在成功取决于各种因素,可以分为两类:
- 硬件—需要新的和复杂的硬件。
- 软件—为了利用量子硬件提供的能力,需要开发专用软件。
硬件
目前存在许多不确定性,阻碍了量子计算在大规模上的应用。此外,需要强调的是,量子计算机并不能解决所有问题。
用于量子计算的硬件绝不是即刻可进行大规模生产的。创建量子计算机或量子协处理器的量子硬件是极具挑战性的。
我们在本书中解释的量子计算的核心原理是基于量子力学的核心原理。量子力学研究自然界的基本粒子。它通常被认为是物理学中最具挑战性的方面之一,并且仍在不断发展。一些世界上最杰出的物理学家,包括阿尔伯特·爱因斯坦、马克斯·普朗克和路德维希·玻尔兹曼,曾从事过量子力学理论的研究。但在量子力学研究中一个重要问题是,往往极其难以检验理论是否与现实相符。令人惊奇的是,科学家们能够通过理论预测尚未观察到的某些粒子的存在。观察自然界最微小的元素及其行为需要特殊的硬件。
在封闭的实验室环境中研究和操纵量子效应已经很困难了,而在现实世界中以可控的方式利用这些量子效应则是更大的挑战。
如今许多实验性的量子计算机基于超导原理,并且在非常低的温度下运行(例如10毫开尔文,接近-273摄氏度)。这带来了一些实际限制,在经典计算机在室温下操作时是不会遇到的。
在本书中,我们将硬件进行了抽象。正如我们后面会讨论的,软件开发人员没有理由等待硬件准备就绪后才开始考虑最终将在量子硬件上运行的软件算法。量子计算的原理是可以理解的,并且可以通过量子计算机模拟器进行模拟。预计编写为量子计算机模拟器设计的量子软件在真实的量子计算机上也能工作,只要核心量子概念是相似的。
软件
虽然在理论上,量子计算可能会带来重大突破的领域存在,但普遍认为量子计算机或量子处理器可以取代某些经典计算机的任务,但它们不会取代经典计算机。可以用QC解决的问题与目前使用经典计算机解决的问题并无不同。然而,由于QC采用了完全不同的底层方法,可以以完全不同的方式处理这些问题;对于一组给定的问题,使用QC可以实现性能的显著提升。因此,量子计算机应该能够解决目前因为计算资源不足而无法实际解决的问题,例如模拟化学反应、优化问题或整数因式分解等。
量子计算机最有帮助的领域是处理在多项式时间内无法被经典计算机解决,但可以在多项式时间内被量子计算机解决的问题。一个常见的例子是整数因式分解,这在加密(例如广泛使用的RSA密码系统)中是一个常见操作,更准确地说是破解加密。整数因式分解的基本思想是将一个数分解为相乘得到原始数的质数:例如,15 = 3 × 5。尽管在没有计算机的情况下很容易做到这一点,但是当数字变得更大时,比如146963 = 281 × 523,计算机是非常有帮助的。
我们想要分解的数字越大,找到解决方案所需的时间就越长。这是许多安全算法的基础。它们使用了这样一个想法,即分解由1024位组成的数字几乎是不可能的。可以证明,解决这个问题所需的时间的数量级为⋯⋯
方程式 1.1
其中,b是原始数的位数。方程式中的e是关键部分:简而言之,它意味着通过增加b的大小,分解该数字所需的时间将呈指数级增长。图1.1中的图表显示了对具有b位的数字进行因式分解所需的时间。
请注意,绝对时间并不相关。即使使用最快的现有计算机,增加一个位数也会产生巨大的差异。
这个问题被称为非多项式问题,因为没有已知的经典算法能够在多项式时间内解决这个问题。因此,通过增加位数,经典计算机几乎不可能找到这个问题的解决方案。
然而,同样的问题可以在量子算法中在多项式时间内处理。正如我们将在第11章中展示的那样,使用Shor算法,使用量子计算机解决这个问题的时间数量级是b³。
为了说明这意味着什么,我们将使用量子算法在量子计算机上所需的时间与经典算法在经典计算机上所需的时间进行对比。这在图1.2中有所说明。
从位数开始,量子计算机将比经典计算机快得多。而且,位数越大,差距就越大。这是因为在位数增加时,经典计算机解决问题所需的时间呈指数级增长,而同样增加的位数对于量子算法只会引起多项式级别的增长。
这些类型的问题被称为量子多项式问题。它们是量子计算机处理的最有意义的问题。
值得注意的是,Shor算法是最受欢迎的量子计算算法之一。尽管如此,我们在第11章中讨论这个算法有几个原因。首先,为了对算法的工作原理有一个合理的理解,您必须对量子计算的基础有所了解。其次,根据目前硬件的状态,即使有快速的创新,大多数专家认为距离量子计算机能够在实际时间内分解一个相当大小的密钥还需要很多年时间。您不应该等到事情太晚才考虑Shor算法,但另一方面,我们也不希望给您虚假的期望。最后,尽管Shor算法的影响可能是巨大的,但在医疗保健、化学和优化问题等其他领域,量子计算机也可能产生巨大的差异。
算法
Shor算法是一个很好的例子,它是一个在经典计算机上难以解决的计算问题(在时间上是非多项式的),但在量子计算机上相对容易解决的问题(在时间上是多项式的)。这种差异从何而来?正如我们在第11章中讨论的那样,Shor算法将整数因式分解的问题转化为寻找函数周期性的问题,例如找到满足对所有可能的x值都成立的函数评估f(x + p) = f(x)的p值。这个问题在经典计算机上仍然难以解决,但在量子计算机上相对容易解决。
目前已知的适用于量子计算机的大多数算法都基于同样的原理:将原始问题转化为使用量子计算机容易解决的问题空间。经典方法如图1.3所示。将最优秀的已知算法应用于问题,并得到结果。
如果我们可以以某种方式将原始问题转化为一个可以被量子计算机轻松处理的不同问题,我们可以期望性能的提升。这在图1.4中有所展示。
请注意,我们必须考虑将原始问题转化为不同问题以及将最终结果逆转的成本。然而,在谈论计算密集型算法时,这种成本应该是可以忽略的。
注意,当你看到解释量子算法时,你可能会想知道为什么它似乎要绕道处理原始问题。量子计算机能够快速解决特定问题,因此将原始问题转换为这些特定问题可以使用QC实现更快的算法。
设计这些算法通常需要深厚的数学背景。通常,开发人员不会为受益于量子计算机的应用程序创建新的量子算法,而是使用现有的算法。然而,了解量子算法的基础知识,以及为什么它们更快以及如何使用它们的开发人员将拥有优势。
为什么今天要开始涉足量子计算?
有时程序员会想知道为什么他们应该开始学习量子计算,尤其是在真正可用的量子计算机仍然需要数年才能实现。然而,你必须意识到,编写涉及量子计算的软件与编写经典软件是不同的。尽管预计会有库使得开发者能够方便地使用量子计算机,但那些库还需要编写;而且即使有了这些库,使用最适合特定项目的最佳工具仍需要技能和知识。
任何参与需要加密或安全通信的项目的开发者都可以从学习量子计算中受益。一些现有的经典加密算法在量子计算机面前将变得不安全。在量子计算机破解加密之前才加固加密软件是一个不好的主意。相反,你应该在硬件可用之前做好准备。因为量子计算确实是具有颠覆性的技术,预计大多数开发者在学习量子计算方面会比使用新库时需要更多的时间。
虽然我们不想用灾难场景来吓唬你,但重要的是要理解,在现有的加密技术被威胁之前,并不需要安装大量的量子计算机。网络攻击并不需要大量的计算机,并且可以从任何地方进行。
建议 当量子计算机变得更强大时,某些现有的通信协议和加密技术可能会有漏洞。开发者了解哪种软件可能会有漏洞以及如何解决这个问题非常重要。这不是一蹴而就的事情,所以建议你尽早开始研究这个问题。
我们在本书中讨论的软件示例是基本应用程序。它们说明了量子计算的核心原理,并清楚地表明哪些问题可以从量子计算中受益。但是,基本算法和完全功能的软件之间的差距是显著的。因此,尽管硬件准备还需要数年的时间,开发者必须理解,优化他们的软件项目以尽可能多地使用量子计算可能也需要很长时间。
上世纪中叶,当第一台数字计算机问世时,软件语言也需要被创造。而今天的不同之处在于,我们可以使用经典计算机来模拟量子计算机。我们可以在没有接触量子计算机的情况下,着手开发量子计算机的软件。
这是一个重要的优势,也突显了量子模拟器的重要性。今天开始使用模拟器探索量子计算的开发者,当量子硬件变得更加普及时,将比其他开发者拥有巨大的优势。
量子计算中的颠覆性部分:更接近自然
量子计算的主要应用领域之一是与物理学相关的任何问题。科学家们长期以来一直试图通过在经典计算机上模拟现代物理学的核心概念来理解这些概念。然而,由于自然界最基本的粒子不遵循经典定律,对它们进行经典计算机上的模拟是复杂的。而使用这些量子粒子及其规律作为量子计算机的基础,使得解决这些问题变得更加容易。
经典计算机的演进
在最近几十年中,计算机变得更加强大。性能的改进通常是因为以下方面的提升:
- 计算机内存
- 处理器性能
- 计算机中的处理器数量
这些改进通常带来渐进、线性的效益。预计使用量子计算机实现的潜在性能增益与这些改进无关。量子计算机不是具有更小芯片、更大内存或更快通信的经典计算机;相反,量子计算从一个完全不同的基本概念出发:量子比特(qubit)。我们在第3章中详细讨论了量子比特,但因为这是一个关键的概念,我们在这里进行简介。
量子计算机的革命性进展
在经典计算机中,位(bit)是最小的信息单元,它可以是0或1。对这些位进行不同的操作,可以改变或组合它们。然而,在任何时刻,计算机中的所有位都处于明确的状态:0或1。经典位的物理类比与电流有关。0状态对应于无电流,1状态对应于有电流。所有现有的经典软件开发都基于对这些位进行操作。使用位的组合并应用位的门操作是经典软件开发的本质。我们在第3章中详细讨论了这一点。
在量子计算中,基本概念是量子比特(qubit)。与经典位类似,量子比特可以表示0和1的值。但是,最具颠覆性的区别是,量子比特的值可以是0和1值的组合。当人们第一次听到这一点时,通常会感到困惑。量子比特,作为量子计算的基本组成部分,比经典计算的基本组成部分——位——更复杂,这听起来有些不自然。然而,事实证明,量子比特比经典位更接近自然的基本概念。
量子物理学
正如其名称所示,QC的基础来自于量子物理学。在量子物理学中,研究最小粒子及其行为和相互作用。事实证明,其中一些粒子具有有趣的特性。例如,电子具有一个称为自旋的特性,它可以取两个值:上旋和下旋。有趣的是,在特定时刻,电子的自旋可以处于所谓的这两个值的叠加状态。这是一个难以理解的物理现象,它可以归结为更容易理解的数学公式,其中自旋可以是上旋值和下旋值的线性组合,但有一些限制,我们将在第4章中讨论。
电子的自旋是允许属性在同一时刻处于多个状态的物理现象之一。在QC中,量子比特就是通过这个物理现象来实现的。因此,量子比特与量子物理的实际情况非常接近。量子比特的物理实现是一个现实世界的概念。因此,QC通常被认为是接近自然工作方式的。
QC的目标之一是利用在最小粒子尺度上发生的物理现象。因此,QC更加“自然”,虽然乍一看似乎比经典计算复杂得多,但可以认为它相反地更简单,因为它需要较少的人为构造。
理解量子现象是一回事,能够操纵它们是另一回事。证明量子现象存在需要花费大量时间和资源。为了在量子比特上进行计算表示,我们必须能够操纵这些基本部分。尽管在大型科研中心中可以做到这一点,但在典型的计算环境中仍然很难实现。
混合计算(Hybrid Computing)
我们已经提到过量子计算机在处理特定问题方面表现出色,但并非适用于所有类型的问题。因此,最佳结果可能是通过一种新形式的混合计算实现的,其中量子系统解决问题的一部分,而经典计算机解决其余部分。
实际上,这种方法并不完全新鲜。类似的模式已经在大多数现代计算机系统中使用,其中中央处理器(CPU)配备了图形处理器(GPU)。GPU对于某些任务非常适用(例如在图形或深度学习应用中需要的矢量运算),但并非适用于所有任务。许多现代UI框架,包括JavaFX,使用CPU和GPU的可用性,并通过将工作的不同部分分配给CPU和GPU来优化执行任务,如图1.5所示。
将不同的协处理器用于不同任务的思想可以扩展到量子计算。在理想的情况下,软件应用程序将一些任务委派给CPU,另一些任务委派给GPU,还有一些任务委派给量子处理单元(QPU),如图1.6所示。
在特定任务中使用最佳工具可以实现最佳结果。在这种情况下,意味着软件应用程序应该使用GPU进行矢量计算,使用QPU进行在经典系统上运行缓慢但在量子系统上运行快速的算法,并使用CPU处理既不受GPU也不受QPU影响的所有内容。
如果每个终端应用程序都必须判断应该将哪些部分委托给哪个处理器,软件开发人员的工作将变得非常困难。然而,我们预计,框架和库将提供帮助,并将这个问题从最终开发者的视野中抽象出来。
如果您正在使用JavaFX API在Java中创建用户界面,您不必担心哪些部分在GPU上执行,哪些部分在CPU上执行。JavaFX API的内部实现会为您处理这些。JavaFX框架会检测有关GPU的信息并将工作委派给它。尽管开发人员仍然可以直接访问CPU或GPU,但这通常是高级语言(如Java)为我们屏蔽的东西。
在图1.6中,我们简化了QPU。虽然GPU可以轻松适应现代服务器、台式系统、移动设备和嵌入式设备,但由于量子效应需要在受控、无噪声环境中进行操纵(例如维持接近绝对零度的硬件),提供量子处理器可能会更加棘手。起初,大部分真正的量子计算资源可能将通过特定的云服务器提供,而不是通过嵌入式芯片上的协处理器。然而,原则仍然保持不变,因为最终的软件应用程序可以受益于将复杂任务拆分并委派一些任务给通过云服务访问的量子系统,如图1.7所示。
对于量子计算机的软件进行抽象化
虽然实际的量子计算机已经存在,如之前所提到的,但它们绝对不准备进行大规模生产。近年来,创建量子计算机硬件的步伐是巨大的,但对于实现真正有用的量子计算机或量子处理器仍存在许多不确定性。然而,这并不是不开始开发软件的理由。我们从经典硬件和建立在其之上的软件中学到了很多。过去几十年中创建的高级编程语言使得软件开发人员能够以便捷的方式创建应用程序,他们不必担心甚至理解底层硬件。作为一种高级编程语言,Java在对底层低级软件和硬件进行抽象化方面特别擅长。最终,当执行Java应用程序时,将执行低级别、特定硬件的指令。根据所使用的硬件,将使用不同处理器和不同架构的特定机器指令。
经典计算机的硬件仍在不断发展。软件也在不断发展。然而,Java语言的大部分变化与硬件变化无关。硬件和软件演进的解耦使得创新速度更快。有许多领域,在这些领域,硬件的改进最终导致软件的更具体的演变,但对于大多数开发人员来说,硬件和软件是可以解耦的。图1.8显示了Java应用程序最终在硬件上进行操作,但不同的抽象层保护了真正的硬件(和硬件的演进)不被最终应用程序所感知。
在很大程度上,量子计算机的软件可以与硬件演进解耦。虽然硬件实现细节远未确定,但一般原则已经变得清晰;我们在第2章到第5章中讨论了这些原则。软件开发可以基于这些一般原则。类似于经典软件开发人员不必担心如何将晶体管(经典计算机的低级构建块)组合在单个芯片上,量子软件开发人员无需考虑qubit的物理表示。只要量子软件符合和利用这些一般原则,当真正的量子计算机或量子处理器面世时,它将可以在这些设备上使用。
在开发量子计算机软件时的一个重要优势是可以利用经典计算机。量子硬件的行为可以通过经典软件模拟:这是一个巨大的优势,因为这意味着量子软件可以通过在经典计算机上编写的量子模拟器进行测试。当然,量子计算机模拟器和真实的硬件量子计算机之间有很大的差异,几乎可以说,典型的量子算法在量子计算机上执行的速度比在量子模拟器上快得多。但从功能上来看,结果应该是相同的。
除了真实的量子计算机和量子计算机模拟器,还应该考虑云服务。通过将工作委派给云服务,应用程序甚至不知道它是在模拟器还是真实的量子计算机上运行。云提供商可以将其服务从模拟器更新为真正的量子计算机。使用真正的量子计算机时,结果应该得到更快的获得,但与使用模拟器时应该没有不同。
这些选项在图1.9中结合在一起:它显示Java应用程序可以使用提供量子API的库。这些库的实现可以在真实的量子计算机上工作,使用量子计算机模拟器,或将工作委派给云。对于最终应用程序,结果应该是相似的。而且,当硬件拓扑在未来发生变化时(例如添加了量子协处理器),最终应用程序不需要进行修改。库将会更新,但顶级API不应受影响。
正如我们之前讨论过的,当处理在经典计算机上需要非多项式(指数)规模的问题时,量子算法特别有用。一个典型的例子是整数因式分解。量子计算机将能够将大整数分解为其质因数(至少提供部分算法),而这在今天即使将全球所有计算能力综合起来也是不可能的。因此,用经典软件编写的量子计算机模拟器将无法对这些大数进行因式分解。
同样的量子算法当然也可以对小整数进行因式分解。因此,可以使用量子模拟器来对小整数进行因式分解。可以使用量子模拟器创建、测试和优化量子算法,并在其中使用小数。当硬件准备好时,同样的算法可以用于在真实硬件上进行因式分解。(一个5量子比特系统已经分解了21。)随着量子硬件的改进(增加量子比特或减少错误),该算法将允许对更大的数进行因式分解。
总之,量子计算机的原理可以在运行在经典计算机上的软件模拟器中模拟。开发人员可以利用这一点,在这些模拟器上运行量子实验。在本书中,我们使用了一个用Java编写的开源量子模拟器,它可以在您的笔记本电脑/台式机上以及云环境中运行。您不必担心代码在哪里执行。
我们通过查看库中算法的源代码来解释一些量子计算的原理。虽然这对于使用QC编写应用程序并不是严格必需的,但它将使您更加了解何时以及在何种情况下量子算法可能带来真正的优势。
从量子到计算或从计算到量子
在IT项目中使用QC有几种方式,目前正在同时研究不同的方法。大致上来说,有两个极端的观点,以及很多中间地带的选择。这些选项如图1.10所示。
在这个领域的两个极端之一是使用与QC的物理特性直接对应的特定软件语言。例如,微软创建的量子软件语言Q#就是一个例子。这种方法有明显的优势和劣势:
- 优势——通过直接建立在量子物理概念之上,更容易在特定应用中使用这些概念。
- 劣势——已经有许多语言可供开发人员使用,不使用现有的语言会增加学习的障碍。此外,由于大多数应用程序需要量子和经典计算的结合,单独使用专用的量子语言对于项目来说是不够的。
另一方面,另一个极端是坚持使用现有的语言,并将所有量子特性隐藏在开发人员背后。这也有优势和劣势:
- 优势——开发人员不需要学习新的语言,因为他们的软件将“神奇地”使用最佳实现,无论是经典的、量子的还是混合的。
- 劣势——前面句子中的“神奇地”很难实现。优化特定语言以适应特定用例已经很困难了(通常由即时编译器实现),而在软件中动态决定是使用量子还是经典例程更加棘手。
在本书中,我们选择了中间路线。在接下来的章节中,我们介绍的Strange量子模拟器允许Java开发人员创建使用QC的应用程序。您不需要学习一门新的语言,但如果您愿意,您可以创建自己的算法,直接从量子特性中获益。
在本书的第一部分,我们主要讨论了量子物理学的特性,这使得QC与经典计算有根本的不同。我们使用Strange中的低级代码来阐述这些概念。
在第二部分,我们谈论了基本概念与(Java)代码的关系。这使我们更接近“使用现有语言”的方法。
最后,在第三部分,重点是讨论可以在库中实现并由开发人员使用的量子算法。这个方法如图1.11所示。
最终,我们预计软件平台会变得越来越智能,并能够找到使用经典和QC相结合来实现特定功能的最优方法。不过,这需要很长时间;与此同时,了解QC及其特性绝对是软件开发人员的竞争优势。
总结
- 量子计算不仅仅是经典计算的升级。
- QC使用物理学的基本核心概念,因此比经典计算更接近现实。
- 要想充分发挥QC的优势,可能需要很多年时间,以等待硬件变得足够强大。
- 量子计算机预计能够在执行某些算法时大幅加速,这些算法在经典方式下几乎不可能解决,但它们不会取代经典计算机,因为它们只擅长特定(但重要)的任务。
- 高层次的软件开发不应该担心低层次的量子细节。
- 软件开发人员应该意识到将算法的某些部分移动到不同的领域可能会带来巨大的改进。