はじめに
量子フーリエ変換の行列は、古典フーリエ変換と同じです。
面倒なのは、この行列を量子ゲートに直す作業です。
今回、2量子ビットの量子フーリエ変換の行列をゲートに変換するソフトを作りましたので紹介します。
2量子ビットの量子フーリエ変換を行列で表記すると下記のようになります
行列と余弦波との関係を図で表すと、下記のようになります。
この図は周期の異なる余弦波を並べたもので、古典フーリエ変換で使っているものと同じです。
量子フーリエ変換が古典フーリエ変換よりも速い理由
下記の行列計算を従来の方法でやると下記のステップを順番に実行する必要があります。
下の図で、古典計算ではAの計算、Bの計算、Cの計算、Dの計算を順番に行います。
量子計算では複数の平行宇宙に置かれた計算機により、Aの計算、Bの計算、Cの計算、Dの計算を同時に行います。
つまり、量子計算が速いのは並列処理によるものです。
量子ゲートメーカーを使った量子ゲートの作り方
量子ゲートメーカー(フリーソフト)はVectorからダウンロードしてください。
量子ゲートメーカーの説明ページ
初は分かりにくいと思いますが、とりあえず説明通りに実行してみてください。
初めに、制御ゲートだけ使い量子フーリエ変換ゲートを作ります
「QFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
下記のような表示になります。
図の(1)は現時点のターゲット行列を表します。
赤色のセルの数値は0以外。
青色のセルは0を表します。
図(1)の実際の行列は図(4)です。
図(2)は選択された量子ゲートを表します。
図(5)には、この量子ゲートの逆行列が表示されます。
図(3)には、現時点で行った処理の一つ前のターゲット行列が表示されます。
行列の関係は、図(5)×図(4)=図(3)になります。
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)
以上のように、制御ゲートだけ使って量子フーリエ変換ゲートを作ると、回路が複雑になります。
次に、単一ゲートと制御ゲートを組み合わせて量子フーリエ変換ゲートを作ります
「QFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
ゲート行列を見ると、q0の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q1の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
「最終ゲート」ボタンを押します。
「最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは4行4列セルだけです。
デフォルトで「-i」と書かれているので、そのまま「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
qiskitで記述すると下記のようになります。
qc = QuantumCircuit(2,2)
qc.h(1)
qc.cu1(1/2*np.pi,0,1)
qc.h(0)
次に、逆量子フーリエ変換のゲートを作ります
量子フーリエ変換の逆行列が逆量子フーリエ変換になります。
下記のように、QFTの出力値をIQFTに入力すると、IQFTの出力値はQFTの入力値になります。
この時点で、逆量子フーリエ変換のゲートは分かりますが、量子ゲートメーカーを使って逆量子フーリエ変換のゲートを作ってみます。
「IQFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
ゲート行列を見ると、q1の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q0の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
「最終ゲート」ボタンを押します。
「最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは4行4列セルだけです。
「-i」を「i」に書き換えて「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
QFTとIQFTを連結すると、入力値と出力値が一致します。
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)