この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回はグローバーのアルゴリズムを実装していきます。
グローバーのアルゴリズム
詳しい内容はここに書いてます。
今回は2量子ビットの実装を行います。
このアルゴリズムは重ね合わせ状態から欲しい状態をとることができるアルゴリズムです。
重ね合わせ状態は以下のようになります。
H\left|0\right>\otimes H\left|0\right>= \frac{1}{2}(\left|00\right>+\left|01\right>+\left|10\right>+\left|11\right>)
この各確率振幅が 1/4 の重ね合わせ状態を欲しいものだけ増加させて取り出すということをします。
今回は $\left|11\right>$ を取り出そうと思います。
まず始めに Oracle によって欲しい状態の振幅を反転させます。
今回は CZ ゲートを施せば $\left|11\right>$ のみ符号が反転します。
H\left|0\right>\otimes H\left|0\right> \xrightarrow{CZ} \frac{1}{2}(\left|00\right>+\left|01\right>+\left|10\right>-\left|11\right>)
振幅増幅によって欲しい状態の振幅を増加させます。
これは以下のゲートで書けます。
n量子ビットの場合の構成は詳しい内容の部分の補足に述べています。
(H\otimes H)(X\otimes X)CZ(X\otimes X)(H\otimes H)
これらをすることで $\left|11\right>$ が取り出せます。
回路の作成
回路は以下のようになります。
\begin{array}{cccccc}
\left|0\right> -&H&-&*&-&H&X&*&X&H&-\\
&&&|&&&&|&& \\
\left|0\right> -&H&-&Z&-&H&X&Z&X&H&-
\end{array}
始めの Hゲートは重ね合わせの作成です。
CZゲート は Oracle の部分です。
最後の塊は振幅増幅の部分になります。
実際に実装します。
from blueqat import Circuit
c = Circuit().h[:] # 重ね合わせ
c.cz[0,1] # Oracle
c.h[:].x[:].cz[0,1].x[:].h[:] # 振幅増幅
c.m[:].run(shots=1000)
出力
Counter({'11': 1000})
きちんと取れたことがわかります。
まとめ
今回はblueqatを用いてグローバーのアルゴリズムを実装しました。
次回は量子位相推定をblueqatで実装してみます。