1
0

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 1 year has passed since last update.

量子フーリエ変換を開発する手順

Posted at

はじめに

量子フーリエ変換の行列は、古典フーリエ変換と同じです。
面倒なのは、この行列を量子ゲートに直す作業です。
今回、2量子ビットの量子フーリエ変換の行列をゲートに変換するソフトを作りましたので紹介します。

2量子ビットの量子フーリエ変換を行列で表記すると下記のようになります
qgmzu02.jpg

この行列を列ごとに表記すると下記のようになります。
qgmzu03.jpg

行列と余弦波との関係を図で表すと、下記のようになります。
この図は周期の異なる余弦波を並べたもので、古典フーリエ変換で使っているものと同じです。
qgmzu01.jpg

量子フーリエ変換が古典フーリエ変換よりも速い理由

下記の行列計算を従来の方法でやると下記のステップを順番に実行する必要があります。
下の図で、古典計算ではAの計算、Bの計算、Cの計算、Dの計算を順番に行います。
量子計算では複数の平行宇宙に置かれた計算機により、Aの計算、Bの計算、Cの計算、Dの計算を同時に行います。
つまり、量子計算が速いのは並列処理によるものです。
qgmzu04.jpg

量子ゲートメーカーを使った量子ゲートの作り方

量子ゲートメーカー(フリーソフト)はVectorからダウンロードしてください。
量子ゲートメーカーの説明ページ

初は分かりにくいと思いますが、とりあえず説明通りに実行してみてください。

初めに、制御ゲートだけ使い量子フーリエ変換ゲートを作ります

ターゲット行列をセット」ボタンを押します。
qgmzu05.jpg

QFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
qgmzu06.jpg

行列の列をクリックます。
qgmzu07.jpg

ゲート選択(L)」ボタンを押します。
qgmzu08.jpg

下記のような表示になります。
図の(1)は現時点のターゲット行列を表します。
赤色のセルの数値は0以外。
青色のセルは0を表します。
図(1)の実際の行列は図(4)です。
図(2)は選択された量子ゲートを表します。
図(5)には、この量子ゲートの逆行列が表示されます。
図(3)には、現時点で行った処理の一つ前のターゲット行列が表示されます。
行列の関係は、図(5)×図(4)=図(3)になります。
qgmzu10.jpg
qgmzu09.jpg

上記の操作に続けて、下記の図を見て番号順にクリックします。
qgmzu11.jpg

最終ゲート」ボタンを押します。
qgmzu12.jpg

実行」ボタンを押します。
qgmzu13.jpg

ターゲット行列を分解した全ゲートが表示されます。
qgmzu14.jpg

下記に全ゲートを表示しました。
右側は具体的なゲートです。
qgmzu16.jpg

ゲートを逆方向から連結していきます。
qgmzu17.jpg

qiskitで記述すると下記のようになります。

qc = QuantumCircuit(3,3)

qc.ccx(0,1,2)
----------------------- 7
qc.cu1(1/2*np.pi,0,1)
----------------------- 6
qc.cx(0,1)
qc.ch(0,1)
qc.cx(0,1)
qc.cu1(-1/2*np.pi,0,1)
qc.cz(2,1)
qc.cx(2,1)
----------------------- 5
qc.ch(1,0)
qc.cry(0.35,1,0)
----------------------- 4
qc.cx(0,1)
qc.cz(0,1)
----------------------- 3
qc.x(0)
qc.ch(0,1)
qc.cry(-0.52,0,1)
qc.x(0)
----------------------- 2
qc.x(1)
qc.ch(1,0)
qc.cry(-0.35,1,0)
qc.x(1)
----------------------- 1
qc.cx(0,1)
----------------------- 0
qc.x(1)
qc.ch(1,0)
qc.x(1)

結果
qgmzu18.jpg

計算結果は、行列の計算と一致します。
qgmzu19.jpg

以上のように、制御ゲートだけ使って量子フーリエ変換ゲートを作ると、回路が複雑になります。

次に、単一ゲートと制御ゲートを組み合わせて量子フーリエ変換ゲートを作ります

ターゲット行列をセット」ボタンを押します。
qgmzu05.jpg

QFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
qgmzu06.jpg

行列の列をクリックます。
qgmzu07.jpg

ゲート選択(L)」ボタンを押します。
qgmzu08.jpg

単一ゲートにする」ボタンを押します。
qgmzu20.jpg

ゲート行列を見ると、q0の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q1の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
qgmzu21.jpg

最終ゲート」ボタンを押します。
最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは列セルだけです。
デフォルトで「-i」と書かれているので、そのまま「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
qgmzu22.jpg

完成画面
qgmzu23.jpg

下記に全ゲートを表示しました。
右側は具体的なゲートです。
qgmzu24.jpg

ゲートを逆方向から連結していきます。
qgmzu25.jpg

qiskitで記述すると下記のようになります。

qc = QuantumCircuit(2,2)

qc.h(1)
qc.cu1(1/2*np.pi,0,1)
qc.h(0)

結果
qgmzu26.jpg

計算結果は、行列の計算と一致します。
qgmzu19.jpg

次に、逆量子フーリエ変換のゲートを作ります

量子フーリエ変換の逆行列が逆量子フーリエ変換になります。
下記のように、QFTの出力値をIQFTに入力すると、IQFTの出力値はQFTの入力値になります。
qgmzu27.jpg

この時点で、逆量子フーリエ変換のゲートは分かりますが、量子ゲートメーカーを使って逆量子フーリエ変換のゲートを作ってみます。

ターゲット行列をセット」ボタンを押します。
qgmzu05.jpg

IQFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
qgmzu28.jpg

行列の列をクリックます。
qgmzu29.jpg

ゲート選択(L)」ボタンを押します。
qgmzu30.jpg

単一ゲートにする」ボタンを押します。
qgmzu31.jpg

ゲート行列を見ると、q1の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q0の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
qgmzu32.jpg

最終ゲート」ボタンを押します。
最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは4行4列セルだけです。
-i」を「i」に書き換えて「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
qgmzu33.jpg

完成画面
qgmzu34.jpg

下記に全ゲートを表示しました。
右側は具体的なゲートです。
qgmzu35.jpg

ゲートを逆方向から連結していきます。
qgmzu36.jpg

QFTIQFTを連結すると、入力値と出力値が一致します。

QFTIQFTを連結した回路図。
qgmzu38.jpg

qiskitで記述すると下記のようになります。

qc = QuantumCircuit(2,2)

QFT
qc.h(1)
qc.cu1(1/2*np.pi,0,1)
qc.h(0)

IQFT
qc.h(0)
qc.cu1(-1/2*np.pi,0,1)
qc.h(1)

結果
qgmzu37.jpg

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?