Zbuduj i uruchom swój pierwszy program kwantowy
Wprowadzenie
W poniższym filmie Olivia Lanes przeprowadza cię przez materiał z tej lekcji. Możesz też otworzyć film na YouTube dotyczący tej lekcji w osobnym oknie.
Witaj w kursie Użyj komputera kwantowego już dziś! Celem tego kursu jest uruchomienie kodu na prawdziwym komputerze kwantowym w jak najkrótszym czasie – bez żadnej wcześniejszej wiedzy. Zaczynajmy.
Ta pierwsza lekcja to łagodne, praktyczne wprowadzenie do obliczeń kwantowych, odpowiednie zarówno dla ciekawskich początkujących, jak i zapracowanych liderów. Dowiesz się, czym są kwantowe Circuit, i napiszesz mały program kwantowy, który tworzy splątanie, a następnie uruchomisz go na prawdziwym komputerze kwantowym IBM®. Masz też możliwość uruchomienia tego samego programu na symulatorze, jeśli zdecydujesz się pominąć uruchamianie na prawdziwym komputerze kwantowym.
Ten notebook możesz uruchomić od góry do dołu w świeżym środowisku Google Colab lub lokalnie.
Konfiguracja
Aby uruchomić ten notebook w Google Colab, potrzebujesz konta Google, dzięki któremu możesz otwierać notebooki i wykonywać komórki w przeglądarce.
Aby uruchomić kod na prawdziwym komputerze kwantowym IBM, będziesz potrzebować również (bezpłatnego) konta IBM Quantum® Platform. Możesz otworzyć instancję w ramach planu Open Plan i otrzymać 10 minut czasu jednostki procesora kwantowego (QPU) w każdym 28-dniowym oknie kroczącym – to naprawdę całkiem sporo! Jeśli masz problemy z kontem, odwiedź stronę pomocy technicznej.
Możesz też uruchomić ten notebook lokalnie po zainstalowaniu Qiskit – instrukcje znajdziesz na stronie IBM Quantum Platform.
Instalacja i importy
W Colab instalujemy zależności wewnątrz notebooka, żeby wszyscy korzystali z tych samych narzędzi. Następna komórka instaluje Qiskit z modułem wizualizacji oraz dwa dodatki: Aer (szybkie symulatory) i klienta IBM Runtime (do uruchamiania na komputerach kwantowych).
Następnie mamy szereg importów. Klasa QuantumCircuit służy do definiowania kubitów i operacji na nich. To nasz pierwszy termin kwantowy: Qubit to podstawowy element składowy obliczeń kwantowych, tak jak bit jest podstawowym elementem obliczeń klasycznych. Dowiemy się więcej o szczególnych właściwościach kubitów, gdy będziemy tworzyć nasz Circuit. Dalej: plot_histogram posłuży do wizualizacji wyników kwantowego Circuit. AerSimulator pozwala symulować Circuit na klasycznym komputerze. Symulatory nie mogą jednak uruchamiać kwantowych Circuit w takiej skali jak prawdziwe komputery kwantowe – właśnie dlatego potrzebujemy prawdziwych komputerów kwantowych. Symulator przydaje się do testowania, debugowania lub celów edukacyjnych albo gdy wyczerpałeś swoje bezpłatne 10 minut czasu QPU. preset_passmanagers pomagają optymalizować Circuit do efektywnego działania na sprzęcie, co staje się naprawdę istotne, gdy nasze Circuit stają się bardziej złożone. Sampler i QiskitRuntimeService są niezbędne do faktycznego uruchomienia Circuit na komputerze kwantowym. Więcej na ten temat później.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
!pip install 'qiskit[visualization]' qiskit-ibm-runtime qiskit-aer
# Core Qiskit imports
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# IBM Runtime specific imports
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService
Następnie wykonamy szybkie sprawdzenie środowiska. Potwierdzamy wersje i poprawność importów.
Jeśli coś tu nie zadziała, to zazwyczaj problem z instalacją zależności – rozwiązanie go teraz zapobiega mylącym błędom później.
import sys
import qiskit
import qiskit_aer
import qiskit_ibm_runtime
print("Python:", sys.version.split()[0])
print("qiskit:", qiskit.__version__)
print("qiskit-aer:", qiskit_aer.__version__)
print("qiskit-ibm-runtime:", qiskit_ibm_runtime.__version__)
Python: 3.12.2
qiskit: 2.2.3
qiskit-aer: 0.17.2
qiskit-ibm-runtime: 0.41.1
Krótka wycieczka w bok: użyj Composera
Zanim zaczniemy pisać kod, warto zobaczyć obwody w formie wizualnej. IBM Quantum Composer pozwala budować obwody, przeciągając Gate'y na linie. To świetny sposób, żeby zrozumieć, co robi dany Circuit, bez rozpraszania się składnią.
Otwórz Composer tutaj.
Po załadowaniu uruchom samouczek z menu: Help | Build your first circuit. Przechodź przez niego we własnym tempie. Zwracaj uwagę na to, jak każdy Gate zmienia to, czego oczekujesz w pomiarze.
Samouczek przeprowadza przez budowanie obwodu „Hello World". Jest on zwizualizowany w postaci diagramu Circuit, gdzie Qubit'y są reprezentowane przez poziome linie, a Gate'y działające na tych Qubit'ach — przez pudełka lub inne symbole na liniach. Ten Circuit wprowadza kilka kluczowych właściwości Qubit'ów i komputerów kwantowych:
Po pierwsze, czerwone pudełko z etykietą „H" to Gate Hadamarda, który tworzy stan superpozycji Qubit'u 0. W odróżnieniu od bitu, który może być tylko w stanie 1 lub 0, stan Qubit'u może zawierać obie możliwości jednocześnie, z określonymi wagami (zwanymi amplitudami) przypisanymi do każdej z nich. Superpozycja nie oznacza, że w jednym pomiarze zobaczysz oba wyniki; oznacza, że stan jest ustawiony tak, iż każdy wynik może wystąpić w chwili pomiaru.
Po drugie, kółka i pionowa linia łącząca dwa Qubit'y to Gate CNOT, który generuje splątanie między nimi. Splątanie to szczególny rodzaj powiązania między Qubit'ami. Gdy Qubit'y są splątane, wyniki pomiarów mogą być silnie skorelowane w sposób, którego nie możemy wyjaśnić zwykłymi niezależnymi rzutami monetą ani żadną klasyczną korelacją. Gdy dwa Qubit'y są splątane, pomiar jednego z nich natychmiast zdradza wynik pomiaru drugiego.
Kolejnym kluczowym pojęciem, które zobaczysz w samouczku, są strzały (shots). Ponieważ pomiar to moment, w którym Qubit przestaje zachowywać się jak stan kwantowy i daje klasyczny wynik, stan superpozycji probabilistycznie załamie się do 0 lub 1 w chwili zmierzenia. Aby zbadać tę superpozycję, trzeba więc mierzyć ją wielokrotnie, uruchamiając ten sam Circuit, żeby zebrać statystyki. Właśnie to nazywamy shotami.
Sprawdź swoje rozumienie
Zastanów się nad każdym pytaniem poniżej, a następnie kliknij, żeby zobaczyć odpowiedź.
Czy można bezpośrednio zobaczyć superpozycję na podstawie pojedynczego pomiaru?
Odpowiedź
Nie. Pojedynczy pomiar zawsze zwraca wartość klasyczną: 0 albo 1. Idea „mieszaniny" ujawnia się dopiero w statystykach uzyskanych po wielu uruchomieniach, zwanych shotami.
Co w prostych słowach daje ci splątanie?
Odpowiedź
Daje ci powiązane wyniki. Zmierzenie jednego Qubit'u mówi ci coś o drugim. To powiązanie jest silniejsze niż niezależna losowość i silniejsze niż jakakolwiek czysto klasyczna korelacja lub wspólna losowość może wyjaśnić.
Jeśli Qubit jest w superpozycji, co widzisz w pojedynczym pomiarze i dlaczego potrzebujesz wielu shotów?
Odpowiedź
W pojedynczym pomiarze widzisz tylko jeden klasyczny wynik: 0 albo 1. Potrzebujesz wielu shotów, ponieważ „superpozycja" ujawnia się jako rozkład prawdopodobieństwa, który możesz oszacować jedynie zbierając statystyki z powtarzanych uruchomień.
Spójrz na histogram pomiarów swojego obwodu Hello World w Composerze. Co widzisz? Dlaczego jest to sygnatura splątania?
Odpowiedź
Pokazuje 50% szans na bycie w stanie i 50% szans na bycie w stanie . Oznacza to, że jeśli jeden Qubit zmierzysz jako 0, drugi też będzie 0, a jeśli jeden zmierzysz jako 1, drugi też będzie 1. Jest to korelacja między dwoma Qubit'ami, którą można wyjaśnić splątaniem.
Tworzenie i uruchamianie programu kwantowego za pomocą Qiskit
Dobra, wracamy do kodowania. Wygenerujemy ten sam splątany stan co w Composerze (zwany stanem Bella (phi-plus)), ale tym razem napiszemy kod ręcznie. Musimy opanować tę umiejętność, bo gdy będziemy skalować do większej liczby Qubit'ów i bardziej złożonych Circuit'ów, Composer nie będzie w stanie nam pomóc.
Aby zbudować Circuit stanu Bella, używamy Gate'u (Hadamarda), żeby wprowadzić pierwszy Qubit w równą superpozycję. Następnie stosujemy Gate (controlled-NOT), który splata ze sobą oba stany. Dwa Qubit'y s ą teraz skorelowane w sposób niemający klasycznego odpowiednika.
# --- Build the Bell circuit (phi-plus) ---
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all() # creates a classical register named "meas"
bell.draw("mpl")
Funkcja pomocnicza do uruchamiania Circuit'ów
Zdefiniujmy teraz funkcję pomocniczą, która obsługuje proces uruchamiania Circuit'u kwantowego i pobierania wyników pomiarów. Funkcja ta zajmuje się transpilacją Circuit'u do zestawu instrukcji Backend'u, uruchomieniem go przez prymityw Sampler i wyodrębnieniem zliczeń z wyników.
def run_circuit_and_get_counts(circuit, backend, shots=1000):
"""
Runs a quantum circuit on a specified backend and returns the measurement counts.
Args:
circuit (QuantumCircuit): The quantum circuit to run.
backend: The Qiskit backend (real device or simulator).
shots (int): The number of shots to run the circuit.
Returns:
dict: A dictionary of measurement counts.
"""
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(mode=backend)
job = sampler.run([isa_circuit], shots=shots)
result = job.result()
return result[0].data.meas.get_counts()
Uruchomienie na QPU i wizualizacja wyników
Na koniec uruchamiamy Circuit na jednostce przetwarzania kwantowego (QPU) IBM w chmurze przez 1000 shotów i wykreślamy wyniki. QPU IBM to fizyczne systemy podatne na szumy, więc Gate'y są nieco niedoskonałe, pomiary mogą czasem być błędne, a kalibracja urządzenia zmienia się w czasie.
Uruchamianie na prawdziwych komputerach kwantowych wprowadza też praktyczne aspekty. Zadania mogą czekać w kolejce, ponieważ wiele osób może korzystać z tego samego urządzenia. Musisz też wybrać liczbę shotów, która równoważy względy statystyczne (więcej shotów oznacza wyższy stosunek sygnału do szumu) z ograniczeniami czasu i kosztów.
Postępuj zgodnie z instrukcjami w komentarzach kodu w następnej komórce. Po uruchomieniu komórki powinieneś zobaczyć histogram z mniej więcej równymi zliczeniami dla bitciągów i , z pewną liczbą wystąpień lub spowodowanych szumem. Następna komórka w tym notatniku uruchamia ten sam Circuit na symulatorze, jeśli zdecydujesz się pominąć uruchamianie na QPU.
# Syntax for first saving your token. Delete these lines after saving your credentials.
QiskitRuntimeService.save_account(
channel="ibm_quantum_platform",
token="YOUR_TOKEN_HERE",
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_fez".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_fez")
print(backend.name)
ibm_pittsburgh
counts = run_circuit_and_get_counts(bell, backend, shots=1000)
plot_histogram(counts)
Uruchomienie na symulatorze i wizualizacja wyników
Symulator to wersja obliczeń kwantowych w „idealnym świecie". Tutaj uruchamiamy Circuit na symulatorze przez 1000 shotów i wykreślamy wyniki. Powinieneś zobaczyć mniej więcej równe zliczenia dla stanów i , bez żadnych wystąpień lub , co jest sygnaturą doskonałej korelacji stanu Bella.
backend = AerSimulator()
counts = run_circuit_and_get_counts(bell, backend, shots=1000)
plot_histogram(counts)
Sprawdź swoje rozumienie
Jakie dwa Gate'y tworzą tu stan Bella?
Odpowiedź
Gate H na Qubit'cie 0, a następnie Gate CX z Qubit'em 0 jako kontrolą i Qubit'em 1 jako celem.
Na idealnym symulatorze które dwa bitciągi powinny dominować w histogramie?
Odpowiedź
Dominować powinny 00 i 11.
Dlaczego doskonały symulator nie zawsze ma dokładnie tę samą liczbę zliczeń 00 co 11?
Odpowiedź
Nawet jeśli symulator jest „doskonały" i prowadzi do idealnego stanu Bella, wciąż symuluje z natury losowy proces, więc fluktuacje statystyczne i tak będą występować. To jak rzucanie monetą 1000 razy: nawet jeśli istnieje dokładnie 50% szans na orła lub reszkę, nie oznacza to, że zawsze otrzymasz dokładnie 500 orłów i 500 reszek.
Dlaczego prawdziwy komputer kwantowy może pokazywać pewne wyniki 01 lub 10, mimo że symulator tego nie robił?
Odpowiedź
Ponieważ prawdziwe urządzenia mają szumy. Gate'y i pomiary nie są doskonałe, co może wprowadzać sporadyczne błędy.
Jaka jest jedna praktyczna różnica między symulatorami a prawdziwymi komputerami kwantowymi, poza szumem?
Odpowiedź
Komputery kwantowe mogą wiązać się z czasem oczekiwania w kolejce, ograniczoną dostępnością i ograniczeniami specyficznymi dla urządzenia, które wpływają na sposób uruchamiania Circuit'ów.
Podsumowanie
Zaczęliśmy od skonfigurowania Qiskit w świeżym środowisku Colab, co jest dokładnie tym, od czego zaczyna się wiele rzeczywistych przepływów pracy z notatnikami. Następnie odbyliśmy podróż do obliczeń kwantowych za pomocą Composera. Zbudowaliśmy prosty Circuit dwuqubitowy, który wytwarza stan Bella , użyliśmy wielokrotnego próbkowania i zwizualizowaliśmy splątanie jako korelację w histogramie pomiarów Qubit'ów. Zobaczyliśmy też, jak prawdziwe komputery kwantowe wprowadzają szumy i błędy.
Cel nauki
Teraz, gdy przeszliśmy przez tworzenie stanu Bella , sprawdź, czy potrafisz edytować kod, aby utworzyć jeden z pozostałych trzech stanów Bella. W szczególności stan zostanie wykorzystany w nadchodzącej lekcji, więc jeśli uda ci się go stworzyć, będziesz o krok do przodu.