书名:QPanda 量子计算编程
ISBN:978-7-115-64401-5
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 郭国平 窦猛汉 陈昭昀
责任编辑 贺瑞君
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书介绍基于我国自主可控量子计算云平台的量子计算编程,涵盖量子计算的核心内容,包括量子计算的基本概念、多种量子算法及其应用,以及本源量子计算云平台和量子计算编程框架QPanda的使用方法。
本书通过算法理论与编程实践相结合的方式,详细讲解算法与编程之间的紧密关系,并通过大量的示例和练习,帮助读者深入理解量子计算的概念和应用,从而逐步掌握量子计算编程技能。
本书既适合量子计算领域的科研人员、工程技术人员和高等院校相关专业的师生阅读,也适合对量子计算有兴趣或参与相关竞赛的人员参考。
在这个迅速发展的数字时代,量子计算作为一项潜力巨大的技术,正引领着计算领域的一场变革。随着量子理论研究的不断深入和量子硬件技术的不断进步,人们已经能够窥见量子计算带来的无限可能。本书旨在介绍量子计算的基本概念,并提供一个实用的编程框架,希望能够帮助读者了解并参与这场激动人心的技术变革。
量子计算的概念虽然源自深奥的物理学理论,但应用前景广泛。从加密、解密到复杂系统的模拟,量子计算展现出了独特的优势。为了使更多的人能够接触并熟悉量子计算,需要一个强大、灵活,且能够简化量子算法开发和实现过程的编程框架。
本书从介绍量子比特、量子逻辑门、量子纠缠等核心概念开始,通过具体的编程示例展示如何在现有的量子硬件上实现这些概念。此外,还介绍一些量子算法及编程应用实例,以及如何利用它们解决实际问题。
第1章主要从物理原理出发,深入浅出地介绍量子计算的基本概念,包括量子比特及其特性、量子计算的基本操作等,并通过实例帮助读者更好地理解和掌握量子计算的基本原理和方法。
第2章主要介绍本源量子计算科技(合肥)股份有限公司(本书简称“本源量子”)自主研发的量子计算编程框架QPanda的安装、使用,以及本源量子计算云平台的使用案例。
第3章详细介绍量子大数分解算法——Shor算法的组件原理及应用。首先介绍量子算术运算、量子傅里叶变换、量子相位估计,随后介绍Shor算法及其应用。
第4章介绍经典数据至量子数据的映射过程,即量子态制备算法。其中,详细介绍基于QPanda实现的编码到基向量、编码到量子比特旋转角度与相位、编码到振幅这3种算法。
第5章介绍量子搜索算法,包括振幅放大算法、格罗弗(Grover)算法及量子行走(Quantum Walk)搜索算法的基本原理,并介绍Grover算法与量子行走搜索算法的QPanda实现过程及其应用。
第6章介绍量子线性方程组求解器的基本原理及其应用,主要包括哈密顿量模拟、HHL(Harrow-Hassidim-Lloyd)算法及其应用、量子态层析。
第7章首先介绍一种在含噪声中等规模量子(Noisy Intermediate-Scale Quantum,NISQ)计算机上使用的量子算法——变分量子算法(Variational Quantum Algorithm,VQA)。它通过将经典计算机和量子计算机结合,使用基于优化或基于学习的方法来解决问题。随后,对量子近似优化算法(Quantum Approximation Optimization Algorithm,QAOA)、变分量子本征求解器(Variational Quantum Eigensolver,VQE)、量子机器学习算法进行详细介绍。
第8章介绍如何使用QPanda验证含噪声环境下量子算法的可靠性,主要包括量子计算机的运行机制、量子逻辑门分解、量子芯片拓扑结构映射、量子计算机的噪声、含噪声虚拟机的使用,以及量子程序实用分析工具等。
第9章首先介绍如何使用本源量子计算云平台运行量子算法,以及如何使用QPanda运行量子算法,随后介绍量子计算机性能分析指标。
第10章介绍本书涉及的量子计算数学基础。
在开发QPanda和编写本书的过程中,我们得到了许多人的支持和帮助。在此,对所有为这个项目付出时间、精力和资源的人表示最诚挚的感谢。
我们要感谢研究团队,他们不仅提供了宝贵的专业知识,还在整个项目中给予了无限的鼓励和支持。此外,还要特别感谢同事们,他们的指导和建议帮助我们克服了研究和开发中的许多难题。
我们还要感谢参与测试和提供反馈的所有用户。他们的意见对我们改进编程框架至关重要。
最后,我们要感谢家人和朋友们,他们的理解和支持使我们能够专注于这项工作。感谢你们的耐心和鼓励,让我们有力量持续前进。
在量子计算的探索旅程中,每一位参与者都是不可或缺的。感谢大家的共同努力,让我们能够一起迈向量子时代。
名称 |
说明 |
---|---|
量子比特 |
量子计算中信息的基础对象,可以处在叠加态 |
量子逻辑门 |
对量子比特进行西变换,量子计算中基本操作之一,简称量子门 |
基础逻辑门 |
量子芯片所支持的一组量子逻辑门的集合,可以组合为其他任意量子逻辑门 |
测量 |
对量子系统状态进行观察或检测,由测量算符描述,会影响系统的演化和概率分布 |
量子线路 |
最常用的通用量子计算模型,表示在抽象概念下对量子比特进行操作的线路 |
量子程序 |
兼容量子计算操作与经典计算操作的操作序列 |
量子算术运算 |
利用量子线路实现基础的数学算术运算,如加、减、乘、除、模加、模乘等 |
常数模运算 |
非全量子态下的模运算,有部分信息做经典计算预处理 |
变量模运算 |
全量子态下的模运算,不借助经典信息预处理 |
量子傅里叶变换 |
经典离散傅里叶变换的量子形式,是一些量子算法实现中的关键组件 |
量子相位估计 |
一种计算量子态相位信息的量子算法,是一些量子算法实现中的关键组件 |
噪声中等规模量子 |
量子计算近期发展的阶段, 具有几十到几百量子比特, 会受到噪声和误差影响 |
变分量子算法 |
一种经典-量子混合的算法, 使用经典的优化器训练一个参数化的量子线路 |
拟设 |
参数化的量子线路 |
量子近似优化算法 |
求解组合优化问题的一种变分量子算法,具有量子优势的潜力 |
厄米 |
保持自身的共轭转置不变的性质,一般用于复矩阵中 |
西 |
共轭转置恰为自身逆矩阵的性质,是正交矩阵在复数上的推广 |
算符 |
对量子比特或量子态进行某种数学或物理变换的记号,如测量算符、量子逻辑门算符、升降算符、噪声算符等 |
泡利算符 |
描述自旋1/2粒子的一组矩阵算符,同时具备厄米性和西性,在量子计算中有重要作用 |
扩散算符 |
在 Grover 算法中除去 Oracle 标记的用于相位翻转的部分算符 |
格罗弗算符 |
在 Grover 算法中进行振幅放大的重复单元,由 Oracle 和扩散算符组成 |
阿达马门 |
一种量子逻辑门,简称H 门 |
谕示 |
一个由经典函数定义的西算符,可将量子态按照某一规则进行映射。一般不关心其具体构造方法 |
混合态 |
量子系统的状态不能由一个确定的量子态描述,而是以一定经典概率分布存在若干量子态。一般由密度矩阵进行描述 |
噪声 |
对量子系统的干扰或扰动,可能使量子态变为混合态 |
马尔可夫链 |
状态空间中从一个状态转换到另一个状态的随机过程 |
随机行走 |
一种数学统计模型,是指基于过去的表现,无法预测将来的发展步骤和方向 |
变分量子本征求解器 |
利用经典优化器训练一个参数化的量子线路, 是用于求解矩阵本征值和本征向量 ( 又称本征态) 的算法 |
损失函数 |
用来度量模型的预测值与真实值的差异程度的运算函数 |
随机梯度下降 |
一种常用于凸损失函数的线性分类器的学习优化方法 |
自适应矩估计方法 |
一种用于训练神经网络的优化算法 |
同步扰动随机逼近法 |
一种通过估计目标函数的梯度信息来逐渐逼近最优解的算法 |
集合 |
由若干个具有共同特性的元素构成的一个整体 |
元素 |
单个物体,可以是数字、字母或其他任何可以和整体区分开的事物 |
复数 |
形如 |
对易式 |
定义为 |
反对易式 |
定义为 |
稀疏度 |
矩阵每一行或列中非 0 元素的最大数量 |
条件数 |
矩阵绝对值最大的本征值与绝对值最小的本征值之比 |
哈密顿量 |
量子力学中描述系统总能量的算符,数学上为一个厄米矩阵 |
量子态层析 |
一种提取量子态信息的技术 |
密度矩阵 |
一种描述量子系统状态的矩阵 |
量子拓扑结构 |
量子计算机芯片的连接结构 |
量子虚拟机 |
一种可以模拟量子计算的方式 |
量子计算云 平台 |
用户可以通过网页进行量子编程的平台 |
量子计算编程框架 |
量子计算领域的一种软件框架 |
混合量子神经网络 |
一种结合了量子计算和经典神经网络的混合模型,旨在充分利用量子计算的优势来解决某些特定问题 |
量子数据编码 |
在量子计算领域中,使用量子比特来表示和处理数据的方式 |
二维卷积层 |
深度学习卷积神经网络中的核心组件之一, 用于处理二维数据, 如图像 |
池化层 |
深度学习卷积神经网络中的关键层之一,用于减小特征映射的空间分辨率,从而降低计算复杂性及过拟合风险,并且有助于提取图像中的最显著特征 |
全连接层 |
深度学习神经网络中的基本层之一,通常是网络的最后几层 |
监督学习 |
机器学习的一种主要范式,它可以从有标签的数据中学习规律和模式,以便对无标签的数据进行预测或分类 |
无监督学习 |
机器学习的一种范式,与监督学习不同,它涉及使用无标签的数据来发现数据中的模式、结构和关系,而不是预测或分类特定的目标 |
优化器 |
用于调整神经网络模型的权重参数以最小化损失函数的算法 |
激活函数 |
激活函数是神经网络中的一个关键组件,它引入非线性并允许网络学习非线性关系 |
梯度下降 |
一种优化算法, 用于调整模型参数以最小化损失函数 |
过拟合 |
机器学习模型在训练数据上表现得很好,但在未见过的测试数据上表现不佳的现象 |
随着信息时代的到来,人们所面临的问题越来越复杂,对计算能力的要求也越来越高。传统的经典计算机已经无法满足这些需求,因此人们开始寻求新的计算方式来解决这些问题。量子计算作为一种新兴的计算方式,引起了人们的极大关注。
量子计算是基于量子力学理论的计算模型,它利用量子比特的特性来完成计算任务。与经典计算不同的是,量子比特可以同时处理多个状态,通过量子纠缠等特殊的量子操作,实现更高效的计算。量子计算的发展对信息技术的变革具有重要的意义,将为人类的科学研究、医学、金融、安全等领域带来新的机遇和挑战。
本章从物理原理出发,深入浅出地介绍量子计算的基本概念,包括量子比特、量子门、量子态等重要概念,并通过实例帮助读者更好地理解和掌握量子计算的基本原理和方法。
本节不介绍难以理解的量子力学的相关概念,只是从数学和计算的角度去介绍量子比特。为了方便理解,与经典计算机中的比特相似,科学家们把量子计算机中基本的信息处理和存储单元称为量子比特,但量子比特与经典比特有很多的不同之处。
首先,经典比特是经典计算机中存储信息的最小单位。而量子比特(qubit)不仅可以存储量子计算机在计算过程中所需的数据信息,还可以处理这些数据信息。这使得量子计算机成为存算一体的计算架构,从而解决了经典计算机的“冯·诺依曼瓶颈”问题。
其次,经典比特只能表示两种状态(0或1),且每次只能表示一个状态。而量子比特利用了量子力学的叠加态原理,可以同时表示多个状态,所以量子计算机存储的信息密度远高于经典计算机存储。这意味着,在同等硬件资源的情况下,量子计算机能够存储更多的信息。除此之外,量子计算能够利用量子叠加原理在同一时间处理多个计算任务,从而实现并行计算。相比之下,经典计算的并行能力受到硬件和处理器数量的限制。
再次,两个或多个量子比特可通过量子逻辑门操作演化为一种纠缠状态。处于纠缠状态的量子比特,确定了一个比特的状态,其他比特的状态自然就确定了,这是独立的经典比特系统中不存在的特性。量子计算机利用纠缠关系可以更好地处理那些涉及许多相互关联变量的复杂问题,如量子模拟、组合优化等。这些问题在经典计算机上往往难以高效解决,而量子计算机利用高度关联的计算资源可以显著提高解决这类问题的能力。
最后,从存算一体、量子叠加和量子纠缠三个角度来看,量子比特与经典比特之间的区别使得量子计算具有显著的优势。那么如何利用这些量子比特的特性进行计算呢?在回答这个问题之前,需要先了解一些关于量子比特的数学概念。
在经典计算中,经典比特的状态用0或1表示,而在量子计算中可以用、
、
、
表示量子比特的状态,“
”是狄拉克(Dirac)括号。为了与经典计算的二进制规则兼容,本书后续章节只使用
、
这两种状态。量子比特是可以处在多种状态的叠加态的,也就是说量子比特可以处在
、
这两种状态的叠加状态,那怎么表示这种叠加状态呢?可以把量子比特表示为二维复向量空间
中的一个单位向量。设
、
为
的一组基,则一个量子比特可以表示为
(1.1)
其中,、
都是复数,称为振幅,且满足归一化条件
。
接下来,考虑将 表示为一个特定的形式。这种形式通常称为布洛赫(Bloch)球, 如图1.1所示。
布洛赫球的北极表示,南极表示
。根据布洛赫球表示法,可以将任意单量子比特量子态写为
(1.2)
其中, 和
是实数,
是任意相位。这种表示方式的物理意义是,
和
描述了
在布洛赫球上的位置,
描述了
的全局相位。由于
对观测值没有实质性的影响,所以这里可以忽略。进而,可以表示为
(1.3)
图1.1 布洛赫球
显然,这里对应球上的点
。
下面证明如果将 表示为式(1.2),则有
和
。首先,将式(1.2)代入式(1.1):
(1.4)
这样,可以得到:
(1.5)
然后,计算 :
(1.6)
这证明了第一个等式。同时,第二个等式也得到了验证。
因此, 和
是等价的。
假设有两个量子比特,应该如何表示它们的量子态?首先确定的是,两个量子比特可能会有4个状态 、
、
、
,相对应的应该有4个振幅(
、
、
、
),则这两个量子比特对应的
应该是
(1.7)
其中,、
、
、
为复数,且
。
以此类推,对于一个由多个量子比特组成的系统,它的量子态可以表示为, 其中
为量子比特数,
为振幅,且
。此外,还可以考虑使用线性代数中的向量表示量子态。在量子理论中,描述量子态的向量称为态矢,态矢分为左矢和右矢。
(1.8)
态矢中的每一个元素都是复数,T表示转置,表示复共轭。右矢是
的列向量,左矢是
的行向量。相应地,内积与外积定义为:设
,
,有
(1.9)
拥有两个或两个以上的量子比特的量子系统通常被称为复合物理系统。复合物理系统的状态空间由子物理系统状态空间的张量积生成。下面,简要介绍张量积(Tensor Product)。
两个向量空间通过张量积运算可以形成一个更大的向量空间。在量子力学中,量子的状态由希尔伯特空间(Hilbert Space)中的单位向量来描述。设和
分别是
维和
维的希尔伯特空间,
和
的张量积可形成一个
维的希尔伯特空间
。张量积满足的运算规则如下。
(1)张量积对应的矩阵运算为克罗内克(Kronecker)乘积:设矩阵和
,有
(1.10)
(2)设矩阵、
、
、
以及常数
,它们满足以下运算规则:
举例说明,对于2维的希尔伯特空间和
,均有一组标准正交基
,那么
的标准正交基为
。如果有被
到
标记的系统,第
个系统的状态为
,那么生成的整个系统的联合状态为
。
复合物理系统有单量子系统不具有的另一个奇特现象——纠缠(Entanglement)。在数学上,设量子态,若不存在
及
,使得
(1.11)
则称是纠缠的(Entangled)。否则,称
不处于纠缠态。例如,
是纠缠态,而
是非纠缠态。 最大叠加态是指系数相等且包含所有基向量的叠加态,又称均衡叠加态。
注1.1 复合物理系统的状态演变等价于矩阵算符作用在初始状态上(矩阵的乘法运算),与单个系统相比,多了每个子系统的矩阵算符的张量积运算。
1.1节介绍了量子比特的基本概念,那么量子计算机是如何进行计算的呢?经典计算机执行计算的基本操作是逻辑门,量子计算机则基于量子力学原理执行计算。量子计算的基本操作包括量子逻辑门(简称量子门,包括单量子比特逻辑门、多量子比特逻辑门)、测量和量子线路等。本节介绍主要的量子计算基本操作。
设为酉矩阵,满足
。
表示状态的演化。在量子计算机中,各种形式的酉矩阵被称为量子逻辑门。常见的单量子比特逻辑门(简称单比特门)有泡利(Pauli)矩阵、阿达马(Hadamard)门(简称H门)和转动算符(Rotation Operator,又称旋转门),下面分别进行介绍。
泡利矩阵有时也称为自旋矩阵(Spin Matrix),有3种形式,分别为Pauli-X门(简称X门,矩阵形式可记作或
)、Pauli-Y门(简称Y门,矩阵形式可记作
或
)和Pauli-Z门(简称Z门,矩阵形式可记作
或
),如式(1.12)~式(1.14)所示。
(1.12)
(1.13)
(1.14)
可以看出,X门相当于非门,它将、
。Y门的作用相当于绕布洛赫球的
轴旋转角度
。Z门的作用相当于绕布洛赫球的
轴旋转角度
。
H门的矩阵形式如式(1.15)所示。
(1.15)
注1.2 H门常用的表达式如下:
(1.16a)
(1.16b)
(1.16c)
(1.16d)
(1.16e)
在了解旋转门之前,需要证明:设是个实数,
是一个矩阵,且满足
,则有
。该等式可利用e指数的泰勒展开及
得证,这里不赘述。
旋转门有3种形式,分别为RX门、RY门和 RZ门,它们分别以不同的泡利矩阵作为生成元构成,如式(1.17)~式(1.19)所示。
(1.17)
(1.18)
(1.19)
上述单比特门可以统一表示为
(1.20)
通过控制与
的取值以及简单的矩阵变换,
即可转化为以上所有单比特门的形式。 例如,当
时,对
作两行交换就是H门。统一的表达矩阵
在底层实现过程中尤为重要。
理论上,对于单量子比特的任一酉算符,均有ZYZ分解。 具体见定理1.1[1]。
定理1.1 对于单量子比特的任一酉算符,存在
、
、
和
,使得
(1.21)
注1.3 除以上介绍的常用门以外,单比特门还有相位门(Phase Gate又称S门)和门(又称T门),它们的矩阵形式分别为
实现多量子比特逻辑门(简称多比特门)时,量子比特和量子逻辑门都是通过“张量积”运算完成增长的。 对于 量子比特
,
量子比特系统的计算基就由
个单位正交向量组成,借助经典比特的进位方式对量子比特进行标记,从左到右依次是二进制中的高位到低位。也就是说,
中
为高位,
为低位。
标准的多比特门包括两量子比特逻辑门(简称两比特门)和三量子比特逻辑门(简称三比特门)。两比特门包括受控泡利门、受控H门、受控旋转门、受控相位门(Controlled Phase Gate,简称CR门)、换位逻辑(iSWAP)门。三比特门包括托佛利(Toffoli)门和控制--交换门[弗雷德金(Fredkin)门]等。下面简要介绍CNOT门、CR门、iSWAP门,以及多量子比特受控U门。
互不相关的两个量子比特能够在经典计算机上轻易模拟,而有纠缠的量子比特的纠缠性是通过受控操作(Controlled Operation)实现的,用受控门表示。最常用的受控门是受控非门,称为CNOT门(或 CX门),如图1.2所示。
图1.2 CNOT门
图1.2中的每根线都表示一个量子比特演化的路线,且这两根线有位次之分,从上到下依次表示从低位到高位的量子比特演化的路线。图1.2横跨两个量子比特,它代表将一个两比特门作用在这两个量子比特上。 一般将 含实点的路线对应的量子比特称为控制比特(Control Qubit),另一条路线对应的量子比特为目标比特
(Target Qubit)。
若低位为控制比特,满足运算:
(1.22)
那么,CNOT门具有如下矩阵形式:
(1.23)
由此可见,当低位为控制比特、高位为目标比特时,若低位位置对应为1,高位就会被取反;当低位位置为0时,不对高位做任何操作。
若高位为控制比特,状态演变如图1.3所示。
图1.3 高位为控制比特时的状态演变
那么,CNOT门具有如下矩阵形式:
(1.24)
在计算机基础方面,CNOT门可以表示为。 也就是说,当控制比特为
态时,目标比特不发生改变;当控制比特为
态时,对目标比特执行X门(量子非门)操作。
受控相位门(Controlled Phase Gate)和CNOT门相似,通常称为 CR 门(或CPhase门),矩阵形式为
(1.25)
CR门在线路中的符号如图1.4所示。
图1.4 CR门
当控制比特为态时,目标比特不发生改变;当控制比特为
态时,对目标比特执行相移门(Phase-shift Gate)。相移门的特征是,将CR门里的控制比特和目标比特的状态进行交换,矩阵形式不会发生任何改变。
iSWAP门的主要作用是交换两个量子比特的状态,并且赋予其相位。经典电路中有 SWAP 门,iSWAP门则是量子计算中特有的。iSWAP门在某些体系中是较容易实现的两比特门,它是先由
作为生成元生成,再作对角化。
门的矩阵形式为
(1.26)
iSWAP门在线路中的符号如图1.5所示。 通常会用一个完整的翻转,即的情况来指代iSWAP门。当角度为
时,记为
。 对
门而言,两个量子比特之间的地位是对等的,不存在控制和受控的关系。
图1.5 iSWAP门
假设有量子比特,
是一个
量子比特逻辑门,则可定义受控操作
:设
位控制比特
满足控制条件,则将
作用于
位目标比特
,否则保持目标比特不变。本质上来说,任意情况的受控U门(
)均有通用计算表达式,如式(1.27)所示。
(1.27)
式(1.27)可以写成
(1.28)
取、
,就可得到CNOT门:
(1.29)
(1.30)
注1.4 这里的特殊算符可以衍生出测量、判别和镜像反射等多种用途,在后面的量子线路和量子算法中均有较多应用场景。
对量子态进行测量会导致坍缩,即测量会影响原来的量子态,因此量子态的全部信息不可能通过一次测量得到。下面给出测量的通用计算表达式。
假设:量子测量由测量算符(Measurement Operator)的集合来描述,这些算符可以作用在待测量系统的状态空间(State Space)中; 指标(Index)
表示实验中可能发生的结果。 如果测量前的量子系统处在最新状态
,那么测量结果
发生的概率为
(1.31)
并且测量后的系统状态转变为
(1.32)
由于所有可能情况的概率和为1,即
(1.33)
所以测量算符需满足。该方程被称为完备性方程(Completeness Equation)。
量子测量有多种方式,如投影测量(Projective Measurement)、正算符值测量(Positive Operator-Valued Measure)。投影测量要求测量算符为投影算符,且满足
。正算符值测量并非全新的概念:对于任意的测量算符
,记
,可以看出
是正定的,且是完备的
,则
是正算符值测量。可以说,投影测量与正算符值测量是一般测量的特例。 当测量算符具有酉矩阵时,投影测量和一般测量等价。
下面介绍投影测量。 投影测量由一个可观测量(Observable)来描述,可观测量是一个待观测系统的状态空间上的自伴算符。 对可观测量
进行谱分解:
(1.34)
设是
在特征值
对应的特征空间上的投影。 在对状态
进行测量之后,得到结果
的概率为
(1.35)
测量后,若结果发生,则量子系统的最新状态为
(1.36)
投影测量的一个重要特征就是平均值及标准偏差很容易计算:
(1.37)
(1.38)
例1.1 单量子比特在计算基下有两个测量算符,即、
。这两个测量算符均是自伴的,即满足
、
,且
、
,因此
。因此,该测量算符满足完备性方程。
若对式(1.1)的量子态进行测量,测量结果为0的概率为
(1.39)
相应地,测量后的状态为
(1.40)
同理可得,以概率
处于
,对应测量后的状态为
。
例1.2 若可观测量是,现对待观测量
进行投影测量。首先,对
进行谱分解,得到
,其中
、
、
、
。然后,对状态
进行测量,可知概率为
、
。
测量后,若结果1发生,则量子系统的最新状态为
(1.41)
若结果2发生,则量子系统的最新状态为
(1.42)
量子线路又称量子逻辑电路,是最常用的通用量子计算模型,它表示在抽象概念下,对量子比特进行操作的线路。量子线路的组成包括量子比特、线路(时间线),以及各种量子逻辑门,最后常需要通过量子测量将结果读取出来。与传统电路用金属线进行连接以传递电压信号或电流信号不同,在量子线路中,线路是由时间连接,即量子比特的状态随着时间自然演化,这个过程遵循哈密顿算符(Hamiltonian Operator)的指示,直到遇上量子逻辑门而被操作。由于组成量子线路的每一个量子逻辑门都是一个酉算符,所以整个量子线路整体也是一个大的酉算符。下面看几个具体的例子。
对于1个控制比特和1个目标比特,受控 U门由图1.6所示线路表示。
4个控制比特和3个目标比特下的受控操作如图1.7所示。
图1.6 受控U门
图1.7 受控操作示例
对于三比特门,当、
和
(NOT门)时,可得到Toffoli门:
(1.43)
Toffoli门的线路表示如图1.8所示。
当、
且U门为SWAP门时,可得到Fredkin门:
(1.44)
Fredkin门的线路表示如图1.9所示。
图1.8 Toffoli门的线路表示
图1.9 Fredkin门的线路表示
在QPanda中,QCircuit类(量子线路类)是一个仅加载量子逻辑门的容器类型。初始化一个QCircuit对象的方式如下。
1 cir = QCircuit()
读者可以通过如下方式向QCircuit对象的尾部填充量子逻辑门。这里,QPanda重载了运算符“”,用于向量子线路中插入量子操作。
1 cir << X(qubits)
QCircuit的使用方式如代码1.1所示(PyQPanda是Python版的QPanda)。
代码1.1 QCircuit的使用方式
1 import pyqpanda as pq
2
3
4 if __name__ == '__main__':
5
6 qvm = pq.CPUQVM()
7 qvm.initQVM()
8 qubits = qvm.qAlloc_many(2)
9 cubits = qvm.cAlloc_many(2)
10 # 申请量子线路容器
11 cir = pq.QCircuit()
12 prog = pq.QProg()
13 # 给量子线路插入量子逻辑门,量子线路中不能包含量子逻辑门之外的任何操作,包括测量操作
14 cir << pq.H(qbits[0])\
15 << pq.CNOT(qubits[0],qubits[1])
16 prog << cir\
17 << pq.measure_all(qubits,cbits)
18 result = qvm.run_with_configuration(prog,cbits,1000)
19 print(result)
代码1.1申请了一个量子线路cir,并向cir中插入了H门和CNOT门。需要注意的是,量子线路中不能包含量子逻辑门之外的操作(如测量操作),所以想要在量子计算机中运行量子线路并获取计算结果,就需要把量子线路放到量子程序中。
量子程序设计用于编写与构造量子算法,一般可以将它理解为一个操作序列。由于量子算法中会包含经典计算,因而设想量子计算机是混合结构的,它包含两大部分:一部分是经典计算设备,负责执行经典计算与控制;另一部分是量子设备,负责执行量子计算。所以,QPanda的量子程序与量子线路的区别在于前者可以包含一部分经典操作(如测量操作、经典逻辑运算操作等)。量子程序的定义更好地兼容了量子计算与经典计算。除了量子计算,它把一部分简单的经典计算也纳入了量子计算机的框架中,在量子计算机底层硬件的支持下,可以大大减少量子计算机与经典计算机之间频繁的数据交互。
在QPanda中,声明一个量子程序可以用QProg对象,它是一个容器,可以用来承载量子逻辑门、量子线路、测量等操作。初始化QProg的操作如下。
1 prog = QProg()
读者还可以用已有的量子操作来构建量子程序。
1 qubit = qAlloc()
2 gate = H(qubit)
3 prog = QProg(gate)
在QPanda中,读者可以通过运算符“”向QProg对象的尾部插入新的量子操作。
1 prog << H(qubit)
读者可以通过运算符“”向QProg对象的尾部插入量子逻辑门、测量、量子线路及其他的量子程序。QProg的使用方式如代码1.2所示。
代码1.2 QProg的使用方式
1 import pyqpanda as pq
2
3
4 if __name__ == '__main__':
5
6 qvm = pq.CPUQVM()
7 qvm.initQVM()
8 qubits = qvm.qAlloc_many(3)
9 cbits = qvm.cAlloc_many(3)
10 #申请量子程序
11 prog = pq.QProg()
12 #给量子程序插入量子门和测量操作
13 prog << pq.H(qubits[0])\
14 << pq.CNOT(qubits[0],qubits[1])\
15 << pq.CNOT(qubits[1],qubits[2])\
16 << pq.measure_all(qubits,cbits)
17 result = qvm.run_with_configuration(prog,cbits,1000)
18 print(result)
代码1.2使用QProg构建的量子程序制备了3量子比特的GHZ态,形式如式(1.45)所示。
(1.45)
3量子比特的GHZ态可以通过1个H门和2个CNOT门制备得到,量子程序的计算结果如下。
1 '000': 513, '111': 487
量子线路的本质是一个量子逻辑门的执行序列,它是从左至右依次执行的。在经典计算中,人们经常会使用if、for、while等判断或循环操作。自然地,人们会考虑在量子计算机的层面是否存在与经典计算机中相似的循环和分支语句。因此,就有了QIf 和QWhile。
在量子计算中,QIf 和QWhile 的判断条件的信息并不是量子比特,而是一个经典的信息。这个经典的信息是基于测量的。在执行量子程序时,测量语句会先对量子比特施加一个测量操作,再将这个量子比特的测量结果保存到经典寄存器中。最后,可以根据这个经典寄存器的值,选择接下来要进行的操作。一段简单的QIf示例如代码1.3所示。
代码1.3 QIf示例
1 import pyqpanda as pq
2
3 if __name__ == "__main__":
4
5 qvm = pq.CPUQVM()
6 qvm.init_qvm()
7 qubits = qvm.qAlloc_many(4)
8 cbits = qvm.cAlloc_many(4)
9
10 prog = pq.QProg()
11 branch_true = pq.QProg()
12 branch_false = pq.QProg()
13 prog << pq.X(qubits[3]) << pq.Measure(qubits[3],cbits[3])
14 # 构建QIf的正确分支及错误分支
15 branch_true << pq.H(qubits[0])\
16 << pq.H(qubits[1])\
17 << pq.H(qubits[2])\
18 << pq.Measure(qubits[0],cbits[0])\
19 << pq.Measure(qubits[1],cbits[1])
20 branch_false << pq.H(qubits[0]) \
21 << pq.CNOT(qubits[0], qubits[1])\
22 << pq.CNOT(qubits[1], qubits[2])\
23 << pq.Measure(qubits[0],cbits[0])\
24 << pq.Measure(qubits[1],cbits[1])\
25 << pq.Measure(qubits[2],cbits[2])
26
27 # 构建QIf
28 qif = pq.QIfProg(cbits[3] ==1 , branch_true, branch_false)
29
30 # 将QIf插入量子程序
31 prog << qif
32
33 # 进行蒙特卡罗测量,并返回目标比特的测量结果,下标为二进制
34 result = qvm.run_with_configuration(prog, cbits, 1000)
35
36 # 打印测量结果
37 print(result)
代码1.3构建了一个包含QIf的量子程序。首先,对qubits[·]施加一个X门,使其状态从翻转为
,然后对其执行测量操作,并把测量得到的值放在cbits[3]中。接下来,构建QIf的正确分支和错误分支,正确分支是通过H门制备qubits[0]和qubits[1]的叠加态,错误分支是制备qubits[0]到qubits[2]的GHZ态。最后,通过QIfProg构建量子判断程序,判断条件为当cbits的值为1时执行正确分支,否则执行错误分支。代码1.3的计算结果如下。
1 '1000': 254, '1001': 236, '1010': 236, '1011': 274
从结果可以看出,程序很好地执行了量子判断,达到了预期效果。
1.2.6小节介绍的是“量子信息、经典控制”,那么有没有“量子信息、量子控制”呢?对IF而言,答案是有的。定义“量子信息、量子控制”过程是一组量子比特的操作,它是由另一组量子比特的值决定的。一个简单的例子就是CNOT门。对而言,
是否执行NOT门是由
的值决定的。基于量子信息的IF 的性质如下。第一,这种控制可以叠加。如果判断变量本身处于叠加态,那么操作比特也会出现执行/不执行量子逻辑门这两种分支,由此可判断变量和操作比特之间会形成纠缠态。第二,控制变量和操作比特之间不能共享量子比特,即
中的控制比特和目标比特一定不能相同。
基于量子信息的IF在实际的量子算法中使用得比较少,因此大部分量子软件开发包都没有加入这个功能。在Shor算法和其他基于布尔运算的线路中会采用这个思想(如对是否求模的判断),但实际中,一般是利用CNOT门的组合来实现。目前,WHILE还没有合适的定义,因为量子信息不确定,那么很有可能会在WHILE 中产生无法停机的分支。以经典控制的QWhile为例,如果控制变量是1量子比特,那么每次都会有一个概率使得这个循环继续下去。因此,为了执行这个序列,就需要无限长的操作序列,这导致从物理上无法定义这种操作。