
1.4 为量子计算机抽象软件
之前提到,真正的量子计算机虽然已经问世,但远未实现大规模生产。近年来,量子计算机硬件制造已取得了巨大进步,然而在实现真正可用的量子计算机或量子处理器等方面仍然存在诸多不确定性。这并不能作为拒绝开始研究软件的理由,人们已从经典的硬件和基于它的软件中学到了很多东西。在过去的几十年中,高级编程语言使得软件开发人员能够以便捷的方式创建应用程序,而无须担心底层硬件。Java作为一种高级编程语言,特别擅长对底层的低级软硬件进行抽象。在执行Java应用程序时,最终还是会执行低级的、针对特定硬件的指令。所用的硬件不同,不同架构的不同处理器对应的机器指令也不同。
经典计算机的硬件仍在不断发展,软件亦然。但大部分Java语言的变更已与硬件的变更无关。硬件演化和软件演化的解耦促成了更快的创新。在许多领域,硬件的改进最终会导致软件更具体的改变。但对于大多数开发人员来说,硬件和软件是可以解耦的。图1.8展示了Java应用程序如何最终实现对硬件的操作,多个不同层次的抽象将真实的硬件(以及硬件的演变)与终端应用程序屏蔽开来。
在很大程度上,量子计算软件也可以与硬件的演化解耦。虽然硬件实现的细节还远未确定,但总体原则正变得愈加清晰,第2章~第5章将对此进行讨论。软件开发可以基于这些一般原则进行。正如经典软件开发者不必考虑晶体管(经典计算机的低级单元)如何集成芯片,量子软件开发者也不必考虑量子位的物理表达。量子软件只要满足并利用一般原理,就可以在真正的量子计算机或量子处理器问世后使用。

图1.8 传统软件栈
大量可用的经典计算机为量子计算机的软件开发提供了巨大的方便。量子硬件的行为可以通过经典软件进行模拟,这是一个巨大的优势,因为这意味着借助经典计算机上用经典软件编写的量子模拟器,就可以用来测试量子软件。显然,量子计算机模拟器与真正的量子计算机之间存在重大差异:根据定义就可以知道,典型的量子算法在量子计算机上的执行速度比量子模拟器上快得多。但从功能的角度来看,它们的结果应是一样的。
除了真正的量子计算机和量子计算机模拟器之外,还可以考虑云服务。通过将工作委托给云服务,应用程序甚至不知道它是在模拟器上运行还是在真正的量子计算机上运行。云服务提供商可以将服务从模拟器升级为真正的量子计算机。当使用真正的量子计算机时,应该能更快地获得结果,但结果与使用模拟器时一致。
这些选择的组合如图1.9所示,图中表明Java应用程序可以使用量子计算的API库。这些库可以在真正的量子计算机上实现,也可以使用量子计算模拟器,或者将工作委托给云端。但对于终端应用,结果应当是相似的。另外,即使将来硬件拓扑发生变化(例如添加了一个量子协处理器),终端应用程序也不需要修改。库的更新不应对顶层API产生影响。
我们已经讨论过,量子算法在处理经典计算机需要非多项式(指数)时间的问题上特别有优势,一个典型的例子是整数分解。量子计算机能将大整数进行质因数分解(至少提供部分算法),而目前即使动用世界上所有的计算能力,也是不可能做到的。因此用经典软件编写的量子计算机模拟器也无法进行大数分解。
同样的量子算法当然也可以分解小整数,因此量子模拟器可以用于小整数的分解。可以在量子模拟器上用较小的数字创建、测试和优化量子算法。一旦硬件可用,就可以用相同的算法在真实的硬件上进行整数分解(一个5量子位的系统足以分解21)。随着量子硬件的进步(更多的量子位或更少的错误率),算法就能分解更大的数字。

图1.9 使用量子API的Java应用程序栈
总而言之,量子计算机的原理可以在经典计算机上用模拟器进行模仿。开发者可以借此在模拟器上进行量子实验。本书使用了一个用Java编写的开源量子模拟器,它既可以在计算机本地运行,也可以在云环境中运行。你不需要关心代码具体在哪里执行。
本书通过查看库中算法的源代码的方式解释一些量子计算的原理。虽然这并不是使用量子计算编写应用程序的硬性要求,但这会帮助你更深入地了解量子算法,以及量子算法如何突显其真正的优势。