LoginSignup
4
1

More than 3 years have passed since last update.

blueqatで量子もつれ(entanglement)

Last updated at Posted at 2019-12-05

この記事に関して

ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回は量子もつれ(entanglement)を実装します。

量子もつれとは

前回は $\left|+\right>,\left|-\right>$ を考えました。今回は2量子ビットの以下の値を考えてみます。

\frac{1}{2}\left(\left|00\right>+\left|01\right>+\left|10\right>+\left|11\right>\right),
\frac{1}{\sqrt2}\left(\left|00\right>+\left|11\right>\right),(\left|00\right> = \left|0\right>\otimes\left|0\right>)

左の状態は純粋状態のテンソル積で $\left|+\right>\otimes \left|+\right>$ と表せます。
では右の状態はどうでしょう、手を動かせばわかりますがこれは純粋状態のテンソル積でかけません。

このように2つの状態が絡み合っている状態を量子もつれ(emtaglement)と言います。

量子もつれの利点は情報の絞りこみを行うことができる点にあります。
たくさんの組み合わせのビットをうまく絞りこむことで欲しい状態の確率を引き上げることができます。

回路の作成

今回は Hゲートと CXゲートを使います。
$\left|+\right>\otimes\left|0\right>$ にCXを施すことで作られます。

H\left|0\right>\otimes\left|0\right> = \frac{1}{\sqrt2}(\left|00\right>+\left|10\right>)\xrightarrow{CX}\frac{1}{\sqrt2}(\left|00\right>+\left|11\right>)

実装

上の状態を実装してみます。

sample.ipynb
from blueqat import Circuit

c = Circuit(2).h[0].cx[0,1]
c.m[:].run(shots=1000)

結果
Counter({'11': 474, '00': 526})

00 と 11 が約50%で取れていることがわかります。

GZH状態 (3量子ビットもつれ)

3量子ビットのもつれとしてGHZ状態というのがあります。
まずは値から

\frac{1}{\sqrt2}(\left|000\right>-\left|111\right>)

もつれてますね。

値の導出は言葉では難しいので以下に式を述べます。

\begin{array}{ll}
\left|0\right>\otimes\left|0\right>\otimes\left|0\right>&\xrightarrow{H\otimes H\otimes X}
&\left|+\right>\otimes\left|+\right>\otimes\left|1 \right>\\
&\xrightarrow{CX[1,2]}
&\left|+\right>\otimes\frac{1}{\sqrt2}(\left|01\right>+\left|10\right>) = 
\frac{1}{2}(\left|001\right>+\left|010\right>+\left|101\right>+\left|110\right>)\\
&\xrightarrow{CX[0,2]}&\frac{1}{2}(\left|001\right>+\left|010\right>+\left|100\right>+\left|111\right>)
\\
&\xrightarrow{H\otimes H\otimes H}
&\frac{1}{\sqrt2}(\left|000\right>-\left|111\right>)
\end{array}

(最後の計算はかなり省略していますが成り立ちます。)

実装

上の状態を実装してみます。
[:2]とは上から2つのビットにゲートを施し、
[:]とは指定したビット全てにゲートを施すことを意味します。

sample.ipynb
from blueqat import Circuit

c = Circuit(3).h[:2].x[2].cx[1,2].cx[0,2].h[:]
c.m[:].run(shots=1000)

結果
Counter({'111': 496, '000': 504})

000 と 111 が約50%で取れていることがわかります。

まとめ

今回はblueqatを用いて量子もつれ(entanglement)を実装しました。
次回は様々な量子ゲートを実装してみます。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1