qiskit学习——建立你的第一个量子算法:量子隐形传态

量子隐形传态简单实现

- 介绍

基于IBM Q Experience上的说明文档,有些部分可能会加上个人的理解,欢迎各位指正~

本篇文章演示量子隐形传态。我们首先使用Qiskit的内置模拟器来测试我们的量子电路,然后在一台真正的量子计算机上进行测试。

- 概念
Alice想把量子信息发送给Bob。具体地说,假设她想要发送状态|ψ ⟩ =α |0⟩ +β |1⟩ 给Bob。这需要传递关于α和β的信息给Bob。

Alice不能简单地生成一个|ψ ⟩ 的副本然后传送给Bob。复制状态只有在经典计算中生效。

然而,通过两个经典位和纠缠,Alice可以转换状态|ψ ⟩ 给Bob。

- 步骤

  1. Alice和Bob建立一个纠缠的Bell对,每人都有Bell对中的一个量子位(一共两个)。
    在量子电路语言中,在两个量子位之间建立Bell对的方法是首先将一个量子位通过Hadamard门转换成Bell基(|+⟩ and |−⟩),然后在另一个量子位上使用CNOT门(使用之前提到Bell基的那个量子位来控制)。
    假设Alice持有q1,Bob持有q2.

  2. Alice在q1上使用CNOT门,由|ψ ⟩控制。

  3. 接下来,Alice在|ψ ⟩上加一个H门,然后测量她拥有的bit。

  4. 然后和Bob建立联系。Alice告诉Bob这两个量子位测量的结果,根据结果Bob决定怎样处理q2:
    00 →Do nothing
    01 →Apply X gate
    10 →Apply Z gate
    11 → Apply ZX gate
    这种信息传递是经典的

如何在量子计算机上测试结果?

  1. 我们给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的情况。这是由于所应用的门的错误而引起的。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值