α
2,测到1的概率为
β
2。由于测到的值非0即1,所以:其中,包含α和β的列向量是一个量子比特,α和β上方的横线表示复共轭。之所以把概率写成α和β模长的平方,是因为α和β本质上是两个波函数的幅值,而任何测量手段都是在取各自的模平方。总结:量子比特是两个复数的α和β的单位向量。量子比特被测量概率为0的是
α
2,被测量为1。α和β在被测量之前,是不得而知的,测过之后则坍缩。量子比特符号我们通常使用狄拉克标记(也称作bra-ket标记)表示量子比特。bra代表行向量,用
表示,ket代表列向量,用
表示。例如,我们可以按照以下的方式在狄拉克表示中写入测到的“0”状态和“1”状态。(注意不要将bra/ket的表示和向量内的内容混淆。)量子比特有纯态和混合态的区别。如果一个量子比特的态可以完全用
0和
1线性表示,这就是一个纯态:还有一些纯态的简单表示例子:其他量子比特需要纯态的混合才能充分描述它们,被称为混合态量子比特。换句话说,混合态量子比特是通过纯态的概率分布来描述的。在本文稍后的部分,我们将看到一个混合态量子比特的示例。多个量子比特到目前为止,我们仅定义了单个量子比特的状态。多个量子比特的组合状态是什么样的?多个量子比特的组合状态其实就是所有量子比特的张量积。如果你不知道张量积是什么,请不要担心。我们将通过一个简单的示例来进行介绍(是张量积运算的符号)。通常,我们可以通过以下两个步骤对任何两个矩阵进行张量积:1.将第一个矩阵中的每个元素乘以第二个矩阵;2.根据第一个矩阵中元素的原始位置,合并乘出来的矩阵。这是一个如何处理二维矩阵的示例:我们还可以将狄拉克表示中的多个量子比特表示为
0
1。作为简写,我们可以省略,仅写
0
1;更简略些,写成
01。了解量子门现在让我们了解一下量子门。量子门是一个幺正矩阵。为什么是幺正矩阵?首先,量子门将由物理设备实现,因此它们必须遵守量子物理定律。物理学的定律表明:信息在过去和未来的点转换时,不会丢失,这被称为幺正性(unitarity)。由于我们的量子门定义了状态的转变,因此它们也必须遵守幺正性。其次,请注意,量子门是作用在量子比特上的。之前提到,量子比特实际上只是矢量,因此这意味着量子门必须以某种方式对矢量起作用。幸运的是,我们记得矩阵实际上是向量的线性变换!结合这两种思想,我们将量子门视为幺正矩阵。幺正矩阵是复数的任何方阵,它的共轭转置等于它的逆。作为快速变换,可以通过取矩阵中每个元素的共轭(a+bi→a-bi),然后取矩阵的转置(元素ij→元素ji),可以找到矩阵的共轭转置。我们通常用“”表示共轭转置。关于幺正矩阵的一个重要性质是范数(即向量的长度)不变性。否则,一个量子比特被量子门处理过后,其概率和不为1!这没有任何意义,因为所有概率的总和必须始终等于1。还应注意,根据定义,幺正矩阵有逆。这意味着我们不能将量子比特“分配”到任意状态。为了理解,我们假设有一个可以“分配”值的量子门,因此,可以将含有两个复数的任何矢量转换为含有两个复数的特定矢量。作为幺正矩阵,这个量子门具有的一些特定的表示,且该矩阵具有能够将特定矢量转换回操作前状态的逆矩阵!但是,在测量之前,量子比特可能处于任何状态,并且无法知道是哪个!因此,我们不能将量子比特“分配”到任意状态。在更高的层次上,所有量子门都是可逆的,这就是为什么我们经常将量子计算视为可逆计算的一种形式。最后,请注意,因为我们的量子门是幺正矩阵,从定义上来说它们是方阵,所以我们的量子门必须具有相等数量的输入和输出量子比特(因为正方形矩阵将n个标准基向量映射到n列)!这与大多数逻辑门完全不同。例如,“与”门取两个输入并产生一个输出。H和CNOT量子门现在我们已经对我们将要做的事情有了一点了解了,现在以Hadamard门为例,矩阵H:我们可以通过计算矩阵的共轭转置(H)是否等于矩阵的逆(H-1)来确定H的幺正性:另一个重要的量子门是“控制非门”,也称为CNOT。CNOT作用于两个量子比特,一个控制量子比特和一个目标量子比特。我们可以将CNOT视为“if语句”——如果控制量子比特等于1,则CNOT将NOT(非门)应用于目标量子比特。因此CNOT又叫控制非门。这是代表CNOT的矩阵。此矩阵将控制量子比特视为右矢内的最右值,将目标量子比特视为最左值。将其作用到
00上,得:在此示例中,我们看到CNOT不会修改“00”的值,这是被预期的行为,因为CNOT仅在控制态为1时才反转目标态。让我们来看看它对
01的影响。在这里,我们可以看到控制态等于1,因此CNOT发生概率反转。因此,结果是
11。尝试找出另外两种情况,
10和
11,你可以发现CNOT具有以下行为:请注意,这恰恰是传统计算机中控制位为1时对目标位应用“非”的行为。总结:量子门是一个幺正矩阵,幺正性需得保证其概率之和为1,且量子计算机可逆。由于幺正矩阵是方阵,因此输入和输出的数目是一样的。我们了解到Hadamard和CNOT两个重要的量子门。(还存在着更多的其他量子门。)量子电路图在已经了解量子比特和量子门的基础上,进一步学习第一个量子电路图。量子电路图是我们对于量子程序的思考构建。将量子比特定义为行,从左到右应用量子门,构建量子电路图。遍历图的每一个部分。首先,我们有两个量子比特,每一行匹配一个量子比特,最上面的一行对应着x0的量子比特,下面对应着下x1的量子比特。将x0视为第0个量子比特,从0开始计数,标号x0:
0和x1:
0代表从状态
0开始。H是Hadamard门,应用于量子比特x0。●-⊕是CNOT门,●是控制量子比特,⊕是目标量子比特。“-”是为了帮助我们表示受影响的两个量子比特。换句话说,我们正在应用CNOT量子门,其中控制态为量子比特x0,目标态为x1。注意,我们这些门的应用顺序很重要。在此图中,我们首先应用H,然后应用CNOT。翻译量子电路图量子电路图只是量子编程的一种表达方式。它帮助我们了解量子计算机,但是其他的表示方法也是很有用的。我们能将我们的图形式变为字符串符号的形式,能够更好地帮助我们写作代码。以字符串表示能使之更轻松地转换为基础的数学,这个数学公式将告诉我们程序的预期输出。首先,将图转换为字符串符号。我们使用狄拉克表示法,像写二进制数一样,第0个量子比特将是
00中最右边的量子比特。这意味着量子比特x1是
00中最左边的量子比特。(请注意,顺序的定义可以不同,但前后要保证统一。)我们还需要转换“门”。由于我们将H作用于量子比特x0而不作用任何东西到量子比特x1(等同于应用单位门,I),因此我们将其写为(IH)。最后,我们翻译CNOT门,指定哪个量子比特是控制态,哪个是目标态。结果为CNOT[control=0,target=1](IH)
00(注意,从右到左读取此字符串)。当编写将在量子计算机上运行的代码时,这些都将非常有用。写出基础数学写出了量子电路图的字符串表示形式之后就可以轻松地将我们的程序转换为基础数学公式表达的形式。可以分为三个部分,即CNOT[control=0,target=1],(IH)和
00。每一部分都可以转换成矩阵,如下图的第一行所示:我们甚至可以将矩阵相乘以找到结果状态向量,如上所示。该状态向量是量子计算完成后我们两个量子比特的预期状态。另外,我们可以将其视为程序的输出。它告诉我们每种可测量状态的概率幅度。另外,还记得我们的混合态量子比特吗?请注意,我们无法再次编写量子比特x0和量子比特x1的纯态了,因为没有任何方法可以用张量积分解向量,因此我们的量子比特处于混合态!测量状态向量如果我们现在测量量子比特会怎么样?我们会收到什么结果?我们可以通过将状态向量分解为可测量状态来找出其结果。用标准基(也称为
0和
1)(我们也可以测量其他基数,但现在不用担心)来衡量量子比特。因此,我们两个量子比特系统的可测量状态为
00、
01、
10和
11。就像我们可以使用
α
2来确定单个量子比特的
0的概率一样,我们可以用同样的方法来确定测量值的概率。由于
01和
10的概率振幅为0,因此我们知道我们永远也不会测到该状态。并且我们将以(1/sqrt(2))=1/2的概率来测量到
00和
11。现在,假设我们要将这两个量子比特分开很长的距离,然后再测量其中一个。在我们测量它的那一刻,我们也将知道另一个量子比特的值!这是因为我们知道量子比特只能是
00或
11。这就是爱因斯坦所说的“幽灵般的超距离作用”,也称为量子纠缠(参见EPR佯谬)。在量子计算机上运行了解了量子比特、量子门和量子电路图的原理之后,让我们看看如何在真实的量子计算机上运行程序。可以使用Rigetti的量子计算机,因为他们目前向测试用户免费开放。我们也可以使用IBM的量子计算机。这是Rigetti量子编程过程的基本概述:1.编写一个Python程序来指定您的量子电路和任何其他必需的代码;2.使用量子模拟器测试该Python程序;3.给Rigetti的量子计算机预留出时间;4.将您的程序发送到Rigetti的服务器;5.在Rigetti的服务器上执行程序(他们会将您的量子程序发送给他们的量子计算机)。这是上面的量子电路图的Python版本:frompyquil.quilimportProgramfrompyquil.apiimport*frompyquil.gatesimport*#ApplyHtoqubit0,thenCNOTtoqubit0and1p=Program(H(0),CNOT(0,1))#Getinfofora2-qubitquantumvirtualmachineqc=get_qc(2q-qvm)#Simulateprogramresults=qc.run_and_measure(p,trials=10)print(list(zip(results[0],results[1])))#ApplyHtoqubit1,thenCNOTtoqubit1and2p=Program(H(1),CNOT(1,2))#Getinfoforareal2-qubitquantum