この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回は量子位相推定(Quantum phase estimation)を実装していきます。
量子位相推定
詳しい理論はここに述べています。
ユニタリ行列の固有値を求めるアルゴリズムです。
ユニタリ行列を $U$ 固有ベクトルを $\left|u\right>$ とおくと、
U\left|u\right> = e^{2\pi i0.j_1\cdots j_n}\left|u\right> \\
\left(0.j_1\cdots j_n = \frac{j_1}{2^1} + \cdots + \frac{j_n}{2^n}\right)
となります。
ここで以下の状態を考えると逆量子フーリエ変換で $j_1\cdots j_n$ を求めることができます。
量子フーリエ変換についてはここに述べています。
\frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_1\cdots j_n}\left|1\right>\right)\otimes \frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_2\cdots j_n}\left|1\right>\right)\otimes \cdots\otimes \frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_n}\left|1\right>\right) \xrightarrow{QFT^{-1}} j \\
(j = j_1\cdots j_n)
j は2進数表示です。
回路の作成
以下のような回路で実装できます。
\begin{array}{cc}
\left|0\right>&-&H&-&*&-&\cdots&-&-&-&|&&|&-&←j_1 \\
\left|0\right>&-&H&-&|&*&\cdots&-&-&-&|&&|&-&←j_2 \\
\vdots&&\vdots&&\vdots&\vdots&&&&&\vdots&\Large{QFT^{-1}}&|&\vdots&\vdots \\
\left|0\right>&-&H&-&|&|&\cdots&*&-&-&|&&|&-&←j_{n-1} \\
\left|0\right>&-&H&-&|&|&\cdots&|&*&-&|&&|&-&←j_n \\
&&&&|&|&&|&|\\
\left|u\right>&-&-&-&U&U^2&\cdots&U^{2^{n-2}}&U^{2^{n-1}}&-&-&-&-&- \\
\end{array}
実装
今回は $U = U_1(\lambda)$ を考えます。
固有値は $1, e^{i\lambda}$ となり、今回は $e^{i\lambda}$ を求めようと思います。
このとき固有ベクトルは ${}^t(0,1)$ なので、$\left|u\right>$ は
\left|u\right> = \left(\begin{array}{c}0\\1\end{array}\right) = \left|1\right> = X\left|0\right>
と Xゲートで作れます。
$\lambda = \pi/4$ を考えます。
$\pi/4 = 2\pi 0.001$ より 3量子ビット使います。
今回の回路は以下のようになります。
\begin{array}{cc}
\left|0\right>&-&H&-&*&-&-&-&-&-&-&R_3^{\dagger}&R_2^{\dagger}&H&-&←j_1 \\
\left|0\right>&-&H&-&|&*&-&-&-&R_2^{\dagger}&H&|&*&-&-&←j_2 \\
\left|0\right>&-&H&-&|&|&*&-&H&*&-&*&-&-&-&←j_3 \\
&&&&|&|&|&\\
\left|1\right>&-&-&-&U&U^2&U^4&-&-&-&-&-&-&-&- \\
\end{array}
後半は QFT^-1 となります。
$R_n^{\dagger}$ については
R_n^{\dagger} = \left(\begin{array}{cc} 1&0\\ 0&e^{-\frac{2\pi i}{2^n}}\end{array}\right)
となります。
これを実装します。
from blueqat import Circuit
import math
# 前半の回路の作成
c = Circuit().h[0,1,2].x[3] # 重ね合わせ & u の作成
c.cu1(math.pi/4)[0,3] # U^1
c.cu1(math.pi/4)[1,3].cu1(math.pi/4)[1,3] # U^2
c.cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3] # U^4
# QFT^-1
qft_inverse = Circuit().h[2]
qft_inverse.cu1(-math.pi/2)[2,1].h[1]
qft_inverse.cu1(-math.pi/4)[2,0].cu1(-math.pi/2)[1,0].h[0]
# 回路の結合
c = c+qft_inverse
# 観測
c.m[:].run(shots=1000)
結果
Counter({'0011': 1000})
0011 が取れたので $j_1 = 0,\ j_2 = 0,\ j_3 = 1$ から 0.001 が求められました。
まとめ
今回はblueqatを用いて量子位相推定を実装しました。
次回はVQEをblueqatで実装してみます。