Ben de bu sorun üzerinde çalışıyorum. Yeni başlayan ve klasik bir programcı olarak (yani, Kuantum Mekaniği konuşmuyorum), tam örnekler olmadan kavramları anlamak zordur. Beraber çalıştığım Microsoft Q # Veritabanı Arama numunesi . Veritabanında çok kullanışlı olmayan belirli bir dizin / anahtar arar. Bir veritabanındaki değerlerin listesini aramak ve karşılık gelen anahtarı döndürmek için bu örnek üzerine genişlettik.
Örneğinizde olduğu gibi, dizinler için bir adet iki-qubit "anahtar kaydı" ve değerler için ayrı bir iki-qubit kaydı vardır. İstenen değerin ne zaman bulunduğunu belirtmek için Microsoft'un örneğinden gelen beşinci "işaretli bir kübit" de vardır. Anahtarlar ve değerler dolaşma ile ilişkilidir. Bu en iyi şekilde bir devre ile gösterilir. Gerçek Quirk devresini görmek için buraya tıklayın .
Bu devrenin sadece kehanet içerdiğini unutmayın. Tüm Grover algoritmasını uygulamaz.
- Üstteki iki kubit anahtar yazmacı, sonraki iki kubit değer yazmacı ve alt kübit işaretli kübittir.
- İlk bölüm, Grover algoritmasının gerektirdiği şekilde Haramard kapılarını kullanarak anahtar kaydını tekdüze bir üstüste koymaktadır.
- İkinci bölüm, anahtarların dolaşma yoluyla değerlerle ilişkilendirildiği bölümdür. Her bir anahtar, (Anti-) Kontrollü X kapıları uygulanarak değer kaydında karşılık gelen bir değerle dolanır. Böylece, anahtar kaydı 0 olduğunda, değer kaydı 3 olarak ayarlanacaktır. Anahtar 1 olduğunda, değer 2 olarak ayarlanır ve bu şekilde devam eder.
- Devrenin üçüncü bölümü arama kehanetidir. Değer kaydı işaretli qubit ile dolanır. Bu örnekte, istenen değer 2'dir. Değer kaydı 2 içerdiğinde, işaretli qubit 1 olarak ayarlanır.
- Grover'ın algoritması anahtar kaydına bakar ve kubit olarak işaretlenir. Arama kehaneti değer kaydına bakar ve işaretli kübit ayarlar. Bu, değer 2 olduğunda anahtar 1'in yükseltilmesine neden olur.
Anahtarların ve değerlerin kubitlerde değil, devre / programda saklandığını belirtmek ilginçtir. Gerçekten kendi başına bir veritabanı olmadığını söyleyebiliriz. Daha çok bir switch / case deyimi gibidir, ancak değerlerin üst üste bindirilmesiyle çalışabilen bir deyimdir.
Daha fazla ayrıntı, uyarılar ve Q # kodu için GitHub veri havuzuma bakın .
EDIT: Yanıtladığımdan beri daha iyi anladığım bir şey ... devreyi her yinelemenin bir parçası olarak tersine çevirmeli / geri almalısınız. Q # kodunda, ReflectStart () işlemi içindeki Adjoint StatePreparationOracle () çağrısı bunu işler, bu yüzden açıkça yapmak zorunda değildim. Qiskit'in benzer bir özelliği olup olmadığını bilmiyorum. Çeviriyi doğru bir şekilde yapmışsam, yukarıdaki örnek için tam bir devre .