CHSH-Ungleichung
Nutzungsschätzung: Zwei Minute uf eme Heron r2-Prozessor (HINWEIS: Des isch nur e Schätzung. Dini Laufzeit ka variiere.)
Hintergrund
In dem Tutorial füehret mir e Experiment uf eme Quantecomputer us, um d'Verletzung vo dr CHSH-Ungleichung mit em Estimator-Primitiv z'zeige.
D'CHSH-Ungleichung, benannt nach de Autore Clauser, Horne, Shimony un Holt, wird verwendet, um Bells Theorem (1969) experimentell z'beweise. Des Theorem besagt, dass lokali Theorien mit verborgene Variabble manche Konsequenze vo dr Verschränkung in dr Quantemechanik nit erklärn könnet. D'Verletzung vo dr CHSH-Ungleichung wird verwendet, um z'zeige, dass d'Quantemechanik mit lokale Theorien mit verborgene Variabble nit vereinbar isch. Des isch e wichtigs Experiment zum Verschtändnis vo de Grundlage vo dr Quantemechanik.
Dr Nobelpreis für Physik 2022 isch an Alain Aspect, John Clauser un Anton Zeilinger verliehe worre, unter anderem für ihri Pionierarbeit in dr Quanteinformationswissenschaft un insbesondere für ihri Experimente mit verschränkte Photone, wo d'Verletzung vo de Bellsche Ungleichunge demonstriert hän.
Aforderunge
Stellt vor em Beginn vo dem Tutorial sicher, dass mir Folgendes installiert hän:
- Qiskit SDK v1.0 oder neuer, mit visualization-Unterstützung
- Qiskit Runtime (
pip install qiskit-ibm-runtime) v0.22 oder neuer
Setup
# General
import numpy as np
# Qiskit imports
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# Qiskit Runtime imports
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
# Plotting routines
import matplotlib.pyplot as plt
import matplotlib.ticker as tck
Schritt 1: Klassischi Eingabe uf e Quanteproblem abbilden
Für des Experiment erstelle mir e verschränkts Paar, wo mir jeds Qubit uf zwei verschiedeni Basa messe. Mir bezeichne d'Basa für s'erschte Qubit mit un un d'Basa für s'zweite Qubit mit un . Des ermöglicht uns, d'CHSH-Größe z'berechne:
Jedi Observable isch entweder oder . Klar isch, dass einer vo de Terme gleich sei muss un dr andere sei muss. Deshalb isch . Dr Durchschnittswert vo muss d'Ungleichung erfülle:
D'Entwicklung vo in Bezug uf , , un ergibt:
Ihr könnet e weiteri CHSH-Größe definiere:
Des füehrt zu enre weitere Ungleichung:
Wenn d'Quantemechanik durch lokali Theorien mit verborgene Variabble beschriebe werre ka, müsset d'vorherige Ungleichunge wahr sei. Wie aber in dem Tutorial demonstriert wird, könnet dese Ungleichunge uf eme Quantecomputer verletzt werre. Deshalb isch d'Quantemechanik nit mit lokale Theorien mit verborgene Variabble vereinbar. Falls Ihr mehr Theorie lerne wollet, erkundet Entanglement in Action mit em John Watrous. Ihr werdet e verschränkts Paar zwischen zwei Qubits in eme Quantecomputer erstelle, indem Ihr de Bell-Zustand erzeuget. Mit em Estimator-Primitiv könnet Ihr direkt d'benötigte Erwartungswerte ( un ) kriege, um d'Erwartungswerte vo de beide CHSH-Größe un z'berechne. Vor dr Einführung vom Estimator-Primitiv hän Sie d'Erwartungswerte us de Messergebnisse konstruiere müsse.
Ihr werdet s'zweite Qubit in de - un -Basa messe. S'erschte Qubit wird ebefalls in orthogonale Basa gmesse, aber mit eme Winkel bezüglich vom zweite Qubit, den mir zwischen un variiere werdet. Wie Ihr sehet, macht s'Estimator-Primitiv s'Ausführe vo parametrisierte Schaltkreise sehr eifach. Anstatt e Reihe vo CHSH-Schaltkreise z'erstelle, müsset Ihr nur eine CHSH-Schaltkreis mit eme Parameter erstelle, wo de Messwinkel angibt, un e Reihe vo Phasewerte für de Parameter.
Schließlich werdet Ihr d'Ergebnisse analysiere un gege de Messwinkel auftrage. Ihr werdet sehe, dass für ene bestimmte Bereich vo Messwinkeln d'Erwartungswerte vo de CHSH-Größe oder send, was d'Verletzung vo dr CHSH-Ungleichung demonstriert.
# To run on hardware, select the backend with the fewest number of jobs in the queue
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
backend.name
'ibm_kingston'
En parametrisierte CHSH-Schaltkreis erstelle
Zerscht schreibe mir de Schaltkreis mit em Parameter , den mir theta nenne. S'Estimator-Primitiv ka de Schaltkreisaufbau un d'Ausgabeanalyse enorm vereinfache, indem s'direkt Erwartungswerte vo Observabble liefert. Viel interessanti Probleme, insbesondere für kurzfristige Anwendunge uf verrauschet Systeme, könnet in Form vo Erwartungswerte formuliert werre. S'Estimator (V2)-Primitiv ka automatisch d'Messbasis basierend uf dr bereitgestellte Observable ändere.
theta = Parameter("$\\theta$")
chsh_circuit = QuantumCircuit(2)
chsh_circuit.h(0)
chsh_circuit.cx(0, 1)
chsh_circuit.ry(theta, 0)
chsh_circuit.draw(output="mpl", idle_wires=False, style="iqp")
E Lischt vo Phasewerte erstelle, wo später zugewiese werdet
Nachdem Ihr de parametrisierte CHSH-Schaltkreis erstellt hän, erstellt Ihr e Lischt vo Phasewerte, wo em Schaltkreis im nächste Schritt zugewiese werdet. Ihr könnet de folgende Code verwende, um e Lischt vo 21 Phasewerte im Bereich vo bis mit gleichem Abstand z'erstelle, also , , , ..., , .
number_of_phases = 21
phases = np.linspace(0, 2 * np.pi, number_of_phases)
# Phases need to be expressed as list of lists in order to work
individual_phases = [[ph] for ph in phases]
Observabble
Jetzt brauche mir Observabble, us dene mir d'Erwartungswerte berechne könnet. In unserem Fall betrachte mir orthogonali Basa für jeds Qubit, wobei d'parametrisierte -Rotation für s'erschte Qubit d'Messbasis nahezu kontinuierlich in Bezug uf d'Basis vom zweite Qubit variiert. Mir wähle deshalb d'Observabble , , un .
# <CHSH1> = <AB> - <Ab> + <aB> + <ab> -> <ZZ> - <ZX> + <XZ> + <XX>
observable1 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", -1), ("XZ", 1), ("XX", 1)]
)
# <CHSH2> = <AB> + <Ab> - <aB> + <ab> -> <ZZ> + <ZX> - <XZ> + <XX>
observable2 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", 1), ("XZ", -1), ("XX", 1)]
)
Schritt 2: Problem für d'Ausführung uf Quantehardware optimiere
Um d'Gesamtausführungszeit vom Job z'reduziere, akzeptiere V2-Primitive nur Schaltkreise un Observabble, wo de vom Zielsystem unterstützte Anweisunge un dr Konnektivität entsprechet (bezeichnet als Instruction Set Architecture (ISA)-Schaltkreise un -Observabble).
ISA-Schaltkreis
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
chsh_isa_circuit = pm.run(chsh_circuit)
chsh_isa_circuit.draw(output="mpl", idle_wires=False, style="iqp")
ISA-Observabble
Ebenso müsse mir d'Observabble transformiere, um se backend-kompatibel z'mache, bevor mir Jobs mit Runtime Estimator V2 ausführe. Mir könnet d'Transformation mit dr apply_layout-Methode vom SparsePauliOp-Objekt durchführe.
isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)
Schritt 3: Ausführe mit Qiskit-Primitive
Um s'gesamte Experiment in eim einzige Aufruf vom Estimator usführe.
Mir könnet e Qiskit Runtime Estimator-Primitiv erstelle, um unseri Erwartungswerte z'berechne. D'EstimatorV2.run()-Methode akzeptiert e Iterable vo primitive unified blocs (PUBs). Jeds PUB isch e Iterable im Format (circuit, observables, parameter_values: Optional, precision: Optional).
# To run on a local simulator:
# Use the StatevectorEstimator from qiskit.primitives instead.
estimator = Estimator(mode=backend)
pub = (
chsh_isa_circuit, # ISA circuit
[[isa_observable1], [isa_observable2]], # ISA Observables
individual_phases, # Parameter values
)
job_result = estimator.run(pubs=[pub]).result()
Schritt 4: Nachbearbeitung un Rückgab vom Ergebnis im gwünscht klassische Format
Dr Estimator gibt Erwartungswerte für beide Observabble zruck, un .
chsh1_est = job_result[0].data.evs[0]
chsh2_est = job_result[0].data.evs[1]
fig, ax = plt.subplots(figsize=(10, 6))
# results from hardware
ax.plot(phases / np.pi, chsh1_est, "o-", label="CHSH1", zorder=3)
ax.plot(phases / np.pi, chsh2_est, "o-", label="CHSH2", zorder=3)
# classical bound +-2
ax.axhline(y=2, color="0.9", linestyle="--")
ax.axhline(y=-2, color="0.9", linestyle="--")
# quantum bound, +-2√2
ax.axhline(y=np.sqrt(2) * 2, color="0.9", linestyle="-.")
ax.axhline(y=-np.sqrt(2) * 2, color="0.9", linestyle="-.")
ax.fill_between(phases / np.pi, 2, 2 * np.sqrt(2), color="0.6", alpha=0.7)
ax.fill_between(phases / np.pi, -2, -2 * np.sqrt(2), color="0.6", alpha=0.7)
# set x tick labels to the unit of pi
ax.xaxis.set_major_formatter(tck.FormatStrFormatter("%g $\\pi$"))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=0.5))
# set labels, and legend
plt.xlabel("Theta")
plt.ylabel("CHSH witness")
plt.legend()
plt.show()
In dr Abbildung grenze d'Linien un d'graue Bereiche d'Grenzen ab; d'äußerschte (strichpunktierte) Linien begrenzen d'Quantegrenzen (), während d'innere (gestrichelten) Linien d'klassische Grenzen () begrenzen. Ihr könnet sehe, dass es Bereiche git, wo d'CHSH-Zeugegröße d'klassische Grenzen überschreitet. Herzliche Glückwunsch! Ihr hän erfolgreich d'Verletzung vo dr CHSH-Ungleichung in eme echte Quantesystem demonstriert!
Tutorial-Umfrage
Bitte nemmet an dere kurze Umfrage teil, um Feedback zu dem Tutorial z'gebe. Dini Erkenntnisse helfet uns, unseri Inhaltsangebote un Benutzererfahrung z'verbessere.