私もこの問題に取り組んでいます。初心者であり古典的なプログラマーである(つまり、私はQuantum Mechanicsを話しません)ので、完全な例なしに概念を理解することは困難です。私はで働いてきましたマイクロソフトQ#のデータベース検索のサンプル。データベース内の特定のインデックス/キーを検索するだけで、あまり便利ではありません。このサンプルを拡張して、データベース内の値のリストを検索し、対応するキーを返します。
例と同様に、インデックス用に1つの2キュービット「キーレジスタ」と、値用に別の2キュービットレジスタがあります。また、Microsoftのサンプルに由来する5番目の「マーク付きキュービット」があり、目的の値がいつ見つかるかを示します。キーと値は、エンタングルメントによって関連付けられます。これは、回路で最もよく実証されます。実際のQuirk回路を見るにはここをクリックしてください。
この回路にはオラクルのみが含まれていることに注意してください。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に同様の機能があるかどうかはわかりません。変換を適切に行った場合、上記の例の完全な回路を次に示します。