@yuichirominato 2018.11.17更新 57views

Blueqatで量子フーリエ変換の実装

Blueqat アダマール変換 量子ゲート 量子コンピュータ 量子フーリエ変換

はじめに

以前簡単に量子フーリエ変換の仕組みを見ました。
再帰的に計算を行い、計算量を減らすというのが肝です。
また、実機の搭載はまだ先のようで、任意回転角のコントロール回路が必要なので、その辺りも確認してみたいと思います。

参考資料

下記のような以前量子フーリエ変換を扱ったものや、コントロールユニタリーゲートの実装あたりを使います。

量子フーリエ変換
http://blog.mdrft.com/post/39
トフォリゲートとコントロールユニタリーゲートの実機実装について
http://blog.mdrft.com/post/339

早速実装N=2

N=2の量子フーリエ変換回路は、


--H--Rz2-----
-----*----H--

Blueqatのコードで書くと、コントロール回転ゲートは、


--H----Rz(lambda/2)--X--Rz(-lambda/2)--X------
                     |                 |
---------------------*-----------------*---H--

lambdaにはmath.pi/2をいれます。


from blueqat import Circuit
import math
Circuit().x[0].x[1].h[0].rz(math.pi/4)[0].cx[1,0].rz(-math.pi/4)[0].cx[1,0].h[1].run()

array([ 5.00000000e-01+0.j , -8.32667268e-17-0.5j, -5.00000000e-01+0.j ,
        8.32667268e-17+0.5j])

前回の結果と比べてみますと、同じになってるのが確認できます。


print(1/2*np.array([[1,1,1,1],[1,1j,-1,-1j],[1,-1,1,-1],[1,-1j,-1,1j]])@np.array([0,0,0,1]))                                                                 
[ 0.5+0.j   0. -0.5j -0.5+0.j   0. +0.5j]

つぎに3量子ビット

次に3量子ビットを行なってみます。


--H--Rz2--Rz3-------------
-----*----|----H--Rz2-----
----------*-------*----H--

Blueqatでは、


Circuit().x[:].h[0].rz(math.pi/4)[0].cx[1,0].rz(-math.pi/4)[0].cx[1,0].rz(math.pi/8)[0].cx[2,0].rz(-math.pi/8)[0].cx[2,0].h[1].rz(math.pi/4)[1].cx[2,1].rz(-math.pi/4)[1].cx[2,1].h[2].run()                                                                                        

array([ 3.53553391e-01+1.38777878e-17j,  2.50000000e-01-2.50000000e-01j,
       -6.93889390e-17-3.53553391e-01j, -2.50000000e-01-2.50000000e-01j,
       -3.53553391e-01-1.38777878e-17j, -2.50000000e-01+2.50000000e-01j,
        6.93889390e-17+3.53553391e-01j,  2.50000000e-01+2.50000000e-01j])

最後に4量子ビット

最後に4量子ビットでやってみます。


--H--Rz2--Rz3--Rz4--------------------------
-----*----|----|----H--Rz2--Rz3-------------
----------*----|-------*----|----H--Rz2-----
---------------*------------*-------*----H--

Blueqatでは、


Circuit().x[:].h[0].rz(math.pi/4)[0].cx[1,0].rz(-math.pi/4)[0].cx[1,0].rz(math.pi/8)[0].cx[2,0].rz(-math.pi/8)[0].cx[2,0].rz(math.pi/16)[0].cx[3,0].rz(-math.pi/16)[0].cx[3,0].h[1].rz(math.pi/4)[1].cx[2,1].rz(-math.pi/4)[1].cx[2,1].rz(math.pi/8)[1].cx[3,1].rz(-math.pi/8)[1].cx[3,1].h[2].rz(math.pi/4)[2].cx[3,2].rz(-math.pi/4)[2].cx[3,2].h[3].run()                                                                    

array([ 2.50000000e-01+6.93889390e-18j,  2.30969883e-01-9.56708581e-02j,
        1.76776695e-01-1.76776695e-01j,  9.56708581e-02-2.30969883e-01j,
       -5.55111512e-17-2.50000000e-01j, -9.56708581e-02-2.30969883e-01j,
       -1.76776695e-01-1.76776695e-01j, -2.30969883e-01-9.56708581e-02j,
       -2.50000000e-01-6.93889390e-18j, -2.30969883e-01+9.56708581e-02j,
       -1.76776695e-01+1.76776695e-01j, -9.56708581e-02+2.30969883e-01j,
        5.55111512e-17+2.50000000e-01j,  9.56708581e-02+2.30969883e-01j,
        1.76776695e-01+1.76776695e-01j,  2.30969883e-01+9.56708581e-02j])

numpyのfftでも確認してみました。元の定義の符号がFFTとQFTが異なっているので、共役をとっています。


print(np.fft.fft(np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1])/4).conj())                                 
[ 0.25      -0.j          0.23096988-0.09567086j  0.1767767 -0.1767767j
  0.09567086-0.23096988j  0.        -0.25j       -0.09567086-0.23096988j
 -0.1767767 -0.1767767j  -0.23096988-0.09567086j -0.25      -0.j
 -0.23096988+0.09567086j -0.1767767 +0.1767767j  -0.09567086+0.23096988j
  0.        +0.25j        0.09567086+0.23096988j  0.1767767 +0.1767767j
  0.23096988+0.09567086j]

以上でblueqatで実装ができました。

あわせて読みたい

SERVICE

汎用量子コンピュータ向けアプリケーション開発SDK

詳しく見る Githubで入手する(無料)

汎用量子コンピュータ向け高速シミュレータ

詳しく見る

量子コンピュータ向けクラウドサービス(準備中)

詳しく見る

イジングマシン向けアプリケーション開発SDK

詳しく見る Githubで入手する(無料)

COMMUNITY

量子コンピュータのことを学びたい、仕事としたいなどの情報交換の場を設け、コミュニティの形成を進めています。オフラインの勉強会と、オンラインのチャットコミュニティの2種類あります。オフラインのConnpassは1400名、オンラインのSlackは880名を超える参加があります。どちらも無料ですのでお気軽にご参加ください。

CONNPASS SLACK

CONTACT

弊社あての連絡はinfo@mdrft.comより用件を明記の上、メールで連絡を頂けますと幸いです。

ブログトップに戻る

Recent Posts