10. 量子隐形传态#
接下来讲到的量子隐形传态需要用到贝尔态,让我们回顾一下,总共有四种贝尔态: $$
from mindquantum.core.circuit import Circuit
from mindquantum.core.gates import H, CNOT
from mindquantum.simulator import Simulator
import numpy as np
from IPython.display import display_svg
circ = Circuit()
circ += H.on(0)
circ += CNOT.on(1, 0)
display_svg(circ.svg())
sim = Simulator("mqvector", 2)
sim.set_qs(np.array([1, 0, 0, 0])) # set state to |00>
sim.apply_circuit(circ)
print(sim.get_qs(True))
√2/2¦00⟩
√2/2¦11⟩
量子隐形传态#

量子隐形传态的目的是将Alice手上的一个量子比特 \(|\psi\rangle\) 传送给Bob。由于量子不可克隆原理,事实上将摧毁A点的量子态,然后在B点重新生成。AB两点之间没有物质传送,但是共享一对贝尔态 \(|B_{00}\rangle\),可以传送经典信息(利用电磁波等)。
下面将一步步推导量子隐形传态的过程:
初始态如下所示: $\(|\psi_0\rangle = |\psi\rangle |B_{00}\rangle = \frac{1}{\sqrt{2}}\left(\alpha|0\rangle + \beta|1\rangle\right) \left( |0_A\rangle |0_B\rangle + |1_A\rangle |1_B\rangle \right)\)$
Alice对她拥有的两个量子比特作用CNOT: $\(|\psi_1\rangle = \alpha |0_A\rangle \frac{|0_A\rangle |0_B\rangle + |1_A\rangle |1_B\rangle}{\sqrt{2}} + \beta |1_A\rangle \frac{|1_A\rangle |0_B\rangle + |0_A\rangle |1_B\rangle}{\sqrt{2}}\)$
Alice对她拥有的第一个量子比特作用 H: $\(\begin{align*} |\psi_2\rangle & = \alpha \frac{|0_A\rangle + |1_A\rangle}{\sqrt{2}} \frac{|0_A\rangle |0_B\rangle + |1_A\rangle |1_B\rangle}{\sqrt{2}} + \beta \frac{|0_A\rangle - |1_A\rangle}{\sqrt{2}} \frac{|1_A\rangle |0_B\rangle + |0_A\rangle |1_B\rangle}{\sqrt{2}} \\ & = \frac{1}{2} |0_A 0_A\rangle \left( \alpha |0_B\rangle + \beta |1_B\rangle \right) + \frac{1}{2} |0_A 1_A\rangle \left( \alpha |1_B\rangle + \beta |0_B\rangle \right) \\ & + \frac{1}{2} |1_A 0_A\rangle \left( \alpha |0_B\rangle - \beta |1_B\rangle \right) + \frac{1}{2} |1_A 1_A\rangle \left( \alpha |1_B\rangle - \beta |0_B\rangle \right) \end{align*}\)$
Alice测量她手上的两个量子比特:
如果测量结果是“00”,那么Bob手上的量子比特就是 \(|\psi\rangle\);
如果测量结果是“01”,那么Bob对他手上的量子比特作用 X 门就得到了 \(|\psi\rangle\);
如果测量结果是“10”,那么Bob需要作用 Z 门;
如果测量结果是“11”,那么Bob需要先作用 X 门,再作用 Z 门。

from mindquantum.core.circuit import Circuit
from mindquantum.core.gates import H, CNOT, Measure, X, Z, BARRIER
from mindquantum.simulator import Simulator
from IPython.display import display_svg
import numpy as np
psi = np.random.rand(2)
psi = psi / np.linalg.norm(psi)
print(f"psi = {psi}")
bell = np.array([1, 0, 0, 1]) / np.sqrt(2)
init = np.kron(bell, psi)
sim = Simulator("mqvector", 3)
sim.set_qs(init)
circ = Circuit()
circ += CNOT.on(1, 0)
circ += H.on(0)
circ += BARRIER
circ += Measure("q0").on(0)
circ += Measure("q1").on(1)
display_svg(circ.svg())
res = sim.sampling(circuit=circ, shots=100)
display_svg(res.svg())
res = sim.apply_circuit(circ)
print(res)
# if measurement of q1 is 1, then apply X
if res.samples[0][res.keys_map['q1']] == 1:
sim.apply_gate(X.on(2))
# if measurement of q2 is 1, then apply Z
if res.samples[0][res.keys_map['q0']] == 1:
sim.apply_gate(Z.on(2))
print(sim.get_qs(True))
psi = [0.17310966 0.98490256]
shots: 1
Keys: q1 q0│0.00 0.2 0.4 0.6 0.8 1.0
───────────┼───────────┴───────────┴───────────┴───────────┴───────────┴
11│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
│
{'11': 1}
0.17310966¦011⟩
0.98490256¦111⟩
/var/folders/ms/k8tkmh4n6199kmzjr0z3nlhh0000gn/T/ipykernel_52586/3216541378.py:31: UserWarning: The variable `MeasureResult.samples` has been unified to little-endian order in version 0.10, which means the columns of the samples array have been reversed from the previous big-endian format. If you used this variable in version 0.9, please review and adjust your code carefully.
if res.samples[0][res.keys_map['q1']] == 1:
/var/folders/ms/k8tkmh4n6199kmzjr0z3nlhh0000gn/T/ipykernel_52586/3216541378.py:34: UserWarning: The variable `MeasureResult.samples` has been unified to little-endian order in version 0.10, which means the columns of the samples array have been reversed from the previous big-endian format. If you used this variable in version 0.9, please review and adjust your code carefully.
if res.samples[0][res.keys_map['q0']] == 1:
from show_info import InfoTable
InfoTable('mindquantum', 'numpy')
| Software | Version |
|---|---|
| mindquantum | 0.11.0 |
| numpy | 1.26.4 |
| System | Info |
| Python | 3.11.10 |
| OS | Darwin arm64 |
| Memory | 17.18 GB |
| CPU Max Thread | 10 |
| Date | Tue Sep 16 18:00:59 2025 |
习题#
Exercise 1#
请验证下面的线路对于所有可能的输入 \(q_0 = x, q_1 = y\) 能够生成对应的 \(B_{xy}\) 。
from mindquantum.core.circuit import Circuit
from mindquantum.core.gates import H, CNOT
from mindquantum.simulator import Simulator
import numpy as np
from IPython.display import display_svg
circ = Circuit()
circ += H.on(0)
circ += CNOT.on(1, 0)
display_svg(circ.svg())