Implementacja na poziomie bramki inwersji wartości własnej w HHL
Próbuję zrozumieć, jak działa implementacja kroku inwersji wartości własnej w algorytmie HHL na poziomie bramki.
Podążam za tym odniesieniem , w którym stwierdzono (Lemat 4), że można to osiągnąć za pomocą kontrolowanych obrotów:
$$ U_\theta: |\widetilde{\theta} \rangle |0 \rangle \rightarrow |\widetilde{\theta} \rangle \left(\cos \widetilde{\theta} |0\rangle + sin \widetilde{\theta} |1 \rangle \right ) $$
$$U_\theta = \sum_{\widetilde{\theta} \in \{0,1\}^n} |\widetilde{\theta}\rangle \langle \widetilde{\theta}| \otimes \exp \left(-i \widetilde{\theta} \sigma_y \right) $$
gdzie $\widetilde{\theta}$ jest n-bitową skończoną precyzją reprezentacją kąta $\theta$, i $\sigma_y$ macierz Y Pauli.
Moje pytanie brzmi: jakie są kąty obrotu $\widetilde{\theta}$ dla unitarnych $U_\theta$ obliczone / zastosowane bez wiedzy a-priori o wartościach własnych $\lambda_j$ macierzy systemu $A$?
Rozumiem, że wektor stanu $|\widetilde{\theta} \rangle$ uzyskuje się w poprzednim kroku algorytmu poprzez wyodrębnienie wartości własnych $|\lambda_j \rangle$ z $A$używając QPE (a następnie stosując funkcję inverse + arcsin, jak opisano tutaj ), ale nie jestem pewien, jak te kąty są również stosowane jako parametry bramek o kontrolowanej rotacji (parametr wykładnika w$U_\theta$.)
FYI, widziałem ten inny post, w którym jest napisane: „Ty ... ... masz (przynajmniej dobre przybliżenie) swoje wartości własne zapisane w rejestrze. Jeśli kontrolujesz ten rejestr, możesz go użyć do podjęcia decyzji kąt obrotu dla każdego wektora własnego. "
Więc moje pytanie brzmi: jak go "używać [rejestr zawierający$|\widetilde{\theta} \rangle$] decyduje o kącie obrotu [$\widetilde{\theta}$ w $\exp$ funkcja z $U_\theta$] ”?
Dzięki!
Odpowiedzi
Użycie rejestru do określenia kąta obrotu oznacza, co następuje: masz rejestr $|\tilde{\theta}\rangle$ (składający się z potencjalnie więcej niż jednego kubitu) i zastosujesz obroty innego rejestru kontrolowanego na wartości kubitów $|\tilde{\theta}\rangle$. Różne rotacje, które stosujesz, skutkują różnymi funkcjami wdrażanymi na kubitach ancilla. Ale prawdopodobnie już o tym wiedziałeś.
Pytanie, które obroty wykonać, aby zastosować określoną funkcję, jest znacznie bardziej skomplikowane i nie znam żadnego ogólnego rozwiązania. Choć raz Qiskit ma własną implementację HHL, ale nie wiem, do jakiego momentu jest to ogólne. Istnieją jednak inne przykłady, w których jest „łatwe” do zaimplementowania, na przykład funkcja inwersji wartości własnej wymagana dla HHL. W tym artykule autorzy zaimplementowali aproksymację podprogramu inwersji wartości własnej (kod w Quil
można znaleźć w powiązanym repozytorium GitLab), co jest dokładne w przypadku wartości własnych, które są potęgami 2. Powodem, dla którego jest ona dokładna dla potęg 2, jest to, że w tym przypadku inwersja może być zapisana jako kombinacja zamiany bitów, więc podprogram inwersji wartości własnej jest zbiorem sterowanych bramek SWAP (poglądowe przedstawienie obwodu na rys. 3 w tym artykule ). Ale, jak powiedziałem wcześniej, jak dotąd nie znam ogólnych sposobów implementacji dużych klas funkcji.