Grover-Algorithmはデータベースにどのように適用されますか?


12

質問

Grover-Algorithmを使用して、未ソートのデータベースで要素バツを検索します。ここで疑問が生じますが、どうすればキュービットでデータベースのインデックスと値を初期化できますか?

  • 私は4量子ビットを持っているとしましょう。したがって、24=16古典的な値をマッピングできます。
  • 私のソートされていないデータベースd次の要素を有するd[]=[3201]
  • バツ=2d=10b=|10を検索したい 10
  • 私のアプローチ:索引データベースdd[インデックス、値]=[03122031]。インデックス用のレジスタ01、および値用のレジスタ23。次に、Grover-Algorithmをレジスタ23にのみ適用します3。これは実現できますか?別のアプローチはありますか?

私がすでに実装したもの(GitHubで

「2、3、4クビットのグローバーアルゴリズム」ですが、それは単純です。ビットは|0初期化されます0 、Oracleは私の溶液をマークするバツ(のようなだけの数である2d=10b)、グローバー部は、選択された要素の確率が増加するバツ、他のすべての確率を減少させ、次いで、量子ビットがあることによって読み出されます古典的なビットにマッピングされます。このプロセスを連続して数回実行して、確率分布を取得します。ここで、最も高い確率が要素バツ求めています。

出力は、oracleでマークされた出力と常に同じです。オラクルを構築した時点ではわかりませんが、出力からより多くの情報を生成するにはどうすればよいですか?

回答:


9

私もこの問題に取り組んでいます。初心者であり古典的なプログラマーである(つまり、私はQuantum Mechanicsを話しません)ので、完全な例なしに概念を理解することは困難です。私はで働いてきましたマイクロソフトQ#のデータベース検索のサンプル。データベース内の特定のインデックス/キーを検索するだけで、あまり便利ではありません。このサンプルを拡張して、データベース内の値のリストを検索し、対応するキーを返します。

例と同様に、インデックス用に1つの2キュービット「キーレジスタ」と、値用に別の2キュービットレジスタがあります。また、Microsoftのサンプルに由来する5番目の「マーク付きキュービット」があり、目的の値がいつ見つかるかを示します。キーと値は、エンタングルメントによって関連付けられます。これは、回路で最もよく実証されます。実際のQuirk回路を見るにはここをクリックしてください

キー/値Oracleサーキット

この回路にはオラクルのみが含まれていることに注意してください。Groverのアルゴリズムのすべてを実装しているわけではありません。

  • 上の2つのキュービットはキーレジスタ、次の2つのビットは値レジスタ、下のキュービットはマークされたキュービットです。
  • 最初のセクションでは、Groverのアルゴリズムで必要とされるHaramardゲートを使用して、キーレジスタを均一な重ね合わせにします。
  • 2番目のセクションでは、エンタングルメントを介してキーが値に関連付けられます。各キーは、(アンチ)制御されたXゲートを適用することにより、値レジスタ内の対応する値に絡まります。したがって、キーレジスタが0の場合、値レジスタは3に設定されます。キーが1の場合、値は2に設定されます。
  • 回路の3番目のセクションは、検索オラクルです。値レジスタは、マークされたキュービットと絡み合います。この例では、目的の値は2です。値レジスタに2が含まれる場合、マークされたキュービットは1に設定されます。
  • Groverのアルゴリズムは、キーレジスタとマークされたキュービットを調べます。検索オラクルは値レジスタを調べて、マークされたキュービットを設定します。これにより、値が2のときにキー1が増幅されます。

キーと値はキュービットではなく、回路/プログラムに保存されることに注意してください。本当にデータベースそのものではないと言えます。switch / caseステートメントに似ていますが、値の重ね合わせで実行できるステートメントです。

詳細、警告、およびQ#コードについては、GitHubリポジトリをご覧ください

編集:答えて以来、私がよりよく理解していること...あなたは各反復の一部として回路を逆にする/元に戻す必要があります。Q#コードでは、ReflectStart()操作内のAdjoint StatePreparationOracle()呼び出しがこれを処理するため、明示的に行う必要はありません。Qiskitに同様の機能があるかどうかはわかりません。変換を適切に行った場合、上記の例の完全な回路を次に示します。


ありがとう!それがまさに私が探していたものです。
アレックス

Grover-Partの場合:キーレジスタ(この例では2キュビット)を使用して増幅処理を行うだけですみますか?それらは、マークされたキュービットとどのように関係していますか?
アレックス

Q#サンプルによると、「Groverのアルゴリズムでは、マークされた状態と開始状態に関するリフレクションが必要です」ので、マークされたキュービットとキーレジスタの両方で操作する必要があります。QuantumSearch()オペレーションのコードに従うと、マークされたキュービットだけでReflectMarked()が呼び出されることがわかります。ReflectZero()は、マークされたキュービットとキーレジスタの組み合わせで後で呼び出されます。また、上記の編集をご覧ください。
ジョエルリーチ

3

データベースの検索に適用されるGroverのアルゴリズムを提示する場合、Oracleは従来のリストの要素にアクセスできると想定されています。しかし、それは非常に強い仮定であり、これが、この操作を単純に表すインデックスのCNOT / Toffolisを使用する制御セレクターによってそれを表す理由です(この場合のToffoli回路のように)n=4)。

別のレジスタの値を計算するアプローチに言及しています:

||d
これを効率的に行うためのオラクルが与えられていると仮定します(簡単な方法はcontrol-NOTですが、インデックス/値ごとにこれを行う必要があるのであまり効率的ではありません)。この場合、oracleは関数になりますf=2 量子回路形式(制御セレクタ)で、この状態をマークし、Groverの反復を続けます。

リスト/データベースを検索するよりも、量子検索アルゴリズムを関数の最適化と考える方が良いと思います。アルゴリズムの理解をさらに深めたい場合に、組み合わせ最大化問題を解決するために量子検索を使用する場合に取り組んだ記事を次に示します。


お返事ありがとうございます!そのため、Grover-Algorithmはデータベース検索にはあまり適していません。ここで関連する質問を見つけました。
アレックス

このDB検索の問題を解決するための擬似コード(またはQiskitコード)はありますか?
アレックス

見なければなりませんが、フレームワークの中から簡単に見つけられるはずです。
cnada

3

データベースも保持するようにOracleを変換する必要があります。その結果、一般的なOracle(Phase Inversion)には2つのサブオラクルが含まれています。 一般的なGroverのデータベース検索用アルゴリズム回路

準備する必要がある最初のサブオラクルはメモリ回路です。本体に量子データ(状態)を格納するQRAMとは対照的に、このメモリ(アレイ)回路はフレームに古典的な情報のみを格納するように準備されます。:格納するバイナリの配列[010、110、100、011]の下に表示されている回路のような種の例 メモリ回路の例 より読み出すために、この紙

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.