はじめに

量子位相推定は、あるユニタリ変換に対する固有値の位相を求めるためのアルゴリズムです。

U|ψ> = eiφ|ψ>

今回はとある状態ベクトルを入力として位相を小数で求めるアルゴリズムをBlueqatで実装します。


全体構成

位相推定アルゴリズムは2パートからなります。

前半のコントロールユニタリ変換のパートと、後半の逆量子フーリエ変換の部分です。量子フーリエ変換は以前確認をしましたので、

そちらの回路を利用します。

--H----*------F--

--H----|--*---F--
| |
--ψ----U--U------


前半回路

今回は2つの例題を取り上げてみたいと思います。

参考:IBMQ

https://quantumexperience.ng.bluemix.net/proxy/tutorial/full-user-guide/004-Quantum_Algorithms/100-Quantum_Phase_Estimation.html

2量子ビットからなる簡単な回路です。

--H--*--H--

--H--X-----

入力は2量子ビット目にあります。

この場合にはHゲートをかけて、[1,1]の状態を用意します。

ユニタリ変換としてCXを用意しました。こちらは、コントロールユニタリ変換として、

X=[[0,1],[1,0]]のユニタリ変換を使います。

求めたいものは、X=[[0,1],[1,0]]のユニタリ変換と[1,1]の固有ベクトルから固有値の位相を求めたいです。

解析的に解くと、固有値は1となりますので、位相は0となるはずです。

重ね合わせを作ってCXを適用し、逆フーリエ変換をかけますが、1量子ビットの場合はアダマールゲートと同じです。

出てくる位相は、

0.φ * 2π

と小数点表記で得られますが、φは0のはずなので最終的に0が出てくるはずです。

こちらを実行すると、

from blueqat import Circuit                                             

c = Circuit().h[:].cx[0,1].h[0].m[:]
c.run()
array([0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j])

c.last_result()
(0, 1)

よって、測定は0をとりますので、位相が正しく取れました。0.0なので0になります。

続いて下記のような回路を見てみます。

下記の回路は、HZによって準備される状態は、

[1,-1]となります。

求めたいものは、X=[[0,1],[1,0]]のユニタリ変換と[1,-1]の固有ベクトルから固有値の位相を求めたいです。

解析的に解くと、固有値は-1となりますので、位相はπとなるはずです。

出てくる位相は、

0.φ * 2π

と小数点表記で得られますが、φは5のはずなので最終的に1が出てくるはずです。

--H-----*--H--

--H--Z--X-----

こちらを実行して、

c = Circuit().h[:].z[1].cx[0,1].h[0].m[:]                               

c.run()
array([0.-0.j, 0.-0.j, 0.-0.j, 1.+0.j])

c.last_result()
(1, 1)

よって、測定は1をとりますので、位相が正しく取れました。0.5なので-1になります。

このように用意された、もしくは作り出した量子状態とユニタリ変換から量子回路で位相を取り出すことができました。

以上です。