版权所有 (c) 2021 百度量子计算研究所,保留所有权利。
在本小节,我们将学习量子信息理论中最经典的一个量子协议——量子隐形传态 (Quantum Teleportation)。它将告诉我们如何利用量子纠缠的性质,实现“远距离传输一个量子态”。
假设 Alice 在实验室里获得了一个未知的单比特量子态 ,她想把这个量子态发送给相距很远的同事 Bob。如果他们之间存在一条很理想的量子信道,最直接的方法就是将 通过量子信道发送给 Bob。但如果他们之间根本不存在已搭建好的量子信道该怎么办呢?经过之前的学习,我们知道量子态 可以表示为:。Alice 可以想办法测量得到两个复数概率幅的值 ,然后通过经典信道告诉 Bob。完成经典通讯之后,Bob 再想办法搭建量子电路去制备量子态 。由于 Alice 每次测量后会破坏原来的量子态,要想准确的获得 的估计,则需要大量拷贝 ,来进行反复实验。这种方法往往是非常低效的,并且实际情况中 Alice 往往只有一个拷贝的量子态,从而根本无法测得 和 的准确值。那么是否还有其他的方法将量子态从 Alice 传给 Bob 呢?
相比于上述低效的方法,这一节我们将看到 Alice 如何通过使用量子纠缠态实现在仅有一个拷贝的情况下,将 完美的传送给Bob。
在1993年,本内特等多位物理学家提出了一套引入量子纠缠作为资源的通讯协议,也就是本节重点讨论的量子隐形传态协议。在传输开始之前,Alice 和 Bob 需要提前准备好一对共享的贝尔态 ,
其中角标 分别指代 Alice 和 Bob 所持有的量子比特系统。这个贝尔态可以是 Bob 在离开 Alice 前他们共同制备的,也可以是从其他方式获取的。除此之外,他们还需要保证两人共享一条经典信道并以此来传输经典信息。在确定了实验条件之后,我们记需要被传输的态为 ,角标 指代 Alice 要传输的量子比特系统。Alice 对她所持有的两个量子比特系统 以 为控制位做 操作,然后对量子比特 作 门操作。完成上述量子门操作后,Alice 对两个量子比特在计算基上测量得到经典信息比特 。Alice 将这些信息通过经典信道传输给 Bob。最后 Bob 按照接收到的通讯结果来对他持有的量子比特系统 进行量子门操作 。比如说,如果 Alice 对两个量子比特测量结果为 ,此时 Bob 需要对其量子态进行 门操作。其他情况同理。完成上述步骤后,Bob 的量子比特就会处于量子态 。至此,Alice 实现了对量子态 的传输。实验上,量子隐形传态协议在1997年被 Dirk Bouwmeester 等人通过光子的偏振实验验证。
图1: 量子隐形传态协议的电路图表示。
通过第一章中所学的量子力学基本知识和本章第两节介绍的电路模型知识,下面我们详细分析一下为什么上述协议是可行的。
步骤1:制备贝尔态
首先,Alice 和 Bob 在分开之前制备一对贝尔态 并且两人分别拿走一个量子比特。因为系统是对称的,这里两人具体拿走了哪一个并不重要。我们记 Alice 需要传输的量子态为 。我们不妨假设 。此时整个系统的量子态可以描述为:
步骤2:Alice 进行测量前操作
然后 Alice 进行 操作并得到 ,
回顾 门的作用为:
Alice 对第一个量子比特施加 门得到 ,
步骤3:Alice 进行测量并传输经典比特
为了方便看清 Alice 对所持有的两个量子比特做测量的效果,我们按照计算基重新整理整个系统的量子态 得到:
接着 Alice 对持有的两个量子比特关于计算基 做测量。所得到的四种测量结果如下:
Alice 测量结果 | 概率 | 测量后 Bob 的量子态 | 复原所需要的操作 |
---|---|---|---|
00 | 1/4 | ||
01 | 1/4 | ||
10 | 1/4 | ||
11 | 1/4 |
步骤4:Bob 进行操作并复原量子态
在 Alice 测量结束后,Bob 手上的量子比特所处的状态已经非常接近 。他只需要按照 Alice 发送的经典比特 的信息,进行对应的量子门操作就可以复原得到 。
对于量子隐形传态的理解有以下一些注意事项:
关于更多的相关讨论可以参见文献。
为了加深对量子隐形传态协议的理解,在这一小节,我们介绍如何在量易伏平台上模拟演示量子隐形传态协议。我们将首先展示使用 QComposer 构建量子隐形传态的电路,有兴趣的读者可以登录量易伏平台搭建电路并体验使用量子真机运行。然后我们将基于混合语言编程给出量子隐形传态对应代码,推荐读者在本地使用 QCompute SDK 进行模拟实验。
为模拟传递任意量子态,首先我们采用广义旋转门 ,用于随机的生成一个量子态 ,作为我们想要传输的量子态:
对未知量子态 ,如果能完美传输,那么对此量子态与对经过隐形传态协议后的量子态在计算基上测量,两者测量结果应该一致。
前者在 QComposer 上对应的电路图如下(其中 门的角度 可以在 OPENQASM 中修改):
图 2:量易伏 QComposer 测量未经过隐形传态的电路图
对应的 OPENQASM 代码如下:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
creg c[3];
// 制备量子态 |psi>(此电路中人为设定)
//
u(pi/7, pi/4, pi/6) q[0];
//
// 测量
measure q[0] -> c[0];
理想模拟器输出结果为:
{
"0": 969,
"1": 55
}
按照测量的结果可以得到生成的量子态 ,其中 ,并且 。
然后我们尝试将这个态从 Alice 传输给 Bob,并且在计算基下测量 Bob 最终得到的量子态。这里需要注意的是,根据 量子电路模型一节中提到的推迟测量原理,我们使用了量子控制门 和 来替代 Bob 根据 Alice 测量结果所进行的经典控制(注:此处电路只是模拟演示,在实践中这两个控制门对于分隔两地的 Alice 和 Bob 显然是无法实现的)。
在 QComposer 上对应的电路图如下:
图 3:量易伏 QComposer 隐形传态电路图
对应的 OPENQASM 代码如下:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
creg c[3];
// Alice 与 Bob 纠缠
h q[1];
cx q[1], q[2];
//
// 制备量子态 |psi>(与直接测量中量子态一致)
u(pi/7, pi/4, pi/6) q[0];
// Alice 对持有的量子态进行操作
cx q[0], q[1];
h q[0];
//
// Bob 操作复原量子态 |psi>
cz q[0], q[2];
cx q[1], q[2];
// Bob 执行测量
measure q[2] -> c[2];
理想模拟器输出结果为:
{
"0": 965,
"1": 59
}
按照测量的结果得到量子态 ,其中 并且 。 与被传输的量子态 非常接近。其中两个态之间稍许的误差来源于我们测试量子态时所做的测量次数有限,读者可以在 QComposer 中选择更大的测量次数(增大 值)来减少误差。
生成随机量子态并进行测量的代码如下:
from QCompute import *
import numpy as np
# 不直接给出输出,后续通过print给出需要信息
from QCompute import Define
Define.Settings.drawCircuitControl = []
Define.Settings.outputInfo = False
# 设置量子比特数量
qubit_num = 3
# 设置测量次数
shots = 10000
# 生成要传输量子态 seed(设为14)
np.random.seed(14)
# 生成3个随机的角度
angles = 2*np.pi*np.random.randn(3)
def main():
"""
main
"""
# 创建环境
env = QEnv()
# 选择随机数
seed = int(2147483647*np.random.random())
# 选择 Backend 为本地模拟器
env.backend(BackendName.LocalBaiduSim2, '-s ' + str(seed))
# 初始化全部量子比特
q = [env.Q[i] for i in range(qubit_num)]
# 制备量子态 |psi>
U(angles[0], angles[1], angles[2])(q[0])
# 测量结果
MeasureZ([q[0]], [0])
taskResult = env.commit(shots, fetchMeasure=True)
print("Shots", taskResult['shots'])
print("Counts", taskResult['counts'])
print("Seed", seed)
return taskResult['counts']
if __name__ == '__main__':
main()
代码输出:
Shots 10000
Counts {'1': 9755, '0': 245}
Seed 1101909748
隐形传态的代码如下:
def main():
"""
main
"""
# 创建环境
env = QEnv()
# 选择随机数
seed = int(2147483647*np.random.random())
# 选择 Backend 为本地模拟器
env.backend(BackendName.LocalBaiduSim2, '-s ' + str(seed))
# 初始化全部量子比特
q = [env.Q[i] for i in range(qubit_num)]
# 步骤 1:Alice 和 Bob之间制备纠缠态
H(q[1])
CX(q[1], q[2])
# 制备量子态 |psi>
U(angles[0], angles[1], angles[2])(q[0])
# 步骤 2:Alice 对持有的 q0 和 q1 进行操作
CX(q[0], q[1])
H(q[0])
# 步骤 3:Bob 进行操作复原量子态 |psi>
CZ(q[0], q[2])
CX(q[1], q[2])
# Bob 对他持有的量子比特 q2 进行测量
MeasureZ([q[2]], [2])
np.random.seed(None)
taskResult = env.commit(shots, fetchMeasure=True)
print("Shots", taskResult['shots'])
print("Counts", taskResult['counts'])
print("Seed", seed)
return taskResult['counts']
if __name__ == '__main__':
main()
代码输出:
Shots 10000
Counts {'1': 9743, '0': 257}
Seed 1127768719
习题 1. 请思考如果 Alice 和 Bob 在量子隐形传态开始前共享的量子态是 或者其他的贝尔态,该如何修改这个传输协议?
习题 2. 请思考怎么将量子隐形传态协议拓展到多比特的情况?
习题 3. 除了传输量子态,是否有可以类似的传输一个量子门操作呢?
[1] Bennett, Charles H, et al. "Teleporting an unknown quantum state via dual classical and Einstein-Podolsky-Rosen channels." Physical Review Letters 70.13 (1993): 1895.
[2] Bouwmeester, Dik, et al. "Experimental quantum teleportation." Nature 390.6660 (1997): 575-579.
[3] Peres, Asher. "What is actually teleported?." IBM Journal of Research and Development 48.1 (2004): 63-69.
最后更新时间:2021年12月20日