当前位置: 首页 > news >正文

量子算法入门——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) ψ=2 1(∣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} 贝尔=2 1∣00+2 1∣11= 2 1002 1

直方图

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[]Tr[Yρ]Tr[]

plot_bloch_vector([0.77, -0.2, 0.79])

在这里插入图片描述

http://www.lqws.cn/news/567199.html

相关文章:

  • Ubuntu服务器(公网)- Ubuntu客户端(内网)的FRP内网穿透配置教程
  • 博图SCL编程利器:CASE OF 语句详解与应用指南之设备运行模式选择框架
  • 领域驱动设计(DDD)【28】之实践或推广DDD的学习
  • docker compose基本使用以及示例
  • 基于springboot+vue的数字科技风险报告管理系统
  • URL带有中文会引入哪些问题
  • http相关网络问题面试怎么答
  • 算法-基础算法-递归算法(Python)
  • 第十二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 两种权限控制方式(附前后端代码)
  • Vue 3 Teleport 特性
  • DXYZ投资-ai公司
  • 左神算法之Zigzag方式打印矩阵
  • Java面试题031:一文深入了解MySQL(3)
  • Vivado关联Vscode
  • Rust标量、复合类型与自定义类型、第三方并发结构
  • 【软考--软件设计师】2025-05 我的选择题错题总结
  • ListExtension 扩展方法增加 转DataTable()方法
  • 商业行业项目创业计划书PPT模版
  • 什么是区块链的跨链操作?
  • 穿越时空的光
  • 详解快速排序
  • SRS流媒体服务器(8)源码分析之rtc/rtmp互相转码详解
  • 数据可视化 - 单子图
  • 第10章 数组和指针
  • 左神算法之螺旋打印
  • SQL Server从入门到项目实践(超值版)读书笔记 19
  • 从GPTs到Real智能体:目前常见的几种创建智能体方式
  • spring:BeanPostProcessor后置处理器介绍
  • 小米路由器 AX3000T自定义子网掩码
  • Mybatis多条件查询设置参数的三种方法