3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

この記事に関して

ここでは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)

となります。

これを実装します。

sample.ipynb
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で実装してみます。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?