Přeskočit na hlavní obsah

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 AA a aa a báze pro druhý Qubit BB a bb. To nám umožní vypočítat veličinu CHSH S1S_1:

S1=A(Bb)+a(B+b).S_1 = A(B-b) + a(B+b).

Každá observabla nabývá hodnoty +1+1 nebo 1-1. Je zřejmé, že jeden z členů B±bB\pm b musí být 00 a druhý ±2\pm 2. Proto S1=±2S_1 = \pm 2. Střední hodnota S1S_1 musí splňovat nerovnost:

S12.|\langle S_1 \rangle|\leq 2.

Rozvinutím S1S_1 do členů AA, aa, BB a bb dostaneme:

S1=ABAb+aB+ab2|\langle S_1 \rangle| = |\langle AB \rangle - \langle Ab \rangle + \langle aB \rangle + \langle ab \rangle| \leq 2

Lze definovat další veličinu CHSH S2S_2:

S2=A(B+b)a(Bb),S_2 = A(B+b) - a(B-b),

Z toho plyne další nerovnost:

S2=AB+AbaB+ab2|\langle S_2 \rangle| = |\langle AB \rangle + \langle Ab \rangle - \langle aB \rangle + \langle ab \rangle| \leq 2

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 Φ+=00+112|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}. Pomocí primitivy Estimator můžeš přímo získat potřebné střední hodnoty (AB,Ab,aB\langle AB \rangle, \langle Ab \rangle, \langle aB \rangle a ab\langle ab \rangle) pro výpočet středních hodnot obou veličin CHSH S1\langle S_1\rangle a S2\langle S_2\rangle. 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 ZZ a XX. 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 00 do 2π2\pi. 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í S1>2|\langle S_1\rangle| > 2 nebo S2>2|\langle S_2\rangle| > 2, 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 θ\theta, 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")

Output of the previous code cell

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 00 do 2π2 \pi, tedy 00, 0.1π0.1 \pi, 0.2π0.2 \pi, ..., 1.9π1.9 \pi, 2π2 \pi.

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 YY-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 ZZZZ, ZXZX, XZXZ a XXXX.

# <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")

Output of the previous code cell

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, ZZZX+XZ+XX\langle ZZ \rangle - \langle ZX \rangle + \langle XZ \rangle + \langle XX \rangle a ZZ+ZXXZ+XX\langle ZZ \rangle + \langle ZX \rangle - \langle XZ \rangle + \langle XX \rangle.

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()

Output of the previous code cell

V grafu čáry a šedé oblasti vymezují hranice; nejzazší (čerchované) čáry ohraničují kvantové meze (±2\pm 2), zatímco vnitřní (přerušované) čáry ohraničují klasické meze (±22\pm 2\sqrt{2}). 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.

Odkaz na průzkum

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.