作为一名高产博主,小编我一天不写文章就浑身难受,这不,一闲下来就来给大家科普量子计算编程操作了。
今天我们要来探讨“测量操作”,众所周知,薛定谔的猫是一种既死又活的状态,很多人认为,猫是死还是活,取决于最后那一次测量,这里的测量指的是打开那个含有氰化物、少量的镭以及那只可怜的猫所在房间的门,我们一看便知道。那么在微观世界中,我们如何测量这些量子的状态,是值得我们深思的一个问题。
一、量子测量
量子测量是指通过外界对量子系统进行干扰来获取需要的信息,测量门使用的是蒙特卡洛方法的测量。也就是说,测量之后就会对原系统造成破坏,这也是量子系统一个让人头疼的地方。这就好比,小明同学成绩很优秀,需要通过考试测量出他有多么优秀,期末的时候进行期末考试,先考语文,再考数学。但是在语文考试结束之后,由于刚考完内心压力太大了,心态上发生了些许变化,这个时候再去考数学,不一定会考出他原有的水平。
1、测量
在量子程序中我们需要对某个量子比特做测量操作,并不好直接测量,我们需要找一个靠谱并且熟悉的对象,对这个对象测量,这不,就被我们找到了,我们可以把测量结果存储到经典寄存器上,可以通过下面的方式获得一个测量对象:
measure = Measure(qubit, cbit);
可以看到Measure接两个参数, 第一个是测量比特,第二个是经典寄存器。这也是为什么量子比特数一定要等于经典寄存器个数的原因,方便我们测量。
如果想测量所有的量子比特并将其存储到对应的经典寄存器上, 可以如下操作:
measureprog = measure_all(qubits, cbits);
2、执行程序
directly_run的功能是运行量子程序并返回运行的结果, 我们举一个小例子:
prog = QProg()
prog << H(qubits[0])\
<< CNOT(qubits[0], qubits[1])\
<< CNOT(qubits[1], qubits[2])\
<< CNOT(qubits[2], qubits[3])\
<< Measure(qubits[0], cbits[0])
result = directly_run(prog)
run_with_configuration()的功能是统计量子程序多次运行的测量结果, 同样举一个小例子:
prog = QProg()
prog << H(qubits[0])\
<< H(qubits[0])\
<< H(qubits[1])\
<< H(qubits[2])\
<< measure_all(qubits, cbits)
result = run_with_configuration(prog, cbits, 1000)
二、概率测量
概率测量是指获得目标量子比特的振幅,目标量子比特可以是一个量子比特也可以是多个量子比特的集合。 在pyqpanda中概率测量又称为PMeasure 。 概率测量和量子测量是完全不同的过程,Measure是执行了一次测量, 并返回一个确定的0/1结果,并且改变了量子态。
pyqpanda有三种概率测量方式,如下:
1、prob_run_list:获得目标量子比特的概率测量结果列表。
2、prob_run_tuple_list:获得目标量子比特的概率测量结果,为列表类型,其对应的下标为十进制。
3、prob_run_dict:获得目标量子比特的概率测量结果,为字典类型,其对应的下标为二进制。
这三个函数的使用方式是一样的,下面用一个例子让大家感受一下三者的区别:
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])\
<< CNOT(qubits[0], qubits[1])
print("prob_run_dict: ")
result1 = qvm.prob_run_dict(prog, qubits, -1)
print(result1)
print("prob_run_tuple_list: ")
result2 = qvm.prob_run_tuple_list(prog, qubits, -1)
print(result2)
print("prob_run_list: ")
result3 = qvm.prob_run_list(prog, qubits, -1)
print(result3)
结果为:
好的,本期的量子计算课程就到此为止了,感兴趣的小伙伴们可以在读完本篇文章后,自行测量,玩一玩量子计算。