当前位置:网站首页>基于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
边栏推荐
- Rpc interface stress test
- 西门子Step7和TIA软件“交叉引用”的使用
- 如何在报表控件FastReport.NET中连接XLSX 文件作为数据源?
- Interface debugging also can play this?
- Ask you guys.The FlinkCDC2.2.0 version in the CDC community has a description of the supported sqlserver version, please
- 剑指Offer 033.变位数组
- 线程(上篇):线程的创建
- Stacks and Queues | Implementing Queues with Stacks | Implementing Stacks with Queues | Basic Theory and Code Principles
- 一篇文章掌握整个JVM,JVM超详细解析!!!
- MySql之json_extract函数处理json字段
猜你喜欢
实战小技巧19:List转Map List的几种姿势
EasyGBS连接mysql数据库提示“can’t connect to mysql server”,该如何解决?
EasyGBS connects to mysql database and prompts "can't connect to mysql server", how to solve it?
基于BP神经网络的多因素房屋价格预测matlab仿真
An article to master the entire JVM, JVM ultra-detailed analysis!!!
动手写prometheus的exporter-02-Counter(计数器)
接口调试还能这么玩?
Pulsar中游标的工作原理
Zhongang Mining: Strong downstream demand for fluorite
pytest测试框架
随机推荐
抽象问题方法论
An article to master the entire JVM, JVM ultra-detailed analysis!!!
SQLSERVER 2008 parses data in Json format
When oracle cdc, set the parallelism to 2 and the number of slots to 1, and the final task has only one tm. Is it because oracle does not support concurrency
Stacks and Queues | Implementing Queues with Stacks | Implementing Stacks with Queues | Basic Theory and Code Principles
Touch chip used in smart touch remote control
EasyGBS connects to mysql database and prompts "can't connect to mysql server", how to solve it?
【LeetCode】41、 缺失的第一个正数
通过一个案例轻松入门OAuth协议
【Static proxy】
各位大佬,idea中测试使用FlinkCDC SQL 读取Mysql 数据写入Kafka中,代码中创
strongest brain (1)
Linear Algebra (4)
Interface debugging also can play this?
软考考生注意!2022年下半年报名详细流程来了!
ThreadPoolExecutor thread pool principle
Pulsar中游标的工作原理
FPGA engineer interview questions collection 41~50
flex related
Shield Alt hotkey in vscode