Eksperyment Sterna-Gerlacha z użyciem komputerów kwantowych
W tym module Qiskit w Klasach studenci 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, studenci muszą założyć konto w IBM Quantum®, postępując zgodnie z krokami opisanymi w przewodniku Konfiguracja konta IBM Cloud.
Ten moduł został przetestowany i zużył 2 sekundy czasu QPU. Jest 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 prezentację modułu przygotowaną przez dr Katie McCormick poniżej lub kliknij tutaj, aby obejrzeć ją na YouTube.
Tło historyczne
Na początku XX wieku narastały dowody na skwantowane zachowanie na skalach atomowych. Wiele udanych interpretacji danych, takich jak wyjaśnienie katastrofy ultrafioletowej przez Maxa Plancka, oraz eksperymenty, takie jak ten przeprowadzony przez Otto Sterna i Walthera Gerlacha, były kluczowe w przekonaniu świata, że konieczny jest system mechaniki kwantowej i że pewne zjawiska fizyczne są skwantowane. W przypadku eksperymentu Sterna-Gerlacha (pomyślanego przez Sterna w 1921 roku i przeprowadzonego przez Sterna i Gerlacha w 1922 roku) celem było sprawdzenie kwantyzacji momentu pędu w atomach.
W tym samym czasie dominującym modelem atomu był model Bohra-Sommerfelda, będący rozwinięciem modelu Bohra, który – podobnie jak model Bohra – przewidywał, że elektrony istnieją na pewnych skwantowanych orbitach, podobnych do planet krążących wokół Słońca.

Choć ostatecznie to podejście okazało się niewystarczające do wyjaśnienia kwantowomechanicznego zachowania atomu, to ogólnie rzecz biorąc, przewidywało wiele obserwowanych zjawisk, takich jak dyskretne linie widmowe atomów. Skwantowane orbity elektronów o określonych energiach odpowiadają skwantowanym wartościom momentu pędu. To właśnie ten orbitalny moment pędu Stern i Gerlach chcieli zaobserwować w swoim eksperymencie, choć eksperyment dotyczy każdego rodzaju skwantowanego momentu pędu, w tym spinu. Często można spotkać eksperyment Sterna-Gerlacha stosowany do spinów. Oryginalny eksperyment skupiał się na orbitalnym momencie pędu po prostu dlatego, że George Uhlenbeck i Samuel Goudsmit nie sformułowaliby teorii istnienia spinu aż do 1925 roku.
Niezależnie od rodzaju momentu pędu, ładunek posiadający moment pędu ma moment magnetyczny. W klasycznym ujęciu ruchu orbitalnego oczekiwalibyśmy, że cząstka o ładunku , masie i momencie pędu ma moment magnetyczny dany wzorem:
Okazuje się, że niemal ten sam wzór obowiązuje dla kwantowomechanicznego momentu pędu, z zastrzeżeniem dodania liczbowego współczynnika związanego z rodzajem momentu pędu, zwanego czynnikiem g . Przy łączeniu różnych rodzajów momentu pędu lub uogólnianiu na dowolny typ często używa się zamiast , więc piszemy:
Dla obiektów klasycznych . Dla elektronów , a dla różnych jąder i cząstek subatomowych wartości te są różne. Najważniejsze jest tutaj to, że skwantowany moment pędu oznacza skwantowany moment magnetyczny!
Ten moment magnetyczny doświadcza momentu siły w polu magnetycznym:
I doświadcza siły w polu magnetycznym o niezerowym gradiencie:
Często rozważamy powyższe wyrażenie składnik po składniku, więc wygodne może być myślenie o jego składowej :
Łącząc wyrażenia, możemy otrzymać:
Stern i Gerlach nie wiedzieli o czynniku , ale nawet z nim w wyrażeniu mamy siłę równą kilku znanym lub mierzalnym stałym pomnożonym przez moment pędu. Zatem używając pola magnetycznego o znanym gradiencie i mierząc ugięcie cząstki podczas jej przechodzenia przez pole, powinniśmy uzyskać informację o momencie pędu. To jest istota eksperymentu Sterna-Gerlacha.

Rys. Eksperyment Sterna-Gerlacha[1]: Atomy srebra przechodzące przez niejednorodne pole magnetyczne i odchylane w górę lub w dół w zależności od swojego spinu. Klasycznie oczekiwalibyśmy ciągłego rozkładu na ekranie, ale w eksperymencie widzimy dwa odrębne punkty.
Neutralne atomy srebra były podgrzewane w piecu. Gdy strumień atomów srebra wypływał z pieca, kolimatory wiązki były używane do wybierania tylko atomów podróżujących blisko centrum niejednorodnego pola magnetycznego. Oczywiście, niektóre atomy odchylają się nieco w lewo lub w prawo i doświadczają słabszego gradientu pola lub nie doświadczają go wcale. Dlatego nie przejmujemy się zbytnio zachowaniem atomów daleko na lewo lub prawo. Interesuje nas to, co dzieje się z atomami podróżującymi wzdłuż centrum kanału, gdzie gradient pola magnetycznego wywoła siłę odchylającą atomy wyłącznie w kierunku .
Czego należałoby oczekiwać klasycznie?
Jak zachowywałyby się te atomy, gdyby były dokładnie jak masywne, klasyczne magnesy? Możesz przeprowadzić ten eksperyment samodzielnie. Wyobraź sobie, że strzelasz małymi magnesami neodymowymi obok dużego, silnego magnesu. Orientacja małych magnesów jest losowa. Ale gdy mijają duży magnes, szybko zmieniają orientację, aby dostosować się do pola, i przyciągają się do dużego magnesu. Zdecydowana większość małych magnesów jest odchylana w kierunku dużego magnesu. Bardzo spostrzegawczy obserwator mógłby zapytać: „A co z zachowaniem energii?"
Rzeczywiście, moment magnetyczny w zewnętrznym polu magnetycznym ma związaną z nim energię potencjalną:
Zatem gdyby moment magnetyczny miał obrócić się w zewnętrznym polu magnetycznym, nastąpiłaby zmiana energii dana wzorem:
W szczególnym przypadku małego magnesu dokładnie anty-równoległego do zewnętrznego pola, który obraca się i ustawia równolegle do niego, odpowiadałoby to zmniejszeniu energii potencjalnej:
Dokąd więc trafia ta energia? Klasyczny magnes, jak mały neodymowy magnes na lodówkę, ma wiele cząstek i może rozpraszać niemal dowolną ilość energii w postaci ciepła. Kąty początkowe i końcowe między momentem magnetycznym a zewnętrznym polem magnetycznym mogą być dowolne, a przynajmniej orientacja początkowa byłaby losowa. Każdy mały magnes rozpraszałby więc inną ilość energii w postaci ciepła. Ale klasycznie nie stanowi to żadnego problemu, ponieważ zespół klasycznych cząstek może rozpraszać dowolną ilość energii w postaci ciepła.
Czego należałoby oczekiwać, stosując klasyczne myślenie do skal atomowych?
W każdym razie nie jest to tak samo w przypadku magnesów atomowych, ponieważ w grę wchodzi mniej cząstek i mniej stopni swobody, przez które energia może być rozpraszana. Propozycje wczesnej mechaniki kwantowej sugerowały dalej, że energia, którą może pochłonąć pojedyncza cząstka, taka jak elektron, byłaby skwantowana, co oznacza, że elektron może pochłonąć tylko kilka określonych ilości energii. Ponieważ losowe orientacje początkowe wymagałyby rozpraszania losowych ilości energii, nie powinno być to możliwe dla układu ze skwantowanymi poziomami energetycznymi. Nadmiar energii nie mógłby być rozpraszany w postaci ciepła. Co zatem zamiast tego by się stało?
Sprawdź swoje rozumienie
Przeczytaj poniższe pytania, przemyśl odpowiedzi, a następnie kliknij trójkąty, aby zobaczyć rozwiązania.
Wyjaśnij, co twoim zdaniem wydarzyłoby się w sytuacji opisanej powyżej. To znaczy: masz atomowo mały magnes, który nie może rozpraszać energii w postaci ciepła. Zatem wszelka początkowa magnetyczna energia potencjalna musi pozostać w układzie. A jednak zewnętrzne pole magnetyczne wywiera moment siły, który próbuje obrócić mały magnes tak, aby ustawił się zgodnie z zewnętrznym polem. Co się dzieje?
Odpowiedź:
Mały moment magnetyczny obracałby się w kierunku wyrównania z zewnętrznym polem. Ale w momencie chwilowego wyrównania miałby kinetyczną energię obrotu, która utrzymywałaby go w ruchu obrotowym poza polem i z powrotem poza wyrównanie. To zachowanie można nawet zaobserwować w dużych klasycznych magnesach. Ale w tych klasycznych układach oscylacja małego momentu magnetycznego ostatecznie ustaje, gdy energia jest rozpraszana w postaci ciepła. Ale w układzie pozbawionym takiego mechanizmu rozpraszania oscylacja powinna trwać w nieskończoność.
Biorąc pod uwagę zachowanie oczekiwane w powyższej odpowiedzi, jakiego rozkładu cząstek magnetycznych spodziewałbyś się zobaczyć na ekranie?
Odpowiedź:
Gładki rozkład od pewnego maksymalnego ugięcia w kierunku silniejszej strony pola magnetycznego (te cząstki, które przypadkowo zaczęły być ustawione zgodnie z zewnętrznym polem) do pewnego maksymalnego ugięcia w kierunku słabszej strony pola (te cząstki, które zaczęły być ustawione anty-równolegle do zewnętrznego pola), i każde ugięcie pośrednie, odpowiadające każdej orientacji początkowej między tymi ekstremami.

Co przewidywałaby mechanika kwantowa?
Być może najdziwniejszą ze wszystkich możliwości byłaby następująca: Co jeśli moment pędu elektronu byłby skwantowany, ale także jego rzut na pewną oś byłby skwantowany? Kwantyzacja momentu pędu jako wielkości jest interesująca, ale można spróbować uzasadnić ją za pomocą intuicji klasycznej, podobnie jak orbity planetarne ustabilizowały się w stałych ścieżkach, które się nie przecinają, mając tylko pewne dozwolone momenty pędu. Ale co jeśli ten wektor momentu pędu mógłby wskazywać tylko dokładnie wzdłuż lub dokładnie przeciwnie do , ale nie mieć żadnej innej składowej wzdłuż ? Co jeśli wtedy mierzony wzdłuż innego kierunku, wektor mógłby wskazywać tylko całkowicie wzdłuż lub całkowicie przeciwnie do , i nic pośrodku? Byłoby to dziwne w sposób, który dezorientuje całą klasyczną intuicję.
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie, przemyśl odpowiedź, a następnie kliknij trójkąt, aby zobaczyć rozwiązanie.
Jakiego rodzaju rozkładu cząstek na ekranie spodziewałbyś się znaleźć w tym ostatnim przypadku, gdy rzut momentu pędu wzdłuż kierunku pola jest skwantowany? Możesz rozważyć tylko cząstki przechodzące dokładnie przez środek urządzenia lub uwzględnić te, które nieznacznie zbaczają na bok, gdzie gradient jest słabszy. Bądź precyzyjny.
Odpowiedź:
Cząstki w centrum urządzenia doświadczyłyby jednego niejednorodnego pola i wszystkie zostałyby zmierzone jako mające jedną z dwóch orientacji momentów magnetycznych. Zatem byłyby albo odchylane maksymalnie zgodnie z gradientem, albo maksymalnie przeciwnie do gradientu, i nic pośrodku. Oczywiście, po obu stronach, gdzie gradient jest słabszy, ugięcie byłoby mniejsze. Przy bardzo dużych pozycjach bocznych cząstki mogą znajdować się całkowicie poza gradientem i może istnieć tylko jeden obszar nieodchylonych cząstek.

Jak Qubit pomoże nam to przetestować?
Większość komputerów kwantowych używa „Qubitów" – kwantowych analogów klasycznych bitów. Dokładniej, są one zaprojektowane jako układy dwupoziomowe, analogiczne do stanów „włączony"/"wyłączony" klasycznych bitów. Istnieją paradygmaty obliczeń kwantowych wykorzystujące układy trzypoziomowe (tzw. „kutrity") lub układy wielopoziomowe (zwane „kuditami"). Jednak większość prac skupia się na Qubitach. W szczególności komputery kwantowe IBM® używają tak zwanych Qubitów transmonowych o stałej częstotliwości. Różnią się one dość znacznie od orbitalnego lub spinowego momentu pędu atomów. Ale podobnie jak spin elektronu, Qubity IBM® są układami kwantowomechanicznymi, które mogą oddziaływać ze światłem i na których można wykonywać pomiary. W rzeczywistości często można znaleźć analogie między stanami kwantowomechanicznego spinu a stanami obliczeniowymi Qubitu. Na przykład często można zobaczyć stan „spin w górę" powiązany ze stanem obliczeniowym 0, a „spin w dół" powiązany ze stanem obliczeniowym 1:
Możemy używać tych podobieństw do obserwowania kwantowomechanicznego zachowania w komputerach kwantowych IBM, które naśladuje kwantowomechaniczne zachowanie orbitalnego lub spinowego momentu pędu w atomach. Będziemy dokonywać podobnych obserwacji, używając kombinacji liniowych tych stanów, które pozwolą nam rozszerzyć dyskusję na moment pędu wzdłuż dowolnego kierunku.
Pierwszy eksperyment: Pojedynczy pomiar
W tym pierwszym eksperymencie oraz w całym module będziemy korzystać z frameworku dla obliczeń kwantowych zwanego „Qiskit patterns" (wzorcami Qiskit), który dzieli przepływ pracy na następujące kroki:
- Krok 1: Odwzorowanie klasycznych danych wejściowych na problem kwantowy
- Krok 2: Optymalizacja problemu pod kątem wykonania kwantowego
- Krok 3: Wykonanie przy użyciu prymitywów Qiskit Runtime
- Krok 4: Post-przetwarzanie i klasyczna analiza
Będziemy generalnie postępować zgodnie z tymi krokami, choć nie zawsze będziemy je wprost oznaczać.
Krok 1: Odwzorowanie klasycznych danych wejściowych na problem kwantowy
Klasycznymi danymi wejściowymi są tu orientacje spinu przed pomiarem w urządzeniu Sterna-Gerlacha. Nie martw się zbytnio o dokładną naturę stanu kwantowego przed pomiarem. Jest to temat osobnego modułu Qiskit Classrooms, poświęconego twierdzeniu Bella.
Zwróć uwagę, że komputery kwantowe IBM mierzą stany wzdłuż osi . Ten pierwszy eksperyment będzie więc bardzo podobny do eksperymentu Sterna-Gerlacha z gradientem pola magnetycznego wzdłuż . Zobaczymy później, jak zmienić układ, aby mierzyć wzdłuż innych kierunków.
Zacznijmy od stworzenia analogu stanu spinowego, czyli pewnej superpozycji i , lub równoważnie i . Zaproponowaliśmy pewne wartości początkowe. Zachęcamy jednak do eksperymentowania z innymi wartościami, a nawet z wartościami losowymi.
import random
from numpy import pi
import numpy as np
# Use these lines to choose your own arbitrary state vector and normalize it.
# a = 2
# b = (1+1j)
# norm = np.sqrt(a*np.conjugate(a)+b*np.conjugate(b))
# a = a/norm
# b = b/norm
# print(a,b)
# Use these lines if you would rather look at at random spin orientations.
a = random.random()
b = random.random()
norm = np.sqrt(a * np.conjugate(a) + b * np.conjugate(b))
a = a / norm
b = b / norm
print(a, b)
0.7032089086145691 0.7109832845047109
Teraz użyjemy powyższych kątów jako parametrów w Circuit kwantowym. Rozważamy tylko jedną cząstkę na raz, więc użyjemy w naszym Circuit tylko jednego Qubitu i będziemy potrzebować tylko jednego rejestru klasycznego.
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit, Parameter
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the quantum state
qc.initialize([a, b])
qc.measure(0, 0)
qc.draw("mpl")
Krok 2: Optymalizacja problemu pod kątem wykonania kwantowego
Aby uruchomić nasz eksperyment na prawdziwym komputerze kwantowym, musimy załadować Qiskit Runtime Service i wybrać komputer kwantowy (czyli „Backend"). Poniżej po prostu wybieramy najmniej zajęty dostępny komputer kwantowy.
Poniżej znajduje się kod do jednorazowego zapisania swoich danych uwierzytelniających. Pamiętaj, aby usunąć te informacje z notesu po zapisaniu ich w swoim środowisku, żeby przypadkowo nie udostępnić danych uwierzytelniających podczas dzielenia się notesem. 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
# 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')
# Syntax for specifying a channel and instance (if you need to change from the default set above)
# service = QiskitRuntimeService(channel='<channel name here>', instance="<your instance name here>")
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
# Use the least busy backend, specify options as needed
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.least_busy()
print(backend.name)
ibm_sherbrooke
Musimy teraz dokonać transpilacji Circuit, co oznacza, że musimy odwzorować nasz Circuit na bazowe bramki dostępne w wybranym komputerze kwantowym i zoptymalizować go pod kątem działania na tym komputerze.
# Transpile the circuit and optimize for running on the quantum computer selected
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
qc_ibm = pm.run(qc)
Krok 3: Wykonanie przy użyciu prymitywów Qiskit Runtime
Chcemy teraz uruchomić to na prawdziwym komputerze kwantowym. Cała niezbędna składnia znajduje się w bloku kodu poniżej. Jeśli wyczerpałeś/aś przydzielony czas na prawdziwych komputerach kwantowych lub nie masz połączenia z internetem, możesz odkomentować kolejny blok kodu, który uruchomi kod na lokalnym symulatorze.
# Specify that we want to use only a single shot, to represent a single measurement of a spin in a SG device.
num_shots = 1
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# from qiskit_ibm_runtime import Batch,
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
Użyj poniższego kodu, jeśli nie możesz uruchomić eksperymentu na prawdziwym komputerze kwantowym.
# This uses a local simulator
# from qiskit_aer import AerSimulator
# This generates a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend = backend_sim)
# num_shots = 1
# This runs the job
# dist = sampler.run([qc_ibm], shots = num_shots).result()
# This selects measurement counts for the 0th circuit, which in this case is the only circuit
# counts=dist[0].data.c.get_counts()
Krok 4: Post-przetwarzanie i klasyczna analiza
W tym bardzo prostym eksperymencie klasyczna analiza sprowadza się jedynie do wizualizacji wyniku eksperymentu.
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'0': 1}
Wykonaliśmy jeden pomiar i otrzymaliśmy „0". Nie jest to dla nas zaskoczenie. Wiemy, że używamy komputera kwantowego zbudowanego z Qubitów i jesteśmy bardzo przyzwyczajeni do tego, że klasyczne bity zwracają 0 lub 1. Pamiętaj jednak: to jest kwantowo-obliczeniowy analog eksperymentów przeprowadzanych na cząstkach z momentami magnetycznymi. Gdybyśmy oczekiwali równomiernego rozkładu między 0 a +1, mogłoby nas faktycznie zaskoczyć, że przy pierwszym pomiarze otrzymaliśmy jedno z ekstremów. Właśnie ta zaskakująca kwantyzacja wyników w eksperymencie Sterna-Gerlacha doprowadziła nas do lepszego zrozumienia natury, co z kolei pomogło nam ostatecznie zbudować komputery kwantowe.
Zobaczmy, co się stanie, gdy wykonamy wiele pomiarów.
Drugi eksperyment: Pomiar wielu cząstek
Aby zebrać statystyki z wielu takich pomiarów, nie musimy powtarzać kroków 1 i 2. Możemy po prostu zwiększyć liczbę strzałów (shots) w naszym eksperymencie. Zachęcamy do zabawy z liczbą strzałów w poniższym kroku 3.
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
num_shots = 100
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
Jak poprzednio, jeśli nie możesz uruchomić kodu na prawdziwym komputerze kwantowym, odkomentuj powyższy blok z pierwszego eksperymentu i zmień num_shots = 1 na num_shots = 100 lub więcej.
plot_histogram(counts)
Widzimy, że czasami mierzymy 0, a czasami 1. Zwróć uwagę, że nigdy nie mierzymy niczego innego! Możesz zmienić liczbę strzałów i zauważyć, że prawdopodobieństwo zmierzenia 0 lub 1 wydaje się być dość spójne między różnymi uruchomieniami z różną liczbą strzałów. Tak więc coś w przygotowaniu stanu wydaje się wyznaczać prawdopodobieństwo wyników pomiarów, choć pojedynczy pomiar może dać 0 lub 1.
Trzeci eksperyment: Losowe spiny w piecu
W eksperymencie Sterna-Gerlacha badacze nie mogli określić kąta, pod jakim wektor momentu pędu wyłaniałby się z pieca. Orientacje były losowe (a może nawet bardziej tajemnicze! Zobacz moduł Qiskit Classrooms dotyczący twierdzenia Bella). Rozsądnym analogiem tego eksperymentu byłoby losowe inicjowanie stanów naszego Qubit i wielokrotne wykonywanie pomiarów.
Krok 1: Mapowanie klasycznych danych wejściowych na problem kwantowy
Circuit, który chcemy zbudować, jest taki sam jak poprzednio. Jedyna różnica polega na tym, że tym razem skonstruujemy Circuit przy użyciu bramek (Gate) z wolnymi parametrami i . Wartości liczbowe tych parametrów będą następnie przypisywane dla każdego nowego uruchomienia.
# from qiskit.circuit import QuantumCircuit, Parameter
theta = Parameter("θ")
phi = Parameter("$\phi$")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add rotation gates for rotating the state of qubit 0 to random orientations
qc.rx(theta, 0)
qc.rz(phi, 0)
qc.measure(0, 0)
qc.draw("mpl")
Uruchamianie Circuit kwantowego tylko dla jednego strzału i robienie tego dla wielu losowych konfiguracji to nietypowy przepływ pracy dla komputera kwantowego. Z pewnością można to zrobić, ale dla uproszczenia użyjemy tutaj lokalnego symulatora.
# This uses a local simulator
from qiskit_aer import AerSimulator
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
from qiskit.primitives import BackendSamplerV2
# This generates a simulator that mimics the real quantum system
backend_sim = AerSimulator.from_backend(backend)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend=backend)
# A list to store the accumulated probabilities of the two possible measurement outcomes.
probslist = {"0": 0.0, "1": 0.0}
# Choose how many "particles"/measurements
measurements = 100
num_shots = 1
for i in range(measurements):
# Assign a random orientation for each measurement
phi = random.random() * 2 * pi
theta = random.random() * 2 * pi
angles = [phi, theta]
circuit = qc.assign_parameters(angles)
qc_ibm = pm.run(circuit)
# Run the circuit
# job = sampler.run([circuit],num_shots = 1)
dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
# Update the list of probabilities
zeroterm = dist[0].data.c.get_counts().get("0") or 0
oneterm = dist[0].data.c.get_counts().get("1") or 0
probslist.update({"0": probslist.get("0") + zeroterm})
probslist.update({"1": probslist.get("1") + oneterm})
probslist.update({"0": probslist.get("0") / measurements})
probslist.update({"1": probslist.get("1") / measurements})
# print(probslist)
plot_histogram(probslist)
Widzimy więc, że losowy stan początkowy Qubit (odpowiadający losowym orientacjom momentu pędu w eksperymencie Sterna-Gerlacha) daje podobną liczbę stanów 0 i 1 (podobnie jak podobna liczba stanów spin-w-górę i spin-w-dół). Jest to dokładnie to, co pokazał oryginalny eksperyment Sterna-Gerlacha.
Czwarty eksperyment: Powtórzone pomiary
Gdy Qubit zaczyna w losowym stanie, widzimy, że istnieje mniej więcej 50-procentowa szansa zmierzenia jednego ekstremum zamiast drugiego. Ale co dzieje się ze stanem Qubitu (lub momentem pędu cząstki) po dokonaniu pomiaru? Aby to zbadać, musimy zdefiniować Circuit umożliwiający wykonanie wielu pomiarów na tych samych Qubitach. Zdefiniujmy Circuit, którego możemy użyć do zbadania tej kwestii. Chcemy dopuścić możliwość zmierzenia obu stanów i , więc potrzebujemy czegoś, co obróci początkowy stan Qubitu ze stanu domyślnego . W tym przypadku użyjemy bramki Hadamarda , ponieważ . Zauważ, że domyślnie oba te pomiary będą wykonywane wzdłuż osi .
from qiskit import QuantumCircuit
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the qubit to be a mixture of 0 and 1 states.
qc.h(0)
# Add a first measurement
qc.measure(0, 0)
qc.barrier()
# Add a second measurement
qc.measure(0, 1)
qc.draw("mpl")
qc_ibm = pm.run(qc)
# Step 3: Run the job
num_shots = 1000
dist = sampler.run([qc_ibm], shots=num_shots).result()
# To run on a simulator, uncomment the line below and comment out the line above.
# dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
counts = dist[0].data.c.get_counts()
print(counts)
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)
Na powyższym rysunku pojemniki (biny) są oznaczone „00", „01" i tak dalej. Liczby te odnoszą się do „wynik 2. pomiaru, wynik 1. pomiaru". Zatem „00" oznacza, że oba pomiary dały stan , a „01" oznacza, że pierwszy pomiar dał , a drugi . Zdecydowana większość Qubitów była mierzona albo dwukrotnie jako , albo dwukrotnie jako . Przypadki, w których Qubit był mierzony w jednym stanie, a następnie w drugim, były bardzo rzadkie, a te nieliczne przypadki (~1%) wynikają z szumów. W tym przypadku szum ten został zasymulowany zgodnie z zachowaniem rzeczywistego układu kwantowego. Obserwowana korelacja między kolejnymi pomiarami jest również obserwowana w pomiarach typu Sterna–Gerlacha cząstek z orbitalnym momentem pędu spin. Jeśli cząstka zostanie zmierzona jako „spin w górę", kolejny pomiar wykonany wkrótce potem ponownie da wynik „spin w górę" (z wyjątkiem niewielkich odchyleń spowodowanych szumami).
Może to wydawać się oczywiste. W końcu, jeśli Qubit zostaje zmierzony w pewnym stanie, a ja zmierzę go ponownie, szybko, dlaczego miałby nie pozostać w tym stanie? Ale jeśli naprawdę skupimy się na tej subtelności, może ona pomóc nam wybrać narzędzia matematyczne do opisu tego zjawiska.
Analiza dotychczasowych eksperymentów
Zbierzmy kilka obserwacji z naszych dotychczasowych eksperymentów:
- Pomiar układu kwantowego daje tylko jedną z dozwolonych wartości. Dla układów dwupoziomowych, takich jak Qubit lub cząstka o spinie 1/2, pomiar zawsze daje jeden z dwóch możliwych wyników.
- Gdy losowo inicjalizujemy stan naszego układu binarnego (np. cząstki o spinie 1/2 wylatujące z pieca), możliwy jest każdy z dwóch wyników pomiaru.
- Po dokonaniu pomiaru i ustaleniu stanu układu, powtórzenie pomiaru tej samej obserwowalnej fizycznej nie zmienia stanu! Tzn. jeśli raz otrzymamy stan 0, przy kolejnym pomiarze nadal będzie to stan 0 (z wyjątkiem drobnych zakłóceń w układzie rzędu ~0,1% do 1%).
Zwróć szczególną uwagę na to, że nie omawialiśmy jeszcze probabilistycznej natury mechaniki kwantowej ani „kolapsowania" stanu do wektora własnego. Opierając się wyłącznie na powyższych obserwacjach, można by pokusić się o poszukiwanie operacji matematycznej , która pozostawia pewien szczególny zbiór stanów kwantowych niezmieniony z dokładnością do stałej: , skoro dwukrotny pomiar wzdłuż daje ten sam wynik. Ostatecznie takie podejście nie opisze wszystkich zachowań, które zobaczymy. Może jednak opisywać pewne zjawiska, dlatego będziemy je kontynuować jeszcze przez chwilę.
Taka operacja rzeczywiście istnieje. Działanie macierzy na pewne wektory zmienia te wektory, natomiast na inne wektory (wektory własne) pozostawia je niezmienione z dokładnością do stałej. Weźmy na przykład macierz i wektor , gdzie
oraz
Zauważ, że
Natomiast dla innego wektora, powiedzmy , mamy
Moglibyśmy spróbować opisać spin cząstki za pomocą macierzy, a stany cząstek po pomiarze — za pomocą wektora, zwanego „wektorem stanu". Wcale nie jest oczywiste, jakie wartości należy umieścić w takiej macierzy czy wektorze stanu, ale jedyną własnością uzyskaną z dotychczasowych pomiarów, której moglibyśmy użyć do oznaczenia stanów, byłoby prawdopodobieństwo zmierzenia 0 lub 1 (odpowiednio „spin w górę" lub „spin w dół" w kontekście cząstek o spinie 1/2). Należy rozważyć, czy wpisy wektorów stanu powinny być powiązane z tym prawdopodobieństwem (dokładnie jako prawdopodobieństwo, jako „amplituda prawdopodobieństwa" — tzn. podnosimy wpis do kwadratu, aby uzyskać prawdopodobieństwo, itd.). Nie jesteśmy jednak pewni, czy wpisy w tych macierzach powinny być ściśle rzeczywiste, zespolone czy jeszcze inne. Dla bezpieczeństwa spróbujmy opracować formalizm, w którym wektory i macierze spełniają następujące warunki:
- Operatory macierzowe powinny być powiązane z eksperymentem tak ściśle, jak to możliwe. Na przykład możemy powiązać wartości własne macierzy spinowej z eksperymentalnie obserwowanymi rzutami spinu.
- Wektory stanu powinny być powiązane z prawdopodobieństwem w następujący sposób: jeśli cząstka jest w stanie , prawdopodobieństwo, że kolejny pomiar znajdzie cząstkę w stanie , wynosi .
Daje nam to ogromną swobodę w konstruowaniu naszych pierwszych macierzy. Na przykład możemy naiwnie spróbować
Zapis oznacza, że istnieją stany w komputerach kwantowych i w układach o spinie 1/2, które są do siebie bardzo podobne i często są na siebie odwzorowywane. Oczywiście nie są dokładnie tożsame, ponieważ odnoszą się do różnych układów. Algebra opisująca te dwustanowe układy może jednak podlegać tym samym regułom (spoiler: podlega!). Zwróć uwagę, że ten przypadkowy wybór ma już jedną miłą właściwość, mianowicie:
To znaczy, jeśli cząstka jest już w stanie , prawdopodobieństwo, że kolejny pomiar również da , wynosi 1 (pomijając efekty szumów). Jest to doskonały wynik, ponieważ widzieliśmy już, że gdy stan jest w lub „spin w górę", pozostaje tam przy kolejnych pomiarach. Powyższe prawdopodobieństwo powinno wynosić dokładnie 100%.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedziami, a następnie kliknij trójkąty, aby odkryć rozwiązania.
Dlaczego
jest lepszym wyborem niż, powiedzmy,
Odpowiedź:
Nasza próba powiązania prawdopodobieństwa pomiaru z kwadratem iloczynu skalarnego wymaga, aby długość każdego wektora wynosiła 1. Tzn. dla wszystkich , ponieważ prawdopodobieństwo, że obiekt w stanie znajduje się w stanie , wynosi 100%. Jest to tzw. „warunek normalizacji".
Dlaczego
jest lepszym wyborem niż, powiedzmy,
Odpowiedź:
Nie jest. Nie ma powodu, dla którego musielibyśmy początkowo wybrać . Jest to raczej konwencja. Jednak po dokonaniu tego wyboru nakłada on pewne ograniczenia na kolejne wybory. Patrz niżej.
Przypomnij sobie, że w powyższych eksperymentach odkryliśmy, że Qubit w stanie pozostaje w tym stanie przy kolejnych pomiarach. To samo dotyczy . Oznacza to, że Qubit w stanie ma zerowe prawdopodobieństwo bycia zmierzonym w stanie (pomijając efekty szumów). Wymagany przez nas związek między iloczynami skalarnymi a prawdopodobieństwami pomiarów mówi nam wtedy, że
Bez straty ogólności możemy zapisać wektor stanu . Wtedy możemy napisać
Wymaganie, że , tzw. „warunek normalizacji", mówi nam, że . Samo w sobie ogranicza to jedynie do dla . Okazuje się, że istnieją inne powody, aby wybrać , które wykraczają poza to wprowadzenie do tematu. Na razie niech wystarczy, że jest jednym dopuszczalnym rozwiązaniem.
Poczyniliśmy znaczne postępy w naszej analizie. Wybór postaci wektorów stanu pozwala nam skonstruować macierz opisującą pewien aspekt badanych zjawisk fizycznych. W szczególności, ponieważ oryginalny eksperyment Sterna-Gerlacha mierzył rozdzielenie trajektorii na podstawie składowych momentu pędu spinu wzdłuż osi , chcielibyśmy mieć operator opisujący dokładnie to: . Kolejnym kluczowym powiązaniem z eksperymentem jest to, że na podstawie wartości odchylenia, czasu przelotu i znanych parametrów pola magnetycznego możemy wyznaczyć wielkość składowej spinu. Choć wymaga to wielu założeń dotyczących dokładności układu eksperymentalnego, tutaj po prostu powtórzymy, że zmierzone składowe spinowego momentu pędu wynoszą .
Szukamy zatem macierzy z rzeczywistymi wartościami własnymi (spełnioną przez macierze hermitowskie) o wartościach własnych odpowiadających eksperymentalnie obserwowanym składowym spinu. Bez straty ogólności możemy zapisać i wymagać:
Łącząc i wyciągając przed nawias ogólny czynnik , otrzymujemy
Jest to dobrze znany operator spin-z, który pojawia się we wszystkich podręcznikach mechaniki kwantowej. Często widuje się go bez czynnika , w którym to przypadku jest to operator „Pauliego-z", zazwyczaj oznaczany :
Jest to użyteczne, ponieważ ten operator Pauliego (i macierze pokrewne) może opisywać wiele układów fizycznych obejmujących dwa poziomy lub dwa możliwe wyniki pomiaru, w tym stany Qubitów transmonowych w komputerze kwantowym.
Zanim przejdziemy do innych operatorów i stanów z nim powiązanych, musimy odnieść się do jednego faktu, który wiele osób rozumie błędnie. Działanie operatora to nie to samo co pomiar. W pewnym sensie można powiedzieć: „Oczywiście, że nie! Jedno dzieje się na papierze jako część obliczeń matematycznych, a drugie w laboratorium na układach fizycznych." Tak, to prawda, ale chodzi o coś więcej. Dokonanie pomiaru składowej spinu zawsze daje stan „spin w górę" lub „spin w dół", niezależnie od początkowego stanu układu. Widzieliśmy to na kwantowych analogach i . Inicjalizowaliśmy stany w setkach losowych orientacji, a pomiary zawsze dawały lub . Zjawisko to znane jest jako „kolapsowanie stanu" do wektora własnego na skutek pomiaru. Nie dzieje się tak, gdy przykładamy macierz do stanu. Sprawdź poniższe pytania, aby to zbadać.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby zobaczyć rozwiązanie.
Załóżmy, że cząstka jest w stanie spinowym
(a) Co otrzymasz, gdy zadziałasz operatorem na ten wektor stanu? (b) Co otrzymasz, jeśli wykonasz pojedynczy pomiar składowej spinu tej cząstki? (c) Co otrzymasz, jeśli przygotujesz wiele cząstek w identycznym stanie i wykonasz tysiące pomiarów składowej spinu?
Odpowiedzi:
(a) Otrzymasz
Tyle i nic więcej. Nie ma tu żadnego wyniku eksperymentalnego. Po prostu przykładasz macierz do wektora i otrzymujesz nieco inny wektor, który ma teraz nowy znak „-" i nie ma już modułu równego 1, ponieważ zawiera czynnik .
(b) Otrzymasz albo , albo . Odpowiada to zaobserwowaniu rzutu spinu na oś wynoszącego odpowiednio lub . Możemy też wyznaczyć prawdopodobieństwo każdego wyniku:
Stan z spinem skierowanym w górę jest więc o 20% bardziej prawdopodobny, ale oba wyniki są możliwe — otrzymamy dokładnie jeden z tych dwóch stanów.
(c) Zgodnie z prawdopodobieństwami pomiarowymi obliczonymi w części (b), około 60% pomiarów da cząstki ze spinem skierowanym w górę, a około 40% — cząstki ze spinem skierowanym w dół.
Zweryfikuj odpowiedzi do części (b) i (c) poprzedniego pytania, korzystając z analogii między stanami spinu skierowanego w górę atomu a stanami Qubit:
Zakoduj Circuit kwantowe, które tworzą żądany stan początkowy, a następnie użyj prawdziwego sprzętu lub symulatora, aby sprawdzić wyniki pojedynczego pomiaru oraz rozkład wyników z ensemble złożonego z setek lub nawet tysięcy pomiarów.
Odpowiedź:
#Use the backend sampler for part (b) because it allows us to use a single shot.
from qiskit_aer import AerSimulator
backend_sim = AerSimulator.from_backend(backend)
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend = backend_sim)
#Create a quantum circuit to initialize the state.
import math
psi = [math.sqrt(3/5),math.sqrt(2/5)]
qc = QuantumCircuit(1,1)
qc.initialize(psi, [0])
#Add measurement to the circuit
qc.measure(0,0)
qc.draw('mpl')
#Set num_shots =1 for part (b) and num_shots = 1000 or more for part (c).
num_shots = 1000
#Run the job and print the result. You should obtain only 0 or 1 in part (b) for a single shot.
#You should obtain a probability distribution with approximately 60% 0 and 40% 1 in part (c)
dist = sampler.run([qc_ibm], shots = num_shots).result()
counts=dist[0].data.c.get_counts()
print(counts)
#You should obtain {0: 599, 1: 401} or something equivalently close to the 60%-40% distribution predicted.
Piąty eksperyment: Pomiar różnych obserwowalnych
Dotychczas dokonywaliśmy pomiarów wyłącznie wzdłuż osi z. W eksperymencie Sterna–Gerlacha, gdybyśmy chcieli mierzyć wzdłuż, powiedzmy, osi x, wystarczyłoby odpowiednio zorientować niejednorodne pole magnetyczne wzdłuż osi i obserwować ugięcia wzdłuż na ekranie. Komputery kwantowe IBM są jednak zaprojektowane do dokonywania pomiarów wyłącznie wzdłuż jednej osi (). Aby zmierzyć stan wzdłuż , musimy wykonać „zmianę bazy". Oznacza to, że musimy zastosować operację, która przekształca stany wzdłuż na sferze Blocha w stany wzdłuż i odwrotnie. Można to zrealizować na kilka sposobów, ale preferowanym jest bramka Hadamarda:
Sprawdź swoje rozumienie
Przeczytaj poniższe pytania, zastanów się nad odpowiedziami, a następnie kliknij trójkąty, aby odkryć rozwiązania.
Pokaż, że oraz że
Odpowiedź: