Saya telah mengerjakan masalah ini juga. Sebagai seorang pemula dan seorang programmer klasik (yaitu, saya tidak berbicara Quantum Mechanics), sulit untuk memahami konsep-konsep tanpa contoh lengkap. Saya telah bekerja dengan sampel Pencarian Microsoft Q # Database . Itu hanya mencari indeks / kunci tertentu dalam database, yang tidak terlalu berguna. Saya telah memperluas sampel itu untuk mencari daftar nilai dalam database dan mengembalikan kunci yang sesuai.
Seperti contoh Anda, ada satu "register kunci" dua-qubit untuk indeks, dan register dua-qubit terpisah untuk nilai-nilai. Ada juga "qubit bertanda" kelima yang berasal dari sampel Microsoft, untuk menunjukkan kapan nilai yang diinginkan ditemukan. Kunci dan nilai dikaitkan melalui keterjeratan. Itu terbaik ditunjukkan dengan sirkuit. Klik di sini untuk melihat sirkuit Quirk yang sebenarnya .
Perhatikan bahwa sirkuit ini hanya berisi oracle. Itu tidak menerapkan semua algoritma Grover.
- Dua qubit teratas adalah register kunci, dua berikutnya adalah register nilai, dan qubit bawah adalah qubit yang ditandai.
- Bagian pertama menempatkan register kunci dalam superposisi seragam menggunakan gerbang Haramard, seperti yang dipersyaratkan oleh algoritma Grover.
- Bagian kedua adalah di mana kunci terkait dengan nilai-nilai melalui keterjeratan. Setiap kunci terjerat dengan nilai yang sesuai dalam daftar nilai dengan menerapkan (Anti-) gerbang X Terkendali. Jadi, ketika register kunci adalah 0, maka register nilai akan diatur ke 3. Ketika kuncinya adalah 1, nilai diatur ke 2, dan seterusnya.
- Bagian ketiga dari sirkuit adalah pencarian oracle. Register nilai terjerat dengan qubit yang ditandai. Dalam contoh ini, nilai yang diinginkan adalah 2. Ketika daftar nilai berisi 2, qubit yang ditandai akan ditetapkan ke 1.
- Algoritma Grover melihat register kunci dan menandai qubit. Oracle pencarian melihat pada register nilai dan mengatur qubit yang ditandai. Ini akan menyebabkan kunci 1 diperkuat ketika nilainya 2.
Sangat menarik untuk dicatat bahwa kunci dan nilai tidak disimpan di qubit, tetapi di sirkuit / program. Anda bisa mengatakan itu bukan database sebenarnya. Ini lebih seperti pernyataan switch / case, tetapi yang bisa berjalan pada superposisi nilai.
Untuk detail lebih lanjut, peringatan, dan kode Q #, lihat repositori GitHub saya .
EDIT: Sesuatu yang saya mengerti lebih baik sejak menjawab ... Anda harus membalik / membatalkan rangkaian sebagai bagian dari setiap iterasi. Dalam kode Q #, panggilan Adjoint StatePreparationOracle () di dalam operasi ReflectStart () menangani ini, jadi saya tidak perlu melakukannya secara eksplisit. Saya tidak tahu apakah Qiskit memiliki fitur serupa. Jika saya sudah melakukan terjemahan dengan benar, berikut adalah rangkaian lengkap untuk contoh di atas.