Przejdź do głównej treści

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:

  • qiskit v2.1.0 lub nowszy
  • qiskit-ibm-runtime v0.40.1 lub nowszy
  • qiskit-aer v0.17.0 lub nowszy
  • qiskit.visualization
  • numpy
  • pylatexenc

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.

Diagram modelu Bohra-Sommerfelda. Centralna kropka reprezentuje jądro atomu. Okręgi lub elipsy wokół tego punktu reprezentują orbitale atomowe, bardzo podobne do orbit planetarnych wokół Słońca. Orbitale o wyższej energii są dalej od jądra.

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 qq, masie mm i momencie pędu L\vec{L} ma moment magnetyczny μ\mu dany wzorem:

μ=q2mL\vec{\mu} = \frac{q}{2m}\vec{L}

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 gg. Przy łączeniu różnych rodzajów momentu pędu lub uogólnianiu na dowolny typ często używa się J\vec{J} zamiast L\vec{L}, więc piszemy:

μ=gq2mJ\vec{\mu} = \frac{gq}{2m}\vec{J}

Dla obiektów klasycznych g=1g=1. Dla elektronów g2g\approx 2, 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:

τ=μ×B\vec{\tau}=\vec{\mu}\times \vec{B}

I doświadcza siły w polu magnetycznym o niezerowym gradiencie:

F=(μB)\vec{F} = \nabla(\vec{\mu}\cdot\vec{B})

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 zz:

Fz=μzdBzdzF_z = \mu_z \frac{dB_z}{dz}

Łącząc wyrażenia, możemy otrzymać:

Fz=gq2mdBzdzJzF_z = \frac{gq}{2m} \frac{dB_z}{dz} J_z

Stern i Gerlach nie wiedzieli o czynniku gg, 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.

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.

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 zz.

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ą:

U=μB=μBcos(θ)U = -\vec{\mu}\cdot \vec{B} = -\mu B \cos(\theta)

Zatem gdyby moment magnetyczny miał obrócić się w zewnętrznym polu magnetycznym, nastąpiłaby zmiana energii dana wzorem:

ΔU=UfUi=μB(cos(θf)cos(θi)).\Delta U = U_f - U_i = -\mu B (\cos(\theta_f) - \cos(\theta_i)).

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:

ΔU=UfUi=μB(cos(0)cos(π))=2μB.\Delta U = U_f - U_i = -\mu B (\cos(0) - \cos(\pi)) = -2\mu B.

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.

Diagram wiązki cząstek przechodzących przez magnes. Są one odchylane w różnym stopniu wzdłuż kierunku pola magnetycznego. Gdy uderzają w odległy ekran, tworzą linię.

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ż zz lub dokładnie przeciwnie do zz, ale nie mieć żadnej innej składowej wzdłuż zz? Co jeśli wtedy mierzony wzdłuż innego kierunku, wektor mógłby wskazywać tylko całkowicie wzdłuż xx lub całkowicie przeciwnie do xx, 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.

Diagram wiązki cząstek odchylanych albo w górę, albo w dół, uderzających w jeden z dwóch punktów na ekranie, bez cząstek pomiędzy tymi dwoma maksimami

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:

0|\uparrow\rangle \sim |0\rangle 1|\downarrow \rangle \sim |1\rangle

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 zz. Ten pierwszy eksperyment będzie więc bardzo podobny do eksperymentu Sterna-Gerlacha z gradientem pola magnetycznego wzdłuż zz. Zobaczymy później, jak zmienić układ, aby mierzyć wzdłuż innych kierunków.

Zacznijmy od stworzenia analogu stanu spinowego, czyli pewnej superpozycji |\uparrow\rangle i |\downarrow\rangle, lub równoważnie 0|0\rangle i 1|1\rangle. 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")

Output of the previous code cell

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}

Output of the previous code cell

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)

Output of the previous code cell

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 θ\theta i ϕ\phi. 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")

Output of the previous code cell

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)

Output of the previous code cell

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 0|0\rangle i 1|1\rangle, więc potrzebujemy czegoś, co obróci początkowy stan Qubitu ze stanu domyślnego 0|0\rangle. W tym przypadku użyjemy bramki Hadamarda HH, ponieważ H0=12(0+1)H|0\rangle = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle). Zauważ, że domyślnie oba te pomiary będą wykonywane wzdłuż osi zz.

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)

Output of the previous code cell

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 0|0\rangle, a „01" oznacza, że pierwszy pomiar dał 1|1\rangle, a drugi 0|0\rangle. Zdecydowana większość Qubitów była mierzona albo dwukrotnie jako 0|0\rangle, albo dwukrotnie jako 1|1\rangle. 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 OO, która pozostawia pewien szczególny zbiór stanów kwantowych ψ|\psi\rangle niezmieniony z dokładnością do stałej: Oψ=cψO|\psi\rangle = c|\psi \rangle, skoro dwukrotny pomiar wzdłuż zz 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 MM i wektor v|v\rangle, gdzie

M=(1221)M= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}

oraz

v=(11)|v\rangle = \begin{pmatrix} 1\\1 \end{pmatrix}

Zauważ, że

Mv=(1221)(11)=(11+2121+11)=(33)=3v.M|v\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\1 \end{pmatrix} = \begin{pmatrix} 1*1+2*1\\2*1+1*1 \end{pmatrix} = \begin{pmatrix} 3\\3 \end{pmatrix} = 3|v\rangle.

Natomiast dla innego wektora, powiedzmy v=(12)|v'\rangle = \begin{pmatrix} 1\\2\end{pmatrix}, mamy

Mv=(1221)(12)=(11+2221+12)=(54)cv.M|v'\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\2 \end{pmatrix} = \begin{pmatrix} 1*1+2*2\\2*1+1*2 \end{pmatrix} = \begin{pmatrix} 5\\4 \end{pmatrix} \neq c|v'\rangle.

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 A|A\rangle, prawdopodobieństwo, że kolejny pomiar znajdzie cząstkę w stanie B|B\rangle, wynosi PABAB2P_{AB}\equiv |\langle A| B \rangle|^2.

Daje nam to ogromną swobodę w konstruowaniu naszych pierwszych macierzy. Na przykład możemy naiwnie spróbować

0(10).|0\rangle \sim |\uparrow\rangle \sim \begin{pmatrix} 1 \\0 \end{pmatrix}.

Zapis 0|0\rangle \sim |\uparrow\rangle 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:

P00=002=(10)(10)2=12=1.P_{00} = |\langle 0| 0 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} 1 \\ 0\end{pmatrix}\vert ^2 = |1|^2 = 1.

To znaczy, jeśli cząstka jest już w stanie 0|0\rangle, prawdopodobieństwo, że kolejny pomiar również da 0|0\rangle, wynosi 1 (pomijając efekty szumów). Jest to doskonały wynik, ponieważ widzieliśmy już, że gdy stan jest w 0|0\rangle 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

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

jest lepszym wyborem niż, powiedzmy,

0=(20)?|0\rangle = \begin{pmatrix} 2 \\0 \end{pmatrix}?

Odpowiedź:

Nasza próba powiązania prawdopodobieństwa pomiaru z kwadratem iloczynu skalarnego wymaga, aby długość każdego wektora wynosiła 1. Tzn. vv2=1|\langle v|v\rangle|^2 = 1 dla wszystkich v|v\rangle, ponieważ prawdopodobieństwo, że obiekt w stanie v|v\rangle znajduje się w stanie v|v\rangle, wynosi 100%. Jest to tzw. „warunek normalizacji".

Dlaczego

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

jest lepszym wyborem niż, powiedzmy,

0=(01)?|0\rangle = \begin{pmatrix} 0 \\1 \end{pmatrix}?

Odpowiedź:

Nie jest. Nie ma powodu, dla którego musielibyśmy początkowo wybrać 0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}. 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 0|0\rangle pozostaje w tym stanie przy kolejnych pomiarach. To samo dotyczy 1|1\rangle. Oznacza to, że Qubit w stanie 0|0\rangle ma zerowe prawdopodobieństwo bycia zmierzonym w stanie 1|1\rangle (pomijając efekty szumów). Wymagany przez nas związek między iloczynami skalarnymi a prawdopodobieństwami pomiarów mówi nam wtedy, że

P01=P10=0.P_{01} = P_{10}=0.

Bez straty ogólności możemy zapisać wektor stanu 1=(ab)|1\rangle = \begin{pmatrix} a \\ b \end{pmatrix}. Wtedy możemy napisać

P01=012=(10)(ab)2=a2=0.P_{01} = |\langle 0| 1 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} a \\ b\end{pmatrix}\vert ^2 = |a|^2 = 0.

Wymaganie, że P11=1P_{11} = 1, tzw. „warunek normalizacji", mówi nam, że b2=1|b|^2=1. Samo w sobie ogranicza to jedynie do b=eiϕb=e^{i\phi} dla ϕR\phi \in \mathbb{R}. Okazuje się, że istnieją inne powody, aby wybrać b=1b=1, które wykraczają poza to wprowadzenie do tematu. Na razie niech wystarczy, że b=1b=1 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 zz, chcielibyśmy mieć operator opisujący dokładnie to: SzS_z. 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 zz 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 zz spinowego momentu pędu wynoszą ±/2\pm \hbar/2.

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ć Sz=(s11s12s21s22)S_z = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix} i wymagać:

Sz=(s11s12s21s22)(10)=(s11s21)=!2(10)s11=/2,s21=0S_z |\uparrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}1 \\0\end{pmatrix} = \begin{pmatrix} s_{11} \\ s_{21} \end{pmatrix} \overset{!}{=} \frac{\hbar}{2} \begin{pmatrix}1 \\0\end{pmatrix} \rightarrow s_{11} = \hbar/2,s_{21}=0 Sz=(s11s12s21s22)(01)=(s12s22)=!2(01)s12=0,s22=/2S_z |\downarrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}0 \\1\end{pmatrix} = \begin{pmatrix} s_{12} \\ s_{22} \end{pmatrix} \overset{!}{=} -\frac{\hbar}{2} \begin{pmatrix}0 \\1\end{pmatrix} \rightarrow s_{12} = 0, s_{22}=-\hbar/2

Łącząc i wyciągając przed nawias ogólny czynnik /2\hbar/2, otrzymujemy

Sz=2(1001).S_z = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

Jest to dobrze znany operator spin-z, który pojawia się we wszystkich podręcznikach mechaniki kwantowej. Często widuje się go bez czynnika /2\hbar/2, w którym to przypadku jest to operator „Pauliego-z", zazwyczaj oznaczany σz\sigma_z:

σz=(1001).\sigma_z = \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

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 zz 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 0|0\rangle i 1|1\rangle. Inicjalizowaliśmy stany w setkach losowych orientacji, a pomiary zawsze dawały 0|0\rangle lub 1|1\rangle. 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

ψ=(3/52/5).|\psi\rangle = \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}.

(a) Co otrzymasz, gdy zadziałasz operatorem SzS_z na ten wektor stanu? (b) Co otrzymasz, jeśli wykonasz pojedynczy pomiar składowej zz spinu tej cząstki? (c) Co otrzymasz, jeśli przygotujesz wiele cząstek w identycznym stanie i wykonasz tysiące pomiarów składowej zz spinu?

Odpowiedzi:

(a) Otrzymasz

Szψ=2(1001)(3/52/5)S_z |\psi\rangle = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}=2(3/52/5).= \frac{\hbar}{2} \begin{pmatrix}\sqrt{3/5} \\ -\sqrt{2/5}\end{pmatrix}.

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 /2\hbar/2.

(b) Otrzymasz albo |\uparrow\rangle, albo |\downarrow\rangle. Odpowiada to zaobserwowaniu rzutu spinu na oś zz wynoszącego odpowiednio /2\hbar/2 lub /2-\hbar/2. Możemy też wyznaczyć prawdopodobieństwo każdego wyniku:

Pψ=ψ2=(10)(3/52/5)2=3/52=35P_{\uparrow\psi}=|\langle \uparrow|\psi\rangle|^2 = \vert \begin{pmatrix}1 & 0\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{3/5}|^2 = \frac{3}{5}Pψ=ψ2=(01)(3/52/5)2=2/52=25P_{\downarrow\psi}=|\langle \downarrow|\psi\rangle|^2 = \vert \begin{pmatrix}0 & 1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{2/5}|^2 = \frac{2}{5}

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:

0.|\uparrow\rangle\sim|0\rangle.

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 xx i obserwować ugięcia wzdłuż xx na ekranie. Komputery kwantowe IBM są jednak zaprojektowane do dokonywania pomiarów wyłącznie wzdłuż jednej osi (zz). Aby zmierzyć stan wzdłuż xx, musimy wykonać „zmianę bazy". Oznacza to, że musimy zastosować operację, która przekształca stany wzdłuż xx na sferze Blocha w stany wzdłuż zz i odwrotnie. Można to zrealizować na kilka sposobów, ale preferowanym jest bramka Hadamarda:

H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}

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 H0=+xH|0\rangle = |+\rangle_x oraz że H+x=0H|+\rangle_x = |0\rangle

Odpowiedź:

H0=12(1111)(10)=12(11)=+xH|0\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = |+\rangle_xH+x=1(2)(1111)12(11)=12(20)=(10)=0H|+\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}2 \\ 0\end{pmatrix} = \begin{pmatrix}1 \\ 0\end{pmatrix} = |0\rangle

Pokaż, że H1=xH|1\rangle = |-\rangle_x oraz że Hx=1H|-\rangle_x = |1\rangle

Odpowiedź:

H1=12(1111)(01)=12(11)=xH|1\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}0 \\ 1\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = |-\rangle_xHx=1(2)(1111)12(11)=12(02)=(01)=1H|-\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}0 \\ 2\end{pmatrix} = \begin{pmatrix}0 \\ 1\end{pmatrix} = |1\rangle
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add a hadamard gate to rotate into the x-basis
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

Ten Circuit obraca nasz układ tak, aby pomiary (wzdłuż zz) dostarczały informacji o charakterystykach wzdłuż xx sprzed obrotu. Wiemy już, że komputer kwantowy inicjalizuje stany do 0|0\rangle, co odpowiada |\uparrow\rangle. Zobaczmy, co się stanie, gdy zmierzymy rzut spinu wzdłuż xx dla stanu początkowo w |\uparrow\rangle. Ten krok przedstawiamy na symulatorze, aby zachęcić cię do eksplorowania statystyk innych obwodów z różnymi inicjalizacjami.

from qiskit.primitives import StatevectorSampler as Sampler

sampler_sv = Sampler()

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'1': 4977, '0': 5023}

Wynik ten pokazuje, że dla Qubitu początkowo w stanie 0|0\rangle (lub równoważnie, spinu w stanie |\uparrow\rangle) prawdopodobieństwo zmierzenia rzutu wzdłuż +x+x lub x-x wynosi mniej więcej 50-50. Pod pewnym względem jest to całkowicie zrozumiałe. W końcu, jeśli coś wskazuje wzdłuż kierunku z, nie powinno preferować ani +x+x, ani x-x. Można oczekiwać tego samego dla stanu 1|1\rangle (lub |\downarrow\rangle). Sprawdźmy to:

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add a NOT gate and hadamard gate. Measure.
qc.x(0)
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'0': 4935, '1': 5065}

Tak! Ponownie otrzymujemy prawdopodobieństwo 50-50 zmierzenia rzutu wzdłuż ±x\pm x. Analogicznie do pomiarów wzdłuż zz, możemy podejrzewać, że cząstka, która zapadła w stan zdecydowanie wzdłuż +x+x, ma zerowe prawdopodobieństwo zmierzenia jej następnie wzdłuż x-x. Sprawdźmy to:

from qiskit import QuantumCircuit

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Rotate into x-basis using a Hadamard gate, then make two measurements in succession
qc.h(0)
qc.measure(0, 0)
qc.barrier()
qc.measure(0, 1)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())
{'00': 504, '11': 520}

Output of the previous code cell

Zgodnie z oczekiwaniami otrzymujemy wyniki, w których rzut jest wzdłuż +x+x, a następnie ponownie wzdłuż +x+x, oraz wyniki, w których rzut jest początkowo wzdłuż x-x i ponownie wzdłuż x-x. Nie obserwujemy przypadków, w których rzut przełącza się z +x+x na x-x lub odwrotnie. Możemy zebrać nasze obserwacje i wykorzystać je do dalszego rozwijania operatorów w postaci macierzowej oraz kolejnych wektorów stanu.

Wiemy:

  • Stany z określonymi rzutami wzdłuż +z+z lub z-z mają 50% szansę na znalezienie rzutu wzdłuż +x+x i 50% szansę na rzut wzdłuż x-x.
  • Stany z określonym rzutem wzdłuż +x+x mają zerową szansę na późniejsze zmierzenie rzutu wzdłuż x-x i odwrotnie.

Możemy wykorzystać te wyniki do skonstruowania stanów z określonym, dodatnim rzutem wzdłuż xx (które nazywamy +x|+x\rangle) oraz tych z określonym, ujemnym rzutem wzdłuż xx (które nazywamy x|-x\rangle). Na podstawie tych stanów możemy skonstruować macierz odpowiadającą SxS_x, dokładnie tak jak zrobiliśmy to dla SzS_z. Pozostawiamy to jako ćwiczenia dla uczącego się. Podobnie można skonstruować eksperymenty wykonując pomiary wzdłuż osi yy, wyznaczyć wektory +y|+y\rangle i y|-y\rangle, a ostatecznie otrzymać wyrażenie na SyS_y.

Zbierając wszystkie te wektory i macierze, mamy

+x=12(11)x=12(11)Sx=2(0110)+y=12(1i)y=12(1i)Sy=2(0ii0)+z=(10)z=(01)Sz=2(1001)\begin{aligned} |+x\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} & \: & |-x\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} & \: &S_x &=& \frac{\hbar}{2} \begin{pmatrix} 0 & 1 \\ 1 & 0\end{pmatrix}\\ |+y\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} & \: & |-y\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -i\end{pmatrix} & \: &S_y &=& \frac{\hbar}{2} \begin{pmatrix} 0 & -i \\ i & 0\end{pmatrix}\\ |+z\rangle &= \begin{pmatrix}1 \\ 0\end{pmatrix} & \: &|-z\rangle &=& \begin{pmatrix}0 \\ 1\end{pmatrix} & \: &S_z &=& \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & 1\end{pmatrix}\\ \end{aligned}

Pytania

Instruktorzy mogą poprosić o wersje tych notebooków z kluczem odpowiedzi i wskazówkami dotyczącymi ich miejsca w typowych programach nauczania, wypełniając tę krótką ankietę na temat sposobu korzystania z notebooków.

Kluczowe pojęcia:

  • Dla cząstki o spinie 1/2, pomiar rzutu spinu na pewną oś może dać tylko jeden z dwóch wyników, często nazywanych „w górę" i „w dół".
  • Qubity można zmierzyć tylko w jednym z dwóch stanów, często oznaczanych jako 0|0\rangle i 1|1\rangle.
  • Możemy modelować eksperyment Sterna-Gerlacha na cząstkach o spinie 1/2, używając qubitów w komputerze kwantowym.
  • Wielokrotne pomiary tej samej obserwowalnej fizycznej tej samej cząstki/qubitu dadzą ten sam wynik (chyba że układ zostanie zaburzony przez szum).
  • Możemy wykorzystać wyniki eksperymentu Sterna-Gerlacha lub analogicznych eksperymentów z komputerami kwantowymi, aby wyprowadzić układ wektorów stanu i operatorów macierzowych opisujących kwantowo-mechaniczny spin.

Pytania P/F:

  1. P/F Wychodząc z obserwacji eksperymentalnych, jedynym poprawnym wyborem wektora reprezentującego |\uparrow\rangle jest (10)\begin{pmatrix}1 \\ 0\end{pmatrix}
  2. P/F Jeśli =(10)|\uparrow\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix}, jedynym wyborem dla |\downarrow\rangle jest (01)\begin{pmatrix}0 \\ 1\end{pmatrix} (z dokładnością do globalnej fazy).
  3. P/F Cząstka zmierzona w stanie 0|0\rangle będzie nadal znajdowana w stanie 0|0\rangle przy kolejnych pomiarach wzdłuż zz.
  4. P/F Cząstka zmierzona w stanie 0|0\rangle będzie nadal znajdowana w stanie 0|0\rangle przy kolejnych pomiarach wzdłuż xx.
  5. P/F Cząstka zmierzona w stanie 0|0\rangle zawsze będzie znajdowana w stanie +x|+\rangle_x przy kolejnych pomiarach wzdłuż xx.

Pytania wielokrotnego wyboru:

  1. Cząstka początkowo w stanie |\uparrow\rangle ma jakie prawdopodobieństwo bycia zmierzoną w stanie +x|+x\rangle?

    • a. 0%
    • b. 25%
    • c. 50%
    • d. 71%
    • e. 100%
  2. Cząstka początkowo w stanie |\uparrow\rangle ma jakie prawdopodobieństwo bycia zmierzoną w stanie |\downarrow\rangle?

    • a. 0%
    • b. 25%
    • c. 50%
    • d. 71%
    • e. 100%
  3. Stan |\uparrow\rangle cząstki o spinie 1/2 jest najczęściej kojarzony z jakim stanem komputerowym?

    • a. +|+\rangle
    • b. |-\rangle
    • c. 0|0\rangle
    • d. 1|1\rangle
    • e. Żaden z powyższych

Pytania do dyskusji:

  1. Trójka przyjaciół dyskutuje o pomiarach kwantowych i operatorach. Przyjaciel A mówi: „Dokonanie pomiaru wzdłuż zz i działanie operatorem σz\sigma_z to to samo." Przyjaciel B mówi: „Cóż, to są różne procedury, ale dają ten sam wynik." Przyjaciel C mówi: „Są zupełnie różne; mają nawet różny wpływ na większość stanów." Z kim się zgadzasz i dlaczego?

Zadania z odpowiedzią otwartą:

  1. Mając dane obserwacje eksperymentalne i proponowany zapis:

P+x=(10)(ab)2=a2=12P_{\uparrow+x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} P+x=(01)(ab)2=b2=12P_{\downarrow+x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

pokaż, że z dokładnością do globalnej fazy

+x=12(1eiα)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ e^{i\alpha}\end{pmatrix}

Wybierz α=0\alpha = 0, aby uzyskać standardowy wynik.

  1. Mając dane obserwacje eksperymentalne i proponowany zapis:

Px=(10)(ab)2=a2=12P_{\uparrow-x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} Px=(01)(ab)2=b2=12P_{\downarrow-x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

Oraz korzystając z wyniku zadania dodatkowego nr 3:

P+xx=12(11)(cd)2=12c+d2=0P_{+x-x}=\vert \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1\end{pmatrix}\begin{pmatrix}c \\ d\end{pmatrix}\vert^2 = \frac{1}{2}|c+d|^2 =0

pokaż, że z dokładnością do globalnej fazy

+x=12(11)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix}

Podziękowania

[1] By Tatoute - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=34095239