Path: blob/main/translations/ja/ch-algorithms/quantum-counting.ipynb
3855 views
量子数え上げ
このアルゴリズムを理解するためには、最初にグローバーのアルゴリズムと量子位相推定アルゴリズムの両方を理解することは大切なことです。グローバーアルゴリズムがオラクルの解を見つけようとするのに対し、量子数え上げのアルゴリズムは、この問題の解の数を見つけます。このアルゴリズムは量子探索アルゴリズムと量子位相推定アルゴリズムの両方を結びつけるので、大変興味深いものです。
目次
コード 2.1 コードの初期化 2.2 制御グローバ探索の反復 2.3 逆量子フーリエ変換 2.4 合わせてみましょう!
グローバー探索の反復の固有値を見つけるために量子位相推定アルゴリズムを使います。グローバー探索の反復演算は、、基底で、状態ベクトルを回転させるものであることを覚えているでしょう。:
探索空間の解の数の割合はとの違いに依存します。例えば、もしたくさんの解がないならば、基底は基底に近く、そして角度 はとても小さいでしょう。グローバーの反復の固有値はであることが分かり、量子位相推定を使って、解の数()を推定します。
、 基底で、グローバー反復演算は以下の行列で書き表せます。:
行列は以下の固有ベクトルを持ちます。:
前述の通り、固有値はです。幸運なことに、の状態は、とで張られている空間にあるため、は以下のように2つのベクトルの重ね合わせとなります。
その結果、QPEアルゴリズムの出力は2つの位相の重ね合わせになり、レジスターを測定すると、これら2つの値のいずれかが得られます!次に、いくつかの簡単な数学を使用して、の推定値を取得できます。
このガイドでは、回路の最初の4量子ビットをカウントし(カウント量子ビットの数をと呼ぶため、)、最後の4量子ビットを「探索」します()。これを使って、回路の構成ブロックを作ります。
グローバーのアルゴリズムの章で、既に「グローバー反復」を扱いました。これは、拡散オペレーターが組み込まれた、16の状態()のうち5つの解() をもつオラクルの例です。:
Python関数は入力を受け取らず、4量子ビットのQuantumCircuitオブジェクトを返すことに注意してください。過去にあなたが作った関数は既存の回路を変更するものだったかもしれませんが、この関数は QuantumCircuitオブジェクトを単一制御ゲートに変えることができます。
回路から制御ゲートを作り出すために.to_gate()と.control()を使います。私たちはグローバー反復演算をgritと呼び、制御グローバー反復演算をcgritと呼びます。
ここでも、別のQuantumCircuitオブジェクトを返すことを選んだことに注意してください。これは、ゲートを簡単に反転できるようにするためです。 このガイドで選択したカウント量子ビット数である、量子ビットでゲートを作成します。
素晴らしい!結果をいくつか確かめましょう。
他の測定値より測定確率が高い2つの値(0101と1011)をシミュレーションから確認することができます。これら2つの値はとに対応します。しかし、まだ解の数を確かめることはできません。この情報を取得するためにもう少し処理する必要があるため、最初に出力を処理できるもの(int)に入れましょう。
出力データから最も可能性の高い結果の文字列を取得します。
これを整数として保存しましょう:
との内積から角度を得ることができることを覚えているかもしれません。:
このベクトルの内積は:
これらの方程式を組み合わせて、三角法と代数を使用して次のことを示すことができます。
グローバーのアルゴリズムの章から、拡散演算子 を作成する一般的な方法は、実際はを実装することを覚えているでしょう。 この実装は、この章で提供されるグローバー反復で使用されます。通常のグローバー探索では、この位相はグローバルであり、無視できますが、グローバー反復を制御ゲートとして使っているため、この位相には意味があり、そのため、解ではない状態が探索されます。量子数え上げアルゴリズムにより、解ではない状態の数がわかります。 これを修正するには、を計算するだけです。
以下、コード:
おおよそ、正しい解を得ることができました!この解のエラーは以下で概算できます。
誤差の計算の説明はこの節の範囲外です。 しかし、説明は[1]で確かめることができます。
とうとう、最終的な関数calculate_M()を得ることができます。: