Ćwiczenie — tworzenie splątania kwantowego za pomocą polecenia Q#
W poprzedniej lekcji przedstawiono koncepcję splątania kwantowego i stanów Bell.
W tej lekcji użyjesz platformy Azure Quantum Development Kit (QDK), aby napisać Q# kod, który tworzy splątane stany Bell między dwoma kubitami. Aby utworzyć pierwszy stan bell, należy zastosować dwie operacje kwantowe: operację Hadamard i operację Controlled-NOT (CNOT).
Najpierw wyjaśnijmy, jak działają te operacje i dlaczego tworzą splątane stany.
Operacja Hadamard
Pamiętaj, że operacja Hadamard lub H umieszcza kubit, który jest w stanie czystym $\ket{0}$ lub $\ket{1}$ w równą superpozycję.
$$ H \ket{0} = \frac1{\sqrt2} \ket{0} + \frac1{\sqrt2} \ket{1}$$ $$ H \ket{1} = \frac1{\sqrt2} \ket{0} - \frac1{\sqrt2} \ket{1}$$
Pierwszym krokiem do utworzenia stanu bell jest wykonanie operacji Hadamard na jednym z kubitów.
Operacja Kontrolowana NOT (CNOT)
Gdy dwa kubity są splątane, stan jednego kubitu zależy od stanu drugiego kubitu. W związku z tym w celu splątania dwóch kubitów należy zastosować operację z wieloma kubitami, która działa jednocześnie na obu kubitach. Operacja Controlled-NOT lub CNOT jest operacją wielokubitową, która pomaga w tworzeniu splątania kwantowego.
Operacja CNOT przyjmuje dwa kubity jako dane wejściowe. Jednym z kubitów jest kubit kontrolny, a drugi kubit to target kubit. Jeśli kubit kontrolny jest w stanie $\ket{1}$, to operacja CNOT odwraca stan kubitu target. W przeciwnym razie CNOT nic nie robi.
Na przykład w następujących stanach dwóch kubitów kubit kontrolny jest kubitem po lewej stronie, a target kubit jest kubitem z prawej strony.
Dane wejściowe do CNOT |
Dane wyjściowe z CNOT |
|---|---|
| $\ket{00}$ | $\ket{00}$ |
| $\ket{01}$ | $\ket{01}$ |
| $\ket{10}$ | $\ket{11}$ |
| $\ket{11}$ | $\ket{10}$ |
W Q# systemie operacja CNOT działa na tablicy dwóch kubitów i odwraca drugi kubit tylko wtedy, gdy pierwszy kubit jest One.
Splątanie przy użyciu operacji Hadamard i CNOT
Załóżmy, że masz system z dwoma kubitami w stanie $\ket{00}$. W tym stanie kubity nie są splątane. Aby umieścić te kubity w splątanym stanie Bella $\ket{\phi^+}=\frac1{\sqrt2}(\ket{00}+\ket{11})$, zastosuj operacje Hadamarda i CNOT.
Oto, jak to działa:
Wybierz jeden kubit w stanie c jako kubit sterujący, a drugi jako kubit target. W tym miejscu wybieramy najdalej lewy kubit jako kontrolny, a najdalej prawy kubit jako target.
Umieść tylko kubit kontrolny w stanie równej superpozycji. W tym celu zastosuj operację H tylko do kubitu sterującego:
$$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c})$$
Uwaga / Notatka
Indeksy dolne ${}_c$ i ${}_t$ określają odpowiednio qubit kontrolujący i target qubit.
Zastosuj operację CNOT do pary kubitów. Pamiętaj, że kubit kontrolny jest w stanie superpozycji, a kubit target jest w stanie $\ket{0_t}$.
$$ \begin{wyrównane} CNOT \frac{{1}{\sqrt{{2}}(\ket{0_c}+\ket{1_c})\ket{0_t} amp;& CNOT =\frac{2{1}{\sqrt(}0_c 0_t\ket{+}1_c 0_t\ket{)} amp;\\&2=(CNOT \frac{0_c 0_t{1}{\sqrt + CNOT }1_c 0_t\ket{)} amp;\ket{}2\\(&0_c 0_t=+\frac{1_c 1_t{1}{\sqrt)} wyrównane\ket{}\ket{
Stan $\frac{1}{\sqrt2}(\ket{0_c 0_t}+\ket{1_c 1_t})$ jest splątany. Ten konkretny stan splątany to jest jednym z czterech stanów Bella, $\ket{\phi^{+}}$.
Uwaga / Notatka
W obliczeniach kwantowych operacje są często nazywane bramami. Na przykład brama H i brama CNOT.
Utwórz splątanie kwantowe w Q#
Aby utworzyć stan bell z Q# kodem, wykonaj następujące kroki w programie Visual Studio Code (VS Code):
- Otwórz program VS Code.
- Otwórz menu Plik , a następnie wybierz pozycję Nowy plik tekstowy , aby utworzyć nowy plik.
- Zapisz plik jako Main.qs.
Tworzenie stanu dzwonka
Aby utworzyć stan $\ket{\phi^+}$ Bell w pliku Q#, wykonaj następujące kroki:
Zaimportuj przestrzeń nazw
Std.Diagnosticsz biblioteki standardowej Q#, aby móc używać funkcjiDumpMachine. Ta funkcja wyświetla informacje o stanach kubitu podczas wywoływania funkcji w kodzie. Aby zaimportować przestrzeń nazw, skopiuj następujący Q# kod do pliku Main.qs :import Std.Diagnostics.*;Utwórz operację
Mainzwracającą dwieResultwartości typu, które są wynikami pomiaru kubitów.import Std.Diagnostics.*; operation Main() : (Result, Result) { // Your code goes here }Wewnątrz operacji
Main, przydziel dwa kubity do splątania,q1iq2.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); }Zastosuj bramę Hadamard,
H, do kubituq1sterującego. Spowoduje to przejście tylko kubitu do stanu superpozycji. Następnie zastosuj bramę CNOT<, c0 /> na obu kubitach, aby splątać oba kubity. Pierwszym argumentemCNOTjest kubit kontrolny, a drugim argumentem target jest kubit.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); }Użyj funkcji
DumpMachine, aby wyświetlić stan kubitów po ich splątaniu. Należy pamiętać, żeDumpMachinenie wykonuje pomiaru na kubitach, więcDumpMachinenie ma wpływu na stany kubitu.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); }MUżyj operacji, aby zmierzyć kubity i zapisać wyniki wm1im2. Następnie użyj operacjiReset, aby zresetować kubity.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); let (m1, m2) = (M(q1), M(q2)); Reset(q1); Reset(q2); }Zwróć wyniki pomiaru kubitów za pomocą polecenia
return. Oto końcowy program w pliku Main.qs :import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); let (m1, m2) = (M(q1), M(q2)); Reset(q1); Reset(q2); return (m1, m2); }Aby uruchomić program w wbudowanym symulatorze, wybierz polecenie Uruchom nad
Mainoperacją lub naciśnij Ctrl + F5. Dane wyjściowe są wyświetlane w konsoli debugowania.Wyniki pomiaru są skorelowane, więc na końcu programu uzyskasz wynik
(Zero, Zero)lub(One, One)z równym prawdopodobieństwem. Uruchom ponownie program wiele razy i obserwuj dane wyjściowe, aby przekonać się o korelacji.Aby zwizualizować schemat obwodu, wybierz soczewkę kodu Circuit powyżej
Mainoperacji. Diagram obwodu przedstawia bramę Hadamard zastosowaną do pierwszego kubitu i bramę CNOT zastosowaną do obu kubitów.
Tworzenie innych stanów Bella
Aby utworzyć inne stany Bell, zastosuj dodatkowe operacje Pauli $X$ lub $Z$ na kubitach.
Aby na przykład utworzyć stan $\ket{\phi^-}=\frac1{\sqrt2}(\ket{00}-\ket{11})$Bell, zastosuj operację Pauli $Z$ do kubitu kontrolnego po zastosowaniu bramy Hadamard, ale przed zastosowaniem CNOT. Operacja $Z$ przerzuca stan $\ket{+}$ na $\ket{-}$.
Uwaga / Notatka
Stany $\frac{1}{\sqrt{2}}(\ket{0}+\ket{1})$ i $\frac{1}{\sqrt{2}}(\ket{0} - \ket{1})$ są również znane jako $\ket{+}$ i $\ket{-}$, odpowiednio.
Oto sposób, w jaki można utworzyć stan $\ket{\phi^-}$:
Utwórz dwa kubity w stanie $\ket{00}$.
Umieść kubit kontrolki w stanie superpozycji z operacją $H$ :
$$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \ket{+_c}$$
Zastosuj operację $Z$ do kubitu sterującego.
$$Z \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \frac{1}{\sqrt{2}}(\ket{0_c} - \ket{1_c}) = \ket{-_c}$$
Zastosuj operację CNOT do kubitu sterującego i kubitu target, który znajduje się w stanie $\ket{0_t}$.
$$ \begin{aligned} CNOT \frac{{1}{\sqrt{{2}}(\ket{0_c-1_c})\ket{}\ket{0_t}& amp;= CNOT \frac{{1}{\sqrt2}(\ket{0_c 0_t-1_c 0_t}\ket{})\\&=\frac{{1}{\sqrt2}(CNOT \ket{0_c 0_t} - CNOT \ket{1_c 0_t})\\&=\frac{{1}{\sqrt2}(\ket{0_c 0_t-1_c 1_t}) aligned\ket{}
Aby utworzyć $\ket{\phi^-}$ stan Bella w Q#, zastąp kod w pliku Main.qs następującym:
import Std.Diagnostics.*;
operation Main() : (Result, Result) {
use (q1, q2) = (Qubit(), Qubit());
H(q1);
Z(q1); // Apply the Pauli Z operation to the control qubit
CNOT(q1, q2);
DumpMachine();
let (m1, m2) = (M(q1), M(q2));
Reset(q1);
Reset(q2);
return (m1, m2);
}
Podobnie możesz utworzyć stany $\ket{\psi^+}$ and $\ket{\psi^-}$ Bell, stosując operacje Pauli $X$ i $Z$ do kubitów.
- Aby utworzyć stan $\ket{\psi^+}=\frac1{\sqrt2}(\ket{01}+\ket{10})$Bell, zastosuj bramę Pauli $X$ do kubitu target po zastosowaniu bramy Hadamard do kubitu sterującego. Następnie zastosuj bramę CNOT.
- Aby utworzyć stan $\ket{\psi^-}=\frac1{\sqrt2}(\ket{01}-\ket{10})$ Bell, zastosuj Pauli $ Z $ do kubitu kontrolnego i Pauli $ X $ do kubitu target po zastosowaniu bramy Hadamard do kubitu kontrolnego. Następnie zastosuj bramę CNOT.
W następnej lekcji dowiesz się, jak używać splątania do wysyłania informacji kwantowych, czyli procesu znanego jako teleportacja kwantowa.