Pracowałem również nad tym problemem. Jako początkujący i klasyczny programista (tzn. Nie mówię o mechanice kwantowej) trudno jest zrozumieć pojęcia bez pełnych przykładów. Pracowałem z próbką wyszukiwania bazy danych Microsoft Q # . Po prostu szuka określonego indeksu / klucza w bazie danych, co nie jest bardzo przydatne. Rozszerzyłem tę próbkę, aby wyszukać listę wartości w bazie danych i zwrócić odpowiedni klucz.
Podobnie jak w twoim przykładzie, istnieje jeden dwububitowy „rejestr kluczy” dla indeksów i osobny dwububitowy rejestr wartości. Istnieje również piąty „zaznaczony kubit”, który pochodzi z próbki Microsoftu, aby wskazać, kiedy pożądana wartość zostanie znaleziona. Klucze i wartości są powiązane przez splątanie. Najlepszym tego przykładem jest obwód. Kliknij tutaj, aby zobaczyć aktualny obwód Quirka .
Zauważ, że ten obwód zawiera tylko wyrocznię. Nie implementuje całego algorytmu Grovera.
- Dwa górne kubity są rejestrem kluczy, następne dwa są rejestrem wartości, a dolny kubit jest zaznaczonym kubitem.
- Pierwsza sekcja umieszcza rejestr kluczy w jednolitej superpozycji przy użyciu bram Haramarda, zgodnie z wymaganiami algorytmu Grovera.
- W drugiej sekcji klucze są powiązane z wartościami przez splątanie. Każdy klucz jest splątany z odpowiednią wartością w rejestrze wartości przez zastosowanie (anty-) kontrolowanych bramek X. Tak więc, gdy rejestr kluczy wynosi 0, wówczas rejestr wartości zostanie ustawiony na 3. Gdy klucz to 1, wartość zostanie ustawiona na 2 i tak dalej.
- Trzecią częścią obwodu jest wyrocznia poszukiwawcza. Rejestr wartości jest zaplątany w zaznaczony kubit. W tym przykładzie pożądaną wartością jest 2. Gdy rejestr wartości zawiera 2, zaznaczony kubit zostanie ustawiony na 1.
- Algorytm Grovera sprawdza rejestr kluczy i zaznaczony kubit. Wyrocznia wyszukiwania patrzy na rejestr wartości i ustawia zaznaczony kubit. Spowoduje to wzmocnienie klawisza 1, gdy wartość wynosi 2.
Warto zauważyć, że klucze i wartości nie są przechowywane w kubitach, ale raczej w obwodzie / programie. Można powiedzieć, że tak naprawdę nie jest to baza danych. To bardziej jak instrukcja switch / case, ale taka, która może działać na superpozycji wartości.
Aby uzyskać więcej informacji, ostrzeżenia i kod Q #, zobacz moje repozytorium GitHub .
EDYCJA: Coś, co rozumiem lepiej od czasu odpowiedzi ... musisz cofnąć / cofnąć obwód w ramach każdej iteracji. W kodzie Q # wywołanie Adjoint StatePreparationOracle () w ramach operacji ReflectStart () obsługuje to, więc nie musiałem tego robić jawnie. Nie wiem, czy Qiskit ma podobną funkcję. Jeśli poprawnie wykonałem tłumaczenie, oto kompletny obwód dla powyższego przykładu.