Skip to main content
IBM Quantum Platform

Unsicherheit erforschen

Für dieses Modul "Qiskit im Klassenzimmer" müssen die Schüler eine funktionierende Python Umgebung mit den folgenden Paketen installiert haben:

  • qiskit v2.1.0 oder neuer
  • qiskit-ibm-runtime v0.40.1 oder neuer
  • qiskit-aer v0.17.0 oder neuer
  • qiskit.visualization
  • numpy
  • pylatexenc

Um die oben genannten Pakete einzurichten und zu installieren, lesen Sie die Anleitung Qiskit installieren. Um Aufträge auf echten Quantencomputern ausführen zu können, müssen die Schüler ein Konto bei IBM Quantum® einrichten, indem sie die Schritte in der Anleitung zur Einrichtung Ihres IBM Cloud Kontos befolgen.

Dieses Modul wurde getestet und verbrauchte 8 Minuten QPU-Zeit. Dies ist nur eine Schätzung. Ihre tatsächliche Nutzung kann davon abweichen. Zwei zeitaufwändige Berechnungen sind in den Kopfzeilen als solche gekennzeichnet und können an Simulatoren durchgeführt werden, wenn die Schüler nur wenig Zeit für QPU haben. Wenn diese entfernt werden, benötigt das Modul nur etwa 30 Sekunden QPU-Zeit.

# 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'

Schauen Sie sich den Modul-Walkthrough von Dr. Katie McCormick unten an, oder klicken Sie hier, um ihn auf YouTube zu sehen.



Einführung

Wahrscheinlich haben Sie schon einmal von der Unschärferelation gehört, auch außerhalb Ihres Physikunterrichts. Eine gängige umgangssprachliche Umschreibung für Unsicherheit lautet: "Indem man etwas betrachtet, beeinflusst man es" Das ist sicherlich richtig. Eine physikalischere Art, die Unsicherheit zu beschreiben, besteht darin, dass es bestimmte physikalische Beobachtungsgrößen gibt, die eine Inkompatibilität aufweisen, die verhindert, dass sie beide gleichzeitig mit beliebiger Genauigkeit bekannt sind. Viele Schüler stoßen zunächst auf die beiden unvereinbaren Variablen xx und pxp_x, d. h. die Position entlang einer Achse, der xx -Achse, bzw. den linearen Impuls entlang dieser Richtung. Für diese Variablen wird die Unsicherheitsbeschränkung wie folgt geschrieben ΔxΔpx≥ℏ2.\Delta x \Delta p_x \geq \frac{\hbar}{2}. Hier wird Δx\Delta x als die "Unsicherheit in xx " bezeichnet, die dieselbe Definition wie die Standardabweichung in der Statistik hat und wie folgt definiert werden kann Δx=⟨x2⟩−⟨x⟩2.\Delta x = \sqrt{\langle x^2 \rangle - \langle x \rangle^2}. Δpx\Delta p_x ist auf die gleiche Weise definiert. Wir werden diese Unschärferelation hier nicht herleiten, sondern nur darauf hinweisen, dass sie mit unserem Verständnis der klassischen Wellen übereinstimmt. Das heißt, eine Welle mit einer wirklich perfekten Frequenz ff und Wellenlänge λ\lambda würde als perfekte Sinuskurve ewig weiterlaufen. Quantenmechanisch würde dies einer perfekten Kenntnis des Impulses gemäß der de Broglie-Hypothese entsprechen: λ=h/p\lambda = h/p. Um jedoch zu wissen, wo sich ein wellenförmiges Teilchen befindet ( wherewhere ), muss die Welle, die es beschreibt, eine schärfere Spitze im Raum bilden, z. B. eine sehr schmale Gaußsche Kurve. Wir wissen, dass wir jede kontinuierliche Funktion, einschließlich solcher spitzen Wellenfunktionen, als eine Fourier-Reihe von Sinusfunktionen mit unterschiedlichen Wellenlängen ausdrücken können. Da die Wellenfunktion aber immer stärker spitz zuläuft (und die Position besser bekannt ist), benötigen wir mehr Terme in der Fourier-Reihe, was eine Mischung aus mehr Wellenlängen (und damit quantenmechanisch gesehen mehr Impulswerten) bedeutet.

Einfacher ausgedrückt: Ein Zustand mit einem wohldefinierten Impuls (eine perfekte Sinuskurve im Raum) hat eine sehr unsichere Position. Ein Zustand mit einer genau definierten Position (wie eine Dirac-Delta-Verteilung) hat einen sehr unsicheren Impuls.

Es gibt andere Variablen, die eine solche Unvereinbarkeit aufweisen. Der Spin eines Teilchens kann zum Beispiel eine wohldefinierte Projektion entlang einer Achse haben, aber wir wissen nichts über die Projektion auf eine orthogonale Achse. Zum Beispiel hat der Zustand ∣0⟩∼∣↑⟩|0\rangle \sim |\uparrow\rangle (für ein Qubit oder spin-1/2 Teilchen) eine eindeutige Projektion entlang der Achse zz (von 1 im Zusammenhang mit einem Qubit und von ℏ/2\hbar/2 im Zusammenhang mit einem spin-1/2 Teilchen). Dieser Zustand kann jedoch als Überlagerung von zwei Zuständen beschrieben werden, von denen jeder eine wohldefinierte Projektion auf die Achse xx hat: ∣0⟩=12(∣+⟩x+∣−⟩x)|0\rangle = \frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) oder äquivalent (10)=12[12(11)+12(1−1)].\begin{pmatrix} 1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\left[\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1\end{pmatrix}+\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -1\end{pmatrix}\right]. ∣+⟩x|+\rangle_x hat eine wohldefinierte Projektion auf xx, ebenso wie ∣−⟩x|-\rangle_x. Wenn wir also die Projektion eines Zustands entlang der Achse xx angeben, kennen wir die Projektion entlang der Achse zz nicht. Und wenn wir die Projektion auf die Achse zz angeben, kennen wir die Projektion entlang xx nicht. Es gibt geringfügige Unterschiede, wenn man dies im Zusammenhang mit dem Spin und den Qubits diskutiert. Aber im Allgemeinen haben die Eigenzustände der Pauli-Matrizen eine interessante Beziehung, die wir untersuchen können. In dieser Lektion werden wir unsere Intuition für die Unschärfe in diesen inkompatiblen Variablen experimentell überprüfen und nachweisen, dass die Unschärferelationen auf IBM® Quantencomputern gelten.


Einfache Überprüfung der Intuition

In diesem ersten Experiment und während des gesamten Moduls werden wir einen Rahmen für Quantencomputer verwenden, der als "Qiskit-Muster" bekannt ist und Arbeitsabläufe in die folgenden Schritte unterteilt:

  • Schritt 1: Abbildung klassischer Eingaben auf ein Quantenproblem
  • Schritt 2: Optimieren des Problems für die Quantenausführung
  • Schritt 3: Ausführung mithilfe von „ IBM Quantum “-Primitiven
  • Schritt 4: Nachbearbeitung und klassische Analyse

Im Allgemeinen werden wir diese Schritte befolgen, auch wenn wir sie nicht immer explizit kennzeichnen.

Beginnen wir mit dem Laden einiger notwendiger Pakete, einschließlich der Laufzeitprimitive. Wir werden auch den am wenigsten ausgelasteten Quantencomputer auswählen, der uns zur Verfügung steht.

Unten finden Sie einen Code, mit dem Sie Ihre Anmeldedaten bei der ersten Verwendung speichern können. Achten Sie darauf, diese Informationen aus dem Notebook zu löschen, nachdem Sie es in Ihrer Umgebung gespeichert haben, damit Ihre Anmeldedaten nicht versehentlich weitergegeben werden, wenn Sie das Notebook freigeben. Weitere Anleitungen finden Sie unter Einrichten Ihres IBM Cloud Kontos und Initialisieren des Dienstes in einer nicht vertrauenswürdigen Umgebung.

from numpy import pi

# Load IBM Quantum Compute 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')

# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
    Batch,
    SamplerV2 as Sampler,
    EstimatorV2 as Estimator,
)

# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)

Output:

ibm_sherbrooke

Wenn ein Schüler seine verfügbare Zeit für Quantencomputer während des Unterrichts ausschöpft, können die folgenden Zeilen unkommentiert bleiben und dazu verwendet werden, einen Simulator einzurichten, der das Rauschverhalten des oben ausgewählten Quantencomputers teilweise nachahmt.

# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel

# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)

noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})

Sie erinnern sich vielleicht, dass ein Eigenzustand eines Operators Z kein Eigenzustand eines anderen Operators X ist. Wir werden dies nun experimentell beobachten, indem wir Messungen entlang der Achsen xx und zz durchführen. Für die Messung entlang zz verwenden wir einfach qc.measure (), denn IBM Quantencomputer sind so aufgebaut, dass sie entlang zz messen. Aber um entlang xx zu messen, müssen wir das System drehen, um die xx Achse effektiv in die Richtung zu bewegen, entlang der wir messen. Dies wird mit einem Hadamard-Tor erreicht. Ein ähnlicher Schritt ist für Messungen entlang yy erforderlich. Der Einfachheit halber werden die erforderlichen Schritte hier zusammengefasst:

  • Zum Messen entlang zz : qc.measure()
  • Zum Messen entlang xx : qc.h() dann qc.measure()
  • Messung entlang yy : qc.sdg(), qc.h(), qc.sdann qc.measure()

Schritt 1: Klassische Eingaben einem Quantenproblem zuordnen

In diesem Fall besteht der Abbildungsschritt einfach darin, die oben beschriebenen Messungen und Drehungen in einer Quantenschaltung auszudrücken:

# Step 1: Map

# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister

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

# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()

# Change basis so that measurements made on quantum computer which normally tell us about z,
# now tell us about x.
qc.h(qr)

# Add a second measurement
qc.measure(qr, cr[1])

qc.draw("mpl")

Output:

Output of the previous code cell

Schritt 2: Optimierung des Problems für die Quantenausführung

In diesem Schritt werden die Operationen, die wir durchführen wollen, in Bezug auf die Funktionalität eines bestimmten Quantencomputers ausgedrückt. Außerdem wird unser Problem auf den Aufbau des Quantencomputers übertragen.

# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qc)

Schritt 3: Ausführung mithilfe von „ IBM Quantum “-Primitiven

Wir können den Sampler nutzen, um statistische Daten zu den Messungen zu erfassen. Wir werden die Sampler-Primitive so erstellen, dass sie auf einem echten Quantencomputer läuft, und zwar mithilfe von mode = backend. Es gibt weitere Modi für andere Arbeitsabläufe, und wir werden im Folgenden einen davon verwenden. Der Sampler wird verwendet, indem seine Methode run() mit einer Liste von „pubs“ (Primitive Unified Blocs) aufgerufen wird. Jede Zeile enthält bis zu drei Werte, die zusammen eine Berechnungseinheit bilden, die der Schätzer ausführen muss: Schaltkreise, Observablen und Parameter. Sie können außerdem eine Liste der Schaltungen, eine Liste der Messgrößen und eine Liste der Parameter angeben. Weitere Informationen finden Sie in der Übersicht über PUBs.

Wir wollen auf einem echten Quantencomputer laufen, so dass wir ein echtes quantenphysikalisches Experiment durchführen. Wenn Sie die Ihnen zugewiesene Zeit auf echten Quantencomputern ausschöpfen, können Sie den nachstehenden Code für den Quantencomputer auskommentieren und den Code für die Ausführung auf einem Simulator auskommentieren.

# Step 3: Run the job on a real quantum computer


sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()

counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()

Schritt 4: Nachbearbeitung

Dies ist ein besonders einfacher Fall von Post-Processing, bei dem wir einfach die Zählungen visualisieren.

Beachten Sie, dass Qiskit Qubits, Messungen und andere Dinge so anordnet, dass das Element mit der niedrigsten Nummer zuletzt / rechts steht, eine Konvention, die als "Little-Endian" bezeichnet wird. Das bedeutet, dass sich die Spalte mit der Bezeichnung "10" auf Zählungen bezieht, bei denen die erste Messung eine "0" und die zweite Messung eine "1" ergab.

# Step 4: Post-process

from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output:

Output of the previous code cell

Wenn Ihnen diese Konvention nicht zusagt, können Sie marginal_counts verwenden, um die Ergebnisse der einzelnen Messungen getrennt darzustellen:

from qiskit.result import marginal_counts

plot_histogram(
    marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)

Output:

Output of the previous code cell
plot_histogram(
    marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)

Output:

Output of the previous code cell

Standardmäßig werden die Zustände in Qiskit mit dem Zustand ∣0⟩|0\rangle initialisiert. Es ist daher nicht überraschend, dass fast alle der ersten Messungen ∣0⟩|0\rangle ergaben. Es ist jedoch zu beachten, dass die zweite Messung (diejenige, die Informationen über die Projektion des Zustands auf xx liefert) eine fast gleichmäßige Verteilung ergab. Es scheint, als ob dieser Zustand, der uns ein sehr vorhersehbares Ergebnis für Messungen entlang von zz liefert, uns eine sehr unvorhersehbare Reihe von Ergebnissen für Messungen entlang von xx liefert. Lassen Sie uns dies untersuchen.

Was passiert, wenn die Messungen in umgekehrter Reihenfolge durchgeführt werden? Wir könnten damit beginnen, das Hadamard-Gatter zu verwenden, um Statistiken über die Wahrscheinlichkeit zu erhalten, dass ∣0⟩|0\rangle in ∣±⟩x|\pm\rangle_x gemessen wird. Für die zweite Messung wechseln wir dann wieder zur Basis zz und verwenden ein zweites Hadamard-Gatter.

# Step 1:

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

# Change basis to measure along x.
qc.h(qr)
qc.measure(qr, cr[0])
qc.barrier()

# Change our basis back to z and make a second measurement
qc.h(qr)
qc.measure(qr, cr[1])

qc.draw("mpl")

Output:

Output of the previous code cell
# Step 2: Transpile the circuit for running on a quantum computer

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer

sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
# Step 4: Post-process
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output:

Output of the previous code cell

Hier scheint es noch weniger Vorhersehbarkeit zu geben! Zuvor wussten wir zumindest, wie das Ergebnis der ersten Messung aussehen würde, jetzt haben wir eine ziemlich gleichmäßige Verteilung über alle möglichen Zustände. Es ist nicht allzu schwer zu verstehen, warum dies geschah. Wir haben mit ∣0⟩|0\rangle begonnen, das eine 50-50-Mischung aus ∣+⟩x|+\rangle_x und ∣−⟩x|-\rangle_x ist ∣0⟩=12(∣+⟩x+∣−⟩x)|0\rangle=\frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) Die Wahrscheinlichkeit, bei der ersten Messung den Zustand "+" oder "-" (im Diagramm auf 0 und 1 abgebildet) zu erhalten, sollte also gleich groß sein. Die Messung entlang xx lässt den Zustand entweder in einen Eigenzustand ∣+⟩x|+\rangle_x oder den Eigenzustand ∣−⟩x|-\rangle_x kollabieren. Jeder dieser Zustände ist eine 50-50-Mischung aus ∣0⟩|0\rangle und ∣1⟩|1\rangle, gemäß ∣+⟩x=12(∣0⟩+∣1⟩)|+\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) ∣−⟩x=12(∣0⟩−∣1⟩)|-\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle) Sobald sich das System also in einem Eigenzustand von xx befindet, führen Messungen entlang von zz sowohl zu ∣0⟩|0\rangle als auch zu ∣1⟩|1\rangle, und zwar mit ungefähr gleicher Wahrscheinlichkeit. Unser erstes Beispiel hat uns also gezeigt, dass einige Staaten sehr vorhersehbare Ergebnisse bei einigen Messungen, aber unvorhersehbare Ergebnisse bei anderen Messungen haben werden. Das aktuelle Beispiel zeigt uns, dass es noch schlimmer kommen kann. Es gibt Zustände, die bei beiden Messungen zu unvorhersehbaren Ergebnissen führen können, selbst wenn wir nur die Reihenfolge der Messungen vertauschen. Untersuchen wir, wie sicher oder unsicher eine Größe für einen bestimmten Zustand ist.


Berechnung der Unsicherheit

Wir können dies mit Hilfe der Unsicherheit bzw. Varianz quantifizieren. Die "Unsicherheit" wird oft als die Quadratwurzel der "Varianz" einer Verteilung definiert. Das heißt, die Unsicherheit für eine beobachtbare Größe SS wird mit ΔS\Delta S bezeichnet und ist gegeben durch

(ΔS)2≡⟨(S−⟨S⟩)2⟩(ΔS)2=⟨S2−2S⟨S⟩+⟨S⟩2⟩(ΔS)2=⟨S2⟩−⟨S⟩2\begin{aligned} (\Delta S)^2 & \equiv \langle (S - \langle S \rangle)^2 \rangle\\ (\Delta S)^2 & = \langle S^2 - 2 S \langle S \rangle +\langle S \rangle^2 \rangle\\ (\Delta S)^2 & = \langle S^2 \rangle - \langle S \rangle^2 \end{aligned}

Für den Fall der Pauli-Matrizen, für die S2=IS^2 = I gilt, wird daraus

(ΔS)2=1−⟨S⟩2(\Delta S)^2 = 1 - \langle S \rangle^2

Wenden wir dies einmal auf ein konkretes Beispiel an. Beginnen wir mit dem Zustands ∣ψ⟩=∣+⟩y=12(1i)|\psi\rangle = |+\rangle_y = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ i \end{pmatrix} und bestimmen wir die Unsicherheit der Observable XX in diesem Zustand.

Überprüfen Sie Ihr Verständnis

Berechnen Sie die Unsicherheit von XX im Zustand ∣+⟩y=∣+i⟩|+\rangle_y = |+i\rangle von Hand.

  • ΔX=⟨+i∣X2∣+i⟩−⟨+i∣X∣+i⟩2\Delta X =\sqrt{\langle+i| X^2 |+i\rangle - \langle+i| X |+i\rangle^2}

    In dem gegebenen Zustand ergibt sich dies:

    ΔX=12(1−i)(0110)(0110)12(1i)−(12(1−i)(0110)12(1i))2ΔX=12(1−i)(1001)(1i)−(12(1−i)(i1))2ΔX=12(1−i)(1i)−(12(0)))2ΔX=12(2)=1\begin{aligned} \Delta X & =\sqrt{\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 & 0 \\ 0 & 1\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}i \\ 1\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}(0))\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}(2)} = 1 \end{aligned}

Mit qc.initialize() können wir einen beliebigen Ausgangszustand erzeugen. Beachten Sie, dass die Syntax für die imaginäre Einheit hier 1j1j lautet.

# Step 1: Map the problem into a quantum circuit

from qiskit.quantum_info import SparsePauliOp
import numpy as np

obs = SparsePauliOp("X")

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

# Initialize the state
qc.initialize([1, 1j] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer


estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)

Output:

-0.02408454165642664

Nach unserer obigen Gleichung, (ΔX)2=1−⟨X⟩2=1−(0.0015...)2→ΔX=0.999...(\Delta X)^2 = 1 - \langle X \rangle^2 = 1-(0.0015...)^2 \rightarrow \Delta X = 0.999... Bleiben wir bei demselben Zustand, finden aber jetzt den Erwartungswert von ZZ :

# Step 1: Map the problem into a quantum circuit

obs = SparsePauliOp("Z")

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

# Initialize the state to |+>_y
qc.initialize([1, 1j] / np.sqrt(2))


# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)

Output:

0.04958271968581247

Wir könnten die gleichen Berechnungen anstellen wie zuvor, würden aber sehen, dass die Varianz wieder sehr nahe bei 1.0 liegt. Wir könnten daraus schließen, dass ΔXΔZ≈1.0\Delta X \Delta Z \approx 1.0. Tatsächlich ist dies für den von uns gewählten Zustand ungefähr richtig. Aber können wir es besser machen? Oder schlimmer?

Erinnern wir uns daran, dass zwischen der Position in einer Richtung, xx, und dem Impuls in derselben Richtung, pxp_x, ein Unschärferelation besteht. Für diese Größen ist die wohl bekannteste Form wahrscheinlich ΔxΔpx≥ℏ/2\Delta x \Delta p_x \geq \hbar/2 Wenn wir uns nur daran erinnern, könnten wir versucht sein zu glauben, dass auch ΔX\Delta X und ΔZ\Delta Z eine solche grundlegende Unschärfegrenze aufweisen könnten. Vielleicht ist es unmöglich, dass das Produkt ΔXΔZ\Delta X \Delta Z den Wert Null erreicht? Probieren wir es mal mit einem anderen Bundesland aus und schauen wir, ob das auch dort zutrifft. Dieses Mal verwenden wir „ ∣ψ⟩=12(11)|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} “. Mal sehen, was passiert. Beachten Sie, dass der Schätzer im folgenden Code zwei Sätze von Schaltkreisen und Beobachtungsgrößen in derselben Job-Einreichung akzeptieren kann.

# Step 1: Map the problem into a quantum circuit

obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Z")

# Define registers

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

# Initialize the state
qc.initialize([1, 1] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]
    job = estimator.run(pubs)
    res = job.result()
batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print("The expectation value of the first observable is: ", res[0].data.evs)
print("The expectation value of the second observable is: ", res[1].data.evs)

Output:

The expectation value of the first observable is:  1.0011036174126302
The expectation value of the second observable is:  0.0029429797670141016

Der Erwartungswert von XX sollte in der Nähe von 1.0 liegen, aber 1.0 nicht überschreiten. Machen Sie sich keine Sorgen, wenn die Zahl 1.0 nur geringfügig überschritten wird. Dies lässt sich auf Faktoren wie Rauschen und/oder Auslesefehler zurückführen. Obwohl dies ein sehr wichtiges Thema ist, können wir es vorerst ignorieren.

Wir haben einen Erwartungswert für XX erhalten, der sehr nahe an 1.0 liegt (was einer sehr geringen Varianz für XX entspricht). Dies macht das Produkt der beiden Varianzen recht niedrig:

ΔXΔZ=1−(0.9853)2×1−(−0.00195)2=0.171.\Delta X \Delta Z = \sqrt{1-(0.9853)^2} \times \sqrt{1-(-0.00195)^2} = 0.171.

Dies ist zwar nicht genau Null, aber dieser Wert wird im Vergleich zu den Eigenwerten der Pauli-Operatoren ( ±1\pm 1 ) klein. Sie erinnern sich vielleicht daran, dass die Unschärferelation zwischen linearer Position und Impuls auch anders geschrieben werden könnte, nämlich explizit unter Verwendung der Kommutationsbeziehung zwischen den Operatoren xx und pxp_x :

ΔxΔpx≥12∣⟨[x,px]⟩∣\Delta x \Delta p_x \geq \frac{1}{2}|\langle [x,p_x] \rangle|

wo

[x,px]=xpx−pxx[x,p_x] = xp_x-p_xx

ist der Kommutator von xx und pxp_x.

Dies ist die Form, die sich am einfachsten auf die Pauli-Operatoren übertragen lässt. Im Allgemeinen gilt für zwei Betreiber AA und BB,

ΔAΔB≥12∣⟨[A,B]⟩∣.\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|.

Und im Fall der Pauli-Matrizen XX und ZZ benötigen wir [X,Z][X,Z], um zu berechnen

ΔXΔZ≥12∣⟨[X,Z]⟩∣.\Delta X \Delta Z \geq \frac{1}{2}|\langle [X,Z] \rangle|.

Wir zeigen dies hier und überlassen ähnliche Berechnungen dem Leser als Übung:

[X,Z]=XZ−ZX=(0110)(100−1)−(100−1)(0110)[X,Z] = XZ-ZX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} [X,Z]=(0−110)−(01−10)=2(0−110)[X,Z] = \begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}-\begin{pmatrix}0 & 1 \\ -1 & 0\end{pmatrix} = 2\begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}

Dies ist eine durchaus akzeptable Antwort, aber mit einem weiteren Schritt sehen wir

[X,Z]=−2i(0−ii0)=−2iY[X,Z] = -2i\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}=-2iY

Unsere Unschärferelation lautet also

ΔXΔZ≥∣⟨Y⟩∣.\Delta X \Delta Z \geq |\langle Y \rangle|.

Überprüfen Sie Ihr Verständnis

Bestimmen Sie [X,Y][X,Y] und [Y,Z][Y,Z]. Benutzen Sie dies, um die Unsicherheitsbeziehungen zwischen XX & YY und YY & ZZ aufzuschreiben.

  • [X,Y]=XY−YX=(0110)(0−ii0)−(0−ii0)(0110)=2(i00−i)=2iZ[X,Y] = XY-YX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}-\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} = 2 \begin{pmatrix}i & 0 \\ 0 & -i\end{pmatrix}=2iZ[Y,Z]=YZ−ZY=(0−ii0)(100−1)−(100−1)(0−ii0)=2(0ii0)=2iX[Y,Z] = YZ-ZY = \begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix} = 2 \begin{pmatrix}0 & i \\ i & 0\end{pmatrix}=2iX

    In Verbindung mit der allgemeinen Unschärferelation ergibt sich

    ΔXΔY≥∣⟨Z⟩∣,\Delta X \Delta Y \geq |\langle Z \rangle|,ΔYΔZ≥∣⟨X⟩∣.\Delta Y \Delta Z \geq |\langle X \rangle|.

Konsistenz überprüfen

Bevor wir fortfahren, wollen wir überprüfen, ob dies mit unserer vorherigen Erkenntnis übereinstimmt. Wir haben die Zustands ∣ψ⟩=12(11)|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} angewendet. Dabei haben wir festgestellt, dass ΔXΔZ=0.171\Delta X \Delta Z = 0.171 gilt. Nun wissen wir, dass dieses Produkt größer oder gleich

∣⟨Y⟩∣=12(11)(0−ii0)12(11)|\langle Y \rangle|=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} ∣⟨Y⟩∣=12(11)(−ii)=12(−i+i)=0.|\langle Y \rangle| = \frac{1}{2}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix} -i \\ i \end{pmatrix} = \frac{1}{2}(-i+i) = 0.

Das stimmt, ΔXΔZ=0.171≥∣⟨Y⟩∣=0\Delta X \Delta Z = 0.171 \geq |\langle Y \rangle|=0

Nutzen Sie die folgenden Fragen, um ein Gefühl für diese Erkenntnisse zu bekommen:

Überprüfen Sie Ihr Verständnis

Beantworten Sie die folgenden Fragen gemeinsam als Satz:

(a) Bei welchen Zuständen würden Sie erwarten, dass die Unsicherheit in XX gleich Null ist?

(b) Bei welchen Zuständen würden Sie erwarten, dass die Unsicherheit in ZZ gleich Null ist?

(c) In welchen Zuständen würden Sie einen Null-Erwartungswert erhalten ⟨Y⟩\langle Y \rangle?

(d) Stimmen die Antworten auf die obigen Fragen mit dem Fall ΔXΔZ≥∣⟨Y⟩∣\Delta X \Delta Z \geq |\langle Y \rangle| überein?

(e) Schreiben Sie einen Code, um dies mit Hilfe eines Schätzers explizit zu überprüfen.

  • (a) Man könnte erwarten, dass Eigenzustände des Operators „ XX “ in „ XX “ eine Unsicherheit von Null ergeben. Tatsächlich gilt unter Verwendung von „ ∣ψ⟩=∣+⟩x|\psi\rangle = |+\rangle_x “ ΔX=1−⟨X⟩2=1−12=0.\Delta X = \sqrt{1-\langle X \rangle^2} = \sqrt{1-1^2} = 0.

    (b) Man könnte erwarten, dass Eigenzustände des Operators „ ZZ “ zu einer Unsicherheit von Null in „ ZZ “ führen. Tatsächlich ergibt sich unter Verwendung von „ ∣ψ⟩=∣1⟩|\psi\rangle = |1\rangle “ Folgendes: „ ΔZ=1−⟨Z⟩2=1−(−1)2=0.\Delta Z = \sqrt{1-\langle Z \rangle^2} = \sqrt{1-(-1)^2} = 0. “

    (c) Wir erwarten, ⟨Y⟩=0\langle Y \rangle=0 für alle Zustände zu finden, die, wenn sie gemessen werden, genauso oft eine positive Projektion auf die Achse yy ergeben wie eine negative Projektion. Dazu gehören die Eigenzustände von XX und ZZ.

    (d) Ja. Man würde für Eigenzustände von XX oder ZZ einen sehr kleinen Wert für das Produkt der Unsicherheiten ΔXΔZ\Delta X \Delta Z erwarten: ΔXΔZ≈0\Delta X \Delta Z \approx 0. Dies kann zutreffen, da wir für dieselben Zustände auch ⟨Y⟩=0\langle Y \rangle=0 erwarten würden. Somit könnte der Unschärferelation erfüllt sein.

    (e) Ein Code wie der folgende würde dies bestätigen:

    obs1 = SparsePauliOp.from_list(
        [("X", 1.000)]
    )
    obs2 = SparsePauliOp.from_list(
        [("Y", 1.000)]
    )
    obs3 = SparsePauliOp.from_list(
        [("Z", 1.000)]
    )
    qc = QuantumCircuit(1,1)
    qc.ry(pi/2,0)
    
    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
    res=job.result()

    Wobei die Ergebnisse alle Erwartungswerte zurückgeben. Um alle Erwartungswerte abzurufen und die Unsicherheiten zu berechnen, können wir Folgendes verwenden:

    xs=res[0].data.evs[0]
    ys=abs(res[0].data.evs[1])
    zs=res[0].data.evs[2]
    
    import math
    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
    

Beantworten Sie die folgenden Fragen gemeinsam als Satz:

(a) Können Sie sich einen Zustand vorstellen, in dem Sie einen großen Erwartungswert haben ⟨Y⟩\langle Y \rangle?

(b) Würden Sie erwarten, dass derselbe Zustand eine große oder kleine Unsicherheit in XX hat?

(c) Würden Sie erwarten, dass derselbe Zustand eine große oder kleine Unsicherheit in ZZ hat?

(d) Stimmen die Antworten auf die obigen Fragen mit dem Fall ΔXΔZ≥∣⟨Y⟩∣\Delta X \Delta Z \geq |\langle Y \rangle| überein?

(e) Schreiben Sie einen Code, um dies mit Hilfe eines Schätzers explizit zu überprüfen.

  • (a) Wir erwarten, dass wir ⟨Y⟩≈1\langle Y \rangle\approx 1 für den Eigenzustand von YY : ∣+⟩y|+\rangle_y finden.

    (b) Es ist zu erwarten, dass „ XX “ in dem Zustand „ ∣+⟩y|+\rangle_y “ eine große Unsicherheit aufweist, da die Messung von „ XX “ in diesem Zustand mit gleicher Häufigkeit bzw. Wahrscheinlichkeit sowohl ein positives als auch ein negatives Ergebnis liefern würde.

    (c) Es ist zu erwarten, dass „ ZZ “ eine große Unsicherheit im Zustand „ ∣+⟩y|+\rangle_y “ aufweist, da die Messung von „ ZZ “ in diesem Zustand mit gleicher Häufigkeit bzw. Wahrscheinlichkeit sowohl ein positives als auch ein negatives Ergebnis liefern würde.

    (d) Ja. Man würde einen großen Wert für das Produkt der Unsicherheiten ΔXΔZ\Delta X \Delta Z für Eigenzustände von YY und insbesondere für ∣+⟩y|+\rangle_y erwarten. Für denselben Zustand würden wir außerdem ⟨Y⟩≈1\langle Y \rangle\approx 1 erwarten. Sowohl ⟨Y⟩\langle Y \rangle als auch ΔXΔZ\Delta X \Delta Z sind in diesem Zustand also beide recht groß, und es ist plausibel, dass die Unschärferelation erneut erfüllt sein könnte.

    (e) Ein Code wie der folgende würde dies bestätigen:

    obs1 = SparsePauliOp.from_list(
        [("X", 1.000)]
    )
    obs2 = SparsePauliOp.from_list(
        [("Y", 1.000)]
    )
    obs3 = SparsePauliOp.from_list(
        [("Z", 1.000)]
    )
    qc = QuantumCircuit(1,1)
    qc.rx(-pi/2,0)
    
    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
    res=job.result()

    Wobei die Ergebnisse alle Erwartungswerte zurückgeben. Um alle Erwartungswerte abzurufen und die Unsicherheiten zu berechnen, können wir Folgendes verwenden:

    xs=res[0].data.evs[0]
    ys=abs(res[0].data.evs[1])
    zs=res[0].data.evs[2]
    
    import math
    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
    

Prüfung von Unsicherheitsbeziehungen

Der obige Test hat nur die Gültigkeit der Unschärferelation für eine einzige Wahl des Zustandsvektors ∣ψ⟩=∣+⟩x|\psi\rangle = |+\rangle_x gezeigt. Um uns davon zu überzeugen, dass dies im Allgemeinen mit dem Experiment übereinstimmt, sollten wir ähnliche Berechnungen mit dem Schätzer für viele verschiedene Zustandsvektoren durchführen. Beginnen wir damit, unseren Zustandsvektor von der Achse zz wegzudrehen, indem wir ein `RY'-Gatter verwenden, um verschiedene Anfangszustände mit einem Parameter θ\theta zu erzeugen.

# The calculation below uses approximately 3-4 minutes of QPU time.
# Step 1: Map the problem into a quantum circuit

from qiskit.circuit import Parameter
import numpy as np

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

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

# Rotate away from |0>
theta = Parameter("θ")
qc.ry(theta, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
    job = estimator.run(pubs, precision=0.01)
    res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
    prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

Output:

Output of the previous code cell

Beachten Sie, dass die rote Kurve (ΔXΔZ)(\Delta X \Delta Z) stets größer ist als die orangefarbene Kurve ⟨Y⟩\langle Y \rangle. Manchmal fällt das Unsicherheitsprodukt ab und liegt relativ nahe am Grenzwert, manchmal steigt es an und ist weiter vom Grenzwert entfernt, aber es hält sich stets an die Unschärferelation.

Natürlich ist dies vielleicht nicht der beste Test für die Unschärferelation, da unser Grenzwert ⟨Y⟩\langle Y \rangle immer sehr nahe bei Null liegt. Nehmen wir einen Quantenzustand, der eine größere Projektion auf die Eigenzustände von YY hat. Konkret werden wir ∣0⟩|0\rangle immer noch um verschiedene Winkel von der Achse zz nach unten drehen, aber jetzt werden wir den resultierenden Zustand auch um einen bestimmten Winkel um zz drehen, vielleicht π/4\pi/4, und sehen, was passiert.

# The calculation below uses approximately 3-4 minutes of QPU time.
from qiskit.circuit import Parameter
import numpy as np

# Step 1: Map the problem to a quantum circuit

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

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

# Rotate away from |0> along one plane, and then along a transverse direction.
theta = Parameter("θ")
qc.ry(theta, 0)
qc.rz(pi / 4, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
    job = estimator.run(pubs, precision=0.01)
    res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
    prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

Output:

Output of the previous code cell

Nun sehen wir, dass die Grenze der Unsicherheit (ΔXΔZ)(\Delta X \Delta Z) auf die Probe gestellt wird! Die rote Kurve liegt nun viel näher an der orangefarbenen Kurve als zuvor. Tatsächlich wäre der Unschärferelation ohne Rauschen an einem Punkt genau gesättigt ( (ΔXΔZ)=⟨Y⟩(\Delta X \Delta Z) = \langle Y \rangle ). Angesichts von Rauschen und Auslesefehlern sollte es nicht überraschen, wenn bei einem Durchlauf gelegentlich ein Wert von (ΔXΔZ)(\Delta X \Delta Z) ermittelt wird, der geringfügig größer ist als ⟨Y⟩\langle Y \rangle. Dies stellt keine tatsächliche Verletzung der Unsicherheit dar, sondern ist lediglich ein Artefakt eines Fehlers ungleich Null.

Überprüfen Sie Ihr Verständnis

Erläutern Sie, wie Sie dies bis an die absoluten Grenzen ausreizen und „ ⟨Y⟩\langle Y \rangle “ so groß wie möglich gestalten würden.

  • Der Code enthält derzeit Zeilen, die den Standard-Ausgangszustand ∣0⟩|0\rangle um einen parametrisierten Winkel θ\theta von der Achse zz nach unten und anschließend um einen Winkel π/4\pi/4 um die Achse zz drehen, wodurch der Zustandsvektor teilweise in Richtung der Achse yy gedreht wird.

    qc.ry(theta,0)

    qc.rz(pi/4,0)

    Wir könnten die Rotation um zz von π/4\pi/4 auf π/2\pi/2 ändern und so bis zu einem Eigenzustand von YY rotieren:

    qc.ry(theta,0)

    qc.rz(pi/2,0)

    Weitere Änderungen wären nicht erforderlich.

Ändern Sie den Code oder kopieren Sie ihn und implementieren Sie diese Überprüfung der Unschärferelation mit maximiertem Erwartungswert von Y. Gilt die Unschärferelation?

  • Wir würden genau den Code aus dem obigen Beispiel verwenden, mit

    qc.rz(pi/2,0)

    eingebaut als Ersatz für

    qc.rz(pi/4,0).

    Das Ergebnis sollte wie unten dargestellt aussehen, und ja, die Unschärferelation sollte immer noch gültig sein.

    Ein Diagramm, das die Unsicherheit mit dem maximalen Erwartungswert des Y-Operators vergleicht.

Ändern Sie den obigen Code, um ein ähnliches Bild zu erstellen und zu zeigen, dass sich das Produkt ΔXΔY\Delta X \Delta Y nach den Messungen auf dem Quantencomputer so verhält, wie es sollte. Wählen Sie eine beliebige Anzahl von Staaten aus, die Sie mögen.

  • Wir würden genau den Code aus dem obigen Beispiel verwenden, und im Gesicht könnten wir die gleichen Ergebnisse wie oben verwenden, nur unter Verwendung der Erwartungswerte, um verschiedene Unsicherheiten zu berechnen. Wir könnten zum Beispiel Folgendes verwenden

    xs=res[0].data.evs[0]
    ys=res[0].data.evs[1]
    zs=abs(res[0].data.evs[2])
    import math
    delx = []
    dely = []
    prodxy=[]
    for i in range(len(xs)):
        delx.append((1-xs[i]*xs[i])**0.5)
        dely.append((1-ys[i]*ys[i])**0.5)
        prodxy.append(((1-xs[i]*xs[i])**0.5)*(1-ys[i]*ys[i])**0.5)

    und wir könnten die

    import matplotlib.pyplot as plt
    plt.plot(params, delx, label=r'$\Delta$ X')
    plt.plot(params, dely, label=r'$\langle$ Y $\rangle$')
    plt.plot(params, zs, label=r'$\Delta$ Z')
    plt.plot(params, prodxy, label=r'$\Delta$X $\Delta$Z')
    plt.xlabel(r'$\theta$')
    plt.ylabel('Expectation/Uncertainty Values')
    plt.legend()
    plt.show()

Aufgabe: Schreiben Sie einen Code, um viele Werte von ϕ\phi abzufragen, genauso wie wir viele Werte von θ\theta abgefragt haben, und erstellen Sie eine 3-D-Darstellung, die zeigt, dass die Unschärferelation nie verletzt wird. Wählen Sie beliebige Observablen aus, die Ihnen gefallen.


Fragen

Lehrkräfte können Versionen dieser Hefte mit Antwortschlüsseln und Hinweisen zur Einordnung in gängige Lehrpläne anfordern, indem sie diese kurze Umfrage zur Verwendung der Hefte ausfüllen.

Wichtige Konzepte:

  • Es gibt Unschärferelationen zwischen vielen physikalischen Messgrößen, darunter Position und linearer Impuls sowie Komponenten des Spins.
  • Die Pauli-Matrizen sind nicht kommutabel. Dies ist ein mathematischer Ausdruck der Tatsache, dass nicht alle Komponenten des Spins gleichzeitig bekannt/bestimmt werden können.
  • In der Quanteninformatik werden die Pauli-Operatoren/-Matrizen intensiv genutzt, so dass es nützlich ist, die Unschärferelation für die Pauli-Operatoren sowie die eng verwandten Spin-Operatoren zu kennen.
  • Eine allgemeine Formel für die Unschärfe von zwei Operatoren AA und BB lautet ΔAΔB≥12∣⟨[A,B]⟩∣.\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|.
  • Ein Eigenzustand ∣a⟩|a\rangle eines Operators AA führt zu einer Unsicherheit von Null bei der mit diesem Operator verbundenen physikalischen Observable. Selbst experimentell gilt: „ ΔA≈0\Delta A \approx 0 “.
  • Ein Eigenzustand ∣a⟩|a\rangle eines Operators AA führt zu einer größeren Unsicherheit für einen Operator BB, der nicht mit AA kommutiert.
  • Experimentelle Ergebnisse mit einem echten Quantencomputer bestätigen die Intuition, die wir aus der Matrixdarstellung physikalischer Operatoren gewinnen.

Wahr/Falsch-Fragen:

  1. T/F Man kann gleichzeitig XX und YY messen, aber nicht ZZ.
  2. T/F Man kann gleichzeitig XX und ZZ messen, aber nicht YY.
  3. T/F Lineare Positions- und lineare Impulsoperatoren sind nicht kommutabel.
  4. T/F IBM Quantencomputer messen standardmäßig entlang ZZ, so dass eine Drehung durchgeführt werden muss, um entlang einer anderen Richtung zu messen.
  5. T/F Die folgende Schaltung misst tatsächlich ZZ und dann XX.
Ein Schaltplan mit einer Messung, einem Hadamard-Gatter und einer weiteren Messung.

MC-Fragen:

  1. Welche der folgenden Unschärferelationen wird in der folgenden Abbildung dargestellt?

    • a. ΔXΔY≥∣⟨Z⟩∣\Delta X \Delta Y \geq |\langle Z \rangle|
    • b. ΔYΔZ≥∣⟨X⟩∣\Delta Y \Delta Z \geq |\langle X \rangle|
    • c. ΔZΔX≥∣⟨Y⟩∣\Delta Z \Delta X \geq |\langle Y \rangle|
    • d. Keines der oben genannten.
Ein Diagramm, das die Unsicherheit mit dem maximalen Erwartungswert des Y-Operators vergleicht.
  1. Welches ist die Standardreihenfolge für die Durchführung einer Messung auf xx?

    • a. Nur qc.measure()
    • b. qc.h() dann qc.measure()
    • c. qc.h(), qc.h() dann qc.measure()
    • d. qc.h(), qc.s, qc.h()dann qc.measure()
    • e. qc.sdg(), qc.h(), qc.s dann qc.measure()
    • f. qc.sdg(), qc.h(), qc.s, qc.h() dann qc.measure()
  2. Welcher der folgenden Zustände ergibt den größten Erwartungswert ⟨X⟩\langle X \rangle?

    • a. ∣+⟩x|+\rangle_x
    • b. ∣−⟩x|-\rangle_x
    • c. ∣+⟩y|+\rangle_y auch genannt ∣+i⟩|+i\rangle
    • d. ∣−⟩y|-\rangle_y auch genannt ∣−i⟩|-i\rangle
    • e. ∣0⟩|0\rangle auch genannt ∣↑⟩|\uparrow\rangle
    • f. ∣1⟩|1\rangle auch genannt ∣↓⟩|\downarrow\rangle
  3. Welcher der folgenden Zustände ergibt die größte Unsicherheit ΔX\Delta X?

    • a. ∣+⟩x|+\rangle_x
    • b. ∣+⟩y|+\rangle_y auch genannt ∣+i⟩|+i\rangle
    • c. ∣0⟩|0\rangle auch genannt ∣↑⟩|\uparrow\rangle
    • d. a und b sind unentschieden
    • e. b und c sind unentschieden
    • F. a, b und c sind unentschieden

Diskussionsfragen:

  1. Steht dieses Konzept der Ungewissheit in irgendeiner Weise im Widerspruch zu der Vorstellung vom Spin als Vektorpfeil im kartesischen Raum? Wie sieht es mit der Bloch-Kugel aus?

  2. Angenommen, Sie richten ein Messgerät in einer Richtung aus, die auf halbem Weg zwischen den Achsen xx und yy liegt. Was geschieht? Können Sie eine Messung in diese Richtung vornehmen? Wie verhält sich dies zur Unsicherheit auf XX und YY?

  3. Welche zusätzlichen Experimente würden Sie gerne durchführen, um sich von den hier erzielten Ergebnissen zu überzeugen?

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.