目录
一、概述
1、前言
2、构建量子程序前的几个步骤
①导入pyqpanda包
②创建量子虚拟机
③申请量子比特和经典寄存器
二、QGate类
1、量子比特门
①单量子比特无角度
②单量子比特有角度
③多量子比特无角度
④多量子比特有角度
2、接口
①对矩阵进行伴随操作
②为量子逻辑门添加控制
③单门操作与多门操作
三、量子线路与量子程序
1、QCircuit
2、QProg
四、实例
1、题目
2、代码
一、概述
1、前言
之前的文章中,我们讲解的都是量子力学的基本知识以及各种各样的量子逻辑门的功能介绍。量子计算属于计算机的范畴,当然少不了与代码相结合,下面,小编将在python中利用pyqpanda讲解如何将电子线路给代码化。
小编接下来的几篇文章讲解pyqpanda,将会从以下顺序介绍:首先是量子逻辑门的基础类(QGate)、紧接着是量子程序构建的相关组件(QCircuit以及QProg),随后是量子逻辑表达式的介绍(QIf与Qwhile),最后是量子程序的测量操作,分为蒙特卡罗测量(Measure)与概率测量(PMeasure)。
希望小编的这篇文章,能够帮助到大家!
2、构建量子程序前的几个步骤
①导入pyqpanda包
from pyqpanda import *
②创建量子虚拟机
#创建量子虚拟机
qvm=CPUQVM()
#初始化量子虚拟机
qvm.init_qvm()
③申请量子比特和经典寄存器
构建一个程序,我们需要先算出需要使用几个量子比特,如果只需要用一个,那么就调用qAlloc()函数:
qubits=qvm.qAlloc()
如果需要多个量子比特,则调用qAlloc_many()函数:
qubits=qvm.qAlloc_many(qubits_num)
其中qubits_num为int型,且代表着需要的量子比特数量。
如果你想申请经典寄存器,则调用的是cAlloc_many()函数,与qAlloc_many函数类似,这里就不多说了。
二、QGate类
我们知道,量子逻辑门是构造量子线路必不可少的组件,那么对应的,QGate类是量子编程中最不可缺少的组件,也是算法能够顺利进行的基础。请大家猜一猜,小编将分为几个部分讲解QGate类?
这个时候,一定会有一个大聪明举手,并且大声的告诉我们:两类!毕竟我们还知道,量子逻辑门分为单量子比特门以及多量子比特门。如果你要这么想的话,那么请问,单量子逻辑门中,X门是布洛赫球绕X轴旋转π,而RX门是旋转θ,但是你知道θ吗?你不传递参数,我怎么知道θ是多少?难不成要把布洛赫球旋转成麻花吗?
所以说,单量子比特门我们又可以细分为需要传递参数的与不需要传递参数的两种,多比特同理。依照这个逻辑,请大家跟紧小编的步伐一起学习!
1、量子比特门
①单量子比特无角度
不含角度的门,以H门为例,它的统一获得方式为:
h = H(qubits[0])
参数为目标比特,返回值为量子逻辑门。类似的,把H可以换成I(单位矩阵)、X(X门)、Y(Y门)、Z(Z门)、T(T门)、S(S门)等等。
②单量子比特有角度
单门带有一个旋转角的门,如RX门:
rx=RX(qubits[0],np.pi/3) #import numpy as np
第一个参数为目标比特,第二个参数为旋转角度,返回值为量子逻辑门。类似的还有RY、RZ以及U1。
③多量子比特无角度
两比特量子逻辑门与单比特量子逻辑门相似,需要传入比特。以CNOT门为例:
cnot=CNOT(qubits[0],qubits[1])
其中第一个参数为控制比特,第二个参数为目标比特。且两个比特不能相同。类似的还有CZ、SWAP、iSWAP以及sqiSWAP。
同理,对Toffoli门,前两个参数为控制比特,第三个为目标比特:
toffoli = Toffoli(qubits[0], qubits[1], qubits[2])
④多量子比特有角度
我们以CR为例:
cr = CR(qubits[0], qubits[1], np.pi) #import numpy as np
第一个参数为控制比特, 第二个参数为目标比特, 第三个参数为旋转角度。
2、接口
在量子逻辑门中,还有一些很有意思的接口,我们一一对其介绍:
①对矩阵进行伴随操作
伴随,即对矩阵进行转置,再进行共轭操作。不理解的可以看看小编以前写的文章。我们知道所有的量子逻辑门都是酉矩阵,那么我们也可以对量子逻辑门做伴随操作。
获得一个量子逻辑门伴随之后的量子逻辑门有两种方法,第一种是在定义量子门时在后面添加一个.dagger()
rx_dagger = RX(qubits[0], np.pi).dagger()
第二种是再添加一行代码:
rx_dagger = RX(qubits[0], np.pi)
rx_dagger.set_dagger(True)
②为量子逻辑门添加控制
很简单,只需要在.control()的括号中加入控制比特。例如:
qvec = [qubits[0], qubits[1]]
rx_control = RX(qubits[2], np.pi).control(qvec)
或者同理,我们多添加一行代码,利用set.control()函数:
qvec = [qubits[0], qubits[1]]
rx_control = RX(qubits[2], np.pi)
rx_control.set_control(qvec)
③单门操作与多门操作
pyqpanda中简化了一些比较简单的操作,例如单门操作中对所有量子比特都加H门:
from pyqpanda import *qvm=CPUQVM()
qvm.init_qvm()
qubits = qvm.qAlloc_many(3)cir = H(qubits)
print(cir)
它的输出结果如下,同理对于X门、Y门、加参数的旋转门诸如此类的也有这种操作,大家依此类推!
对多量子比特门来说,以CNOT门为例,如果我们希望第一个量子比特控制第三个量子比特,第二个量子比特控制第四个量子比特,可以这么写代码:
from pyqpanda import *
import numpy as npqvm=CPUQVM()
qvm.init_qvm()
qubits = qvm.qAlloc_many(4)cir = CNOT(qubits[0:2], qubits[2:4])
print(cir)
qubits[0:2]代表的是qubits[0]与qubits[1],也就是第一个量子比特和第二个量子比特。并且[]里是左闭右开,也就是没有qubits[2],相信大家都用编程的经验,应该知道这一点。
三、量子线路与量子程序
1、QCircuit
量子线路,也称量子逻辑电路是最常用的通用量子计算模型,表示在抽象概念下,对于量子比特进行操作的线路。组成包括了量子比特、以及各种逻辑门,最后常需要量子测量将结果读取出来。当然了最重要的一点我觉得还是时间线。在不同的时间完成相同的事情,效果往往有很大的差别,这一点大家应该都能理解,毕竟先做饭才能后吃饭,要是先吃饭后做饭,我想到了一种可能性:这人在减肥,先喝了一顿西北风,然后做饭当成宠物饲料。
不同于传统电路是用金属线所连接以传递电压讯号或电流讯号,在量子线路中,线路是由时间所连接,亦即量子比特的状态随着时间自然演化,过程中是按照哈密顿运算符的指示,一直到遇上逻辑门而被操作。
它的代码初始化方式为:
circuit = QCircuit()
大家可以通过如下方式向QCircuit尾部填充节点,pyqpanda重载了 <<
运算符作为插入量子线路的方法。例如:
circuit << H(qubits[0]) \<< CNOT(qubits[0], qubits[1])
2、QProg
QProg是量子编程的一个容器类,是一个量子程序的最高单位。它可以完全代替QCircuit放入各种各样的量子门。初始化一个QProg对象有以下两种:
prog = QProg()#或者
prog = create_empty_qprog()
而最后对量子线路进行测量操作的代码如下:
prog << circuit << Measure(qubits[0], cbits[0])
对程序运行多少次得出结果的代码如下:
#以1000次为例
result = qvm.run_with_configuration(prog, cbits, 1000)
print(result)
四、实例
那么到这里,最基础的量子程序构建就讲完了,剩下的逻辑表达式与测量小编将会在后边的文章中详细讲解。
1、题目
现在,为了测试大家是不是真的学明白了,我们来做一道题目练练手:
请用程序搭建下面的电子线路,并观察计算结果与测量效果上是否一致,然后再想想,它和哪一个门的作用类似。
电子线路:
2、代码
from pyqpanda import *if __name__ == "__main__":qvm = CPUQVM()qvm.init_qvm()qubits = qvm.qAlloc_many(2)cbits = qvm.cAlloc_many(2)
#直接利用量子程序构建prog = QProg()prog << H(qubits[0])\<<H(qubits[1])\<< CNOT(qubits[1], qubits[0])\<<H(qubits[0])\<<H(qubits[1])
#利用概率密度测量print("prob_run_dict: ")result1 = qvm.prob_run_dict(prog, qubits, -1)print(result1)
它的结果为:
很显然,这就是一个典型的CNOT门(qubits[0]控制qubits[1])
好的,本期的量子计算的文章就到此结束啦,希望小编的文章能够帮助到大家,麻烦大家给一个免费的小心心并且用收藏鼓励一下小编(哪怕是放在收藏夹里吃灰也好)。