はじめに
Bell 状態 (Bell state) は2つの量子ビットが最大限に量子もつれ(エンタングルメント)した状態です。一方の量子ビットを測定すると、その測定結果と強く相関した結果がもう一方の量子ビットでも得られます。Bell 状態は量子テレポーテーションや量子通信など、多くの量子アルゴリズムで利用される基本的な量子状態です。
この状態について、IBM 社の Qiskit1 を用いて理解していきたいと思います。
Bell 状態とは
ベル状態 $ \ket{B_{00}} $ にある量子ビットの間には次のような相関があります。
量子ビットAを計算基底で測定した結果を0とすると、量子ビットBは $ \ket{0} $ の状態に決まり、量子ビットAを計算基底で測定した結果を1とすると、量子ビットBは $ \ket{1} $ の状態に決まります。BとAが逆でも成り立ちます。2
Bell 状態には4種類ありますが、今回は最も基本的な $\Phi^{+}$ を扱います。
\begin{align}
\ket {\Phi^{+}} = \frac {\ket{00} + \ket{11}}{\sqrt{2}}
\end{align}
ここで、
\begin{align}
\ket {00} = \begin{bmatrix}
1 \\
0 \\
0 \\
0
\end{bmatrix}
\end{align}
\begin{align}
\ket {11} = \begin{bmatrix}
0 \\
0 \\
0 \\
1
\end{bmatrix}
\end{align}
したがって
\begin{align}
\ket {\Phi^{+}} = \frac {1} {\sqrt{2}}\begin{bmatrix}
1 \\
0 \\
0 \\
1
\end{bmatrix}
\end{align}
になります。この状態では $\ket{00}$ と $\ket{11}$ が同じ振幅で重ね合わされています。
Qiskit で量子回路を作成
Qiskit は IBM が開発しているオープンソースの量子コンピューティング SDK です。量子回路の作成やシミュレーション、実機での実行などを行うことができます。
$ pip install qiskit
Qiskit で Bell 状態を生成する回路を作成します。
from qiskit import QuantumCircuit
import matplotlib.pyplot as plt
# 量子回路を作成
qc = QuantumCircuit(2)
# Bell状態を生成する回路
qc.h(0)
qc.cx(0, 1)
# 回路を表示
fig = qc.draw(output="mpl")
plt.show()
この回路では、初期状態 $ \ket{00} $ の第1量子ビットにアダマールゲートを適用し、$ \frac{\ket{00}+\ket{10}}{\sqrt{2}} $ としたのち、さらに CNOT ゲートを適用し $ \frac{\ket{00}+\ket{11}}{\sqrt{2}} $ の結果を得るものです。
実際にこの結果について、Statevector で確認してみます。Statevector は量子状態(状態ベクトル)を取得するためのクラスです。測定を行う前の量子状態をそのまま確認できます。
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
# Bell状態を生成する回路
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
sv = Statevector.from_instruction(qc)
print(sv)
結果は、以下のようになりました。
statevector([0.70710678+0.j,
0.+0.j,
0.+0.j,
0.70710678+0.j],
dims=(2, 2))
出力された4つの要素は、それぞれ
$\ket{00}$, $\ket{01}$, $\ket{10}$, $\ket{11}$
の振幅を表しています。
これは、先ほどの $\ket {\Phi^{+}}$ と一致しています。
\begin{align}
\ket {\Phi^{+}} = \frac {1} {\sqrt{2}}\begin{bmatrix}
1 \\
0 \\
0 \\
1
\end{bmatrix}
\end{align}
次に、1000回の試行で確認してみます。
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
# Bell状態を生成する回路
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
# 全量子ビットを測定
qc.measure_all()
# シミュレータを作成
simulator = AerSimulator()
# 1000回実行
job = simulator.run(qc, shots=1000)
result = job.result()
# 測定結果を取得
counts = result.get_counts()
print(counts)
結果は以下のようになります。 '00' と '11' が 50% の確率で観測され、'01' と '10' は観測されません。これは、Bell 状態が '00' または '11' のどちらかに決まるためです。
{'11': 493, '00': 507}
終わりに
今回は Qiskit を用いて Bell 状態を生成し、状態ベクトルと測定結果を確認しました。
- アダマールゲートと CNOT ゲートで Bell 状態を生成できた
- Statevector を用いることで測定前の量子状態を確認できた
- シミュレート結果は 00 と 11 のみが約50%ずつ観測され、Bell 状態の相関を確認できた
-
『量子コンピューティング 基本アルゴリズムから量子機械学習まで』(嶋田義浩著, 2020) ↩
