大家好!
在大约六个月的时间里,出版社一直在积极研究量子计算及其实际适用性这一主题。 很长一段时间以来,一直无法找到有价值的文章来翻译这个有趣的主题,直到此类文章出现在Oracle博客上为止。 该出版物将很好地介绍这种新范式的软件,硬件和纯自然科学问题,因此必须阅读。

在过去的几个月和几年中,对量子计算的兴趣显着增长。 研究机构,公司或政府组织不断出现新材料,说明该领域取得了突破性成就。 同时,技术基础较弱的文章讨论了量子计算的潜在后果,预测范围从破解最现代的加密技术到承诺治愈所有疾病并完成创建完整AI的工作。 但是,并非所有这些期望都是同样现实的。
如果您是一个从业的清醒程序员,那么您可能想知道事实与虚构之间的界线在这些计算中的位置,以及量子计算将如何影响未来的软件开发。
自然地,在创建用于量子计算的工作硬件之前还有很多年。 但是,这种范例的一般原理已经为人所理解,有些抽象允许开发人员创建应用程序,其中使用模拟器实现了量子计算的可能性。
量子计算会减少到另一个CPU收益吗?
使用经典计算机的传统软件开发涉及将高级编程语言(例如Java)转换为在大量(硬件)晶体管上执行的操作。
在图1中,该过程以最简单的形式进行了架构化:Java源代码被编译为与平台无关的字节码,然后将其翻译为平台特定的机器码。 机器代码使用在内存中执行的许多简单操作(门)。 用于此目的的主要硬件组件是众所周知的晶体管。
图 1.将高级编程语言转换为在晶体管上执行的操作 。
近年来实现的生产率提高主要是由于硬件技术的进步。 单个晶体管的尺寸已大大减少,每平方毫米可以放置的晶体管越多,计算机将拥有更多的内存和处理能力。
量子计算是一种破坏性技术,因为这里最简单的计算单元不是经典的晶体管,而是量子比特,我们将在下面讨论。
重点不仅在于这些主要元件的差异,而且在于阀门的不同装置。 因此,与图的堆栈。 量子计算中的1不适用。
量子计算会将整个堆栈分解到Java级别吗?
简而言之-“不是真的”。 科学家逐渐同意,量子计算机将特别适合解决特定问题,而其他问题则可以使用传统计算机更合理地解决。 听起来很熟悉,对吧? 比较GPU和CPU时会观察到类似情况。 尽管晶体管也用在GPU中,但它们在原理上与CPU不同,但是许多用高级语言编写的应用程序同时使用了CPU和GPU的功能。 GPU非常适合矢量处理,在许多应用程序和库中,CPU和GPU的工作是不同的。
例如,这正是使用JavaFX或Deeplearning4j时的情况。 如果要使用JavaFX编写用户界面应用程序,则只能使用Java代码(也许还可以使用FXML声明用户界面)。 当需要在屏幕上显示JavaFX场景时,内部JavaFX实现为此使用着色器和纹理,直接联系低级GPU驱动程序,如图2所示。因此,您不必担心代码的哪一部分更适合与CPU配合使用,以及使用GPU。
图 2. JavaFX委托GPU和CPU的工作。如图所示。 2,JavaFX实现代码通过将工作传递给GPU和CPU来委托工作。 尽管这些操作对开发人员是隐藏的(未通过API提供),但是当您需要开发功能更强大的JavaFX应用程序时,对GPU的某些了解通常会很有用。
使用Deeplearning4j时,也会出现类似情况。 Deeplearning4j具有许多用于执行所需的矢量和矩阵运算的实现,其中一些使用GPU。 但是,对于最终开发人员而言,您的代码将使用哪种功能(CPU或GPU)并不重要。
看起来,量子计算机将在解决问题方面做得非常出色,通常随着问题数量的增长呈指数增长,因此,使用经典计算机很难解决或几乎无法解决。 特别是,专家们在谈论一个混合实施例:一个典型的端到端应用程序包含在CPU上运行的经典代码,但它也可能包含量子代码。
系统如何执行量子代码?
如今,用于量子计算机的硬件仍处于极端试验阶段。 虽然大型公司以及可能的某些州都在从事原型的开发,但这种技术并未广泛使用。 但是,当它出现时,其形状可能会有所不同:
- 量子协处理器可以与系统中的CPU集成在一起。
- 量子问题可以委托给量子云系统。
尽管此类决策的实际背景仍然存在巨大不确定性,但我们在量子代码的外观上日益达成共识。 最底层应该是以下砖块:
量子位和
量子门 。 基于它们,您可以创建实现预期行为的
量子模拟器 。
因此,量子模拟器是进行此类开发的理想工具。
它们给出的结果应该与在量子计算机的真实设备上获得的结果几乎相同-但模拟器的工作速度要慢得多,因为必须使用传统软件来模拟加速量子设备的量子效应。
量子计算的基本组成部分是什么?
将经典计算与量子计算进行比较通常很重要。 在经典计算中,我们有位和门。
一位包含单个信息位,其值可以为0或1。
阀作用在一个或多个钻头上,并可以对其进行操作。 例如,图3所示的NOT阀反转一位的值。 如果输入为0,则非门的输出将为1,反之亦然。
图 3.非阀在量子计算中,我们有等效的位和门。 一位的量子等效量是qubit。 像经典位一样,量子位的值可以等于0或1,但是,也可以处于所谓的叠加中。 这是一个复杂的概念,根据这个概念,量子位可以同时处于两种状态:0和1。
当一个qubit处于叠加状态时,其值是状态0和1的线性组合。 4:
图 4.量子位重叠的相等。注意:量子位通常用
括号表示 ,变量名放在字符“ |”之间。 和“>”。
图中的表达式 图4报告了qubit x处于状态| 0>和| 1>的叠加。 这并不意味着它处于状态| 0>或状态| 1>;。 这意味着我们不知道他目前的状态。
实际上,它同时处于两种状态,并且可以这种形式对其进行操作。 但是,当我们测量量子位时,它将处于一种状态,即| 0>或| 1>。 上面的表达式还有另一个限制:a ^ 2 + b ^ 2 = 1。
a和b的值是概率性的:存在一个概率a ^ 2,当我们测量qubit | x>时,它将包含值| 0>,而概率b ^ 2就是所测量的qubit将包含值| 1>。
有一个重要的限制因素打破了量子计算的乐趣:在测量了一个量子比特之后,所有有关量子比特所在位置的潜在信息都将丢失。 qubit值可以为0或1。
在计算中,叠加的量子比特可以同时对应于0和1(具有不同的概率)。 如果我们有两个量子位,那么它们又可以用来以不同的概率表示四个状态(00、01、10和11)。 在这里,我们介绍了量子计算机的强大功能。 具有八个经典位,您可以精确地表示一个介于0到255之间的数字。八个位中每个位的值将为0或1。具有八个qubit,可以同时表示从0到255的所有数字。
如果只能测量一个状态,那么叠加有什么用?
该算法的结果通常很简单(是或否),但是要实现它,需要大量并行计算。 在计算过程中保持量子位重叠,您可以立即考虑任何许多不同的选项。 量子计算机无需执行每个单独组合的决定,就可以一步计算所有选项。
然后,在许多量子算法中,下一个重要阶段开始了:将算法的结果与给出有意义结果的度量联系起来。 通常,会考虑干扰:有趣的结果在结构上会相互叠加,而没有兴趣的结果会相互抵消(破坏性干扰)。
一个人如何将一个量子比特“转换”为叠加状态?
就像经典的门操纵位一样,量子门也操纵量子位。 一些量子门类似于经典的量子门。 例如,Pauli-X门将量子位从状态a | 0> + b | 1>转移到状态b | 0 |。 + a | 1>,这与经典NOT门的原理相似。 实际上,当a = 1和b = 0时,量子位最初处于| 0>状态。 在Pauli-X阀作用后,该量子位将进入状态| 1>,如图2所示。 5,
图 5.使用Pauli-X阀门的结果。在这种情况下,哈达玛阀非常有趣。 如图4所示,它将处于| 0>:1 / sqrt(2)*(| 0> + | 1>)状态的qubit叠加。 6。
图 6.施加Hadamard阀的结果。在将Hadamard阀应用于一个量子位并测量该量子位之后,该量子位值为50的概率为50,该量子位值为1的概率为50%。 。
这怎么可能?
如果您真的对这个问题的答案感兴趣,则必须详细研究量子物理学。 但是,幸运的是,不需要理解这些现象的整个理论基础。 尽管叠加现象似乎难以理解,但必须强调的是,这些性质是自然界中基本粒子的特征。 因此,量子计算比乍看之下更接近物理现实的基础。
我应该等几年,然后再仔细研究量子计算吗?
不行 在这种情况下,您将迟到。 从理论上讲,有可能先开发硬件,然后再进行软件级别的研究,看看可以用它实现什么。 然而,所有的概念已经或多或少地很清楚,并且已经可以用流行的语言编写量子模拟器,包括Java,C#,Python等。
然后,可以将这些模拟器用于量子算法。 尽管这些算法在实际的量子设备上工作时不会带来帮助下可以实现的性能提升,但它们在功能上应该是完整的。
因此,如果您当前正在开发量子算法,则您有时间改进它,并且当访问中出现量子设备时就可以启动它。
量子算法需要与经典算法不同的智力方法。 著名的科学家早在上个世纪就开始开发量子算法,现在越来越多的文章描述了这种算法,包括整数乘法,列表搜索,路径优化工作等等。
还有其他原因为什么今天值得进行量子计算。 在现代化的大公司中重构软件系统并不是一整夜都能完成的事情之一。 但是,量子计算将真正发生革命的领域之一是加密。 毕竟,所有这些都是基于这样的理论:在经典计算机上,实际上不可能将大整数分解为素数。
尽管量子计算机变得足够大以轻松解决整数分解问题可能要花费很多年,但开发人员知道改变系统并将新的,更安全的技术引入其中需要花费很多年。
如何学习Java中的量子算法?
您可以下载并掌握
Strange ,这是Java中的开源量子计算机模拟器。 奇怪允许您通过创建一系列量子位并对它们应用几个量子门来模拟量子算法。
举一个简单的例子,让我们创建两个量子比特q [0]和q [1],以便它们最初都处于状态0。然后我们对每个量子比特应用两个简单的门,因此该操作在图形上对应于图5。 7
第一个量子位将首先到达Pauli-X阀,然后到达Hadamard阀。 Pauli-X阀会将其从状态| 0>转换为| 1>,而Hadamard阀会将其转换为具有相等概率| 0>和| 1>的叠加。 因此,如果我们完成整个序列1000次并在此循环结束时测量第一个qubit 1000次,那么平均而言,我们可以预期,在500种情况下,其值为0,在500种情况下,其值为1。
第二个量子位甚至更简单。 我们从身份门开始,它不会改变量子位的行为,然后将其传递给Pauli-X门,将其值从0更改为1。
图 7.可以使用Strange模拟的量子算法的示例。为确保我们的推理正确,您可以使用Strange创建一个简单的量子程序。
public static void main(String[] args) { Program p = new Program(2); Step s = new Step(); s.addGate(new X(0)); p.addStep(s); Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); }
在此应用程序中,创建了具有两个量子位的量子程序:
Program p = new Program(2);
作为该计划的一部分,我们经历了两个阶段。 第一步,将Pauli-X阀应用于q [0]。 我们没有将阀应用于q [1],因此暗示它将与身份阀一起使用。 将此步骤添加到程序中:
Step s = new Step(); s.addGate(new X(0)); p.addStep(s);
然后进入第二阶段,将Hadamard阀应用于q [0],将Pauli-X阀应用于q [1]。 将此步骤添加到程序中:
Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t);
这样,我们的程序就准备好了。 现在开始吧。 Strange内置了量子模拟器,但是,Strange也可以使用云服务在某种云中运行程序,例如在
Oracle Cloud中运行程序。
在以下示例中,我们使用一个简单的内置模拟器,运行该程序并获取生成的量子位:
SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits();
在测量量子位(并丢失所有信息)之前,我们先显示概率。 现在测量量子位并查看值:
Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure()));
运行此应用程序,我们得到以下输出:
qubit with probability on 1 = 0.50, measured it gives 1
qubit with probability on 1 = 1, measured it gives 1
请注意:对于第一个量子位,也可以按照我们的预期测量值0。
如果您多次运行该程序,则平均第一个qubit的值在一半情况下为0,在一半情况下为1。
您是否需要了解有关量子计算的全部知识?
当然不是 在这里,我们没有涉及许多重要的概念,尤其是,我们没有讨论确保两个量子位之间相互作用的
复杂性 ,即使它们在物理上彼此相距甚远。 我们没有讨论最著名的量子算法,其中包括Shore算法,该算法允许将整数分解为素数。 我们还忽略了许多数学和物理事实,尤其是没有考虑到| x> = a | 0> + b | 1>的叠加中,数字a和b都可能是复杂的。
但是,本文的主要目的是给您量子计算的印象,并了解它们如何适应软件开发的未来。