量子算法入门——5.Qiskit库介绍与简单应用(2)
参考资料:
【【零基础入门量子计算】】
来自b站up:溴锑锑跃迁
建议关注他的更多高质量文章:CSDN:【溴锑锑跃迁】
(实际上只带一点点原创,绝大部分资料来自这位大佬)
跟着视频我手打了一遍notebook的内容,文件随附(为了创作分哈哈),为了绕开CSDN下载资源的种种手段,再附【下载链接】: 密码:depven
OpenQASM后端
对一个量子电路,我们需要测量它来得到(理想的)实际结果,否则我们不能从量子态中得到任何信息。而测量这一行为则会导致量子比特坍缩到经典比特,我们使用量子电路的measure函数添加测量门:
#可以接续我们的测试代码
#再创建一个量子电路以进行测量操作
#绘图时会生成 3 qubits + 3 bits = 6个道
meas = QuantumCircuit(3, 3)
#在0~2个量子比特道上加一个隔板以进行区分
meas.barrier(range(3))
#建立从量子到经典的测量映射,相当于把测量结果移至经典道
meas.measure(range(3), range(3))qc = circ.compose(meas)#电路的可加性
qc.draw('mpl')
OpenQASM后端用于实打实地测量最终量子态,其对应的后端名称为qam.simulator,原理是制备大量初始量子态输入电路当中,最后测量对应的最终量子
#导入OpenQASM后端
backend2 = Aer.get_backend('qasm_simulator')#基于OpenQASM后端运行电路
#这里用参数shots把样本数设定为1024(事实上是默认值)
job = execute(qc, backend2, shots = 1024)#获得结果
result = job.result()counts = result.get_counts(qc)
print(counts)
结果解释:shots是测试的次数,总共1024次测量,000出现508次,111出现516次
每次执行的结果都是不一样的,如何理解这一结果呢?我们可以通过计算一个哈达吗门和两个CNOT门作用于量子电路后得出的最终态为
∣ ψ ⟩ = 1 2 ( ∣ 000 ⟩ + ∣ 111 ⟩ ) |\psi\rangle=\frac{1}{\sqrt{2}}(|000\rangle+|111\rangle) ∣ψ⟩=21(∣000⟩+∣111⟩)
如此一来,两种量子态各占约50%的结果就是符合理论的了。
回顾上文所述的态矢后端可以印证这一点,如下图:
绘图
绘图要使用qiskitvisualization库
from qiskit.visualization import *
绘图的对象永远是量子态,也就是statevector。量子态可以是态矢量,也可以是态矩阵 ρ ρ ρ
ρ = ∣ ψ ⟩ < ψ ∣ = ∑ k ∣ ψ k > < ψ k ∣ \rho=\left|\psi\right\rangle\left<\psi\right|=\sum_{k}\left|\psi_{k}\right>\left<\psi_{k}\right| ρ=∣ψ⟩⟨ψ∣=k∑∣ψk⟩⟨ψk∣
为方便,我们先创建一个贝尔态并调用态矢后端
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)backend = Aer.get_backend('statevector_simulator')
job = execute(bell, backend)
result = job.result()
statevector = result.get_statevector(bell, decimals=3)statevector
可以看到,我们绘制出了贝尔态,即:
∣ 贝尔 ⟩ = 1 2 ∣ 00 ⟩ + 1 2 ∣ 11 ⟩ = [ 1 2 0 0 1 2 ] |\text{贝尔}\rangle=\frac{1}{\sqrt2}|00\rangle+\frac{1}{\sqrt2}|11\rangle=\begin{bmatrix}\dfrac{1}{\sqrt{2}}\\0\\0\\\dfrac{1}{\sqrt{2}}\end{bmatrix} ∣贝尔⟩=21∣00⟩+21∣11⟩= 210021
直方图
plot_histogram:直方图用于绘制OpenQASM后端返回的counts
circ = QuantumCircuit(3)
meas = QuantumCircuit(3, 3)
# 根据测试部分中的描述,现在第0个和第2个量子比特都处于|0>和|1>的叠加态
# 每个单态的概率都是50%
circ.h(0)
circ.h(2)
circ.cx(0, 1)meas.barrier(range(3))
meas.measure(range(3), range(3))
qc = circ.compose(meas)backend = Aer.get_backend('qasm_simulator')
result1 = execute(qc, backend).result()
result2 = execute(qc, backend).result()counts1 = result1.get_counts(qc)
counts2 = result2.get_counts(qc)
legends = ['1st','2nd']#加入图例
plot_histogram([counts1, counts2], legend = legends, figsize=(10, 7))
城市图
plot_state_city:将量子态矩阵分成实部和虚部进行绘制,会形成立体的柱状图
plot_state_city(statevector)
Q球图
plot_state_qsphere:Qiskit中的特色菜,将某量子态的振幅和相位绘制在球体中,并分别用线条粗细和颜色区分。
对混合态则会将每个分量的qsphere绘制出来,下称“Q球图”
plot_state_qsphere(statevector)
Bloch球图
plot_bloch_multivector: 将态向量画在布洛赫球面上
plot_bloch_multivector(statevector)
Pauli图
plot_state_paulivec:相当于用泡利矩展开量子态
plot_state_paulivec(statevector, color=['red','blue','violet','green'])
Bloch矢量图
plot_bloch_vector:布洛赫矢量被定义为
v ⃗ = [ T r [ X ρ ] T r [ Y ρ ] T r [ Z ρ ] ] \left.\vec{v}=\left[\begin{array}{c}Tr[X\rho]\\Tr[Y\rho]\\Tr[Z\rho]\end{array}\right.\right] v= Tr[Xρ]Tr[Yρ]Tr[Zρ]
plot_bloch_vector([0.77, -0.2, 0.79])