Path: blob/main/translations/ja/ch-algorithms/quantum-fourier-transform.ipynb
3855 views
量子フーリエ変換
このチュートリアルでは、量子フーリエ変換(QFT)の紹介と、回路の導出、Qiskitを使用した実装を紹介します。実装においては、シミュレーターと5量子ビットデバイスでQFTを実行する方法を示します。
目次
離散フーリエ変換は、次の式に従って、ベクトル をベクトル にマッピングします。
ここで です。
同様に、量子フーリエ変換は、次式に従って、量子状態を量子状態にマッピングします。
は、上記で定義したものと同じです。状態の振幅のみがこの変換の影響を受けることに注意してください。
これは以下のマッピングとして表すこともできます:
または、以下のユニタリー行列としても表すことができます:
2. 直感的解釈
量子フーリエ変換(QFT)は、2つの基底、計算 (Z) 基底とフーリエ基底、の間を変換します。 Hゲートは1量子ビットQFTであり、Z基底の状態とをX基底の状態 と に変換します。 同様に、計算基底のすべての複数量子ビット状態は、対応するフーリエ基底の状態をもっています。 QFTは、これらの基底間を変換する関数です。
計算基底 QFT フーリエ基底
(ティルダ(〜)を使用してフーリエ基底の状態を書くことが多いです。)
2.1 フーリエ基底での計算:
計算基底では、 と の状態を使用して数値を2進数で格納します:

それぞれの量子ビットが変化するスピードをみてください。一番左の量子ビットは、数値が増えるたびに反転し、その隣は2つ増えるごとに反転、3番目の量子ビットは4つ増えると反転します。次に、フーリエ基底では、Z軸を中心とした回転で数値を格納します:

保存する数によって、各量子ビットがZ軸を中心に回転する角度が決まります。 状態では、すべての量子ビットは状態にあります。 上の例に見られるように、4量子ビットで状態をエンコードするには、左端の量子ビットを全回転に対して(ラジアン)回転させます。 次の量子ビットはその2倍になり( ラジアン、つまり全回転の)、この角度が次の量子ビットでは2倍になり、以下同様に続きます。
繰り返しますが、各量子ビットが変化するスピードに注意してください。 この場合、左端の量子ビット(qubit 0)の周波数が最も低く、右端の量子ビットが最も高くなります。
では、量子フーリエ変換は、より大きなに対してどのように見えるのでしょうか? で、 が、状態 に作用するときの変換を導き出しましょう。ここで、は最上位ビットです。 この数学は、それが役立つと思う人のためにあります。あなたが、この数学に苦労する場合でも心配はいりません。2章の直感的解釈を理解していれば、次の章に進むことができます。
( と より)
(二進数への書き換え より)
(指数の積に展開して)
(和と積を入れ替え、 を使って)
以上が直感的解釈の章にあったアニメーションの数学的な記述です:

5. QFTを実装する回路
QFTを実装する回路は2つのゲートを使用します。 最初のものは、すでに知っている1量子ビットのアダマールゲートです。上の 例 1 の説明から、1量子ビット状態 に対する の作用は、次のようになることをみてきました。
2番目は、次のようにブロック対角形式で与えられる2量子ビットの制御回転 です。
ここで
です。
2量子ビット状態でのの動作(最初の量子ビットがコントロールで、2番目がターゲットである)は以下で与えられます。
これらの2つのゲートが与えられたら、 n量子ビットのQFT を実装する回路は以下のようになります。

回路は次のように動作します。 n量子ビット入力状態から始めます。
- qubit 1の最初のアダマールゲートの後、状態は入力状態から以下のように変換されます。
ここで
を使うと、以下のように書き換えられます。
出力状態では量子ビットの順序が逆になりますが、上記 で導いた入力状態をQFTした結果とまったく同じです。
上記の例は、のQFTの非常に便利な形式を示しています。 最後の量子ビットだけが他のすべての入力量子ビットの値に依存し、それ以降の各ビットは量子ビットの入力値にだんだん依存しなくなることに注意してください。 これはQFTの物理的な実装で重要になります。実デバイスでは、遠い量子ビット間の結合よりも近傍の量子ビット間の結合を実現する方が簡単です。
そして、QFT回路が大きくなるにつれて、わずかな回転を行うために費やされる時間がますます増えます。 特定のしきい値を下回る回転を無視しても、適切な結果を得られることが知られています。これは、近似QFTとして知られています。 操作の数を減らすとデコヒーレンスと潜在的なゲートエラーを大幅に減らすことができるため、これは物理的な実装でも重要です。
8. Qiskit での実装
Qiskitでは、上記の議論で使用されたゲートは、制御位相回転ゲートで実装します。 このゲートは OpenQASM で次のように定義されています。
よって、上記の説明のゲートから ゲートへのマッピングは、次の式から得られます:
8.1 3量子ビットでの例
量子ビットの場合に一般化する前に、3量子ビットの場合のコードを理解しておくと便利です。 まず、量子回路を定義する必要があります。
注意:Qiskitの最下位ビットは最も小さいインデックス(0)であることを忘れないでください。したがって、回路は5章の画像に対して水平方向に反転されます。最初に、qubit 2にHゲートを適用します。
次に、qubit 1の状態がの場合、これを1/4回転させます:
そして、最下位量子ビットqubit (0) が:の場合、さらに1/8回転:
qubit 2の演算が終わったので、qubits 0 と1に同じロジックを使用して、プロセスを繰り返します。
最後に、QFTを完了するために、qubits 0と2をスワップする必要があります:
これがどのように見えるか見てみましょう:
以下のウィジェットを使用して、この回路が量子ビットの数に応じてどのようにスケーリングするかを確認できます。
すばらしいです! これは、QFTの最初の部分です。最上位の量子ビットを正しく回転できたので、2番目に上位の量子ビットを正しく回転させます。 次に、3番目に上位のビットを処理させます。ところで、このためのコードをたくさん書く必要があるでしょうか?次の qft_rotations()関数の最後に、次のn-1 量子ビットでプロセスを繰り返すコードがあります。
簡単でしたね! 別の関数内で関数を使用することを「再帰」と呼びます。 コードを大幅に簡略化できます。 以下のウィジェットを使用して、これがどのようにスケーリングするかを再度確認できます。
最後に、QFTの定義に一致させるために、QFT関数の最後にスワップを追加する必要があります。 これを最終的な関数qft()に付け加えます。
これが、量子フーリエ変換の一般化された回路です。 以下のウィジェットを使用して、これがどのようにスケーリングするかを再度確認できます。
次に、この回路が正しく機能することをデモしてみましょう。そのためには、まず計算基底で数値をエンコードする必要があります。 2進数の5が 101であることがわかります。
(0bは、これが2進数であることを示すための記号です)。 これを量子ビットにエンコードしましょう:
状態ベクトルシミュレーターを使用して量子ビットの状態をチェックしましょう:
QFT関数を使用して、量子ビットの最終状態を表示します。
QFT関数が正しく機能していることがわかります。 状態と比較すると、Qubit 0は回転、Qubit 1は回転(1周のに相当)、そしてqubit 2は 回転(1周の に相当)しています。
8.2章の後に、実デバイスで回路を実行しようとすると、すべての量子ビットがと の等しい重ね合わせにあるため、結果は完全にランダムになってしまいます。 実際のハードウェアで動作するQFTをデモして結果を調べたい場合は、代わりに8.2章の最後の状態を先に作成し、QFTを逆に実行することで、出力が期待どおりに状態になることを確認します。
まず、QiskitでQFT演算を逆にしましょう。
では、量子ビットを状態にします。
そして、これが実際にフーリエ状態であることがわかります。
最後に、逆QFTを適用します。
私たちは(うまくいけば)最も高い確率が101になることを確認できます。
QFTの上記の実装は、であるフーリエ状態 を準備することによってテストしました。 となるような状態を見つけてみてください。
となるような状態を見つけてください。
再帰なしでQFT関数を記述してください。 Qiskitのユニタリーシミュレーターを使用して、結果を確認してください。
M. Nielsen and I. Chuang, Quantum Computation and Quantum Information, Cambridge Series on Information and the Natural Sciences (Cambridge University Press, Cambridge, 2000).