在 MindQuantum 中,如何根据对某个(些)量子比特的测量结果决定后续量子线路的执行
在量子算法中,有时需要根据某个(些)量子比特的测量结果决定是否执行后续量子线路,从而筛除掉一些不想要的分量。比如在 HHL 算法中,需要测量辅助比特
q
a
q_a
qa ,且其坍缩为 1
时,才能继续执行后续的逆傅里叶和逆相位估计的操作。
下面我们考虑一个简单的例子,来看一下如何在 MindQuantum 中实现该操作。
在此例子中,总的量子线路 circ
分为三部分 circ_0
、对 q0
的测量 和 circ_1
。其中,circ_0
和 circ_1
都是同样的贝尔态制备线路。分别作用在 q0
q1
和 q1
q2
上。当执行 circ_0
后,如果对 q0
的测量结果为 0
时,执行后续线路 circ_1
,否则不执行。
我们知道,由于量子比特初始状态都为
∣
0
⟩
|0\rangle
∣0⟩,所以在对 q0
进行测量之前,q1
和 q0
量子态为
(
∣
00
⟩
+
∣
11
⟩
)
/
2
(|00\rangle+|11\rangle)/\sqrt{2}
(∣00⟩+∣11⟩)/2。此时测量 q0
,如果其测量结果为 0
,则量子态坍缩到
∣
00
⟩
|00\rangle
∣00⟩;如果测量结果为 1
,则坍缩到
∣
11
⟩
|11\rangle
∣11⟩。当测量结果为 0
时,q1
的量子态为
∣
0
⟩
|0\rangle
∣0⟩,由于 q2
的状态也为
∣
0
⟩
|0\rangle
∣0⟩,再作用 circ_1
后,q2
和 q1
的量子态就变为了
(
∣
00
⟩
+
∣
11
⟩
)
/
2
(|00\rangle+|11\rangle)/\sqrt{2}
(∣00⟩+∣11⟩)/2。此时,对 q2
和 q1
进行测量,测量结果必同时为 0
或 同时为 1
。
- 注意:在 MindQuantum 中,量子态的表示是
little endian
的,也就是量子态与量子比特之间的映射关系为: ∣ q 2 q 1 q 0 ⟩ |q_2q_1q_0\rangle ∣q2q1q0⟩。
from mindquantum import *
sim = Simulator('mqvector',3)
circ_0 = Circuit()
circ_0 += H.on(0)
circ_0 += X.on(1,0)
circ_0 += BarrierGate()
circ_0 += Measure().on(0)
circ_0 += BarrierGate()
circ_1 = Circuit()
circ_1 += H.on(1)
circ_1 += X.on(2,1)
circ_1 += Measure().on(1)
circ_1 += Measure().on(2)
circ = circ_0 + circ_1
print('总的量子线路为:')
print(circ)
sim.apply_circuit(circ_0)
state = sim.get_qs(ket=True)
print('\nq0 的测量结果为:',state[-2])
if state[-2]=='0': # 量子态在 ket 形式下会以字符串显示为 '|q2q1q0>'。此时 state[-1] 为 '>',而 state[-2] 为 'q0'。
print('\n执行后续线路')
sim.apply_circuit(circ_1)
state = sim.get_qs(ket=True)
print('q1 的测量结果为:', state[-3])
print('q2 的测量结果为:', state[-4])
else:
print('\n不再执行后续线路')
总的量子线路为:
q0: ──H────●──‖──M(q0)──‖───────────────────
│ ‖ ‖
q1: ───────X──‖─────────‖──H────●────M(q1)──
‖ ‖ │
q2: ──────────‖─────────‖───────X────M(q2)──
q0 的测量结果为: 0
执行后续线路
q1 的测量结果为: 1
q2 的测量结果为: 1
多次运行上述程序,从结果可知,q2 和 q1 的测量结果始终相同(同时为 0
或 同时为 1
),效果符合预期。