likes
comments
collection
share

《量子计算实践—Java样例》第四章:叠加

作者站长头像
站长
· 阅读数 11

本章内容包括:

  1. 理解为何叠加允许量子系统处理指数级的数据。
  2. 通过量子门处理数据。
  3. 使用Hadamard门。

在前一章中,我们简要提到了叠加(superposition)的概念,这是量子计算的一个基本概念。它是量子计算机预计能够比经典计算机更快运行某些应用程序的原因之一。

在本章中,您将学习什么是叠加,以及它在创建量子算法中的相关性。我们将讨论一种特定的门,它可以将量子比特带入叠加状态,并展示一个简单但相关的示例来说明叠加的概念。本章的流程在图4.1中有详细解释。

《量子计算实践—Java样例》第四章:叠加

我们尽量将物理解释减少到最低限度。物理学背后的科学工作令人难以置信,但它需要不同的技能,对于软件开发来说不太相关。请记住,即使对于最有知识的人来说,量子计算(QC)及其概念也很难理解,因此如果叠加背后的物理概念不太清楚,不必担心。对开发人员而言,重要的是如何运用这些概念并编写更合适的应用程序。

什么是叠加?

量子比特(qubit)可以处于不同的状态。我们之前提到过,量子比特可以具有值0、值1,以及这两个值的某种组合。然而,对于允许的组合,存在重要的限制,我们将在下面进行讨论。

我们之前说过,当量子比特被测量时,它总是返回值0或值1。但这并不能完全说明在测量之前发生了什么。

为了理解这一点,让我们简要地转向量子物理学的世界。请记得,软件开发者所称的量子比特是由现实世界的现象支持的。因此,量子比特的软件行为和属性必须在某种程度上与现实世界的现象的行为和属性相对应(见图4.2)。

《量子计算实践—Java样例》第四章:叠加

在量子物理学中,粒子具有有趣的属性。例如,电子具有一个称为自旋的属性。当被测量时,自旋可以具有两个状态:上旋和下旋,我们称之为基态。请注意,这与比特(bits)的情况相似,比特可以是1(对应于上旋)或0(对应于下旋)。这在图4.3中有显示。

《量子计算实践—Java样例》第四章:叠加

然而,量子理论表明电子的自旋也可以处于上旋和下旋状态的叠加态。符号上,可以用图4.4来表示。再次强调,当它被测量时,它总是会坍缩到这两个基态中的一个。

《量子计算实践—Java样例》第四章:叠加

关于叠加态存在一些误解:

  1. 处于叠加态并不意味着电子同时处于0态(自旋向下)和1态(自旋向上)。实际上,叠加态的理论并没有指明电子处于哪种状态;相反,它描述的是当电子在特定点被测量时各种状态发生的概率。
  2. 处于叠加态并不意味着电子的自旋处于上旋态或下旋态,我们只是尚未知晓。量子计算的一个基本(也是奇异)特点是,系统在被测量时会受到影响。只有当我们测量自旋时,它才决定是处于上旋态还是下旋态。

从前面的章节中可以回忆到,一个持有值0的量子比特在Dirac符号表示法中为|0>。如果对应的物理元素是一个电子,你可以认为这类似于电子具有自旋向下属性。同样地,当量子比特持有值1时,在Dirac符号表示法中为|1>,这可以对应于现实世界中的电子具有自旋向上属性。

注意:大多数现有的量子计算机原型并不使用电子作为量子比特的表示形式。然而,电子的自旋向上/-向下属性通常比大多数量子计算机使用的更复杂现象(如约瑟夫森接合)更容易理解。因为我们尽量尽可能地对物理背景进行抽象,我们更喜欢使用与较简单物理表示法类似的类比。

正如我们所解释的,电子可以处于自旋向上或自旋向下状态,但它的自旋也可以处于上旋态和下旋态的叠加态。因此,一个量子比特也可以处于叠加态。

现在我们给这个量子比特起一个名字,类似于在经典程序中给变量或参数起名字。希腊字母通常被使用,为了与大多数文献保持一致,我们也会使用这些符号。因此,一个名为ψ(读作“psai”)的量子比特,持有值0(对应于自旋向下的电子)的描述如下:

∣ψ>=∣0>|ψ> = |0>ψ>=∣0>

同样地,当名为ψ的量子比特持有值1(对应于自旋向上的电子)时,你可以将其描述为:

∣ψ>=∣1>|ψ> = |1>ψ>=∣1>

有趣的是描述处于叠加态的量子比特,对应于一个自旋同时处于向上和向下叠加的电子。当量子比特处于叠加态时,这个状态可以被描述为基态的线性组合:

∣ψ>=α∣0>+β∣1>|ψ> = α|0> + β|1>ψ>=α∣0>+β∣1>

这个方程告诉我们,量子比特的状态是基态|0>和基态|1>的线性组合,其中α和β是与概率相关的数值,我们稍后会解释。

这个方程凸显了经典计算和量子计算之间的一个基本区别。虽然量子比特持有值0或值1的简单情况也可以使用经典变量来表示,但是将这两个值组合起来对于经典计算机是不可能的,正如图4.5中所解释的。

《量子计算实践—Java样例》第四章:叠加

你也可以用矢量符号表示方程4.3。使用Dirac符号对|0>和|1>的定义,你可以将方程4.3改写如下:

《量子计算实践—Java样例》第四章:叠加

Dirac符号和矢量符号指的是同样的原理:所考虑的量子比特处于|0>状态和|1>状态的叠加态。

有许多方法可以试图解释这个方程在物理上的意义。从本质上讲,这个方程表示电子处于这样的状态,如果它在那一时刻被测量,我们测量到0的概率为α²,测量到1的概率为β²。

为什么是α²和β²而不是α和β?我们在第10章中会在讨论状态向量和概率向量之间的差异时,更详细地解释这一点。简单地说,概率必须是实数、正数,而状态变量可以是复数。

因为我们将测量到0或1,所以α和β还受到另一个限制:概率之和应该为1(因为你会测量到某个结果)。因此,

α2+β2=1α^2 + β^2 = 1α2+β2=1

正如之前所说,理解量子物理学是困难的。幸运的是,作为开发者,你只需要考虑方程,可以忽略物理解释。

我们之前描述的电子自旋的情况也适用于其他基本粒子的其他属性。当我们谈论一个量子比特时,它的底层物理实现使用了这些属性的行为。作为开发者,你不需要关心物理行为。因此,当我们谈论一个处于叠加态的量子比特时,你不需要了解这个量子比特的物理表示。

此时,开发者经常问的一个最常见的问题是:“很好,一个量子比特可以处于0和1的叠加态,但是当我们测量它时,它仍然是0或1。与经典计算机有什么区别?”这是一个合理的问题,我们将在接下来的章节中回答。

注意:量子计算有时与处理概率而不是确定性有关。经典比特要么是0,要么是1,并且总是可以被测量。正如你刚刚学到的,在量子计算中,系统的状态由概率描述,这需要一种不同的思维方式。

量子系统的状态可以表示为概率向量

到目前为止,我们主要讨论了量子比特以及这些量子比特所持有的值。现在我们已经介绍了叠加,你知道在处理过程中,单个量子比特可以处于两个基态的组合状态,并且在测量时会坍缩为其中一个基态(0或1)。在经典计算中,参数的值是处理中最重要的概念。然而,在谈论量子计算机时,由于叠加,这些值在处理过程中并没有唯一定义。因此,通常更方便谈论量子比特的概率而不是值。这是我们在本节中解释的内容,其中之一的结果是量子计算机的处理能力。

在前一章中,你学到了量子系统的状态可以用一个向量来表示。对于一个有一个量子比特的量子系统,一个含有两个元素的向量描述了当测量该单个量子比特时其值的概率。一个有两个量子比特的量子系统可以用含有四个元素的向量来表示,一般而言,一个有n个量子比特的量子系统则用含有2^N个元素的向量来表示。图4.6解释了这个原理。

《量子计算实践—Java样例》第四章:叠加

在第三章中,我们展示了表示所有量子比特处于基态的量子系统状态的概率向量:所有元素都是0,只有一个元素不为0。该元素定义了系统的状态,并且对应于每个量子比特的明确值:要么0,要么1。

你已经学到了一个量子比特可以处于叠加态,其中它的状态是0值和1值的线性组合。对于一个单量子比特系统,其状态可以用Dirac符号和矢量符号描述,如下所示:

《量子计算实践—Java样例》第四章:叠加

一个有两个量子比特的系统可以描述为:

《量子计算实践—Java样例》第四章:叠加

这个方程显示了一个有两个量子比特的系统可以用一个有四个值的(概率)向量来描述。两个量子比特可以同时持有四个值。当测量时,每个量子比特只会保留一个值。但是在量子算法中的所有计算都是在这四个值上进行的。

扩展到n个量子比特的系统对应于一个有2^n个元素的向量。这是量子计算机预计能够解决指数级问题的一个原因:随着量子比特数量的增加,量子系统可以处理指数级增长的值。

图4.7展示了一个有六个量子比特的系统。在这个图片中,六个量子比特对应于一个有64个(2^6)元素的向量。一旦被测量,这些元素中的一个持有值1,其他元素的值都是0。通过持有值1的元素的索引,可以计算出六个量子比特的单独值。因此,你从六个值(每个值为0或1)开始,最后得到六个值(每个值为0或1)。

《量子计算实践—Java样例》第四章:叠加

乍看之下,由于叠加可能没有明确的值。在系统中可以持有指数级的元素,但一旦测量它,你似乎回到了经典状态,其中每个比特都有一个明确定义的值。

让我们将一台拥有六个比特的经典计算机与一台拥有六个量子比特的量子计算机进行比较。这两台计算机都有一个由六个比特组成的值作为算法的输入,并在测量算法的输出后,它们都再次读取六个比特的值。这两台计算机都可以处理64个可能的组合作为输入值。关键的区别在于,量子计算机可以同时处理这64个组合。如图4.8所示。

《量子计算实践—Java样例》第四章:叠加

我们可以通过一些Java代码来展示这一点。首先,假设你使用的是具有单个比特的经典计算机,并对该比特应用一个函数。你可以使用boolean类型,因为这个Java原始类型可以保存两个值:false和true,分别对应于0和1。

boolean input;
boolean output;
 
output = someFunction(input);

在这里,someFunction是一个Java函数,具有以下签名:

public boolean someFunction(boolean v) {
    boolean answer;
    ... // do some processing           ❶
    return answer;
}

❶ 这里进行真正的处理。

要将someFunction应用于所有可能的输入值,你需要调用函数两次:

boolean[] input = new boolean[2];
boolean[] output = new boolean[2];
input[0] = false;
input[1] = true;
 
for (int i = 0; i < 2; i++) {
    output[i] = someFunction(input[i]);
}

现在,我们用伪代码来演示如何在量子计算机上执行相同的操作。

注意:这个示例并不使用真正的Java代码,因为我们进行了一些简化。经典算法和量子算法之间的差异不仅仅是叠加的概念,正如我们在接下来的章节中所看到的那样。我们在下一章中解释的另一个重要差异是量子比特并不是孤立地运作的:对一个量子比特的操作可能会影响到另一个看似无关的量子比特。因此,在对量子比特进行操作时,整个系统(所有量子比特)都需要考虑在内。

你首先创建一个量子比特的实例,并使用一个虚构的叠加方法将其带入叠加态。在本章后面,我们将解释如何将量子比特带入叠加态:

Qubit qubit = new Qubit();
qubit.superposition();

现在,someFunction必须使用一个量子比特进行工作,因此你将其定义如下:

public Qubit someFunction(Qubit v) {
    Qubit answer;
    ... // do some processing
    return answer;
}

到目前为止,这与经典情况看起来相似。然而,现在你可以通过将函数应用于处于叠加态的量子比特,同时评估量子比特为0和持有值1的情况,只需要一次函数评估:

Qubit qubit = new Qubit();
qubit.superposition();
qubit = someFunction(qubit);

关键的元素在于函数someFunction以量子比特作为输入,并且输出也是量子比特。如果输入的量子比特处于叠加态,函数将对这两个状态进行操作。同样地,如果你有一个以两个量子比特作为输入的函数,它可以对量子比特状态的四种不同组合进行操作。一般而言,对n个量子比特进行操作的函数可以操作2^n种可能的状态。这解释了为什么在谈论量子计算时通常使用概率向量,因为这些向量有2^n个元素,描述了在特定状态下找到量子比特的概率。

现在你知道了为什么量子计算机可以实现指数级扩展,你需要找出如何从中受益,因为指数级的优势仅在处理过程中有效,而不在测量过程中。编写量子算法的技巧在于设计操作,当应用这些操作时,它们会导致更多关于问题解决方案的信息在测量结果中呈现。这在图4.9中展示:在量子系统被测量之前,通过应用量子门进行处理。这些量子门操作会修改概率向量的状态。

《量子计算实践—Java样例》第四章:叠加

注意:假设有人给你1,000个数字,并告诉你其中一个是质数。你需要找出这个质数的索引。想象一下,你可以同时操作这些数字,并以某种方式处理它们,使得除了质数以外,所有数字都变成0,而质数变成1。然后,一次测量就能揭示质数的位置。虽然对于这个目的没有简单的量子算法,但这个类比显示了能够处理大量值的好处,即使结果是一个单一的值。

我们已经多次谈到量子系统上的操作。这使我们更接近软件,因为我们最终想要使用软件来操作量子系统的状态。在我们将注意力转向软件之前,我们将解释量子门如何操作量子比特和概率向量。

引入矩阵门操作

我们尽量将本书中的数学部分保持在最低限度。然而,为了理解量子门的核心概念,了解线性代数和矩阵运算的基本知识会有所帮助。在本节中,我们简要介绍所需的背景知识。

我们使用最简单(但仍然有用)的量子门——Pauli-X门来解释这个概念。在讨论Pauli-X门与矩阵操作的对应关系后,我们将将这个概念推广到所有门。

在本章的开头,图4.1显示了讨论的流程。在本节中,我们将在图4.10中添加细节说明。

《量子计算实践—Java样例》第四章:叠加

这些步骤是为了进入本章的最后部分:Hadamard门的讨论。Pauli-X门很容易理解,通过本节后,你将对门的工作原理有一个清晰的理解。

在前一节中,我们解释了我们可以用包含2^n个元素的向量来表示n个量子比特系统的状态。我们提到量子计算机可以对这个向量进行处理,在本节中,我们将解释这是什么意思。量子计算机可以同时对多种状态进行操作的事实为性能提供了极大的机会,但也带来了一些复杂性:你不再考虑单个量子比特,而是需要思考量子比特组合的概率。

Pauli-X门的矩阵

在前一章中,我们描述了Pauli-X门。我们提到Pauli-X门与经典的NOT门有相似之处,并且我们使用了以下简单的表格来解释NOT门的行为(为了清楚起见,在此重复):

输入输出
ANOT A
01
10

这个表格在讨论Pauli-X门时也是有意义的,但它仅考虑了基态,其中输入值为0或1。正如我们在本章前面提到的,量子比特的一般状态可以是基态的线性组合。状态不仅仅是0或1,而是概率的组合:测量量子比特时测量到0的概率和测量到1的概率。在这种情况下,一个简单的表格已经不足以描述门的行为。你需要一个有无限行数的表格,如表4.1所示,考虑到在99%和100%之间已经有无限多个值。

输入输出
ANOT A
100% chance of 0, 0% chance of 10% chance of 0, 100% chance of 1
99% chance of 0, 1% chance of 11% chance of 0, 99% chance of 1
98% chance of 0, 2% chance of 12% chance of 0, 98% chance of 1
......
0% chance of 0, 100% chance of 11100% chance of 0, 0% chance of 1

在量子计算中,描述门常常使用矩阵操作的方式。

将Pauli-X门应用于处于叠加态的量子比特

量子系统的状态可以始终用一个向量表示。当门作用于量子比特时,向量中的值会发生变化。在线性代数中,可以通过用一个矩阵表示门,并将该矩阵与量子比特向量相乘,得到量子比特向量的新状态。在本节中,我们展示了Pauli-X门可以用以下矩阵表示:

《量子计算实践—Java样例》第四章:叠加

让我们从简单的情况开始。首先,假设量子比特最初持有值0。在上一章中你学到,将Pauli-X门应用于该量子比特后,它将持有值1。在Dirac符号中,该量子比特最初被表示为|0>。在向量表示中,对应的表示为:

《量子计算实践—Java样例》第四章:叠加

将门应用于量子比特相当于将门矩阵和量子比特向量相乘:

《量子计算实践—Java样例》第四章:叠加

这个方程介绍了矩阵-向量乘法。请注意,向量是一种特殊的矩阵,因为它只有一列。矩阵-向量乘法的结果是一个新的向量。在矩阵和向量相乘时,矩阵的列数必须等于向量的行数。在这种情况下,矩阵有两列,向量有两行,因此我们满足了这个要求。此外,结果向量必须与原始矩阵具有相同的行数。Pauli-X矩阵有两行,因此结果向量也有两行。

结果向量中的值计算如下:结果向量中位置 i 处的元素是矩阵第 i 行的所有元素与原始向量中对应位置的元素的乘积之和。向量中的第一个元素是通过 (0 * 1) + (1 * 0) = 0 得到的,第二个元素是通过 (1 * 1) + (0 * 0) = 1 得到的。

因此,对处于状态 |0> 的量子比特应用Pauli-X门(方程中的原始向量)后,该量子比特的状态变为 |1>(在应用矩阵乘法后的结果)。这确实是我们在第三章中学到的内容。

现在,假设量子比特最初持有值1,并且用Dirac符号 |1> 或向量表示为:

《量子计算实践—Java样例》第四章:叠加

在这种情况下,将Pauli-X门矩阵与量子比特向量相乘的过程如下所示:

《量子计算实践—Java样例》第四章:叠加

结果是一个值为0的量子比特的向量表示,或者在Dirac符号中为|0>。

我们在这里计算的两种情况表明,在量子比特持有值0或1的“简单”情况下,我们在方程4.8中创建的矩阵与我们从Pauli-X门中期望的一致。

但这些都是两种特殊情况,我们想知道的是当量子比特处于叠加态时会发生什么。在这种情况下,量子比特的状态可以表示如下:

ψ=α∣0>+β∣1>ψ = α |0 > + β |1 >ψ=α∣0>+β∣1>

或者在向量表示中写成:

《量子计算实践—Java样例》第四章:叠加

现在你将通过将来自方程4.8的矩阵与该向量相乘,将Pauli-X门应用于这个量子比特:

《量子计算实践—Java样例》第四章:叠加

从这个方程中可以看出,Pauli-X门通常在量子比特测量时交换找到0和找到1的概率。在极端情况下,如果在应用Pauli-X门之前量子比特的状态是0或1,那么门会简单地反转该值。

一个适用于所有门的矩阵

在前一节中,我们展示了如何描述作用在单个量子比特上的Pauli-X门,通过将Pauli-X门矩阵与量子比特的概率向量相乘。在本节中,你将了解这个矩阵乘法原理是如何适用于任何门的。在整本书中,我们会介绍新的门,理解门与矩阵的一般原理会有所帮助。将门应用于单个量子比特的一般过程如图4.11所示。

《量子计算实践—Java样例》第四章:叠加

这相当于以下的矩阵乘法:

《量子计算实践—Java样例》第四章:叠加

最初,量子比特处于状态|ψ>,也可以写成:

《量子计算实践—Java样例》第四章:叠加

图4.11中的门对应于这个矩阵:

《量子计算实践—Java样例》第四章:叠加

将门应用于量子比特相当于将矩阵与量子比特的概率向量相乘:

《量子计算实践—Java样例》第四章:叠加

将门矩阵与量子比特状态相乘会得到一个描述量子比特状态的新向量:

《量子计算实践—Java样例》第四章:叠加

在将门应用于量子比特后,量子比特处于以下状态:

《量子计算实践—Java样例》第四章:叠加

现在你已经学会了门如何对应于矩阵操作,现在是时候讨论本章主题中至关重要的门:叠加态。

Hadamard门:通向叠加态的门

将粒子带入叠加态需要应用一些复杂的物理原理。幸运的是,对于开发者来说,将一个量子比特带入叠加态只需要将一个特定的门应用于该量子比特。

图4.12展示了一个将原本处于0态的量子比特带入叠加态的门。这个门被称为Hadamard门。

《量子计算实践—Java样例》第四章:叠加

Hadamard门是量子计算中最基本的概念之一。在将Hadamard门应用于一个持有值0的量子比特后,有50%的概率测量到量子比特为0,还有50%的概率在测量时量子比特会持有值1。

注意:我们之前提到过,但这一点无论如何都不能重复得太多:在前面的解释中,“测量时”的措辞非常重要。只要量子比特没有被测量,它就可以保持在叠加态中。可以应用其他门,概率会发生改变。只有在测量时,量子比特才会具有0或1的值。

与Pauli-X门类似,Hadamard门作用于单个量子比特,并可以用一个2×2的矩阵来表示。Hadamard门的定义如下:

《量子计算实践—Java样例》第四章:叠加

我们想要找出将该门应用于处于|0>状态的量子比特时会发生什么。可以通过将门矩阵与量子比特向量相乘来进行检查:

《量子计算实践—Java样例》第四章:叠加

这个方程表明,在将Hadamard门应用于处于|0>状态的量子比特后,量子比特进入一个新的状态,其中测量到0的概率为:

《量子计算实践—Java样例》第四章:叠加

测量到1的概率也为:

《量子计算实践—Java样例》第四章:叠加

总的来说,将Hadamard门应用于处于状态|0>的量子比特会使量子比特进入一个叠加态,其中测量到0的概率等于测量到1的概率。

如果将Hadamard门应用于处于|1>状态的量子比特会发生什么呢?该状态下的量子比特的向量表示为:

《量子计算实践—Java样例》第四章:叠加

因此,将Hadamard门应用于该量子比特意味着将Hadamard矩阵与方程4.26中的向量相乘:

《量子计算实践—Java样例》第四章:叠加

如果此时对量子比特进行测量,测量到0的概率将为:

《量子计算实践—Java样例》第四章:叠加

测量到1的概率将为:

《量子计算实践—Java样例》第四章:叠加

因此,在两种情况下(量子比特|0>或量子比特|1>),应用Hadamard门在测量时都给予量子比特以相等的机会成为0或1。

使用Hadamard门的Java代码

你已经学习了Hadamard门的理论,现在是时候在量子应用中使用它了。让我们利用Hadamard门来创建一个随机数生成器;这是一个有用的应用,因为在密码学中随机数很有用。该示例的代码可以在ch04/hadamard中找到。这个示例包含两个部分。第一部分,你只需运行该应用一次。下面是相关部分的代码:

public static void singleExecution(String[] args) {
    QuantumExecutionEnvironment simulator = new SimpleQuantumExecutionEnvironment();
    Program program = new Program(1);
    Step step = new Step();                           ❶
    step.addGate(new Hadamard(0));                    ❷
    program.addStep(step);
    Result result = simulator.runProgram(program);    ❸
    Qubit[] qubits = result.getQubits();
    Qubit zero = qubits[0];
    int value = zero.measure();                       ❹
    System.out.println("Value = "+value);
}

❶ 此时,环境已准备就绪,您可以添加门。

❷ 添加一个Hadamard门

❸ 执行量子程序

❹ 测量量子比特。它将具有值0或1。

请注意这个示例与第三章中的Pauli-X示例之间的相似之处;我们将跳过关于与Pauli-X示例相似的步骤的详细解释。您创建了QuantumExecutionEnvironment,它运行您的程序。接下来,您创建了一个Program实例,它处理一个量子比特,并创建一个Step实例。

与将Pauli-X门添加到该步骤不同,您将添加Hadamard门:

step.addGate(new Hadamard(0));

这将对该量子比特应用Hadamard门。默认情况下,量子比特最初处于|0>状态。根据本章学到的知识,将Hadamard门应用于处于该状态的量子比特时,测量该量子比特为0的概率为50%,为1的概率也为50%。

剩余的代码与Pauli-X示例类似。您将该步骤添加到程序中,并在模拟器上运行程序。最后,您测量该量子比特并打印其值。如果您运行此程序一次,您将看到可能的结果是:Value = 0或者Value = 1。

在示例代码打印出测量值后,它使用以下代码行通过StrangeFX可视化量子电路:

Renderer.renderProgram(program);

图4.13显示了包含量子电路的窗口。得到的量子比特有50%的概率被测量为1。

《量子计算实践—Java样例》第四章:叠加

第二部分的示例调用了manyExecution函数,这与之前讨论的singleExecution类似,但这次你要运行程序1000次。QuantumExecutionEnvironmentProgram只需创建一次。将以下循环添加到应用程序中。

int cntZero = 0;
int cntOne = 0;
for (int i = 0; i < 1000; i++) {                      ❶
    Result result = simulator.runProgram(program);    ❷
    Qubit[] qubits = result.getQubits();
    Qubit zero = qubits[0];
    int value = zero.measure();                       ❸
    if (value == 0) cntZero++;                        ❹
    if (value == 1) cntOne++;
}

❶ 运行以下循环1,000次

❷ 执行量子程序

❸ 测量量子比特

❹ 根据测量值(0或1),增加一个计数器或另一个计数器的值。

在模拟器上调用runProgram方法1,000次。每次测量得到的量子比特。如果量子比特的值为0,则增加cntZero计数器。如果量子比特的值为1,则增加cntOne计数器。在应用这个循环后,打印结果:

System.out.println("Applied Hadamard circuit 1000 times, got "
                + cntZero + " times 0 and " + cntOne + " times 1.");

这个应用程序的结果类似于这样:

==================================================
1000 runs of a Quantum Circuit with Hadamard Gate
Applied Hadamard circuit 1000 times, got 510 times 0 and 490 times 1.
==================================================

你创建的是一个使用低级量子API的随机数生成器。程序中的单个量子比特被带入叠加态,然后进行测量。在量子模拟器上运行此程序——或者推广说,在任何模拟量子行为的经典计算机上——随机性仍然在某种程度上是确定性的,因为你使用经典算法生成随机数。通常,模拟器使用概率向量进行工作;当需要进行测量时,随机数用于选择其中一个概率,当然还考虑到概率值的大小。

在真实的量子硬件上,当我们测量量子比特时,自然界本身会选择一个值。这个过程是真正的随机(至少目前大多数量子物理学家是这样认为的)。虽然这个简单的应用似乎是生成随机数的复杂方式,但它具有真实的价值:它展示了如何使用量子硬件生成真正的随机数。随机数在许多领域中都非常重要,包括加密。

总结

  • 量子比特能够进入叠加态是量子计算中的关键概念。
  • 量子叠加是量子计算机能够处理具有指数复杂性的算法的原因之一。
  • 量子计算机中的量子比特状态可以用不同的符号表示。
  • 在数学上,将门应用于量子比特的等效操作是将概率向量与(门)矩阵相乘。Hadamard门是将量子比特从基态带入叠加态的门。
  • 使用Strange,您可以在Java量子应用中处理Hadamard门和叠加态。