Zacznij pracę z Qiskit w klasie
W tym module Qiskit w Klasie uczniowie muszą mieć działające środowisko Python z zainstalowanymi następującymi pakietami:
qiskitw wersji 2.1.0 lub nowszejqiskit-ibm-runtimew wersji 0.40.1 lub nowszejqiskit-aerw wersji 0.17.0 lub nowszejqiskit.visualizationnumpypylatexenc
Aby skonfigurować i zainstalować powyższe pakiety, zapoznaj się z przewodnikiem Instalacja Qiskit. Aby uruchamiać zadania na prawdziwych komputerach kwantowych, uczniowie muszą założyć konto w IBM Quantum®, postępując zgodnie z instrukcjami w przewodniku Konfiguracja konta IBM Cloud®.
Ten moduł został przetestowany i wykorzystał 2 sekundy czasu QPU na procesorze Heron v2. Jest to wyłącznie szacunek. Twoje rzeczywiste zużycie może się różnić.
# Added by doQumentation — required packages for this notebook
!pip install -q 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'
Wprowadzenie
W modułach Qiskit w Klasie będziesz mieć okazję użyć komputera kwantowego do eksploracji różnych pojęć z dziedzin powiązanych z obliczeniami kwantowymi, takich jak mechanika kwantowa, informatyka, chemia i inne. Ten moduł stanowi warunek wstępny dla pozostałych — wprowadza podstawy obliczeń kwantowych oraz sposób korzystania z Qiskit do uruchamiania obwodów kwantowych.
Najpierw damy ci krótki przegląd działania klasycznego komputera, a następnie pokażemy, jak te pojęcia są adaptowane do paradygmatu obliczeń kwantowych. Na koniec pokażemy, jak połączyć te koncepcje, aby zbudować i uruchomić swój pierwszy obwód kwantowy.
Komputery klasyczne
Prawdopodobnie znasz już podstawy działania komputerów klasycznych, ale tutaj wyróżnimy kilka kluczowych cech, abyśmy mogli następnie przeprowadzić porównanie z komputerami kwantowymi.
Podstawowe jednostki informacji: bity
Komputery klasyczne przetwarzają informacje klasyczne, a podstawową jednostką informacji klasycznej jest bit. Pojedynczy bit może przechowywać odpowiedź na jedno pytanie „tak/nie". Dwa stany binarne bitu reprezentujemy zazwyczaj jako „0" i „1".
Przypomnienie liczb binarnych
Łączenie bitów pozwala przechowywać więcej informacji. Na przykład, jeśli chcesz przechować liczbę od 0 do 15, możesz to zrobić za pomocą czterech bitów w następujący sposób:
| 0 = 0000 | 4 = 0100 | 8 = 1000 | 12 = 1100 |
| 1 = 0001 | 5 = 0101 | 9 = 1001 | 13 = 1101 |
| 2 = 0010 | 6 = 0110 | 10 = 1010 | 14 = 1110 |
| 3 = 0011 | 7 = 0111 | 11 = 1011 | 15 = 1111 |
Ogólnie rzecz biorąc, aby przekonwertować liczbę binarną o bitach na znajomą liczbę w systemie dziesiętnym, mnożysz bit o najmniejszym znaczeniu (skrajny prawy) przez , następny bit z lewej przez , kolejny przez i tak dalej, aż do bitu o największym znaczeniu (skrajny lewy), który mnożysz przez .
A zatem bitów może znajdować się w jednym z różnych możliwych stanów.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odsłonić rozwiązanie.
Ile bitów potrzeba, aby zapisać liczbę 86? Napisz bitstring kodujący tę liczbę w systemie binarnym.
Odpowiedź:
Pamiętaj, że bitów pozwala reprezentować liczby od do , więc sześć bitów daje nam zakres do . To trochę za mało. Dodajemy jeszcze jeden bit, aby uzyskać zakres do . Teraz rozłóżmy 86 na potęgi liczby 2:
Podstawowe operacje: bramki
Komputer musi być w stanie coś robić z bitami, aby móc — no cóż — obliczać. Bramki binarne to operacje stanowiące podstawowe elementy składowe wszystkich bardziej skomplikowanych algorytmów i kodów.
Bramka jednobitowa:
NOT
Gdy masz tylko jeden bit, istnieje tylko jeden sposób na zmianę jego stanu: odwrócenie stanu z 0 na 1 lub z 1 na 0. Nazywamy to bramką „NOT". Efekt tej bramki — i pozostałych bramek omawianych poniżej — można przedstawić w tak zwanej „tabeli prawdy", z kolumnami dla stanów wejściowych i wyjściowych kubitów. Tabela prawdy dla bramki NOT wygląda następująco:
| Wejście | Wyjście |
|---|---|
| 0 | 1 |
| 1 | 0 |
Bramki wielobitowe:
AND
AND to bramka dwubitowa, która przyjmuje dwa bity wejściowe i daje jeden bit wyjściowy. Zwraca 1, jeśli oba bity wejściowe wynoszą 1, w przeciwnym razie 0:
| Wejście | Wyjście |
|---|---|
| 00 | 0 |
| 01 | 0 |
| 10 | 0 |
| 11 | 1 |
OR
OR to kolejna bramka dwubitowa z jednym bitem wyjściowym. Zwraca 1, jeśli którykolwiek z bitów wynosi 1:
| Wejście | Wyjście |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 11 | 1 |
XOR
XOR oznacza „exclusive OR" (wyłączne OR) i działa jak bramka OR, ale zwraca 1 tylko wtedy, gdy dokładnie jeden z bitów wejściowych wynosi 1. Zwraca 0, jeśli oba wynoszą 1 lub oba wynoszą 0:
| Wejście | Wyjście |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 11 | 0 |
Pomiary:
Zazwyczaj, ucząc się o obliczeniach klasycznych, nie poświęca się zbyt wiele uwagi procesowi odczytu stanu bitów. Wynika to z faktu, że nie jest to zbyt skomplikowane z konceptualnego punktu widzenia. Możesz mierzyć bity w dowolnym momencie — przed, w trakcie lub po obliczeniach — i nie wpływa to na wynik. W obliczeniach kwantowych sytuacja jest inna, jak omówimy poniżej.
Obwody:
Łącząc powyższe bramki, możesz wykonać dowolną operację na komputerze. Weźmy prosty przykład: używając bramek AND i XOR, można zbudować obwód półsumatora, który oblicza sumę dwóch bitów. Jest to przedstawione na schemacie obwodu logicznego, gdzie przewody reprezentują bity, a bramki operujące na bitach są pokazane jako symbole na odpowiednich przewodach:
A zatem dwa bity są kopiowane i przepuszczane zarówno przez bramkę AND, jak i XOR. Wynik bramki XOR to „bit sumy" (S), który pozostaje na miejscu jedności liczby binarnej, natomiast wynik bramki AND to „bit przeniesienia" (C), który jest wartością kolejnej najbardziej znaczącej cyfry w liczbie binarnej. Oto tabela prawdy:
| Suma () | Przeniesienie () | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odsłonić rozwiązanie.
Zweryfikuj, że powyższa tabela prawdy daje poprawny wynik dla obwodu sumatora. To znaczy, dla każdej z czterech kombinacji A i B, sprawdź, czy .
Odpowiedź:
Komputery kwantowe
Bity kubit
Tak jak bity są podstawowymi jednostkami klasycznej informacji, kwantowe bity, czyli „kubit", są podstawowymi jednostkami informacji kwantowej. Podobnie jak klasyczny bit, stan kubitu może wynosić 0 lub 1, co zwykle oznaczamy jako i . Jednak w przeciwieństwie do klasycznego bitu, kubit może też znajdować się w superpozycji stanu i stanu jednocześnie. Ogólnie rzecz biorąc, kubit może być w dowolnym stanie postaci:
gdzie i są zespolonymi amplitudami spełniającymi warunek .
Faza kwantowa
Ponieważ i są zespolone, każdą z nich można zapisać jako , gdzie nazywamy fazą. Jeśli pomnożymy cały stan przez ten sam globalny czynnik fazowy, nic fizycznie się nie zmienia — nazywamy to fazą globalną i nie ma ona żadnych obserwowalnych konsekwencji.
Z tego powodu przyjęło się „wyłączać" przed nawias, co daje:
gdzie jest względną fazą stanu kwantowego, która ma obserwowalne konsekwencje.
Faza ta odgrywa bardzo ważną rolę w obliczeniach kwantowych — jej różnorodne konsekwencje poznasz w kolejnych modułach Qiskit w klasie.
Wiele kubitów
O ile stan wielu bitów można było wyrazić po prostu jako ciąg zer i jedynek, o tyle stan wielu kubitów jest nieco bardziej skomplikowany ze względu na zasady superpozycji i splątania.
Przypomnij sobie, że bitów może przyjmować jeden z możliwych stanów — od binarnego 000...000 do 111...111. Teraz jednak, dzięki zasadzie superpozycji, kubitów może być jednocześnie w superpozycji wszystkich tych stanów!
Można to wyrazić jako
gdzie, podobnie jak w przypadku klasycznym, stan odpowiada stanowi, w którym każdy kubit przyjmuje odpowiednią kombinację zer i jedynek tworzącą liczbę binarną . Stany te znane są jako „obliczeniowe stany bazowe" układu kwantowego. Na przykład stan trzech kubitów można zapisać jako superpozycję ośmiu obliczeniowych stanów bazowych:
Każdy kubit w układzie jest oznaczony indeksem od do . Przyjęta konwencja zakłada odczytywanie stanów kubitów od prawej do lewej, tak że stan kubitu jest stanem znajdującym się najdalej po prawej, a stan kubitu — najdalej po lewej. Taka notacja nazywa się „little-endian" i może początkowo wydawać się nieintuicyjna, skoro jesteśmy przyzwyczajeni do czytania od lewej do prawej.
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie/pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, by zobaczyć rozwiązanie.
Na pierwszy rzut oka porządkowanie kubitów od prawej do lewej, jak w notacji little-endian, może wydawać się nieintuicyjne, lecz jest to w rzeczywistości bardzo logiczne! Wyjaśnij dlaczego. (Przypomnij sobie omówiony wcześniej sposób zamiany liczb binarnych na dziesiętne.)
Odpowiedź:
Jeśli kubity numerujemy od prawej do lewej, tak że kubit 0 jest najdalej po prawej, a kubit N-1 najdalej po lewej, logiczne jest powiązanie kubitu z bitem najmniej znaczącym, mnożonym przez , oraz kubitu z bitem najbardziej znaczącym, mnożonym przez .
Splątanie
Jak wspomnieliśmy wcześniej, kolejną kluczową właściwością kubitów jest możliwość splątania ich ze sobą. Weźmy przykład stanu dwóch kubitów, gdzie i :
Stan kubitu 0 może być zatem równy lub z jednakowym prawdopodobieństwem — tak samo w przypadku kubitu 1. Jednak te prawdopodobieństwa nie są już od siebie niezależne. Jeśli zmierzymy stan kubitu 0 i okaże się, że wynosi , to wiemy, że kubit 1 również będzie w stanie . Jest to prawdą niezależnie od tego, jak daleko od siebie się znajdują — dlatego pomiar splątanego stanu bywa określany mianem „upiornego działania na odległość".
Splątanie może przybierać też inne formy. Na przykład stan
za każdym razem daje przeciwne wyniki: jeśli jeden kubit zostaje zmierzony jako , drugi z pewnością znajdzie się w stanie .
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie/pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, by zobaczyć rozwiązanie.
Czy stan jest splątany? Dlaczego tak lub dlaczego nie?
Odpowiedź:
Nie jest splątany. Choć wyniki pomiaru obu kubitów są zawsze takie same, wynika to jedynie z tego, że każdy kubit jest na stałe w stanie . Wynik pomiaru jednego kubitu faktycznie nie zależy od drugiego — oba po prostu zawsze wynoszą .
Ogólnie rzecz biorąc, jeśli możesz opisać stan każdego kubitu osobno, a następnie pomnożyć je przez siebie w taki sposób:
to taki stan nazywamy „stanem produktowym" i nie jest on splątany.
Notacja wektorowa
Często przydatne jest użycie wektorów i macierzy, by zobaczyć, jak stan kwantowy przekształca się pod wpływem różnych operacji. W tej reprezentacji stany kwantowe są wektorami, a bramki kwantowe (omówione w następnej sekcji) — macierzami przekształcającymi te wektory.
Dla pojedynczego kubitu wektorowe postacie stanów przyjmuje się jako: W ten sposób dowolny stan można zapisać jako
Dla ogólnego stanu kubitów potrzebujemy wektora o wymiarach, ze stanami bazowymi uporządkowanymi w rosnącym porządku binarnym, zgodnie z oczekiwaniami:
Mając tę notację wektorową na uwadze, możemy przejść do potrzebnych bramek kwantowych, ich działania na stany kwantowe oraz ich postaci macierzowych.
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie/pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, by zobaczyć rozwiązanie.
Dla układu dwóch kubitów istnieją cztery obliczeniowe stany bazowe. Zapisz każdy z nich w notacji ket oraz w notacji wektorowej.
Odpowiedź:
Bramki bramki kwantowe
Podobnie jak klasyczne bramki, takie jak NOT, AND, OR i XOR, można łączyć w celu budowania dowolnych klasycznych obwodów, kwantowe bramki odgrywają tę samą rolę w obliczeniach kwantowych. Ponieważ kubity posiadają dodatkowe właściwości mechaniki kwantowej, kwantowe bramki są odpowiednio bogatsze. Choć nadal możemy opisać ich działanie na stany bazowe i za pomocą tablicy prawdy, nie oddaje to pełnego obrazu. W przypadku kwantowych bramek często bardziej naturalne jest użycie reprezentacji macierzowej, ponieważ działają one również na superpozycje stanów bazowych.
Poniżej przedstawimy najczęściej stosowane kwantowe bramki i sposób, w jaki przekształcają one oddziałujące z nimi kubity. Tam, gdzie to możliwe, połączymy je ze znajomymi klasycznymi bramkami.
Jednobitowe bramki (Single-qubit gates)
Bramka : Jest to kwantowy odpowiednik operacji NOT. Jej tablica prawdy wygląda dokładnie tak jak klasyczna bramka NOT:
| Wejście | Wyjście |
|---|---|
Reprezentacja macierzowa:
W Qiskit tworzenie obwodu z bramką wygląda następująco:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")
W tym bardzo prostym diagramie obwodu kubit jest reprezentowany przez przewód – czarną poziomą linię – a bramka pojawia się jako prostokąt na tym przewodzie.
Bramka Hadamarda: Tworzy stan superpozycji. Tablica prawdy:
| Wejście | Wyjście |
|---|---|
Reprezentacja macierzowa:
Obwód z bramką Hadamarda tworzy się w następujący sposób:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")
Bramka : Dodaje przesunięcie fazowe do stanu :
| Wejście | Wyjście |
|---|---|
W Qiskit tworzenie obwodu z bramką wygląda następująco:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")
Bramka : Dodaje przesunięcie fazowe do stanu :
| Wejście | Wyjście |
|---|---|
W Qiskit tworzenie obwodu z bramką wygląda następująco:
qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")
Wielobitowe bramki (Multi-qubit gates)
Dwubitowe bramki mogą przypominać klasyczne bramki dwubitowe, ale z jednym istotnym zastrzeżeniem: wszystkie kwantowe bramki muszą być odwracalne. W terminologii algebry liniowej oznacza to, że są reprezentowane przez macierze unitarne. Dlatego dwa wejściowe kubity zawsze odwzorowują się na dwa wyjściowe kubity, a operację można co do zasady cofnąć. Stoi to w sprzeczności z klasycznymi bramkami, takimi jak AND czy OR, które tracą informację i są nieodwracalne – znając wyjście, nie możesz jednoznacznie ustalić wejścia.
Bramka CNOT (Controlled-NOT): Dwa wejściowe kubity noszą nazwy kubitu „sterującego" (control) i kubitu „docelowego" (target). Kubit sterujący pozostaje niezmieniony, lecz jego stan decyduje o tym, co dzieje się z kubitem docelowym. Jeśli kubit sterujący jest w stanie , to bramka jest stosowana do kubitu docelowego; jeśli stan kubitu sterującego wynosi , żadna zmiana nie jest wprowadzana. W poniższej notacji zakładamy, że kubit (skrajny prawy) jest sterującym, a kubit (skrajny lewy) jest docelowym. Poniżej stosowana notacja to
| Wejście | Wyjście |
|---|---|
Zatem macierz reprezentująca tę operację to:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")
To pierwszy diagram obwodu, który widzimy z dwoma kubitami, reprezentowanymi przez dwa przewody. Bramka CNOT jest zastosowana między dwoma kubitami, przy czym pełni rolę sterującego, a docelowego.
Sprawdź swoje zrozumienie
Przeczytaj poniższe pytanie(-a), zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odsłonić rozwiązanie.
Większość bramek ma tę samą postać macierzową w Qiskit co wszędzie indziej. Jednak bramka CNOT działa na dwa kubity, więc nagle konwencje kolejności kubitów stają się problemem. Teksty, które porządkują kubity jako , będą pokazywać inną postać macierzową bramki CNOT. Zweryfikuj przez jawne mnożenie macierzy, że powyższa macierz CNOT ma właściwe działanie na stan
Odpowiedź:
Bramka SWAP: Ta bramka zamienia stany dwóch kubitów. Tablica prawdy:
| Wejście | Wyjście |
|---|---|
Zatem macierz reprezentująca tę operację to:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")
Bramkę SWAP można w rzeczywistości zbudować z trzech bramek CNOT. Aby zobaczyć jak, możemy rozłożyć (decompose()) bramkę za pomocą Qiskit:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")
Widzimy tu po raz pierwszy, jak wiele bramek jest przedstawianych w diagramie obwodu. Czytamy go od lewej do prawej, więc skrajnie lewa bramka jest stosowana jako pierwsza.
Sprawdź swoje zrozumienie
Przeczytaj poniższe pytanie(-a), zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odsłonić rozwiązanie.
Zweryfikuj, że powyższa kombinacja bramek CNOT daje w wyniku bramkę SWAP. Możesz to zrobić poprzez mnożenie macierzy lub dowolną inną metodę.
Odpowiedź:
Za pomocą mnożenia macierzy:
Za pomocą tablicy prawdy, aby zobaczyć jak stany zmieniają się przy każdym CNOT. W ostatniej kolumnie stany powinny odpowiadać kolumnie „wyjście" tablicy prawdy SWAP:
| Wejście | CNOT(A,B) | CNOT(B,A) | CNOT(A,B) |
|---|---|---|---|
Bramka Toffoliego (czyli „controlled-controlled-NOT" (CCNOT)): Jest to bramka działająca na trzy kubity. Nazwa „controlled-controlled-NOT" może już podpowiadać, jak działa: są dwa kubity sterujące i jeden kubit docelowy, a stan kubitu docelowego jest odwracany tylko wtedy, gdy oba kubity sterujące są w stanie . Zachowujemy konwencję kolejności, którą stosowaliśmy przy CNOT:
Zatem tablica prawdy wygląda następująco:
| Wejście | Wyjście |
|---|---|
Macierz reprezentująca tę operację to:
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")
Bramkę Toffoliego również można rozłożyć na bramki CNOT wraz z kilkoma innymi bramkami. Jest to jednak znacznie bardziej skomplikowane niż dekompozycja bramki SWAP, dlatego zostanie pozostawione jako opcjonalne ćwiczenie na końcu modułu do samodzielnego zbadania i weryfikacji tej dekompozycji.
Pomiary
Pomiary pełnią w obliczeniach kwantowych szczególną rolę, która nie ma analogu w klasycznych komputerach. W przypadku klasycznych komputerów możesz sprawdzić stan bitów w dowolnym momencie algorytmu, natomiast w obliczeniach kwantowych musisz bardzo starannie dobierać chwilę, w której patrzysz na swoje kubity — pomiar powoduje kolaps stanu i niszczy superpozycję, która nadaje kubitom ich obliczeniową złożoność.
W szczególności, dla -bitowego stanu kwantowego , pomiar spowoduje kolaps stanu do jednej z funkcji bazowych z prawdopodobieństwem równym .
Jednak ten destrukcyjny efekt pomiaru nie zawsze jest przeszkodą. W rzeczywistości jest kluczowym zasobem w pewnych algorytmach i protokołach, takich jak teleportacja kwantowa i kwantowa dystrybucja klucza.
W Qiskit, gdy wykonywany jest pomiar, jego wynik trafia do klasycznego rejestru, gdzie jest przechowywany jako klasyczny bit. Tworzenie obwodu z pomiarem wygląda następująco:
qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")
Obwody
Teraz, gdy wiemy już, jak działają kubity, bramki i pomiary, stwórzmy i wykonajmy własny obwód kwantowy! W tym celu zapoznamy cię z przydatnym przepływem pracy zwanym wzorcami Qiskit.
Wzorzec Qiskit patterns
Wzorzec Qiskit patterns to ogólna procedura podejścia do problemów i ich rozwiązywania za pomocą komputera kwantowego. Składa się z czterech kroków:
- Mapowanie naszego problemu na obwody kwantowe i operatory
- Optymalizowanie obwodu pod kątem docelowego sprzętu
- Wykonanie na docelowym sprzęcie
- Post-processing wyników
Aby zilustrować te kroki, zaimplementujemy kwantową wersję omówionego powyżej układu półsumatora.
1. Mapowanie
Klasyczny układ sumatora używa bramki XOR i bramki AND do obliczenia odpowiednio bitu sumy i bitu przeniesienia. Możemy zaadaptować te bramki do kontekstu kwantowego, aby stworzyć kwantowy półsumator. Pamiętając, że kwantowe bramki są odwracalne, nie możemy po prostu nadpisać danych wejściowych. Zamiast tego wprowadzamy dwa pomocnicze kubity zainicjowane w stanie , które będą przechowywać wyjścia sumy i przeniesienia. Nasz pełny stan kwantowy będzie więc składał się z kubitów i oraz kubitów sumy i przeniesienia, które oznaczymy i :
Teraz potrzebujemy kwantowych bramek, które wykonają to samo, co bramki XOR i AND w klasycznym układzie.
Suma:
Dla XOR stosujemy dwa CNOT-y, każdy z kubitami sterującymi i oraz kubitem docelowym dla obu. Jeśli i są różne, jedna z bramek CNOT przerzuci do stanu . Jeśli i są oba , nic się nie dzieje z i pozostaje on w stanie . Jeśli i są oba , stan zostanie przerzucony dwukrotnie, wracając do stanu .
Przeniesienie:
Dla bitu przeniesienia potrzebujemy czegoś, co działa jak klasyczna bramka AND.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytanie(-a), zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odkryć rozwiązanie.
Przejrzyj omówione bramki i sprawdź, czy potrafisz zgadnąć, której kwantowej bramki użyjemy zamiast klasycznej bramki AND:
Odpowiedź:
To bramka Toffoli! Pamiętaj, bramka Toffoli, czyli bramka controlled-controlled-NOT, przerzuca stan docelowy wtedy i tylko wtedy, gdy kubit sterujący 0 ORAZ kubit sterujący 1 są oba w stanie . Zatem jeśli kubit docelowy zaczyna w stanie , działa tak samo jak bramka AND.
Mamy więc już wszystkie składniki potrzebne do stworzenia obwodu kwantowego:
# qubits: a, b, sum, carry
qc = QuantumCircuit(4)
# Choose values for A and B:
a = 0
b = 0
# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)
# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)
# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b
# measure
qc.measure_all()
qc.draw("mpl")
Powyżej przedstawiony jest diagram obwodu kwantowego półsumatora. Jak wspomniano wcześniej, przewody reprezentują kubity do uporządkowane od góry do dołu, a dolny przewód z podwójną linią to rejestr klasycznych bitów. Czytając diagram od lewej do prawej, widzimy, jak bramki są stosowane do każdego kubitu, obserwując, gdzie pojawiają się pola na odpowiadających im przewodach. Na końcu widoczne są pomiary. Pomiary powodują kolaps stanów kubitów do określonych wartości lub , a wyniki trafiają do klasycznego rejestru.
Jedna subtelność: choć diagram obwodu rysowany jest od lewej do prawej, pisząc odpowiadające mu wyrażenie macierzowe, musimy czytać je od prawej do lewej. Wynika to z tego, że w mnożeniu macierzy operator najbliższy wektorowi stanu działa jako pierwszy. Na przykład powyższy obwód (pomijając pomiary) zapisalibyśmy jako:
2. Optymalizowanie:
Następnie musimy zoptymalizować obwód do uruchomienia na sprzęcie kwantowym. Ta optymalizacja jest realizowana przez transpiler, który tłumaczy abstrakcyjny obwód pokazany powyżej na instrukcje zrozumiałe dla komputera kwantowego. Przypisuje logiczne kubity do rzeczywistych, fizycznych kubitów na procesorze i przepisuje bramki w kategoriach własnego natywnego zestawu bramek zoptymalizowanego do działania na komputerze kwantowym. Wreszcie transpiler implementuje również coś, co nazywa się „tłumieniem i łagodzeniem błędów", aby zminimalizować wpływ błędów na wynik. Dla naszego bardzo prostego obwodu nie jest to tak istotne, ale jeśli będziesz kontynuować swoją przygodę z obliczeniami kwantowymi i uruchamiać bardziej skomplikowane obwody, szybko docenisz wartość tłumienia i łagodzenia błędów. Jeśli chcesz dowiedzieć się więcej na ten temat, zapoznaj się z kursem Olivii Lane, Quantum Computing in Practice.
Na początku ładujemy pakiety wymagane do komunikacji z komputerami kwantowymi IBM® i wybieramy backend, na którym będziemy uruchamiać zadania. Możemy wybrać najmniej zajęty backend albo wybrać konkretny backend, o którego właściwościach wiemy.
Poniżej znajduje się kod do jednorazowego zapisania twoich poświadczeń. Pamiętaj, aby usunąć te informacje z notatnika po zapisaniu ich w swoim środowisku, żeby poświadczenia nie zostały przypadkowo ujawnione podczas udostępniania notatnika. Więcej wskazówek znajdziesz w sekcjach Skonfiguruj konto IBM Cloud i Inicjalizuj usługę w niezaufanym środowisku.
# 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_fez
Teraz używamy transpilera do optymalizacji obwodu. Możemy wybrać poziom optymalizacji od 0 (brak optymalizacji) do 3 (najwyższy poziom optymalizacji). Aby zobaczyć, co obejmuje każdy poziom, odwiedź przewodnik Ustaw poziom optymalizacji transpilera. Wynikowy obwód będzie wyglądał znacznie inaczej niż logiczny obwód, który stworzyliśmy na etapie mapowania.
# Transpile the circuit and optimize for running on the quantum computer selected
# 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)
qc_isa.draw("mpl")
„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ą zostać zmierzone i z jakim prawdopodobieństwem. Importujemy tutaj Qiskit Runtime Sampler:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
Jeśli wyczerpałeś(-aś) przydzielony czas na prawdziwych komputerach kwantowych lub nie masz dostępu do internetu, możesz preferować użycie symulatora. W tym celu uruchom poniższą komórkę i odkomentuj powiązaną linię w kroku „Wykonanie".
# 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)
3. Wykonanie
Po przygotowaniu obwodu możemy teraz uruchomić go na komputerze kwantowym!
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()
4. Post-processing
Teraz jesteśmy gotowi, aby zobaczyć wyniki! Wyświetlimy histogram 100 próbek obwodu.
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
Powyższy histogram pokazuje wyniki pomiarów wszystkich czterech kubitów na końcu obwodu. Idealny komputer kwantowy bez szumów mierzyłby kubity z tymi samymi wartościami przy każdym uruchomieniu, jednak w rzeczywistości szumy powodują, że część uruchomień produkuje błędy.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odkryć rozwiązanie.
Używając bitstringa z największą liczbą zliczeń jako wartości , , i , zweryfikuj, że kwantowy układ dodający zadziałał prawidłowo.
Odpowiedź:
Musimy zweryfikować, że . Pamiętaj, że kolejność bitstringa jest zgodna z notacją little-endian, więc czyta się go jako CSBA.
Z powyższego histogramu widać, że dominującym bitstringiem jest 0000.
Wróć i zmień wartości i na i , a następnie przejdź ponownie przez kroki wzorca Qiskit, aby uruchomić obwód jeszcze raz. Zweryfikuj ponownie, że układ dodający zadziałał prawidłowo.
Odpowiedź:
Powinieneś/powinnaś uzyskać histogram, w którym dominującym bitstringiem jest 1011:
Jedną z dodatkowych cech kwantowego półsumatora w porównaniu z klasycznym półsumatorem jest to, że może on działać z kwantowymi wejściami. Oznacza to, że potrafi „dodawać" kubity i nawet wtedy, gdy znajdują się w stanach superpozycji. W sekcji Pytania dodatkowe poniżej zostaniesz poproszony/a o przygotowanie kubitów w superpozycjach i sprawdzenie, co się stanie!
Podsumowanie
Ten moduł został zaprojektowany, aby dać ci solidne, podstawowe zrozumienie zasad leżących u podstaw obliczeń kwantowych poprzez porównanie ich z obliczeniami klasycznymi. Przyjrzeliśmy się klasycznemu obwodowi półsumatora, a następnie pokazaliśmy, jak dostosować ten obwód do działania z kubitami na komputerze kwantowym. Teraz jesteś gotowy/gotowa, aby odkrywać pozostałe moduły Qiskit w Classroom!
Kluczowe pojęcia:
- W odróżnieniu od klasycznych bitów, które mogą przyjmować wyłącznie wartości 0 i 1, kubity mogą również znajdować się w stanach superpozycji obu wartości: 0 i 1.
- Wiele kubitów może znajdować się w superpozycji klasycznie dozwolonych bitstringów, zwanych stanami bazy obliczeniowej.
- Wiele kubitów może być splątanych, tak że stan jednego zależy od stanu drugiego.
- Konwencją Qiskit jest stosowanie notacji little-endian, która umieszcza najmniej znaczący kubit, , na skrajnej prawej pozycji, a najbardziej znaczący kubit, , na skrajnej lewej.
- Bramki kwantowe to odwracalne operacje reprezentowane przez macierze unitarne, które działają na wektorach stanu kwantowego. W tej notacji macierz najbliżej wektora (najbardziej wysunięta w prawo) działa jako pierwsza.
- Pomiary zwijają kwantowy stan superpozycji do jednego z klasycznie dozwolonych stanów, z prawdopodobieństwem równym kwadratowi amplitudy odpowiadającego mu stanu bazy obliczeniowej w superpozycji.
- Obwody kwantowe są często przedstawiane za pomocą diagramów obwodów kwantowych, gdzie kubity są przedstawiane jako poziome linie, a bramki kwantowe pojawiają się wzdłuż tych linii od lewej do prawej.
- Aby uruchomić obwód kwantowy, używamy czterech kroków przepływu pracy wzorców Qiskit: Mapuj, Optymalizuj, Wykonaj, Przetwórz wyniki.
Pytania
Pytania prawda/fałsz
-
Pojedynczy bit w komputerze klasycznym może przechowywać wyłącznie wartość 0 lub 1.
-
Splątanie oznacza, że stan jednego kubitu jest niezależny od stanu drugiego.
-
Bramki kwantowe to operacje generalnie nieodwracalne.
-
Konwencja Qiskit umieszcza najmniej znaczący kubit, , na skrajnej lewej pozycji.
-
Pomiar stanu kwantowego zawsze daje dokładnie taki sam wynik, jeśli jest powtarzany wielokrotnie.
-
Bramka Hadamarda tworzy superpozycję w pojedynczym kubicie.
-
Obwody kwantowe mogą zawierać operacje pomiarowe, które zwijają stan superpozycji do jednego z klasycznie dozwolonych stanów.
-
Liczba możliwych stanów klasycznych dla bitów wynosi .
-
Prawdopodobieństwa wyników pomiarów kwantowych są dane przez kwadraty amplitud klasycznie mierzalnych stanów bazowych.
Pytania krótkiej odpowiedzi
-
Jakie są główne różnice między bitem a kubitem?
-
Co dzieje się ze stanem kwantowym, gdy jest on mierzony?
-
Dlaczego w Qiskit używamy notacji little-endian?
-
Jakie są cztery kroki przepływu pracy wzorców Qiskit?
Pytania dodatkowe:
-
W module używaliśmy sumatora wyłącznie do dodawania klasycznie dozwolonych stanów i . Możemy jednak również przygotować i w superpozycjach! Zmień kod tak, aby przygotować każdy kubit w równej superpozycji stanów 0 i 1, a następnie uruchom nowy obwód i uzyskaj nowy histogram. Co widzisz? Wyjaśnij, co się dzieje.
-
Dekompozycja bramki Toffoliego. Użyj
decompose(), aby pokazać, jak bramka Toffoliego jest rozkładana na jednokubitowe i dwukubitowe bramki, a następnie zweryfikuj tę konstrukcję za pomocą mnożenia macierzy. Pamiętaj, że choć diagramy obwodów czyta się od lewej do prawej, macierze są stosowane do stanów kwantowych od prawej do lewej!