Teleportacja kwantowa
Na potrzeby tego modułu Qiskit w klasach uczniowie muszą mieć działające środowisko Python z zainstalowanymi następującymi pakietami:
qiskitv2.1.0 lub nowszyqiskit-ibm-runtimev0.40.1 lub nowszyqiskit-aerv0.17.0 lub nowszyqiskit.visualizationnumpypylatexenc
Aby skonfigurować i zainstalować powyższe pakiety, zapoznaj się z przewodnikiem Instalacja Qiskit. Aby uruchamiać zadania na prawdziwych komputerach kwantowych, uczniowie będą musieli założyć konto IBM Quantum®, postępując zgodnie z krokami opisanymi w przewodniku Konfiguracja konta IBM Cloud.
Ten moduł był testowany i wykorzystał 14 sekund czasu QPU. To jedynie szacunek. Twoje rzeczywiste zużycie może się różnić.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Obejrzyj poniższy przewodnik po module przygotowany przez dr Katie McCormick lub kliknij tutaj, aby obejrzeć go na YouTube.
Wprowadzenie i tło
Teleportacja kwantowa to technika z dziedziny fizyki kwantowej, która umożliwia transfer informacji kwantowej z jednego miejsca do drugiego bez fizycznego przemieszczania cząstek. W odróżnieniu od koncepcji teleportacji rodem z science fiction, proces ten nie polega na transportowaniu materii. Zamiast tego opiera się na zasadzie splątania kwantowego, w którym dwie cząstki stają się ze sobą powiązane niezależnie od odległości. Poprzez serię precyzyjnych pomiarów i klasycznej komunikacji stan kwantowy jednej cząstki może zostać odtworzony w innej cząstce w odległym miejscu, efektywnie „teleportując" informację kwantową. W tym module zobaczymy, jak działa to matematycznie, a następnie zaimplementujemy teleportację kwantową na prawdziwym komputerze kwantowym. Poniższe wprowadzenie będzie krótkie; po więcej informacji o informacji kwantowej i dokładniejsze wyjaśnienie teleportacji zalecamy kurs Johna Watrusa dotyczący Podstaw informacji kwantowej, a w szczególności sekcję o Teleportacji.
Klasyczne bity mogą przyjmować stany 0 lub 1. Kwantowe bity (qubit) mogą znajdować się w stanach kwantowych oznaczanych i , a także w liniowych kombinacjach tych stanów, zwanych „superpozycjami", takich jak , gdzie i . Choć stany mogą istnieć w tej superpozycji, pomiar stanu „zawęzi" go do stanu lub . Parametry i są powiązane z prawdopodobieństwem każdego wyniku pomiaru zgodnie z
Stąd warunek, że .
Kolejną kluczową cechą jest to, że kwantowe bity mogą być „splątane", co oznacza, że pomiar jednego qubit może wpływać na wynik pomiaru innego, splątanego qubit. Zrozumienie, czym splątanie różni się od zwykłych klasycznych korelacji, jest nieco skomplikowane. Najpierw wyjaśnijmy naszą notację. Nazwijmy dwa qubit należące do przyjaciela 0 (Alicji) i przyjaciela 1 (Boba), z których każdy jest w stanie
lub
czasami skrócone po prostu do
Zauważ, że qubit o najniższym numerze (lub literze) znajduje się najdalej po prawej stronie. Jest to konwencja zwana notacją „little-endian", stosowana w całym Qiskit. Jeśli dwuqubitowy stan przyjaciół wynosi i zmierzą oni stan swoich odpowiednich qubit, każde z nich znajdzie 0. Podobnie, gdyby qubit były w stanie , każdy z ich pomiarów dałby wynik 1. To niczym nie różni się od przypadku klasycznego. Jednak w obliczeniach kwantowych możemy połączyć to z superpozycją, aby uzyskać stany takie jak
W takim stanie to, czy qubit Alicji i Boba są w stanie 0 czy 1, nie jest jeszcze znane — nawet natura tego jeszcze nie wyznaczyła — a jednak wiemy, że zmierzą ten sam stan swojego qubit. Na przykład, jeśli Bob zmierzy swój qubit jako będący w stanie , jedynym sposobem, żeby to się stało, jest to, że pomiar zawalił dwuqubitowy stan do jednego z dwóch możliwych stanów — konkretnie do . To pozostawia qubit Alicji również w stanie .
Splątanie qubit w ten sposób nie wymaga, aby qubit pozostawały fizycznie blisko siebie. Innymi słowy, możemy splątać qubit, a następnie rozdzielić je na dużą odległość i wykorzystać ich splątanie do przesyłania informacji. Splątany stan jak powyższy jest podstawową jednostką splątania i jest czasami nazywany „e-bitem" — pojedynczym bitem splątania. Te e-bity można traktować jako zasoby w komunikacji kwantowej, ponieważ każdy e-bit współdzielony między odległymi partnerami może być używany — jak tu opisujemy — do przenoszenia informacji z jednego miejsca do drugiego.
Pierwszą myślą wielu osób uczących się o tym po raz pierwszy jest kwestia naruszenia teorii względności: czy możemy użyć tego do wysyłania informacji szybciej niż światło? Jak najbardziej — pytaj i kwestionuj zasady naukowe — ale niestety to nie pozwoli nam wysyłać informacji szybciej niż światło, z powodów, które staną się jasne w trakcie tego modułu. Spoiler: co zadziwiające, NIE jest to spowodowane prędkością, z jaką ta „zawalona" informacja się propaguje, co wydaje się dziać szybciej niż światło [1]. Zaczynamy od dwóch współpracowników — Alicji i Boba — którzy początkowo są w tym samym miejscu i mogą razem pracować na tych samych qubit. Ci współpracownicy splątają swoje qubit. Następnie rozdzielą się do dwóch różnych lokalizacji geograficznych, zabierając ze sobą swoje odpowiednie qubit. Alicja następnie uzyska informację kwantową na nowym qubit Q. Nie robimy żadnych założeń dotyczących informacji na Q. Stan Q mógłby być sekretem nieznanym Alicji; mógłby być nieznany wszystkim ludziom. Ale Alicja dostaje zadanie przeniesienia informacji z Q do Boba. Zrobi to za pomocą teleportacji kwantowej.
Aby to osiągnąć, będziemy musieli znać pewne operacje kwantowe, czyli „bramki".
Operatory kwantowe (bramki)
Możesz pominąć tę sekcję, jeśli znasz już bramki kwantowe. Jeśli chcesz lepiej zrozumieć te bramki, zapoznaj się z kursem Basics of quantum information, szczególnie z pierwszymi dwoma lekcjami, dostępnymi na IBM Quantum Learning.
W tym protokole teleportacji będziemy używać przede wszystkim dwóch rodzajów bramek kwantowych: bramki Hadamarda oraz bramki CNOT. Kilka innych odegra mniejszą rolę: bramka , bramka oraz bramka SWAP.
Ten moduł można ukończyć przy bardzo ograniczonej znajomości algebry liniowej, jednak wizualizacja bramek kwantowych za pomocą macierzy i wektorów bywa pomocna. Dlatego przedstawiamy tu również macierzowo-wektorową reprezentację bramek i stanów kwantowych.
Stany, które już omówiliśmy, przyjmują (częściowo zgodnie z konwencją, a częściowo ze względu na narzucone ograniczenia) następujące postaci wektorowe:
W ten sposób dowolny stan można zapisać jako
Istnieje pewna swoboda w rozszerzeniu tej notacji na stany wieloqubitowe, ale poniższy wybór jest dość standardowy:
Mając na uwadze tę notację wektorową, możemy teraz przedstawić potrzebne bramki kwantowe, ich działanie na stany kwantowe oraz ich postaci macierzowe.
Bramka H Hadamarda: Tworzy stan superpozycji. Bramka jednoQubitowa.
Circuit z bramką Hadamarda tworzy się następująco:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")
Bramka CNOT (Controlled-NOT): Ta bramka wykorzystuje dwa Qubity: sterujący i docelowy. Sprawdza stan Qubitu sterującego, który pozostaje niezmieniony. Jeśli jednak qubit sterujący jest w stanie , bramka zmienia stan Qubitu docelowego; jeśli qubit sterujący jest w stanie , żadna zmiana nie jest wprowadzana. W poniższej notacji przyjmijmy, że qubit (skrajny prawy) jest sterującym, a qubit (skrajny lewy) jest docelowym. Notacja poniżej przyjmuje postać
Zapis CNOT bywa niekiedy stosowany bez jawnego wskazania kolejności Qubitu sterującego i docelowego. W kodzie oraz na diagramach Circuit nie ma jednak żadnej dwuznaczności.
Bramka CNOT wygląda nieco inaczej w Circuit, ponieważ wymaga dwóch Qubitów. Oto jej implementacja:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")
Sprawdź swoją wiedzę
Przeczytaj poniższe pytanie, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby ujawnić rozwiązanie.
Większość bramek ma tę samą postać macierzową w Qiskit co wszędzie indziej. Bramka CNOT działa jednak na dwa Qubity, przez co konwencje kolejności Qubitów nabierają znaczenia. Teksty, w których Qubity są uporządkowane jako , będą pokazywać inną postać macierzową bramki CNOT. Zweryfikuj przez jawne mnożenie macierzowe, że powyższa macierz CNOT działa poprawnie na stan
Odpowiedź:
Bramka : Odpowiednik operacji NOT. Bramka jednoQubitowa.
W Qiskit tworzenie Circuit z bramką wygląda następująco:
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")
Bramka : Dodaje „fazę" do stanu (współczynnik, który dla stanów własnych Z, czyli i , wynosi odpowiednio 1 lub -1). Bramka jednoQubitowa.
W Qiskit tworzenie Circuit z bramką wygląda następująco:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")
Teoria
Opiszmy matematycznie protokół kwantowej teleportacji. W kolejnej sekcji zrealizujemy ten schemat na komputerze kwantowym.
Alice i Bob splatają swoje Qubity: Na początku qubit Alice i qubit Boba są oddzielnie w stanie (to rozsądne założenie, a zarazem właściwa inicjalizacja komputerów kwantowych IBM®). Możemy to zapisać jako lub po prostu . Obliczmy, co się dzieje, gdy Alice i Bob zastosują bramkę Hadamarda na Qubicie Alice, a następnie bramkę CNOT z Qubitem Alice jako kontrolnym i Qubitem Boba jako docelowym:
Zauważ, że teraz Qubity Alice i Boba są splątane. Choć natura nie zdecydowała jeszcze, czy oba Qubity są w stanie , czy , wiadomo, że będą w tym samym stanie. Alice i Bob się rozdzielają: Dwoje znajomych przenosi swoje Qubity do nowych lokalizacji, potencjalnie bardzo odległych od siebie. Wiąże się to z wieloma zastrzeżeniami: przenoszenie informacji kwantowej bez jej zakłócania nie jest trywialne. Można to jednak zrobić – i rzeczywiście zrobisz to w tym module. Pamiętaj jednak, że przenoszenie informacji kwantowej wiąże się z ryzykiem wystąpienia błędów.
Wprowadzamy Q: Na Qubicie Q przygotowywany jest tajny stan:
W tym momencie Q sąsiaduje po prostu z Qubitem Alice (A). Nie doszło do żadnego splątania, więc stan kwantowy wszystkich trzech Qubitów razem można zapisać jako:
Celem jest przeniesienie informacji z Q z lokalizacji Alice do lokalizacji Boba. Na tym etapie nie stawiamy żadnych wymagań co do tajności ani szybkości transferu informacji. Badamy po prostu, w jaki sposób informacja może przejść od Alice do Boba. Ponieważ informacja zaczyna się na Q, przyjmiemy, że Q otrzymuje najniższy numer wśród Qubitów, przez co w notacji little-endian Q będzie najbardziej wysunięty w prawo w poniższych wzorach.
Alice splata Qubity A i Q: Alice stosuje teraz bramkę CNOT z własnym Qubitem jako kontrolnym i Q jako docelowym, a następnie przykłada bramkę Hadamarda do Q. Obliczmy trójkubitowy stan po tej operacji:
Ponieważ A i Q znajdują się w tym samym miejscu, pogrupujmy powyższe wyrazy według wyników pomiarów Qubitów A i Q:
Sprawdź swoje zrozumienie
Przeczytaj poniższe pytanie, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby zobaczyć rozwiązanie.
Korzystając z powyższego wyrażenia na stany wszystkich trzech Qubitów, jakie jest prawdopodobieństwo, że pomiar Qubitów A i Q da wynik
Odpowiedź:
25%. Aby to zobaczyć, przypomnij sobie, że stan Boba musi być znormalizowany, więc
Teraz Alice może zmierzyć Qubity A i Q. Nie może kontrolować wyniku tego pomiaru, ponieważ pomiary kwantowe są probabilistyczne. Kiedy więc dokonuje pomiaru, możliwe są 4 wyniki, wszystkie jednakowo prawdopodobne: oraz Zauważ, że każdy wynik ma inne konsekwencje dla Qubitu Boba. Na przykład, jeśli Alice stwierdzi, że jej Qubity są w stanie to cały trójkubitowy stan kwantowy zostaje zredukowany do Inne wyniki pomiaru Alice dają Bobowi różne stany. Zostały one zebrane w poniższej tabeli.
| Wynik Alice | Stan Boba | Instrukcja dla Boba | Wynik |
|---|---|---|---|
| Brak | |||
| , a następnie | |||
| Dla wszystkich możliwych wyników pomiaru Qubitów Alice, qubit Boba pozostaje w stanie przypominającym tajny stan pierwotnie zapisany na Q. Gdy Alice zmierzy $ | 0\rangle_C | 0\rangle_A\alphaX | 0\rangle |
Powinno być teraz jasne, dlaczego nie możemy użyć tego schematu do wysyłania informacji szybciej niż światło. Możemy mieć szczęście i zmierzyć co oznacza, że Bob natychmiast ma tajny stan. Ale Bob nie wie o tym, dopóki nie zadzwonimy do niego i nie powiemy mu: „Zmierzyliśmy , więc nie musisz nic robić."
W eksperymencie myślowym Qubity są często fizycznie rozdzielone i przenoszone do nowej lokalizacji. Komputery kwantowe IBM® używają Qubitów w stanie stałym na chipie, których nie można rozdzielić. Zamiast więc przenosić Alice i Boba do różnych miejsc, rozdzielimy informację na samym chipie, używając tzw. „bramek SWAP" do przesuwania informacji z jednego Qubitu na drugi.
Eksperyment 1: Podstawowa teleportacja
IBM Quantum zaleca podejście do problemów kwantowych za pomocą platformy, którą nazywamy „wzorcami Qiskit" (ang. Qiskit patterns). Składa się ona z następujących kroków:
- Krok 1: Odwzoruj swój problem na obwód kwantowy
- Krok 2: Zoptymalizuj obwód pod kątem uruchamiania na rzeczywistym sprzęcie kwantowym
- Krok 3: Wykonaj zadanie na komputerach kwantowych IBM przy użyciu Runtime Primitives
- Krok 4: Przetwarzaj wyniki końcowe
Krok 1: Odwzoruj problem na obwód kwantowy
Cała matematyka, którą wykonaliśmy powyżej, stanowi zarys kroku 1. Teraz go zrealizujemy — zbudujemy obwód kwantowy przy użyciu Qiskit! Zaczynamy od stworzenia obwodu kwantowego z trzema qubitami i splątania dwóch qubitów Alice i Boba. Przyjmiemy, że będą to qubity 1 i 2, a qubit 0 zarezerwujemy na stan tajny.
# Step 1: Map your problem to a quantum circuit
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np
# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, Alice, Bob, cr)
# We entangle Alice's and Bob's qubits as in our work above.
# We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)
# Inserting a barrier changes nothing about the logic. It just allows us to
# force gates to be positioned in "layers".
qc.barrier()
# Now we will use random variables to create the secret state.
# Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()
# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()
# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])
# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice
# measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)
qc.draw(output="mpl")
To wszystko, co trzeba zrobić, aby stan Alice został steleportowany do Boba. Pamiętaj jednak, że gdy mierzymy stan kwantowy , uzyskujemy albo , albo . Zatem po zakończeniu całego procesu Bob na pewno ma tajny stan Alice, ale nie możemy tego łatwo zweryfikować zwykłym pomiarem. Żeby pomiar powiedział nam, że zrobiliśmy to poprawnie, musimy zastosować pewien trik. Użyliśmy operatora oznaczonego „U" (od „unitary" — unitarny), którym przygotowaliśmy tajny stan Alice. Możemy zastosować odwrotność U na końcu naszego obwodu. Jeśli U przekształciło stan Alice w , to odwrotność U przekształci stan Boba z powrotem w . Ten ostatni krok nie byłby więc konieczny, gdyby celem było jedynie przeniesienie informacji kwantowej. Robimy go wyłącznie po to, by sprawdzić poprawność naszego działania.
# Add the inverse of U and measure Bob's qubit.
qc.barrier()
qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate
qc.draw(output="mpl")
Jeśli zatem wszystko zrobiliśmy poprawnie, pomiar qubitu Boba powinien dać stan . Oczywiście pomiary te są probabilistyczne. Jeśli więc nawet istnieje małe prawdopodobieństwo uzyskania stanu dla qubitu Boba, to pojedynczy pomiar może właśnie taki wynik dać. Naprawdę chcielibyśmy wykonać wiele pomiarów, aby upewnić się, że prawdopodobieństwo jest bardzo wysokie.
Krok 2: Zoptymalizuj problem pod kątem wykonania kwantowego
Ten krok przekształca operacje, które chcemy wykonać, na postać zgodną z możliwościami konkretnego komputera kwantowego. Dokonuje też odwzorowania naszego problemu na układ topologiczny komputera kwantowego.
Zaczniemy od załadowania kilku pakietów niezbędnych do komunikacji z komputerami kwantowymi IBM. Musimy też wybrać Backend, na którym będziemy uruchamiać zadania. Możemy wybrać najmniej zajęty Backend lub wskazać konkretny Backend, którego właściwości znamy.
Poniżej znajduje się kod służący do jednorazowego zapisania poświadczeń. Pamiętaj, by po zapisaniu ich w środowisku usunąć te informacje z notatnika — w ten sposób nie udostępnisz przypadkowo swoich danych uwierzytelniających razem z notatnikiem. Więcej wskazówek znajdziesz w przewodnikach Set up your IBM Cloud account oraz Initialize the service in an untrusted environment.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Qiskit Runtime service
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_sherbrooke
Jawnie włączamy logikę warunkową na pomiarach.
from qiskit.circuit import IfElseOp
backend.target.add_instruction(IfElseOp, name="if_else")
Teraz musimy dokonać „transpilacji" obwodu kwantowego. Proces ten obejmuje wiele podkroków i jest fascynującym zagadnieniem. Jako przykład podkroku: nie wszystkie komputery kwantowe mogą bezpośrednio realizować wszystkie bramki logiczne z Qiskit. Musimy zapisać bramki z naszego obwodu w terminach bramek, które dany komputer kwantowy może wykonać. Ten i inne procesy możemy przeprowadzić za pomocą wstępnie skonfigurowanego menedżera przejść (ang. preset pass manager). Ustawienie optimization = 3 (najwyższy poziom optymalizacji) zapewnia, że odwzorowanie z naszego abstrakcyjnego obwodu kwantowego na instrukcje przekazywane komputerowi kwantowemu jest tak efektywne, jak tylko może to osiągnąć nasz etap wstępnego przetwarzania.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
Sampler to prymityw zaprojektowany do próbkowania możliwych stanów wynikających z obwodu kwantowego oraz zbierania statystyk dotyczących tego, jakie stany mogą być zmierzone i z jakim prawdopodobieństwem. Importujemy tutaj Sampler z Qiskit Runtime:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
Nie wszystkie obliczenia na komputerze kwantowym można w rozsądny sposób symulować na komputerach klasycznych. Ta prosta teleportacja zdecydowanie tak, choć wcale nie jest zaskoczeniem, że możemy klasycznie zapisać informacje w jednym lub innym miejscu. Zdecydowanie zalecamy przeprowadzanie tych obliczeń na prawdziwym komputerze kwantowym IBM. Jeśli jednak wyczerpałeś(-aś) miesięczny bezpłatny limit lub coś musi zostać ukończone podczas zajęć i nie może czekać w kolejce, ten moduł można zrealizować za pomocą symulatora. W tym celu po prostu uruchom poniższą komórkę i odkomentuj odpowiednie linie w krokach „Execute".
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)
Krok 3: Wykonaj
Użyj Sampler, aby uruchomić zadanie, przekazując obwód jako argument.
job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()
Krok 4: Końcowe przetwarzanie i analiza
Wyrysujmy wyniki i je zinterpretujmy.
# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby ujawnić rozwiązanie.
Które ze stanów powyżej wskazują na pomyślną teleportację i skąd to wiesz?
Odpowiedź:
Stany są wszystkie zgodne z pomyślną teleportacją. Wynika to z tego, że dodaliśmy bramkę odwracającą początkowe przygotowanie tajnego stanu. Jeśli tajny stan został pomyślnie steleportowany do qubitu Boba, ta dodatkowa bramka powinna przywrócić qubit Boba do stanu . Zatem każdy stan powyżej, w którym qubit Boba (qubit 0, zmierzony na 0-tym elemencie rejestru klasycznego, a więc najbardziej po prawej stronie) jest w stanie , oznacza sukces.
Ten wykres przedstawia wszystkie wyniki pomiarów dla trzech qubitów, w trakcie 5000 prób, czyli „strzałów" (ang. shots). Wskazaliśmy wcześniej, że Alice będzie mierzyć wszystkie możliwe stany qubitów A i Q z równym prawdopodobieństwem. Qubity 0–2 przypisaliśmy w obwodzie odpowiednio do Q, A i B. W notacji little-endian qubit Boba jest najbardziej po lewej stronie / o najniższym numerze. Tak więc cztery słupki po lewej stronie odpowiadają qubitowi Boba w stanie , a dwa pozostałe qubity przyjmują wszystkie możliwe kombinacje z mniej więcej równym prawdopodobieństwem. Niemal wszystkie (zwykle ~95%) pomiary dają qubit Boba w stanie , co oznacza, że nasze podejście zakończyło się sukcesem! Kilka strzałów (~5%) dało qubit Boba w stanie . Logicznie rzecz biorąc, nie powinno to być możliwe. Jednak wszystkie nowoczesne komputery kwantowe w znacznie większym stopniu niż komputery klasyczne podlegają szumom i błędom. A kwantowa korekcja błędów jest wciąż rozwijającą się dziedziną.
Eksperyment 2: Teleportacja przez procesor
Zdecydowanie najciekawszym aspektem kwantowej teleportacji jest to, że stan kwantowy może być teleportowany na duże odległości natychmiastowo (choć klasyczna komunikacja dodatkowych bramek już nie jest natychmiastowa). Jak już wspomnieliśmy, nie możemy odłamać qubitów od procesora i przenosić ich w przestrzeni. Możemy jednak przenosić informację z jednego qubitu na drugi, aż qubity biorące udział w teleportacji znajdą się po przeciwnych stronach procesora. Powtórzmy teraz kroki opisane powyżej, tworząc tym razem większy Circuit z wystarczającą liczbą qubitów, by objąć cały procesor.
Krok 1: Odwzorowanie problemu na obwód
Tym razem qubity odpowiadające Alice i Bobowi będą się zmieniać. Nie nadamy więc żadnemu konkretnemu qubitowi nazwy „A" ani „B". Zamiast tego ponumerujemy qubity i użyjemy zmiennych reprezentujących bieżącą pozycję informacji na qubitach należących do Alice i Boba. Wszystkie pozostałe kroki — z wyjątkiem bramek swap — przebiegają tak jak opisano wcześniej.
# Step 1: Map
# Define registers
qr = QuantumRegister(13, "q")
qc = QuantumCircuit(qr, cr)
# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)
# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])
# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits,
# until the information is on distant qubits.
for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1
qc.barrier()
# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
qc.u(theta, varphi, 0.0, secret)
# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)
qc.barrier()
# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])
# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])
qc.barrier()
# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate
qc.draw("mpl")
Na diagramie Circuit widać, że kroki logiczne są takie same. Jedyna różnica polega na tym, że użyliśmy bramek swap, aby przenieść stan qubitu Alice z qubitu 6 () na qubit 1 (), bezpośrednio sąsiadujący z Q. Zastosowaliśmy też bramki swap, by przenieść stan początkowy Boba z qubitu 7 () na qubit 12 (). Zwróć uwagę, że stan na qubicie 12 nie ma żadnego związku z tajnym stanem Q aż do momentu wykonania pomiarów na odległych qubitach 0 i 1, a stan na qubicie 12 staje się równy tajnemu stanowi dopiero po zastosowaniu warunkowych bramek i .
Krok 2: Optymalizacja Circuit
Zwykle podczas korzystania z menedżera przebiegów (pass manager) do transpilacji i optymalizacji Circuit sensowne jest ustawienie optimization_level = 3, gdyż zależy nam na jak największej wydajności naszych Circuit. W tym przypadku nie ma jednak obliczeniowego uzasadnienia dla przenoszenia stanów z qubitów 6 i 7 na qubity 1 i 12 — zrobiliśmy to wyłącznie po to, by zademonstrować teleportację na odległość. Gdybyśmy poprosili menedżera przebiegów o optymalizację naszego Circuit, zdałby sobie sprawę, że te bramki swap nie mają logicznego uzasadnienia, i usunąłby je, wykonując operacje bramkowe na sąsiednich qubitach. Dlatego w tym szczególnym przypadku używamy optimization_level = 0.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pmzero = generate_preset_pass_manager(target=target, optimization_level=0)
qc_isa_zero = pmzero.run(qc)
print(qc_isa_zero.depth())
105
Możemy zwizualizować rozmieszczenie tych qubitów na procesorze kwantowym za pomocą funkcji plot_circuit_layout.
Krok 3: Wykonanie
Podobnie jak wcześniej, zalecamy uruchomienie na prawdziwych komputerach kwantowych IBM. Jeśli wyczerpałeś/-aś swój miesięczny bezpłatny limit, możesz odkomentować odpowiednie komórki symulatora i uruchomić obliczenia na symulatorze.
# This required 5 s to run on a Heron r2 processor on 10-28-24
job = sampler.run([qc_isa_zero])
# job = sampler_sim.run([qc_isa_zero])
counts = job.result()[0].data.c.get_counts()
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Krok 4: Klasyczne przetwarzanie wyników
Ponownie widzimy, że prawdopodobieństwa możliwych wyników pomiarów qubitów Alice są dość równomierne. Istnieje wyraźna preferencja dla znalezienia qubitu Boba w stanie po odwróceniu tajnego kodu, co oznacza duże prawdopodobieństwo, że poprawnie przeteleportowaliśmy tajny stan przez procesor — od Q do Boba (od qubitu 0 do qubitu 12). Zauważamy jednak, że tym razem szansa na niezmierzenie dla Boba jest wyraźnie wyższa. To ważna lekcja z informatyki kwantowej: im więcej bramek (zwłaszcza wieloqubitowych, takich jak bramki swap) masz w swoim Circuit, tym więcej szumów i błędów możesz się spodziewać.
Pytania
Instruktorzy mogą poprosić o wersje tych notebooków z kluczami odpowiedzi i wskazówkami dotyczącymi umiejscowienia w typowych programach nauczania, wypełniając tę krótką ankietę na temat sposobu korzystania z notebooków.
Kluczowe pojęcia
- Qubity mogą być splątane, co oznacza, że pomiar jednego Qubitu wpływa na stan innego Qubitu lub nawet go determinuje.
- Splątanie różni się od klasycznych korelacji; na przykład Qubity A i B mogą znajdować się w superpozycji stanów takich jak Stan A lub B może być nieokreślony przez naturę, a mimo to A i B mogą mieć gwarancję znajdowania się w tym samym stanie.
- Poprzez kombinację splątań i pomiarów możemy przenieść stan (który może przechowywać informacje) z jednego Qubitu do drugiego. Przeniesienie to może odbywać się nawet na duże odległości i nazywa się teleportacją kwantową.
- Teleportacja kwantowa opiera się na pomiarach kwantowych, które mają charakter probabilistyczny. Dlatego klasyczna komunikacja może być konieczna do korekty teleportowanych stanów. To uniemożliwia teleportacji kwantowej przenoszenie informacji szybciej niż światło. Teleportacja kwantowa nie narusza teorii względności ani zasady przyczynowości.
- Nowoczesne komputery kwantowe są bardziej podatne na szum i błędy niż komputery klasyczne. Należy spodziewać się kilkuprocentowego błędu.
- Im więcej bramek dodasz kolejno (zwłaszcza bramek dwu-qubitowych), tym więcej błędów i szumu możesz się spodziewać.
Pytania prawda/fałsz
- P/F Teleportacja kwantowa może być wykorzystana do wysyłania informacji szybciej niż światło.
- P/F Współczesne dowody sugerują, że zanik stanu kwantowego propaguje się szybciej niż światło.
- P/F W Qiskit, Qubity są porządkowane w stanach z Qubitem o najniższym numerze po prawej stronie, jak w
Pytania wielokrotnego wyboru
- Qubity A i B są splątane, a następnie rozdzielone na dużą odległość . Qubit A jest mierzony. Które stwierdzenie jest poprawne dotyczące prędkości, z jaką stan Qubitu B jest zmieniany?
- a. Qubit B jest zmieniany natychmiastowo, w granicach tolerancji eksperymentalnej, w dotychczas przeprowadzonych eksperymentach.
- b. Qubit B jest zmieniany po czasie , co oznacza, że stan kwantowy „zapada się" z mniej więcej prędkością światła, w granicach tolerancji eksperymentalnej.
- c. Qubit B jest zmieniany dopiero po przeprowadzeniu klasycznej komunikacji, co oznacza, że dzieje się to w czasie dłuższym niż .
- d. Żadne z powyższych
- Przypomnij sobie, że prawdopodobieństwo pomiaru jest powiązane z amplitudami w stanach kwantowych. Na przykład, jeśli qubit początkowo jest w stanie prawdopodobieństwo zmierzenia stanu wynosi Nie wszystkie zestawy pomiarów będą dokładnie odpowiadać tym prawdopodobieństwom ze względu na skończone próbkowanie (podobnie jak rzut monetą może dać dwa razy z rzędu orła). Poniższy histogram pomiarów może odpowiadać któremu z następujących stanów kwantowych? Wybierz najlepszą odpowiedź.
- a.
- b.
- c.
- d.
- e.
- Które z poniższych stanów pokazują splątane Qubity A i B? Wybierz wszystkie, które pasują.
- a.
- b.
- c.
- d.
- e.
- W tym module przygotowaliśmy stan splątany: Istnieje jednak wiele innych stanów splątanych, które można by zastosować w podobnym protokole. Który z poniższych stanów może dawać histogram pomiarów dwu-qubitowych podobny do przedstawionego poniżej? Wybierz najlepszą odpowiedź.
- a.
- b.
- c.
- d.
- e.
Pytania do dyskusji
-
Opisz protokół teleportacji kwantowej od początku do końca swojemu partnerowi/grupie. Sprawdź, czy mają coś do dodania lub czy mają pytania.
-
Czy jest coś wyjątkowego w początkowym stanie splątanym między Alice i Bobem: Jeśli tak, co jest w nim wyjątkowego? Jeśli nie, jakich innych stanów splątanych moglibyśmy użyć?