量子计算编程
本章节我们介绍常用的量子编程语言和工具,并结合具体示例,展示量子编程的用法。
量子编程语言及框架
目前业内存在多种量子编程语言和框架,以下列举介绍了部分。
名称 | 简介 |
---|---|
Cirq | Google 开发的开源量子编程框架,允许开发人员构建和在模拟器上运行量子电路。 |
Qiskit | IBM 创建的开源量子计算开发编程框架。允许用户设计量子电路、算法,并可协助用户远程使用 IBM 量子平台进行开发。 |
Q# | Microsoft 发布的用于开发和运行量子算法的开源高级编程语言。设计上其与硬件无关,易于扩展,并可优化执行。 |
QCIS
量子控制指令集(Quantum Control Instruction Set, QCIS)是由中国科学技术大学量子计算研发团队提出的,对超导量子计算机硬件系统进行控制的指令集,旨在将硬件控制用指令进行抽象标准化。
目前,QCIS 已经可以由量子编译器生成,利用国产的 IsQ 和 Quingo 高级量子编程语言,可以将高级语言编写的算法优化并编译成 QCIS 代码, QCIS 指令可以直接作为相关团队的量子编程语言输入给量子操控系统,直接驱动量子芯片。中科院量子创新院的量子计算云平台和国盾量子计算云平台,均支持 QCIS 作为原生语言,直接驱动其接入云端的量子计算机。
IsQ
IsQ 是中国科学院软件研究所量子软件工具包的一部分。IsQ 的编译器接受 IsQ 程序作为输入,并生成用几种中间表示或指令集编写的低级代码(取决于特定的编译器选项)。编译结果可以在超导硬件上或者 IsQ 模拟器上运行。
本平台的文档主要基于 IsQ 语法进行后续的实验和说明,用户可以在本地安装 IsQ 编译器,或者直接使用本平台实验室模块进行学习开发。
- IsQ 编译器:支持 IsQ 语法的编译、模拟运行等。关于 IsQ Compiler 的官方文档
- IsQ Tools:用于为 IsQ 编译器提供一套 Python 的接口工具,方便用户直接使用 Python 进行操作。关于 IsQ Tools 的官方文档
以下安装步骤摘自 IsQ 官方文档:
IsQ Compiler 安装步骤
# 可在 https://www.arclightquantum.com/isq-releases/isqc-standalone/ 找到最新发布的版本
VERSION=0.1.1
# Create empty directory for isQ installation.
mkdir isqc && cd isqc
# Check if user namespace is supported for your Linux kernel.
unshare --user --pid echo YES
# Download and unpack tarball.
wget https://www.arclightquantum.com/isq-releases/isqc-standalone/${VERSION}/isqc-${VERSION}.tar.gz
wget https://www.arclightquantum.com/isq-releases/isqc-standalone/${VERSION}/isqc-${VERSION}.tar.gz.sha256
sha256sum -c isqc-${VERSION}.tar.gz.sha256
tar -xvf isqc-${VERSION}.tar.gz
# Now isQ is here.
./isqc --version
IsQ tools 安装步骤
pip install isqtools
量子编程简单示例
隐形传态(teleportation)和超密编码(superdense coding)这两个精巧的量子电路能够以经典计算中不可能实现的方式传输信息。本小节简单介绍了如何构建这两个电路,并给出示例。
隐形传态
问题描述:Alice 希望把量子比特
前提假设:假设已经存在了一对纠缠比特
算法电路:

算法描述:
- Alice 对她持有的
比特和待发送比特 使用 CNOT 门; - Alice 对她持有的
比特使用 Hadamard 门; - Alice 测量她持有的比特,得到两个经典比特,将经典比特的结果发给 Bob;
- Bob 根据收到的经典比特,对自己持有的
比特做如下表格操作,操作完成之后 Bob 持有的量子比特即可恢复 的状态。
Bob 收到的信息 | Bob 需要执行的操作 |
---|---|
00 | 不做任何处理 |
01 | Z |
10 | X |
11 | 先 Z 后 X |
代码实现:
IsQ 实现代码如下
import std;
procedure transform(qbit a, qbit b, qbit c) {
// 准备 Alice 与 Bob 的纠缠比特对
H(b);
CNOT(b, c);
// Alice 进行操作
CNOT(a, b);
H(a);
// Bob 根据 Alice 测量结果修正自己持有的比特
if (M(a)) { Z(c); }
if (M(b)) { X(c); }
}
procedure main()
{
qbit q[3];
Rx(pi/3, q[0]); // 初始化待传送比特为 'sqrt(0.75)|0>-sqrt(0.25)i|1>'
transform(q[0], q[1], q[2]);
print M(q[2]);
}
可以使用 isq tools 对上述代码进行模拟,预期的测量结果中 q[2] 为 '0' 的次数约为 '1' 的 3 倍。
注意
示例代码中出现了 if (M(qubit))
的逻辑判断,由于 QCIS 暂不支持实时反馈控制,因此真机上使用时不允许使用 measure 的结果作为动态条件控制程序流。
超密编码
超密编码是通过发送一个量子比特来传输两个经典比特的方法。若 Alice 希望使用经典信道向 Bob 发送两个经典比特,那么她必须使用两个比特,然而使用超密编码,她可以只传输一个量子比特即可达到同样的效果。
问题描述:Alice 希望通过给 Bob 发送一个量子比特来传输两个经典比特的信息。
前提假设:Alice 与 Bob 持有一对纠缠比特。
算法电路:

算法描述:
- Alice 根据自己想要传输的经典比特,对持有的量子比特进行编码操作:
经典比特 | 编码 |
---|---|
00 | 无需操作 |
01 | X |
10 | Z |
11 | 先 X 后 Z |
- Bob 接收到 Alice 发送的量子比特后,先执行一次 CNOT,然后执行一次 Hadamard。
- Bob 此时测量的结果就是 Alice 想要发送的数据。
代码实现:
IsQ 代码实现如下:
import std;
procedure main()
{
qbit q[2];
// 假设 Alice 持有 q[0] 且希望传送的经典比特有两个
// step1: 准备阶段,Alice 和 Bob 获得一对纠缠比特
H(q[0]);
CNOT(q[0], q[1]);
// step2: Alice 根据要传输的经典比特,对量子比特进行编码
// example1: 预期输出 00
//
// example2: 预期输出 01
// X(q[0]);
// example3: 预期输出 10
// Z(q[0]);
// example4: 预期输出 11
X(q[0]);
Z(q[0]);
// step3: 假设 Alice 已将 q[0] 发送给 Bob,Bob 需要将比特解码
CNOT(q[0], q[1]);
H(q[0]);
// Measure: Bob 通过测量获得 Alice 的经典比特
M(q[0]);
M(q[1]);
}
可以使用 isq tools 对上述代码进行模拟,预期的测量结果全部为 '11',这是因为示例代码中假设了 Alice 希望传输 '11' 并进行了对应的编码。