量子テレポーテーションの回路を作成
前回までで、
\big[ \ket{\psi} \otimes \ket{\Phi}^{+} \big]
を準備しました。
今回は、量子テレポーテーションの回路を作成します。
量子テレポーテーションでは、Alice が持つ2つの量子ビット
- q0 : 転送したい量子状態
- q1 : Bell 状態の Alice 側
に対して操作を行い、その結果を Bob へ送ります。
Bob はその結果に応じて、自分の量子ビット q2 に補正操作を行います。
まず、 Alice 側で Bell 測定の準備をします。
qc.cx(0, 1)
qc.h(0)
qc.barrier()
q0をコントロール量子ビットとした CNOT ゲートを適用し、q0に Hadamard ゲートを適用しています。これにより、q0とq1の情報は通常の計算基底で測定できる形に変換されます。
次に、Alice はq0, q1 を測定します。
# Aliceがq0とq1を測定する
qc.measure(0, 0)
qc.measure(1, 1)
qc.barrier()
測定結果は古典ビットに保存されます。
q0の測定結果 → c0
q1の測定結果 → c1
量子テレポーテーションでは、この2ビットの古典情報を Bob へ送ります。Bob は受け取った測定結果に応じて、q2に補正操作を行います。
# Aliceの測定結果に応じてBob側のq2を補正する
with qc.if_test((0, 1)):
qc.z(2)
with qc.if_test((1, 1)):
qc.x(2)
qc.barrier()
ここでは、
- c0 が 1 のとき、q2 に Zゲートを適用する
- c1 が 1 のとき、q2 に Xゲートを適用する
という条件付き操作を行っています。
この補正によって、Bobの量子ビット q2 は、Aliceが最初に持っていた量子状態 $[\ket{\psi}]$ になります。最後に、q2を測定して確認します。
# Bob側の量子ビットを測定する
qc.measure(2, 2)
ここまでをまとめると以下のようになります。
Alice のq0は測定によって失われるため、「量子状態がコピーされている」というわけではなく、転送されているという点がテレポーテーションとして重要です。
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
q = QuantumRegister(3, "q")
c = ClassicalRegister(3, "c")
qc = QuantumCircuit(q, c)
# 1. q0に転送したい量子状態 |+> を準備
qc.h(q[0])
qc.barrier()
# 2. q1とq2でBell状態を生成
qc.h(q[1])
qc.cx(q[1], q[2])
qc.barrier()
# 3. Alice側のBell測定の準備
qc.cx(q[0], q[1])
qc.h(q[0])
qc.barrier()
# 4. Aliceがq0とq1を測定
qc.measure(q[0], c[0])
qc.measure(q[1], c[1])
qc.barrier()
# 5. Aliceの測定結果に応じてBob側のq2を補正
with qc.if_test((c[0], 1)):
qc.z(q[2])
with qc.if_test((c[1], 1)):
qc.x(q[2])
qc.barrier()
# 6. Bob側の量子ビットを測定
qc.measure(q[2], c[2])
print(qc.draw())
