QPanda量子计算编程
上QQ阅读APP看书,第一时间看更新

1.2.6 QIf与QWhile

量子线路的本质是一个量子逻辑门的执行序列,它是从左至右依次执行的。在经典计算中,人们经常会使用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

从结果可以看出,程序很好地执行了量子判断,达到了预期效果。