Nerovnost CHSH
Odhadovaná spotřeba: dvě minuty na procesoru Heron r2 (POZNÁMKA: Jde pouze o odhad. Skutečná doba výpočtu se může lišit.)
Pozadí
V tomto tutoriálu spustíš experiment na kvantovém počítači a demonstruješ porušení nerovnosti CHSH pomocí primitivy Estimator.
Nerovnost CHSH, pojmenovaná po autorech Clauserovi, Hornovi, Shimonym a Holtovi, slouží k experimentálnímu důkazu Bellova teorému (1969). Tento teorém tvrdí, že teorie lokálních skrytých proměnných nemohou vysvětlit některé důsledky provázanosti v kvantové mechanice. Porušení nerovnosti CHSH se používá k prokázání toho, že kvantová mechanika je neslučitelná s teoriemi lokálních skrytých proměnných. Jde o důležitý experiment pro pochopení základů kvantové mechaniky.
Nobelova cena za fyziku za rok 2022 byla udělena Alainu Aspectovi, Johnu Clauserovi a Antonu Zeilingerovi mimo jiné za jejich průkopnickou práci v oblasti kvantové informační vědy, a zejména za jejich experimenty s provázanými fotony demonstrující porušení Bellových nerovností.
Požadavky
Před zahájením tohoto tutoriálu se ujisti, že máš nainstalováno následující:
- Qiskit SDK v1.0 nebo novější, s podporou vizualizace
- Qiskit Runtime (
pip install qiskit-ibm-runtime) v0.22 nebo novější
Nastavení
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
# 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
Krok 1: Mapování klasických vstupů na kvantový problém
Pro tento experiment vytvoříme provázaný pár, na němž změříme každý Qubit ve dvou různých bázích. Báze pro první Qubit označíme a a báze pro druhý Qubit a . To nám umožní vypočítat veličinu CHSH :
Každá observabla nabývá hodnoty nebo . Je zřejmé, že jeden z členů musí být a druhý . Proto . Střední hodnota musí splňovat nerovnost:
Rozvinutím do členů , , a dostaneme:
Lze definovat další veličinu CHSH :
Z toho plyne další nerovnost:
Pokud by kvantová mechanika mohla být popsána teoriemi lokálních skrytých proměnných, předchozí nerovnosti by musely platit. Jak je však v tomto tutoriálu ukázáno, tyto nerovnosti mohou být na kvantovém počítači porušeny. Kvantová mechanika tedy není slučitelná s teoriemi lokálních skrytých proměnných. Pokud se chceš dozvědět více o teorii, prozkoumej Provázanost v praxi s Johnem Watrousem. Vytvoříš provázaný pár mezi dvěma Qubity v kvantovém počítači pomocí Bellova stavu . Pomocí primitivy Estimator můžeš přímo získat potřebné střední hodnoty ( a ) pro výpočet středních hodnot obou veličin CHSH a . Před zavedením primitivy Estimator by bylo nutné sestrojit střední hodnoty z výsledků měření.
Druhý Qubit změříš v bázích a . První Qubit bude také měřen v ortogonálních bázích, ale s úhlem vůči druhému Qubitu, který budeme měnit od do . Jak uvidíš, primitiva Estimator značně usnadňuje spouštění parametrizovaných obvodů. Místo vytváření série obvodů CHSH stačí vytvořit pouze jeden obvod CHSH s parametrem určujícím úhel měření a sérii hodnot fáze pro tento parametr.
Nakonec výsledky analyzuješ a vyneseš je do grafu v závislosti na úhlu měření. Uvidíš, že pro určitý rozsah úhlů měření platí nebo , což demonstruje porušení nerovnosti CHSH.
# 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'
Vytvoření parametrizovaného obvodu CHSH
Nejprve zapíšeme obvod s parametrem , který nazveme theta. Primitiva Estimator může výrazně zjednodušit sestavování obvodů a analýzu výstupů tím, že přímo poskytuje střední hodnoty observabl. Mnoho zajímavých problémů, zejména pro krátkodobé aplikace na zašuměných systémech, lze formulovat pomocí středních hodnot. Primitiva Estimator (V2) umí automaticky měnit měřicí bázi na základě zadané observably.
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")
Vytvoření seznamu hodnot fáze pro pozdější přiřazení
Po vytvoření parametrizovaného obvodu CHSH vytvoříš seznam hodnot fáze, které budou obvodu přiřazeny v dalším kroku. Pomocí následujícího kódu lze vytvořit seznam 21 hodnot fáze rovnoměrně rozložených od do , tedy , , , ..., , .
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]
Observably
Nyní potřebujeme observably, z nichž vypočítáme střední hodnoty. V našem případě se díváme na ortogonální báze pro každý Qubit a necháváme parametrizovanou -rotaci prvního Qubitu plynule měnit měřicí bázi téměř spojitě vůči bázi druhého Qubitu. Zvolíme proto observably , , a .
# <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)]
)
Krok 2: Optimalizace problému pro spuštění na kvantovém hardware
Aby se zkrátila celková doba provádění úloh, primitivy V2 přijímají pouze obvody a observably, které odpovídají instrukcím a propojení podporovanému cílovým systémem (označované jako obvody a observably ve formátu ISA — instruction set architecture).
ISA Circuit
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 Observables
Podobně je nutné transformovat observably, aby byly kompatibilní s backendem, než spustíme úlohy pomocí Runtime Estimator V2. Transformaci provedeme metodou apply_layout objektu SparsePauliOp.
isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)
Krok 3: Spuštění pomocí primitiv Qiskit
Celý experiment spustíme jediným voláním Estimatoru.
Pomocí primitivy Qiskit Runtime Estimator vypočítáme střední hodnoty. Metoda EstimatorV2.run() přijímá iterovatelnou kolekci primitive unified blocs (PUBs). Každý PUB je iterovatelná kolekce ve formátu (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()
Krok 4: Následné zpracování a vrácení výsledku v požadovaném klasickém formátu
Estimator vrátí střední hodnoty pro obě observably, a .
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()
V grafu čáry a šedé oblasti vymezují hranice; nejzazší (čerchované) čáry ohraničují kvantové meze (), zatímco vnitřní (přerušované) čáry ohraničují klasické meze (). Vidíš, že existují oblasti, kde veličiny svědka CHSH překračují klasické meze. Gratulujeme! Úspěšně jsi demonstroval/a porušení nerovnosti CHSH na reálném kvantovém systému!
Průzkum tutoriálu
Vyplň prosím tento krátký průzkum a poskytni nám zpětnou vazbu k tomuto tutoriálu. Tvoje postřehy nám pomohou zlepšit obsah a uživatelský zážitek.
Note: This survey is provided by IBM Quantum and relates to the original English content. To give feedback on doQumentation's website, translations, or code execution, please open a GitHub issue.