上一章: 量子程序
下一章: 量子线路与量子程序
简介
动态线路(Dynamic Circuits)是量子计算中的一种新型线路设计,其核心在于在线路执行过程中引入中间测量,并将测量结果(经典信息)实时反馈至后续 操作。这一设计突破了传统静态量子线路的固定结构,使量子计算能够根据中间结果动态调整逻辑门操作,从而优化资源利用并提升算法效率。
QPanda3目前支持的动态线路特性包括
- 使用简洁的经典比特索引列表作为动态流程控制的判断条件(当列表中所有索引对应的经典比特的值都为1时,条件判真)
- 允许根据中间测量的结果选择后续分支线路继续执行
- 允许根据中间测量的结果循环执行某段子线路
分支型动态线路
条件执行
prog = QProg()
prog << X(0) << measure(0,0)
branch_prog = QProg()
branch_prog << X(2)
branch_prog2 = QProg()
branch_prog2 << X(3)
prog << (
qif([0]).then(branch_prog)
.qendif()
)
prog << measure(1,1)
prog <<(
qif([1]).then(branch_prog2)
.qendif()
)
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)
输出结果
stv: [0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j]
二分支
prog = QProg()
prog << X(0) << measure(0,0)
branch_prog = QProg()
branch_prog << X(2)
branch_prog2 = QProg()
branch_prog2 << X(3)
prog << (
qif([0]).then(branch_prog)
.qelse(branch_prog2)
)
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)
输出结果
stv: [0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j]
多分支
from pyqpanda3.core import QProg,X,Y,I,Z,S,T,H,measure,qif,CPUQVM
prog = QProg()
prog << X(1)
branch_prog01 = QProg()
branch_prog01 << X(2)<<X(3)
branch_prog0 = QProg()
branch_prog0 << X(2)
branch_prog1 = QProg()
branch_prog1 << X(3)
branch_prog = QProg()
branch_prog <<I(0)
prog << measure(0,0)<<measure(1,1)<<measure(2,2)<<measure(3,3)
prog << (
qif([0,1]).then(branch_prog01)
.qelseif([0]).then(branch_prog0)
.qelseif([1]).then(branch_prog1)
.qelse(branch_prog)
)
qvm = CPUQVM()
qvm.run(prog,1)
stv = qvm.result().get_state_vector()
print('stv:',stv)
输出结果
stv: [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, (1+0j), 0j, 0j, 0j, 0j, 0j]
循环型动态线路
from pyqpanda3.core import QProg,X,Y,I,Z,S,T,H,measure,qwhile,CPUQVM
prog = QProg()
prog << X(0)
loop_prog = QProg()
loop_prog <<H(0)<<measure(0,0)
prog << measure(0,0)
prog << qwhile([0]).loop(loop_prog)
for i in range(10):
qvm = CPUQVM()
qvm.run(prog,1)
res = qvm.result().get_state_vector()
print(f'#{i} res:',res)
输出结果(测量结果具有概率性,下边的结果不一定每次一样)
#0 res: [(1+0j), 0j]
#1 res: [(1+0j), 0j]
#2 res: [(1+0j), 0j]
#3 res: [(-1+0j), 0j]
#4 res: [(1+0j), 0j]
#5 res: [(1+0j), 0j]
#6 res: [(-1+0j), 0j]
#7 res: [(-1+0j), 0j]
#8 res: [(1+0j), 0j]
#9 res: [(1+0j), 0j]