当前位置:网站首页>基于Qiskit——《量子计算编程实战》读书笔记(五)
基于Qiskit——《量子计算编程实战》读书笔记(五)
2022-08-10 05:29:00 【溴锑锑跃迁】
目录
前言
在写博客的过程中,笔者略去了有关IBM QX平台基本使用知识的第六章内容,原因无他,本书买于2020年4月,距今已经过去了整整两年,IBM QX平台也已更新不少,而有意向和能力的读者则推荐在注册账号后亲自体验一把可视化量子编程。
第7章 OpenQASM
关于 OpenQASM
前面的章节里,我们一直在使用纯Python语言去感受量子计算体系的基础架构(如量子比特的模拟、量子算法的初步设计与实现等),而Qiskit则作为一个量子科学包将同类架构封装起来,应用于量子电路构建的代码实现当中,亦即量子编辑器(Quantum Composer)。与之不同,OpenQASM是一种比计算机代码更为高级的、用于编写量子程序的语言,全称为开放式量子汇编语言,顾名思义,可知其之于量子程序的基本程度。对于每一个量子编辑器中的程序(由相应量子电路“转译”而成),也可以在IBM QX平台中轻松访问OpenQASM对应的等效程序。
本书对OpenQASM的讲解会有内容和篇幅上的限制,重点关注的是OpenQASM 2.0,学有余力者可以参考OpenQASM 2.0的完整规范,当然也推荐访问官网自行阅读研究(落笔之时已然更新至OpenQASM 3.0规范):OpenQASM 3.x Live Specification — OpenQASM Live Specification documentation。
OpenQASM的语法类似于C语言:
- 注释是每行一个,并以“//”开头
- 空格不重要
- 区分大小写
- 每一行必须以分号结尾
- 每一个程序都必须以OPENQASM 2.0开头(如果是OpenQASM 3.0规范则换为OPENQASM 3.0)
- 使用IBM QX平台时,必须写出一行include "qelib1.inc"; (分号不可省略!)可以使用类似的语法通过当前程序的相对路径调用其他文件,而OpenQASM做的只是在include位置复制文件内容罢了。
| 说明 | 操作 |
|---|---|
| 引入头文件 | include "qelib1.inc"; |
| 声明一个量子寄存器(qregname可以替换为其他名称) | qreg qregname [k]; |
| 引用量子寄存器 | qregname [i]; |
| 声明一个经典寄存器(cregname可以替换为其他名称) | creg cregname [k]; |
| 引用经典寄存器 | cregname [i]; |
| 单比特门列表(引用qelib1.inc后可使用) | h, t, tdg, s, sdg, x, y, z, id |
| 操作单比特门 | gate q [i]; |
| 双比特的CNOT门(引用qelib1.inc后可使用) | cx |
| CNOT操作 | cnot control, target; |
| 可使用的测量操作 | measure, bloch |
| 测量操作 | measure q [i] -> c [k]; bloch q [i] -> c[k]; |
| 屏障操作 | barrier q[i], q[j], q[k], ...; |
| 量子基本门 | CX, U |
将OpenQASM程序转换为量子电路
例1:取反量子比特
//使用IBM QX的标准头声明
OPENQASM 2.0;
include "qelib1.inc";
//声明一个名为q、大小为1的量子寄存器并自动赋值为|0>
qreg q[1]; //此处1是大小
//取反
x q[0]; //此处0是索引
例2:用门操作两个量子比特并测量第一个量子比特
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[1];
x q[0];
y q[0];
z q[0];
s q[1];
measure q[0] -> c[0];
例3:创建一个有两个参数和两个参量的门并测量(重点!)
请着重注意声明门的语法,包括参数和参量的声明位置
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
gate my_gate(param1, param2) q1,q2 {
x q1;
u1(param1) q1;
h q2;
u1(param2) q2;
}
my_gate(pi/2, 5*pi/12) q[0], q[1];
measure q -> c;
将量子电路转换为OpenQASM 2.0程序
从IBM QX平台进入电路编辑界面并进行正常电路编辑操作后,即可得到系统自动翻译生成的OpenQASM 2.0代码:

课后习题



第8章 Qiskit和量子计算机模拟
测试Qiskit安装
运行以下代码并根据需要排除故障:
from qiskit import Aer. IBMQ
IBMQ.enable_account("输入你的专用令牌(API TOKEN)")提示:要获取API令牌,可以访问官网在首页进行复制

随后运行以下代码,重点关注后端的获取方法:
import qiskit
from qiskit.tools.visualization import plot_histogram
provider = qiskit.IBMQ.load_account() #导入账号,前提是已经添加过API token
backend = provider.backend.ibmq_qasm_simulator
#语法和书上不同,可以直接在backend后加入任意在线的模拟器,不用加字符串(可在官网查找)
q = qiskit.QuantumRegister(5)
c = qiskit.ClassicalRegister(5)
qc = qiskit.QuantumCircuit(q, c)
qc.measure(q, c)
job_exp = qiskit.execute(qc, backend=backend)
plot_histogram(job_exp.result().get_counts(qc)).savefig('result.png') #保存图片

使用OpenQASM
尽管通过Python在Qiskit中编程很有用,但通常可以在OpenQASM中编写量子算法,本节将提供两种将OpenQASM程序整合到Qiskit代码中的示例。
1.从文件加载OpenQASM
新建“hadamard.qasm”文件并输入:
OPENQASM 2.0;
include "qelib1.inc"
qreg q[2];
creg c[2];
h q[0];
h q[1];
measure q -> c;另建文件作为主代码:
import qiskit
provider = qiskit.IBMQ.load_account()
backend = provider.backend.ibmq_qasm_simulator
qc = qiskit.QuantumCircuit().from_qasm_file("hadamard.qasm") #直接导入
sim = qiskit.execute(qc, backend=backend)
result = sim.result()
print(result.get_counts(qc))2.使用字符串加载OpenQASM
整体来说大同小异:
import qiskit
provider = qiskit.IBMQ.load_account()
backend = provider.backend.ibmq_qasm_simulator
qc = qiskit.QuantumCircuit().from_qasm_str(
""""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
h q[1];
measure q -> c;
""")
sim = qiskit.execute(qc, backend=backend)
result = sim.result()
print(result.get_counts(qc))记住QuantumCircuit中的相应函数即可。
欢迎加入Qiskit交流群: 1064371332
边栏推荐
- 如何模拟后台API调用场景,很细!
- What are the common commands of mysql
- An article to master the entire JVM, JVM ultra-detailed analysis!!!
- 树莓派入门(3)树莓派GPIO学习
- 【Pei Shu Theorem】CF1055C Lucky Days
- 论文精读 —— 2021 CVPR《Progressive Temporal Feature Alignment Network for Video Inpainting》
- 西门子Step7和TIA软件“交叉引用”的使用
- conda创建虚拟环境方法和pqi使用国内镜像源安装第三方库的方法教程
- 树莓派入门(4)LED闪烁&呼吸灯
- 【论文笔记】Prototypical Contrast Adaptation for Domain Adaptive Semantic Segmentation
猜你喜欢

线性模型中的高级特征选择技术——基于R

MySql之json_extract函数处理json字段

成为黑客不得不学的语言,看完觉得你们还可吗?

AVL tree insertion--rotation notes

pytest测试框架

栈与队列 | 有效的括号、删除字符串中的所有相邻元素、逆波兰表达式求值、滑动窗口的最大值、前K个高频元素 | leecode刷题笔记

如何模拟后台API调用场景,很细!

线程(下):读写者模型\环形队列\线程池

Flutter开发:报错The following assertion was thrown resolving an image codec:Unable to…的解决方法

mysql常用命令有什么
随机推荐
树莓派入门(3)树莓派GPIO学习
canvas 画布绘制时钟
Linear Algebra (4)
pytorch learning
oracle cdc时,设置并行度2插槽数1,最终任务只有一个tm,是不是因为oracle不支持并发
[Thesis Notes] Prototypical Contrast Adaptation for Domain Adaptive Semantic Segmentation
手把手带你写嵌入式物联网的第一个项目
`id` bigint(20) unsigned NOT NULL COMMENT 'Database primary key',
FPGA工程师面试试题集锦11~20
Kubernetes:(十六)Ingress的概念和原理
Conda creates a virtual environment method and pqi uses a domestic mirror source to install a third-party library method tutorial
深度梳理:防止模型过拟合的方法汇总
Important transformation and upgrading
SEO搜索引擎优化
Rpc interface stress test
Attention candidates for the soft exam! The detailed registration process for the second half of 2022 is coming!
转型做产品,考NPDP靠谱吗?
EasyGBS连接mysql数据库提示“can’t connect to mysql server”,该如何解决?
大咖说·对话生态|当Confluent遇见云:实时流动的数据更有价值
成为黑客不得不学的语言,看完觉得你们还可吗?