CHSH-Ungliichig
Nutzigschätzig: Zwei Minute uf eme Heron r2-Prozässor (HIIWIS: Das isch nume e Schätzig. Eui Laufzyt chönnt variiere.)
Hingergrund
I däm Tutorial füehred mer es Experiment uf eme Quantecomputer uus, zum d'Verletzig vo de CHSH-Ungliichig mit em Estimator-Primitiv z'zeige.
D'CHSH-Ungliichig, benannt nach de Autoore Clauser, Horne, Shimony und Holt, wird bruucht, zum Bells Theorem (1969) experimentell z'bewiise. Das Theorem sait uus, dass lokali Theoriie mit versteckte Variable nöd alli Konsequenze vo de Verschränkig i de Quantemechanik chönd erkläre. D'Verletzig vo de CHSH-Ungliichig wird bruucht, zum z'zeige, dass d'Quantemechanik mit lokale Theoriie mit versteckte Variable nöd vereinbar isch. Das isch es wichtigs Experiment für s'Verständnis vo de Grundlage vo de Quantemechanik.
De Nobelpriis für Physik 2022 isch a Alain Aspect, John Clauser und Anton Zeilinger vergää worde, under anderem für ihri Pionierarbeit i de Quanteinformationswüsseschaft und bsunders für ihri Experimänt mit verschränkte Photone, wo d'Verletzig vo de Bellsche Ungliichige demonstriert händ.
Aaforderige
Bevor dir mit däm Tutorial aafanged, stellet sicher, dass dir Folgendes installiert händ:
- Qiskit SDK v1.0 oder neuer, mit visualization-Understützig
- Qiskit Runtime (
pip install qiskit-ibm-runtime) v0.22 oder neuer
Iirichtig
# 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 Iigabe uf es Quanteproblem abbildä
Für das Experiment erstelled mer es verschränkts Paar, wo mer jedes Qubit uf zwei verschideni Base mässed. Mer bezäichned d'Base für s'erscht Qubit mit und und d'Base für s'zweit Qubit mit und . Das erlaubt öis, d'CHSH-Grössi z'berächne:
Jedi Observable isch entweder oder . Klar isch, dass äine vo de Terme gliich sii muess und de ander sii muess. Darum isch . De Durschnittswärt vo muess d'Ungliichig erfülle:
Wenn mer i Bezug uf , , und uswigglet, chömed mer uf:
Dir chönnt e wyteri CHSH-Grössi definiere:
Das füehrt zu enere wyytere Ungliichig:
Wenn d'Quantemechanik dur lokali Theoriie mit versteckte Variable cha beschribe wärde, müend d'vorige Ungliichige wohr sii. Abelewi däm Tutorial aber gzäigt wird, chönd die Ungliichige uf eme Quantecomputer verletzt wärde. Darum isch d'Quantemechanik nöd mit lokale Theoriie mit versteckte Variable vereinbar. Falls dir meh Theoriie lerned wänd, luäged euch Entanglement in Action mit em John Watrous aa. Mer erstelled es verschränkts Paar zwüschet zwei Qubits i eme Quantecomputer, indem mer de Bell-Zuestand erzüüged. Mit em Estimator-Primitiv chönnt dir diräkt di nötige Erwartungswärt ( und ) überchoo, zum d'Erwartungswärt vo de beide CHSH-Grössene und z'berächne. Vor de Iifüehrig vom Estimator-Primitiv hätt dir d'Erwartungswärt us de Messresultat müesse konstruiere.
Mer mässed s'zweit Qubit i de - und -Base. S'erscht Qubit wird au i orthogonale Base gmässe, aber mit eme Winkel bezüglich vom zweite Qubit, wo mer zwüschet und variiere wärded. Wie dir gsehnd, macht s'Estimator-Primitiv s'Usfüehre vo parametrisierte Schaltchreis sehr eifach. Anstatt e Reihe vo CHSH-Schaltchreis z'erstelle, müend dir nume eine CHSH-Schaltchreis mit eme Parameter erstelle, wo de Mässwinkel aagit, und e Reihe vo Phasewärt für de Parameter.
Schlussändlich wärded mer d'Resultat analysiere und gäge de Mässwinkel ufträge. Dir wärded gseh, dass es für en bestimmte Bereich vo Mässwinkel d'Erwartungswärt vo de CHSH-Grössene oder sind, was d'Verletzig vo de CHSH-Ungliichig 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'
E parametrisierte CHSH-Schaltchreis erstelle
Zerscht schriibemer de Schaltchreis mit em Parameter , wo mer theta nänned. S'Estimator-Primitiv cha de Schaltchreisbou und d'Usgabenaanalyse riisig veryfache, indem's diräkt Erwartungswärt vo Observable lieferet. Vieli intressanti Problem, bsunders für churzfristi Aawändige uf vrauschte Systeem, chönd i Form vo Erwartungswärt formuliert wärde. S'Estimator (V2)-Primitiv cha automatisch d'Mässbasis basierend uf de bereitgstellte 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 Liste vo Phasewärt erstelle, wo schpöter zuegwise wärded
Nachdem dir de parametrisiert CHSH-Schaltchreis erstellt händ, erstellt dir e Liste vo Phasewärt, wo em Schaltchreis im nächste Schritt zuegwise wärded. Dir chönnt de folgende Code bruuche, zum e Liste vo 21 Phasewärt im Bereich vo bis mit gliichem 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]
Observable
Jetzt bruuched mer Observable, us dänä mer d'Erwartungswärt chönd berächne. I öisem Fall betrachted mer orthogonali Base für jedes Qubit, wobii d'parametrisiert -Rotation für s'erscht Qubit d'Mässbasis beinaah kontinuierlich i Bezug uf d'Basis vom zweite Qubit variiert. Mer wähled darum d'Observable , , und .
# <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'Usfüehrig uf Quantehardware optimiere
Zum d'Gsamtusfüehrigszyt vom Job z'reduziere, akzeptiere V2-Primitiv nume Schaltchreis und Observable, wo de vom Ziilsystem understützte Aawysige und de Konnektivität entspräched (bezäichnet als Instruction Set Architecture (ISA)-Schaltchreis und -Observable).
ISA-Schaltchreis
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-Observable
Ebenso müend mer d'Observable transformiere, zum si backend-kompatibel z'mache, bevor mer Jobs mit Runtime Estimator V2 usfüehred. Mer chönd d'Transformation mit de apply_layout-Methode vom SparsePauliOp-Objäkt durchfüehre.
isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)
Schritt 3: Usfüehre mit Qiskit-Primitiv
Zum s'gsamti Experiment i eim einzige Uuruef vom Estimator uuszfüehre.
Mer chönd es Qiskit Runtime Estimator-Primitiv erstelle, zum öisi Erwartungswärt z'berächne. D'EstimatorV2.run()-Methode nimmt es Iterable vo primitive unified blocs (PUBs). Jedes PUB isch es 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: Nachberarbeitig und Rückgab vom Resultat im gwünschte klassische Format
De Estimator git Erwartungswärt für beidi Observable zrügg, und .
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()
I de Abbildig gränzed d'Liniie und grau Beriich d'Gränze ab; d'üsserste (strich-punktierte) Liniie begränzed d'Quantegränze (), während d'innere (gstrichleti) Liniie d'klassische Gränze () begränzed. Dir chönnt gseh, dass es Beriich git, wo d'CHSH-Züügegrössi d'klassische Gränze überschryytet. Härzliche Glückwunsch! Dir händ erfolgriich d'Verletzig vo de CHSH-Ungliichig i eme echte Quantesystem demonstriert!
Tutorial-Umfraag
Bitte nämed a dere churze Umfraag teil, zum Feedback zu däm Tutorial z'gää. Eui Iiblick hälfed öis, öisi Inhaltsaagebot und Benutzererfahrig z'verbessere.