版权所有 (c) 2021 百度量子计算研究所,保留所有权利。
我们知道经典计算机对信息的编码、存储以及操作都建立在布尔代数上,将逻辑值 True(真)和 False(假)编码为二进制 和 。单个比特是 和 的二进制数,也就是说一个经典比特最多能编码一个比特的信息。然而,随着量子纠缠的发现和贝尔态的提出,本内特和威斯纳在1992年提出了一个量子编码方案。这个方案利用量子比特的纠缠性质,通过一个量子比特传递两个经典比特的信息,从而实现容量更大、效率更高的通讯方式。这种利用量子纠缠实现高容量编码的方式被称为量子超密编码(Quantum Superdense Coding),它是量子力学在编码上的一个重要应用。
需要注意的是,切勿混淆量子超密编码和量子隐形传态这两个协议,这里我们将两者作一个简单的对比:
量子超密编码通过一个量子比特传输两个经典比特信息。
量子隐形传态通过两个经典比特信息传输一个量子比特。
从信息传递的角度来看,量子超密编码和量子隐形传态刚好是一个互反的过程,但同时这两种协议都用到了量子纠缠作为资源。
与量子隐形传态一样,量子超密编码的基本假设是 Alice 和 Bob 共享一对贝尔态。不同的是,他们之间共享一条量子信道而不是经典信道。对于最简单的两个量子比特系统,如何实现量子超密编码?即只通过一个量子比特传递 中的某个两个经典比特的信息。我们可以采用如下方式实现:Alice 和 Bob 共享事先准备好的一对贝尔态,根据需要传输的经典信息 Alice 对其所持有量子比特做出相应的编码操作,然后将操作后的量子比特通过量子信道传递给 Bob,Bob 对收到的量子比特和原先持有的量子比特进行测量,从而解码 Alice 想要传输的经典信息。实验上,量子超密编码协议在 1996 年被 Klaus Mattle 等人通过光子的偏振实验验证。
超密编码协议详细的步骤分析如下:
步骤 1:制备贝尔态
首先制备一对贝尔态 , Alice 和 Bob 分开前,各取其中的一个量子比特。
步骤 2:Alice 进行编码操作并传送量子比特
Alice 根据想发送给 Bob 的经典比特信息, 对照下表对其持有的比特进行相应操作。
Alice 编码 | Alice 执行的操作 | Alice 操作后 |
---|---|---|
假设 Alice 想发送经典比特 ,她只需要在自己的量子比特上先作用 门,再作用 门:
之后 Alice 将自己操作后的量子比特通过共享的量子信道传送给 Bob。
步骤 3:Bob 进行解码操作
Bob 收到 Alice 传输过来的量子比特后,就得到了描述整个系统的量子态 。Bob 以 为控制比特作用 CNOT 门,然后再对量子比特 做 门操作。最后对两个系统进行计算基 测量,从而解码 Alice 想传输的经典信息:
注意此时 Bob 的测量结果只可能是 。从而完全解码 Alice 想要传输的信息。同理,如果 Alice 在步骤 2 中的编码是其他情况,相同的操作也可以帮助 Bob 完全解码(实际上,Bob 等效进行了贝尔基测量)。我们可以对照以下表格进行验证。
Alice 编码 | Alice 执行的操作 | Bob 接收到的态 | Bob 操作后 | Bob 解码 |
---|---|---|---|---|
最后,量子超密编码完整的电路图如下(此处模拟中我们省去了发送量子比特这一过程),其中 对应的就是 Alice 想要编码的经典比特:
图 1: 传输信息''的完整量子电路。
协议原理
量子超密编码协议的核心在于,Alice 只需要对其持有的量子比特进行表 1 中给出的不同的操作,就可以使得整个系统的量子态变成四个不同的正交贝尔态 中的一个。当 Bob 接收到 Alice 的量子比特后,便可以通过贝尔基底下的测量完美分辨经过 Alice 操作后整个系统的量子态是四个正交贝尔态中的哪一个,从而解码得到 Alice 想要传送的两经典比特的信息。
在熟悉了以上的理论推导后,我们可以在量易伏平台上模拟量子超密编码协议。首先我们给出传递 01 的 QComposer 量子电路,有兴趣的读者可以登录量易伏平台搭建对应电路并体验使用量子真机运行,也可以设计自己的电路传递其他两经典比特信息。然后我们将基于混合语言编程给出量子超密编码一般的代码,读者可以在本地使用 QCompute SDK 进行模拟实验。
在 QComposer 上传递 01 的对应的电路图如下(此处模拟中我们省去了发送量子比特这一过程):
图 2:量易伏 QComposer 超密编码电路图
对应的 OPENQASM 代码如下:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
// Alice 和 Bob 之间制备纠缠态
h q[0];
cx q[0], q[1];
// Alice 对 '01' 进行编码
x q[0];
// Bob 进行解码
cx q[0], q[1];
h q[0];
// 测量
measure q[0] -> c[0];
measure q[1] -> c[1];
理想模拟器输出结果为:
{
"10": 1024
}
注: 需要注意的是,量易伏平台上模拟返回的字符串采用大端在前的标记方法,从左往右第一位表示的是最高位的量子比特(),和传入的信息顺序相反,故此处理想模拟器输出结果 10 在翻转后得到 01 即为 Alice 想要传递的两比特信息。
量易伏平台实现量子超密编码具体代码如下,修改其中想要传递的信息()即可传递不同信息:
from QCompute import *
import numpy as np
# 不直接给出输出,后续通过print给出需要信息
from QCompute import Define
Define.Settings.drawCircuitControl = []
Define.Settings.outputInfo = False
# 设置测量的次数
shots = 1024
# 设置 Alice 想要发送给 Bob 的经典信息
message = '01'
# 创建环境
env = QEnv()
# 选择随机数
seed = int(2147483647*np.random.random())
# 选择 Backend 为本地模拟器
env.backend(BackendName.LocalBaiduSim2, '-s ' + str(seed))
# 初始化全部量子比特
q = [env.Q[0], env.Q[1]]
# 步骤 1:制备贝尔态
H(q[0])
CX(q[0], q[1])
# 步骤 2:Alice 根据需要传输的信息对其量子比特进行操作
if message == '01':
X(q[0])
elif message == '10':
Z(q[0])
elif message == '11':
X(q[0])
Z(q[0])
# 步骤 3:Bob 进行解码
CX(q[0], q[1])
H(q[0])
# Bob 进行测量
MeasureZ(q, range(2))
taskResult = env.commit(shots, fetchMeasure=True)
print("Shots", taskResult['shots'])
print("Counts", taskResult['counts'])
print("Seed", seed)
# QCompute 默认从最后一位开始测量,因此输出需要反向
bit = max(taskResult['counts'], key=taskResult['counts'].get)
bit[::-1]
print("解码得到的经典信息:", bit[::-1])
代码输出:
Shots 1024
Counts {'10': 1024}
Seed 336210738
解码得到的经典信息: 01
得到的结果显示 Alice 想要传输的经典比特信息 '' 被 Bob 正确地解码了。
习题 1. 如果 Alice 想传输的信息是 '' ,请通过代码验证量子超密编码的正确性。
习题 2. 请思考假如初始制备的贝尔态是 ,我们该怎么设计量子电路去实现量子超密编码?
习题 3. 我们是否可以在多能级量子系统上编码更多的经典信息,实现更高维数的量子超密编码呢?又如何在量易伏平台上实现这一过程呢?
[1] Bennett, Charles H., and Stephen J. Wiesner. "Communication via one- and two-particle operators on Einstein-Podolsky-Rosen states." Physical Review Letters 69.20 (1992): 2881.
[2] Mattle, Klaus, et al. "Dense coding in experimental quantum communication." Physical Review Letters 76.25 (1996): 4656.
最后更新时间:2021年12月20日