Implementacja w Qiskit
W tej lekcji zaimplementujemy niektóre z koncepcji z lekcji o splątaniu w działaniu, używając Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import __version__
print(__version__)
2.1.1
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram, array_to_latex
from qiskit.result import marginal_distribution
from qiskit.circuit.library import UGate
from numpy import pi, random
Oto implementacja protokołu teleportacji w postaci obwodu kwantowego.
qubit = QuantumRegister(1, "Q")
ebit0 = QuantumRegister(1, "A")
ebit1 = QuantumRegister(1, "B")
a = ClassicalRegister(1, "a")
b = ClassicalRegister(1, "b")
protocol = QuantumCircuit(qubit, ebit0, ebit1, a, b)
# Prepare ebit used for teleportation
protocol.h(ebit0)
protocol.cx(ebit0, ebit1)
protocol.barrier()
# Alice's operations
protocol.cx(qubit, ebit0)
protocol.h(qubit)
protocol.barrier()
# Alice measures and sends classical bits to Bob
protocol.measure(ebit0, a)
protocol.measure(qubit, b)
protocol.barrier()
# Bob uses the classical bits to conditionally apply gates
with protocol.if_test((a, 1)):
protocol.x(ebit1)
with protocol.if_test((b, 1)):
protocol.z(ebit1)
display(protocol.draw(output="mpl"))

Obwód wykorzystuje kilka funkcji Qiskit, których nie widzieliśmy jeszcze w poprzednich lekcjach, w tym funkcje barrier i if_test.
Funkcja barrier tworzy wizualne rozdzielenie, dzięki czemu diagram obwodu jest bardziej czytelny, a także uniemożliwia Qiskit przeprowadzanie różnych uproszczeń i optymalizacji w poprzek bariery podczas kompilacji, gdy obwody są uruchamiane na prawdziwym sprzęcie.
Funkcja if_test stosuje operację warunkowo w zależności od bitu lub rejestru klasycznego.
Obwód najpierw inicjalizuje w stanie (co nie jest częścią samego protokołu), następnie wykonuje operacje Alicji, potem jej pomiary, a na koniec operacje Boba. Aby przetestować, czy protokół działa poprawnie, zastosujemy losowo wygenerowaną bramkę jednokubitową do zainicjalizowanego stanu kubitu , aby otrzymać losowy wektor stanu kwantowego, który zostanie teleportowany. Stosując odwrotność (czyli transpozycję sprzężoną) tej bramki do po wykonaniu protokołu, możemy zweryfikować, że stan został teleportowany, mierząc, czy powrócił do stanu .
Najpierw losowo wybierzemy unitarną bramkę kubitową.
random_gate = UGate(
theta=random.random() * 2 * pi,
phi=random.random() * 2 * pi,
lam=random.random() * 2 * pi,
)
display(array_to_latex(random_gate.to_matrix()))
Teraz utworzymy nowy obwód testowy, który najpierw stosuje naszą losową bramkę do następnie uruchamia obwód teleportacji, a na koniec stosuje odwrotność naszej losowej bramki do kubitu i wykonuje pomiar. Wynik powinien być z pewnością.
# Create a new circuit including the same bits and qubits used in the
# teleportation protocol.
test = QuantumCircuit(qubit, ebit0, ebit1, a, b)
# Start with the randomly selected gate on Q
test.append(random_gate, qubit)
test.barrier()
# Append the entire teleportation protocol from above.
test = test.compose(protocol)
test.barrier()
# Finally, apply the inverse of the random unitary to B and measure.
test.append(random_gate.inverse(), ebit1)
result = ClassicalRegister(1, "Result")
test.add_register(result)
test.measure(ebit1, result)
display(test.draw(output="mpl"))

Na koniec uruchommy symulator Aer na tym obwodzie i narysujmy histogram wyników. Zobaczymy statystyki dla wszystkich trzech bitów klasycznych: dolny/najbardziej lewy bit powinien zawsze wynosić co wskazuje, że kubit został pomyślnie teleportowany do podczas gdy pozostałe dwa bity powinny być w przybliżeniu rozłożone równomiernie.
result = AerSimulator().run(test).result()
statistics = result.get_counts()
display(plot_histogram(statistics))
Możemy również filtrować statystyki, aby skupić się wyłącznie na kubicie wyniku testu, jeśli chcemy, w ten sposób:
filtered_statistics = marginal_distribution(statistics, [2])
display(plot_histogram(filtered_statistics))
Superkodowanie
Superkodowanie to protokół, który w pewnym sensie osiąga cel komplementarny do teleportacji. Zamiast umożliwiać przesłanie jednego kubitu przy użyciu dwóch klasycznych bitów komunikacji (kosztem jednego e-bitu splątania), pozwala na przesłanie dwóch klasycznych bitów przy użyciu jednego kubitu komunikacji kwantowej (ponownie kosztem jednego e-bitu splątania).
Mówiąc bardziej szczegółowo, mamy nadawcę (Alicję) oraz odbiorcę (Boba), którzy dzielą jeden e-bit splątania. Zgodnie z konwencjami przyjętymi w tej lekcji oznacza to, że Alicja ma kubit Bob ma kubit a wspólnie para jest w stanie Alicja chce przesłać Bobowi dwa klasyczne bity, które oznaczymy jako i i osiągnie to, wysyłając mu jeden kubit.
Rozsądne jest uznanie tego osiągnięcia za mniej interesujące niż to, które umożliwia teleportacja. Wysyłanie kubitów będzie prawdopodobnie o wiele trudniejsze niż wysyłanie klasycznych bitów w dającej się przewidzieć przyszłości, więc wymiana jednego kubitu komunikacji kwantowej na dwa bity komunikacji klasycznej, na dodatek kosztem e-bitu, wydaje się niewiele warta. Nie oznacza to jednak, że superkodowanie nie jest interesujące, ponieważ z pewnością jest.
Pasując do tematu lekcji, jednym z powodów, dla których superkodowanie jest interesujące, jest to, że demonstruje ono konkretne i (w kontekście teorii informacji) dość uderzające wykorzystanie splątania. Słynne twierdzenie w teorii informacji kwantowej, znane jako twierdzenie Holevo, implikuje, że bez użycia współdzielonego stanu splątanego niemożliwe jest przesłanie więcej niż jednego bitu klasycznej informacji przez wysłanie pojedynczego kubitu. (Twierdzenie Holevo jest ogólniejsze niż to. Jego precyzyjne sformułowanie jest techniczne i wymaga wyjaśnienia, ale jest to jedna z jego konsekwencji.) Tak więc poprzez superkodowanie współdzielone splątanie efektywnie pozwala na podwojenie klasycznej pojemności informacyjnej wysyłanych kubitów.
Protokół
Poniższy diagram obwodu kwantowego opisuje protokół superkodowania:

Słownie, oto co robi Alicja:
-
Jeśli Alicja wykonuje bramkę na swoim kubicie (a jeśli nie wykonuje).
-
Jeśli Alicja wykonuje bramkę na swoim kubicie (a jeśli nie wykonuje).
Następnie Alicja wysyła swój kubit do Boba.
Kiedy Bob otrzymuje kubit najpierw wykonuje bramkę controlled-NOT, gdzie jest bramką sterującą, a jest bramką celu, a następnie stosuje bramkę Hadamard na Potem mierzy aby uzyskać oraz aby uzyskać w obu przypadkach dokonując pomiarów w bazie standardowej.
Analiza
Idea stojąca za tym protokołem jest prosta: Alicja efektywnie wybiera, który stan Bella chciałaby współdzielić z Bobem, wysyła Bobowi swój kubit, a Bob dokonuje pomiaru, aby określić, który stan Bella wybrała Alicja.
Oznacza to, że początkowo współdzielą stan a w zależności od bitów i Alicja albo pozostawia ten stan bez zmian, albo przekształca go w jeden z pozostałych stanów Bella, stosując lub na swoim kubicie
Działania Boba mają następujące efekty na czterech stanach Bella:
Można to sprawdzić bezpośrednio, obliczając wyniki operacji Boba na tych stanach pojedynczo.
Tak więc, gdy Bob dokonuje pomiarów, jest w stanie określić, który stan Bella wybrała Alicja. Weryfikacja, że protokół działa poprawnie, sprowadza się do sprawdzenia każdego przypadku:
-
Jeśli to stan w chwili, gdy Bob otrzymuje to Przekształca ten stan w i uzyskuje
-
Jeśli to stan w chwili, gdy Bob otrzymuje to Przekształca ten stan w i uzyskuje
-
Jeśli to stan w chwili, gdy Bob otrzymuje to Przekształca ten stan w i uzyskuje
-
Jeśli to stan w chwili, gdy Bob otrzymuje to Przekształca ten stan w i uzyskuje (Czynnik fazowy minus jeden nie ma tu żadnego wpływu.)
Implementacja superkodowania
Oto prosta implementacja superkodowania, w której specyfikujemy sam obwód w zależności od bitów, które mają być przesłane. Najpierw wybierzemy dwa bity do przesłania. (Później wybierzemy je losowo, ale na razie dokonamy arbitralnego wyboru.)
c = "1"
d = "0"
Teraz odpowiednio zbudujemy obwód. Pozwolimy Qiskit używać domyślnych nazw dla kubitów: dla górnego kubitu i dla dolnego.
protocol = QuantumCircuit(2)
# Prepare ebit used for superdense coding
protocol.h(0)
protocol.cx(0, 1)
protocol.barrier()
# Alice's operations
if d == "1":
protocol.z(0)
if c == "1":
protocol.x(0)
protocol.barrier()
# Bob's actions
protocol.cx(0, 1)
protocol.h(0)
protocol.measure_all()
display(protocol.draw(output="mpl"))

Niewiele tu nowego, z wyjątkiem funkcji measure_all, która mierzy wszystkie kubity i umieszcza wyniki w pojedynczym rejestrze klasycznym (mającym zatem w tym przypadku dwa bity).
Uruchomienie symulatora Aer daje oczekiwany wynik.
result = AerSimulator().run(protocol).result()
statistics = result.get_counts()
for outcome, frequency in statistics.items():
print(f"Measured {outcome} with frequency {frequency}")
display(plot_histogram(statistics))
Measured 10 with frequency 1024
Teraz użyjmy dodatkowego kubitu jako generatora losowych bitów — w istocie do rzucania uczciwymi monetami. Użyjemy go, aby losowo wybrać i a następnie uruchomić protokół superkodowania.
rbg = QuantumRegister(1, "coin")
ebit0 = QuantumRegister(1, "A")
ebit1 = QuantumRegister(1, "B")
Alice_c = ClassicalRegister(1, "Alice c")
Alice_d = ClassicalRegister(1, "Alice d")
test = QuantumCircuit(rbg, ebit0, ebit1, Alice_d, Alice_c)
# Initialize the ebit
test.h(ebit0)
test.cx(ebit0, ebit1)
test.barrier()
# Use the 'coin' qubit twice to generate Alice's bits c and d.
test.h(rbg)
test.measure(rbg, Alice_c)
test.h(rbg)
test.measure(rbg, Alice_d)
test.barrier()
# Now the protocol runs, starting with Alice's actions, which depend
# on her bits.
with test.if_test((Alice_d, 1), label="Z"):
test.z(ebit0)
with test.if_test((Alice_c, 1), label="X"):
test.x(ebit0)
test.barrier()
# Bob's actions
test.cx(ebit0, ebit1)
test.h(ebit0)
test.barrier()
Bob_c = ClassicalRegister(1, "Bob c")
Bob_d = ClassicalRegister(1, "Bob d")
test.add_register(Bob_d)
test.add_register(Bob_c)
test.measure(ebit0, Bob_d)
test.measure(ebit1, Bob_c)
display(test.draw(output="mpl"))

Uruchomienie symulatora Aer pokazuje wyniki: klasyczne bity Alicji i Boba zawsze się zgadzają.
result = AerSimulator().run(test).result()
statistics = result.get_counts()
display(plot_histogram(statistics))

Gra CHSH
Ostatnim przykładem omawianym w tej lekcji nie jest protokół, lecz gra znana jako gra CHSH.
Gdy mówimy w tym kontekście o grze, nie mamy na myśli czegoś, w co gra się dla zabawy lub sportu, ale raczej matematyczną abstrakcję w rozumieniu teorii gier. Matematyczne abstrakcje gier są badane na przykład w ekonomii i informatyce i są zarówno fascynujące, jak i użyteczne.
Litery CHSH odnoszą się do autorów — Johna Clausera, Michaela Horne'a, Abnera Shimony'ego i Richarda Holta — artykułu z 1969 roku, w którym po raz pierwszy opisano ten przykład. Nie opisali go jako gry, lecz jako eksperyment. Jego opis jako gry jest jednak zarówno naturalny, jak i intuicyjny.
Gra CHSH należy do klasy gier znanych jako gry nielokalne. Gry nielokalne są niezwykle interesujące i mają głębokie powiązania z fizyką, informatyką i matematyką — kryjąc tajemnice, które wciąż pozostają nierozwiązane. Rozpoczniemy tę sekcję od wyjaśnienia, czym są gry nielokalne, a następnie skupimy się na grze CHSH i na tym, co czyni ją interesującą.
Gry nielokalne
Gra nielokalna to gra kooperacyjna, w której dwóch graczy, Alicja i Bob, współpracuje, aby osiągnąć określony rezultat. Gra jest prowadzona przez sędziego, który postępuje zgodnie ze ścisłymi wytycznymi znanymi Alicji i Bobowi.
Alicja i Bob mogą przygotować się do gry w dowolny wybrany przez siebie sposób, ale gdy gra się rozpocznie, nie wolno im się komunikować. Możemy sobie wyobrazić, że gra toczy się w jakimś zabezpieczonym obiekcie — tak jakby sędzia grał rolę detektywa, a Alicja i Bob byli podejrzanymi przesłuchiwanymi w różnych pokojach. Innym sposobem myślenia o tej konfiguracji jest to, że Alicję i Boba dzieli ogromna odległość, a komunikacja jest zabroniona, ponieważ prędkość światła nie pozwala na nią w czasie trwania gry. To znaczy, że jeśli Alicja spróbuje wysłać wiadomość do Boba, gra się skończy, zanim on ją otrzyma, i odwrotnie.
Gra nielokalna działa w ten sposób, że sędzia najpierw zadaje Alicji i Bobowi po jednym pytaniu. Użyjemy litery do oznaczenia pytania Alicji oraz do oznaczenia pytania Boba. Tutaj traktujemy i jako stany klasyczne, a w grze CHSH i są bitami.
Sędzia wykorzystuje losowość do wyboru tych pytań. Dokładniej, z każdą możliwą parą pytań związane jest pewne prawdopodobieństwo , a sędzia zobowiązał się wybierać pytania losowo, w chwili gry, w ten właśnie sposób. Wszyscy, włącznie z Alicją i Bobem, znają te prawdopodobieństwa — ale nikt nie wie konkretnie, która para zostanie wybrana, dopóki gra się nie rozpocznie.
Po otrzymaniu pytań Alicja i Bob muszą udzielić odpowiedzi: odpowiedź Alicji to , a odpowiedź Boba to Ponownie, są to ogólnie stany klasyczne, a w grze CHSH bity.
W tym momencie sędzia podejmuje decyzję: Alicja i Bob albo wygrywają, albo przegrywają w zależności od tego, czy para odpowiedzi zostanie uznana za poprawną dla pary pytań zgodnie z pewnym ustalonym zestawem reguł. Różne reguły oznaczają różne gry, a reguły specyficznie dla gry CHSH są opisane w następnej sekcji. Jak już wspomniano, reguły są znane wszystkim.
Poniższy diagram przedstawia graficzną reprezentację tych interakcji.

To właśnie niepewność co do tego, jakie pytania zostaną zadane, a w szczególności fakt, że każdy z graczy nie zna pytania drugiego gracza, sprawia, że gry nielokalne stanowią wyzwanie dla Alicji i Boba — podobnie jak zmawiający się podejrzani w różnych pokojach starający się zachować spójność swoich zeznań.
Precyzyjny opis sędziego definiuje konkretną instancję gry nielokalnej. Obejmuje to specyfikację prawdopodobieństw dla każdej pary pytań wraz z regułami, które określają, czy każda para odpowiedzi wygrywa, czy przegrywa dla każdej możliwej pary pytań
Za chwilę przyjrzymy się grze CHSH, ale wcześniej krótko zaznaczmy, że warto również rozważyć inne gry nielokalne. W istocie jest to niezwykle interesujące; istnieją dość proste gry nielokalne, dla których nie jest obecnie znane, jak dobrze Alicja i Bob mogą grać, korzystając ze splątania. Konfiguracja jest prosta, ale w grę wchodzi złożoność — a dla niektórych gier obliczenie najlepszych lub prawie najlepszych strategii dla Alicji i Boba może być niewyobrażalnie trudne. Taka jest zaskakująco nieintuicyjna natura modelu gier nielokalnych.
Opis gry CHSH
Oto precyzyjny opis gry CHSH, gdzie (jak wyżej) jest pytaniem Alicji, jest pytaniem Boba, jest odpowiedzią Alicji, a jest odpowiedzią Boba:
-
Pytania i odpowiedzi są bitami:
-
Sędzia wybiera pytania jednostajnie losowo. To znaczy, że każda z czterech możliwości, i jest wybierana z prawdopodobieństwem
-
Odpowiedzi wygrywają dla pytań , jeśli , a w przeciwnym razie przegrywają. Poniższa tabela wyraża tę regułę, wymieniając warunki wygranej i przegranej dla odpowiedzi dla każdej pary pytań
Ograniczenie strategii klasycznych
Rozważmy teraz strategie dla Alicji i Boba w grze CHSH, zaczynając od strategii klasycznych.
Strategie deterministyczne
Zaczniemy od strategii deterministycznych, w których odpowiedź Alicji jest funkcją pytania , które otrzymuje, i podobnie odpowiedź Boba jest funkcją pytania , które on otrzymuje. Na przykład możemy zapisać , aby oznaczyć odpowiedź Alicji, gdy jej pytaniem jest oraz , aby oznaczyć odpowiedź Alicji, gdy jej pytaniem jest
Żadna strategia deterministyczna nie może wygrywać gry CHSH za każdym razem. Jednym ze sposobów zrozumienia tego jest po prostu przejście kolejno przez wszystkie możliwe strategie deterministyczne i sprawdzenie, że każda z nich przegrywa dla przynajmniej jednej z czterech możliwych par pytań. Alicja i Bob mogą wybierać z czterech możliwych funkcji z jednego bitu na jeden bit — z którymi zetknęliśmy się w lekcji o Pojedynczych systemach — a zatem w sumie do sprawdzenia jest różnych strategii deterministycznych.
Możemy również uzasadnić to analitycznie. Jeśli strategia Alicji i Boba wygrywa, gdy to musi być jeśli ich strategia wygrywa, gdy to i podobnie, jeśli strategia wygrywa dla , to Tak więc, jeśli ich strategia wygrywa dla wszystkich trzech możliwości, to
Oznacza to, że strategia przegrywa w ostatnim przypadku a tutaj wygrana wymaga, aby Nie może więc istnieć strategia deterministyczna, która wygrywa za każdym razem.
Z drugiej strony łatwo znaleźć strategie deterministyczne, które wygrywają w trzech z czterech przypadków, takie jak Stąd wnioskujemy, że maksymalne prawdopodobieństwo wygranej Alicji i Boba przy użyciu strategii deterministycznej wynosi
Strategie probabilistyczne
Jak właśnie ustaliliśmy, Alicja i Bob nie mogą osiągnąć lepszego wyniku niż wygrywanie gry CHSH w 75% przypadków przy użyciu strategii deterministycznej. A co ze strategią probabilistyczną? Czy wykorzystanie losowości — włącznie z możliwością wspólnej losowości, gdzie ich losowe wybory są skorelowane — mogłoby pomóc Alicji i Bobowi?
Okazuje się, że strategie probabilistyczne wcale nie pomagają zwiększyć prawdopodobieństwa wygranej Alicji i Boba. Dzieje się tak, ponieważ każdą strategię probabilistyczną można alternatywnie postrzegać jako losowy wybór strategii deterministycznej, podobnie jak (co wspomniano w lekcji Pojedyncze systemy) operacje probabilistyczne można postrzegać jako losowe wybory operacji deterministycznych. Średnia nigdy nie jest większa niż maksimum, a zatem wynika stąd, że strategie probabilistyczne nie oferują żadnej przewagi pod względem ogólnego prawdopodobieństwa wygranej.
Zatem wygrywanie z prawdopodobieństwem jest najlepszym, co Alicja i Bob mogą osiągnąć przy użyciu jakiejkolwiek strategii klasycznej, czy to deterministycznej, czy probabilistycznej.
Strategia w grze CHSH
Naturalnym pytaniem, jakie można postawić w tym momencie, jest to, czy Alicja i Bob mogą osiągnąć lepszy wynik, używając strategii kwantowej. W szczególności, jeśli dzielą splątany stan kwantowy, jak sugeruje poniższy rysunek, który mogli przygotować przed rozpoczęciem gry, czy mogą zwiększyć swoje prawdopodobieństwo wygranej?

Odpowiedź brzmi: tak, i to jest główny sens tego przykładu oraz powód, dla którego jest tak interesujący. Zobaczmy więc dokładnie, jak Alicja i Bob mogą osiągnąć lepszy wynik w tej grze dzięki splątaniu.
Wymagane wektory i macierze
Pierwszą rzeczą, którą musimy zrobić, jest zdefiniowanie wektora stanu kubitu dla każdej liczby rzeczywistej (o której będziemy myśleć jako o kącie mierzonym w radianach) w następujący sposób.
Oto kilka prostych przykładów:
Mamy również następujące przykłady, które pojawiają się w poniższej analizie:
Patrząc na ogólną postać, widzimy, że iloczyn skalarny dowolnych dwóch z tych wektorów wyraża się następującym wzorem:
Dokładniej, w tych wektorach występują wyłącznie liczby rzeczywiste, więc nie musimy przejmować się sprzężeniami zespolonymi: iloczyn skalarny jest iloczynem cosinusów plus iloczynem sinusów. Skorzystanie z jednego ze wzorów na sumę kątów z trygonometrii prowadzi do powyższego uproszczenia. Wzór ten ujawnia geometryczną interpretację iloczynu skalarnego rzeczywistych wektorów jednostkowych jako cosinusa kąta między nimi.
Jeśli obliczymy iloczyn skalarny iloczynu tensorowego dowolnych dwóch z tych wektorów ze stanem , otrzymamy podobne wyrażenie, z tą różnicą, że w mianowniku pojawi się :
Powód naszego zainteresowania tym konkretnym iloczynem skalarnym wkrótce stanie się jasny, ale na razie po prostu zauważamy, że jest to taki wzór.
Następnie zdefiniujmy macierz unitarną dla każdego kąta w następujący sposób.
Intuicyjnie mówiąc, ta macierz przekształca w oraz w Aby sprawdzić, że jest to macierz unitarna, kluczową obserwacją jest to, że wektory i są ortogonalne dla każdego kąta :
Stąd otrzymujemy