量子隐形传态简单实现
- 介绍
基于IBM Q Experience上的说明文档,有些部分可能会加上个人的理解,欢迎各位指正~
本篇文章演示量子隐形传态。我们首先使用Qiskit的内置模拟器来测试我们的量子电路,然后在一台真正的量子计算机上进行测试。
- 概念
Alice想把量子信息发送给Bob。具体地说,假设她想要发送状态|ψ
⟩
=α
|0⟩
+β
|1⟩
给Bob。这需要传递关于α和β的信息给Bob。
Alice不能简单地生成一个|ψ ⟩ 的副本然后传送给Bob。复制状态只有在经典计算中生效。
然而,通过两个经典位和纠缠,Alice可以转换状态|ψ ⟩ 给Bob。
- 步骤
-
Alice和Bob建立一个纠缠的Bell对,每人都有Bell对中的一个量子位(一共两个)。
在量子电路语言中,在两个量子位之间建立Bell对的方法是首先将一个量子位通过Hadamard门转换成Bell基(|+⟩ and |−⟩),然后在另一个量子位上使用CNOT门(使用之前提到Bell基的那个量子位来控制)。
假设Alice持有q1,Bob持有q2. -
Alice在q1上使用CNOT门,由|ψ ⟩控制。
-
接下来,Alice在|ψ ⟩上加一个H门,然后测量她拥有的bit。
-
然后和Bob建立联系。Alice告诉Bob这两个量子位测量的结果,根据结果Bob决定怎样处理q2:
00 →Do nothing
01 →Apply X gate
10 →Apply Z gate
11 → Apply ZX gate
这种信息传递是经典的
如何在量子计算机上测试结果?
- 我们给Alice一个秘密的状态(secret state)|ψ⟩
这个状态是在初始化为基态|0⟩的量子位元上应用一系列幺正门来生成的。继续,在把量子位传递给Alice之前,填入将应用于|0⟩的秘密酉(secret unitary)。
然后我们将对Bob的量子位元进行重复测量,看看它给出0和1的次数。
期望结果
在理想情况下,假设我们的传送协议有效,我们总是从Bob的量子位开始测量0因为我们从 |0⟩开始。
在真正的量子计算机中,门的误差会导致一小部分结果为1。我们来看看效果如何。
1. 模拟传输协议
import qiskit as qk
from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit
from qiskit import execute, Aer
from qiskit import IBMQ
from qiskit.tools.visualization import plot_histogram
# 从给定的字符串应用一系列的幺正门
secret_unitary = 'hz'
def apply_secret_unitary(secret_unitary, qubit, quantum_circuit, dagger):
functionmap = {
'x':quantum_circuit.x,
'y':quantum_circuit.y,
'z':quantum_circuit.z,
'h':quantum_circuit.h,
't':quantum_circuit.t,
}
if dagger:
functionmap['t'] = quantum_circuit.tdg
if dagger:
[functionmap[unitary](qubit) for unitary in secret_unitary]
else:
[functionmap[unitary](qubit) for unitary in secret_unitary[::-1]]
# 创建量子电路,3bit
q = QuantumRegister(3)
c = ClassicalRegister(3)
qc = QuantumCircuit(q, c)
''' 量子位顺序如下(经典寄存器只包含相应量子位的测量值):
q[0]: 要传送的量子位元(Alice的第一个量子位元。这是在她申请了一个她不知道的秘密单位之后给她的)
q[1]: Alice's 的第二个量子位
q[2]: Bob的量子位元,传送的目的地
'''
# 应用我们用来生成状态的秘密酉到传送。你可以把它换成任何一元的
apply_secret_unitary(secret_unitary, q[0], qc, dagger = 0)
qc.barrier()
# 接下来,生成Alice和Bob之间的纠缠对(记住:Hadamard后面跟着CX生成一个Bell对)
qc.h(q[1])
qc.cx(q[1], q[2])
qc.barrier()
# 应用传输协议
qc.cx(q[0], q[1])
qc.h(q[0])
qc.measure(q[0], c[0])
qc.measure(q[1], c[1])
qc.cx(q[1], q[2])
qc.cz(q[0], q[2])
qc.barrier()
'''
原则上如果传输协议有效,有q[2] = secret_unitary|0>
我们应该可以通过秘密酉的转换来恢复q[2] = |0>
因为unitary u, u^dagger u = I.
'''
apply_secret_unitary(secret_unitary, q[2], qc, dagger=1)
qc.measure(q[2], c[2])
qc.draw(output='mpl')
backend = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend, shots=1024)
sim_result = job_sim.result()
measurement_result = sim_result.get_counts(qc)
print(measurement_result)
plot_histogram(measurement_result)
注意,上面直方图中x轴上的结果按c2c1c0的顺序排列。我们可以看到只有当c2 = 0时才会出现结果,这表明远程传送协议已经工作。
- 利用真实量子计算机进行传输
# get the least-busy backend at IBM and run the quantum circuit there
IBMQ.load_accounts()
from qiskit.providers.ibmq import least_busy
backend = least_busy(IBMQ.backends(simulator=False))
job_exp = execute(qc, backend=backend, shots=8192)
exp_result = job_exp.result()
exp_measurement_result = exp_result.get_counts(qc)
print(exp_measurement_result)
plot_histogram(exp_measurement_result)
正如我们上面看到的,大多数结果都是针对c2 = 0的情况。然而,有一些结果包含了真实量子计算机中c2 = 1的情况。这是由于所应用的门的错误而引起的。