量子ゲートメーカーの取り扱い説明書
量子ゲートメーカーは、2量子ビットの行列から、量子ゲートを作るツールです。
ソフトの使い方を、量子フーリエ変換(QFT)と逆量子フーリエ変換(IQFT)を例にして説明します。
2量子ビットの量子フーリエ変換を行列で表記すると下記のようになります。
この行列を列ごとに表記すると下記のようになります。
行列と余弦波との関係を図で表すと、下記のようになります。
この図は周期の異なる余弦波を並べたもので、古典フーリエ変換で使っているものと同じです。
<量子フーリエ変換が古典フーリエ変換よりも速い理由>
下記の行列計算を従来の方法でやると下記のステップを順番に実行する必要があります。
下の図で、古典計算ではAの計算、Bの計算、Cの計算、Dの計算を順番に行います。
量子計算では複数の平行宇宙に置かれた計算機により、Aの計算、Bの計算、Cの計算、Dの計算を同時に行います。
つまり、量子計算が速いのは並列処理によるものです。
量子ゲートメーカーを使った量子ゲートの作り方
最初は分かりにくいと思いますが、とりあえず説明通りに実行してみてください。
●初めに、制御ゲートだけ使い量子フーリエ変換ゲートを作ります
「ターゲット行列をセット」ボタンを押します。
「QFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
行列の3行1列をクリックます。
「ゲート選択(L)」ボタンを押します。
下記のような表示になります。
図の(1)は現時点のターゲット行列を表します。
赤色のセルの数値は0以外。
青色のセルは0を表します。
図(1)の実際の行列は図(4)です。
図(2)は選択された量子ゲートを表します。
図(5)には、この量子ゲートの逆行列が表示されます。
図(3)には、現時点で行った処理の一つ前のターゲット行列が表示されます。
行列の関係は、図(5)×図(4)=図(3)になります。
上記の操作に続けて、下記の図を見て番号順にクリックします。
「最終ゲート」ボタンを押します。
「実行」ボタンを押します。
ターゲット行列を分解した全ゲートが表示されます。
下記に全ゲートを表示しました。
右側は具体的なゲートです。
ゲートを逆方向から連結していきます。
qiskitで記述すると下記のようになります。
qc = QuantumCircuit(3,3)
#input
qc.x(0)
qc.x(1)
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セット」ボタンを押し、「決定して閉じる」ボタンを押します。
行列の3行1列をクリックます。
「ゲート選択(L)」ボタンを押します。
「単一ゲートにする」ボタンを押します。
ゲート行列を見ると、q0の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q1の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
「最終ゲート」ボタンを押します。
「最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは4行4列セルだけです。
デフォルトで「-i」と書かれているので、そのまま「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
完成画面。
下記に全ゲートを表示しました。
右側は具体的なゲートです。
ゲートを逆方向から連結していきます。
qiskitで記述すると下記のようになります。
qc = QuantumCircuit(2,2)
#input
qc.x(0)
qc.x(1)
qc.h(1)
qc.cu1(1/2*np.pi,0,1)
qc.h(0)
#結果
計算結果は、行列の計算と一致します。
次に、逆量子フーリエ変換のゲートを作ります
量子フーリエ変換の逆行列が逆量子フーリエ変換になります。
下記のように、QFTの出力値をIQFTに入力すると、IQFTの出力値はQFTの入力値になります。
この時点で、逆量子フーリエ変換のゲートは分かりますが、量子ゲートメーカーを使って逆量子フーリエ変換のゲートを作ってみます。
「ターゲット行列をセット」ボタンを押します。
「IQFTセット」ボタンを押し、「決定して閉じる」ボタンを押します。
行列の2行1列をクリックます。
「ゲート選択(L)」ボタンを押します。
「単一ゲートにする」ボタンを押します。
ゲート行列を見ると、q1の単一アダマールゲートだと分かります。
ターゲット行列を見ると、q0の単一アダマールゲートに回転ゲートを組み合わせたものだと分かります。
「最終ゲート」ボタンを押します。
「最終ゲート」では、制御回転ゲートを作ります。
エディット出来るのは4行4列セルだけです。
「-i」を「i」に書き換えて「実行」ボタンを押します。
これで、アダマールゲートと回転ゲートを分離することができます。
完成画面。
下記に全ゲートを表示しました。
右側は具体的なゲートです。
ゲートを逆方向から連結していきます。
QFTとIQFTを連結すると、入力値と出力値が一致します。
QFTとIQFTを連結した回路図。
qiskitで記述すると下記のようになります。
qc = QuantumCircuit(2,2)
#input
qc.x(0)
qc.x(1)
#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)
#結果
詳しい説明
■ソフトを起動したら「ターゲット行列をセット」ボタンを押します。
■「ターゲット行列をセット」画面
ここには分解する行列をセットします。
行列はユニタリでなければなりません。
なぜなら、量子コンピュータで使われる行列は、全てユニタリである必要があるからです。
「量子フーリエ変換(QFT)」か「逆量子フーリエ変換(IQFT)」をセットする場合はボタンで選択できます。
行列をセットしたら「決定して閉じる」を押します。
(「行列を開く」と「行列を保存」のボタン操作は、ここでセットした行列が対象です)
■行列の分解は、左下の部分を0にすることで行います。
クリック可能なセルは下図の6か所になります。
クリックしたセルは緑色に変わります。
ゲートを選択すると、このセルの値は0になり、色は青に変わります。
選択するゲートにより、0になるセルの位置と個数が異なります。
■ターゲット行列がユニタリでない場合
ユニタリでない行列をターゲットとしてセットするとエラーになります。
意図的にエラーを作って動作を確認します。
下図の番号に従って操作してください。
1. 「ターゲット行列をセット」ボタンを押します。
2. 「QFTセット」ボタンを押します。
3. 1行4列セルを2に書き換えます。
4. 「決定して閉じる」ボタンを押します。
「この行列はユニタリーではありません」とメッセージが出ます。
「OK」ボタンを押すと、「ユニタリ行列かどうかを調べるための計算」画面が表示されます。
ターゲット行列がユニタリの場合は、この画面は表示されません。
(参考)ユニタリ行列とは、「ターゲット行列×随伴行列=1」かつ「随伴行列×ターゲット行列=1」の行列のことです。
■「今までのゲートの逆行列」は、作業の途中で、作業開始時点から作られた「ゲートの逆行列」を確認することができます。
■「単一ゲートにする」と「元に戻す」
「単一ゲートにする」ボタンを押すと、制御ゲートを単一ゲートにします。
「元に戻す」ボタンを押すと、単一ゲートを制御ゲートを戻します。
■最終ゲート
このゲートは、制御回転ゲートです。
エディットできるのは4行4列のセルだけです。
この例では、「0.71-0.71i」と書かれていますが、ベクトルの大きさを計算すると、0.71×0.71×2=1.0082となります。
この場合、1との誤差が0.0082になりエラーになります。
「0.707-0.707i」と書き直すと、ベクトルの大きさは0.707×0.707×2=0.9997となり、1との誤差は0.0003となり、エラーにはなりません。
誤差は、0.001以内にする必要があります。
(回転の必要がない場合は1を書き込みます)
■ゲート表示画面の説明
上記でIQFTのゲートを作りましたが、今回は、最後の回転ゲートをを変更しないで「実行」ボタンを押します。デフォルトでは「-i」です。
すると、ゲートが下記のように表示されます。
ゲート表示ボタンの右に表示される「実数」または「複素数」ですが、ゲートが実数だけで作られている場合「実数」、複素数も使われている場合「複素数」になります。
左下に表示されるのはゲート図です。行列からゲートを作ることができない場合は、何も表示されません。