メインコンテンツへスキップ

CHSH不等式

使用時間の推定: Heron r3プロセッサーで2分(注: これは推定値のみです。実際の実行時間は異なる場合があります。)

学習の成果

このチュートリアルを完了すると、以下の内容を理解できるようになります:

  • パラメータ化されたベル状態CHSH Circuitを構築し、CHSHウィットネスを構成する4つの期待値を測定する方法。
  • 単一のEstimatorV2プリミティブの呼び出しで、パラメーター・スイープ上の複数のObservableの期待値を計算する方法。
  • ハードウェアに送信する前にAerSimulator.from_backendを使用してノイズのあるローカル・シミュレーターで量子ワークフローを検証する方法。
  • IBM Quantum®ハードウェア上で多数の独立したベルペアを並列実行することで、CHSH実験をデバイス全体のエンタングルメント・ベンチマークにスケールする方法。

前提条件

以下のトピックに慣れておくことをお勧めします:

背景

このチュートリアルでは、Estimatorプリミティブを使用してCHSH不等式の破れを実証する実験を量子コンピューター上で実行します。

Clauser、Horne、Shimony、Holtにちなんで名付けられたCHSH不等式は、ベルの定理(1969年)を実験的に検証するために使用されます。この定理は、局所隠れた変数理論では量子力学におけるエンタングルメントのいくつかの帰結を説明できないことを主張しています。CHSH不等式の破れを実証することで、量子力学が局所隠れた変数理論と矛盾することが示されます。これは量子力学の理解にとって基礎的な実験です。

2022年のノーベル物理学賞は、Alain Aspect、John Clauser、Anton Zeilingerに授与されました。これは量子情報科学における先駆的な業績、特にベルの不等式の破れを実証したエンタングル光子を用いた実験に対してです。

この実験では、エンタングルペアを作成し、各Qubitを2つの異なる基底で測定します。最初のQubitの基底をAAaa、2番目のQubitの基底をBBbbとラベル付けします。これにより、CHSH量S1S_1を計算できます:

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

各Observableは+1+1または1-1です。明らかに、項B±bB\pm bの一方は00で、他方は±2\pm 2となります。したがって、S1=±2S_1 = \pm 2です。S1S_1の平均値は次の不等式を満たす必要があります:

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

S1S_1AAaaBBbbの項に展開すると:

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

別のCHSH量S2S_2を定義できます:

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

これは別の不等式につながります:

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

量子力学が局所隠れた変数理論で記述できる場合、これらの不等式は常に成立します。このチュートリアルで実証されるように、これらの不等式は量子コンピューター上で破ることができるため、量子力学は局所隠れた変数理論と互換性がありません。

ベル状態Φ+=00+112|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}を準備することでエンタングルペアを作成します。Estimatorプリミティブを使用することで、生のカウントから再構成することなく、期待値AB,Ab,aB\langle AB \rangle, \langle Ab \rangle, \langle aB \rangle、およびab\langle ab \rangleを直接取得できます。2番目のQubitをZZ基底とXX基底で測定します。最初のQubitも直交基底で測定しますが、00から2π2\piの間でスイープする回転角度θ\thetaを用います。Estimatorプリミティブは、このパラメーター・スイープを単一のprimitive unified bloc (PUB)で評価します。

要件

このチュートリアルを始める前に、以下がインストールされていることを確認してください:

  • Qiskit SDK v2.0以降、visualizationサポート付き
  • Qiskit Runtime v0.40以降 (pip install qiskit-ibm-runtime)
  • Qiskit Aer v0.17以降 (pip install qiskit-aer)

セットアップ

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-aer 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

# Qiskit Aer for local noisy simulation
from qiskit_aer import AerSimulator

# Plotting routines
import matplotlib.pyplot as plt
import matplotlib.ticker as tck
# Select an IBM Quantum backend.
service = QiskitRuntimeService()
backend = service.least_busy(
min_num_qubits=127, operational=True, simulator=False
)
backend.name
'ibm_pittsburgh'

小規模シミュレーターの例

ハードウェア・ジョブを送信する前に、ローカルのノイズ付きシミュレーター上でワークフロー全体を検証します。AerSimulator.from_backend(backend)を使用して、選択したBackendのノイズ・モデルと結合マップを継承するシミュレーターを構築します。これにより、シミュレーターの応答はハードウェアから期待されるものと定性的に類似します。

ステップ1: 古典的な入力を量子問題にマッピング

単一パラメーターθ\thetaを持つCHSH Circuitを作成します。これは最初のQubitの測定基底をスイープします。Estimatorプリミティブは分析を簡素化します: Observableの期待値を直接返し、単一の呼び出しで多数のパラメーター値でパラメータ化された回路を評価できます。

theta = Parameter(r"$\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

次に、パラメータ化された回路を評価する21個の位相値のリストを00から2π2\piの範囲で作成します(000.1π0.1\pi0.2π0.2\pi、...、1.9π1.9\pi2π2\pi)。

number_of_phases = 21
phases = np.linspace(0, 2 * np.pi, number_of_phases)
# Phases need to be expressed as a list of lists for the Estimator PUB
individual_phases = [[ph] for ph in phases]

最後にObservableを定義します。最初のQubitはθ\thetaで回転した軸に沿って測定され、2番目のQubitはZZXXで測定されます。これらの選択により、4つのCHSH相関子はパウリ演算子ZZZZZXZXXZXZXXXXにマッピングされます:

S1=ZZZX+XZ+XX,\langle S_1 \rangle = \langle ZZ \rangle - \langle ZX \rangle + \langle XZ \rangle + \langle XX \rangle, S2=ZZ+ZXXZ+XX.\langle S_2 \rangle = \langle ZZ \rangle + \langle ZX \rangle - \langle XZ \rangle + \langle XX \rangle.
# <S_1> = <ZZ> - <ZX> + <XZ> + <XX>
observable1 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", -1), ("XZ", 1), ("XX", 1)]
)

# <S_2> = <ZZ> + <ZX> - <XZ> + <XX>
observable2 = SparsePauliOp.from_list(
[("ZZ", 1), ("ZX", 1), ("XZ", -1), ("XX", 1)]
)

ステップ2: 量子ハードウェア実行用に問題を最適化

V2プリミティブは、ターゲット・システムがサポートする命令と接続性に準拠するCircuitとObservable(命令セット・アーキテクチャー(ISA)CircuitとObservableと呼ばれる)のみを受け入れます。BackendからAerSimulatorを構築し、シミュレーターのターゲットに対してトランスパイルすることで、同じパス・マネージャーをエンドツーエンドで実行できます。

# Build a noisy simulator from the ibm_pittsburgh backend
aer_sim = AerSimulator.from_backend(backend)

pm = generate_preset_pass_manager(target=aer_sim.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

また、SparsePauliOp.apply_layoutを使用して、ObservableをトランスパイルされたCircuitのQubitレイアウトに合わせて変換します。

isa_observable1 = observable1.apply_layout(layout=chsh_isa_circuit.layout)
isa_observable2 = observable2.apply_layout(layout=chsh_isa_circuit.layout)

ステップ3: Qiskitプリミティブを使用して実行

aer_simモードのEstimatorV2でパラメーター・スイープを実行します。Estimatorのrun()メソッドはPUBのイテラブルを受け取ります。各PUBの形式は(circuit, observables, parameter_values, precision)です。両方のObservableを一緒に渡すことで、同じパラメーター・スイープを共有できます。

# Use the AerSimulator-backed Estimator to validate the workflow locally
estimator_sim = Estimator(mode=aer_sim)

pub = (
chsh_isa_circuit, # ISA circuit
[[isa_observable1], [isa_observable2]], # ISA observables
individual_phases, # Parameter values
)

sim_result = estimator_sim.run(pubs=[pub]).result()

ステップ4: 後処理し、希望する古典形式で結果を返す

Estimatorは両方のObservableの期待値を返します。これらをθ\thetaに対してプロットし、古典的境界(±2\pm 2)とTsirelson境界(±22\pm 2\sqrt{2})とともに表示します。影付きの灰色領域は両者の間のギャップを示します。これらの帯の内側に入る点はCHSH不等式を破っています。

chsh1_sim = sim_result[0].data.evs[0]
chsh2_sim = sim_result[0].data.evs[1]

def plot_chsh(phases, chsh1, chsh2, title):
fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(
phases / np.pi, chsh1, "o-", label=r"$\langle S_1 \rangle$", zorder=3
)
ax.plot(
phases / np.pi, chsh2, "o-", label=r"$\langle S_2 \rangle$", zorder=3
)

# classical bound +-2
ax.axhline(y=2, color="0.9", linestyle="--")
ax.axhline(y=-2, color="0.9", linestyle="--")

# quantum bound, +-2*sqrt(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
)

ax.xaxis.set_major_formatter(tck.FormatStrFormatter("%g $\\pi$"))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=0.5))

ax.set_xlabel(r"$\theta$")
ax.set_ylabel("CHSH witness")
ax.set_title(title)
ax.legend()
plt.show()

plot_chsh(
phases,
chsh1_sim,
chsh2_sim,
"CHSH witnesses from AerSimulator (ibm_pittsburgh noise model)",
)

Output of the previous code cell

シミュレーターのCHSHウィットネスは、Backendのノイズ・モデルを使用しているにもかかわらず、いくつかのθ\thetaの値で既に古典的境界±2\pm 2を超えています。ピークはシミュレートされたデバイス・ノイズのためにTsirelson境界±22\pm 2\sqrt{2}にわずかに届いていません。ワークフローの検証が完了したので、実際のハードウェアに進みます。

大規模ハードウェアの例

CHSHテストは本質的に2-Qubit実験であるため、1つのCircuitを大きくすることでスケールするわけではありません。代わりに、多数のテストを並列実行することでスケールします。ここでは、Backendをできるだけ多くの独立したベルペアで埋め尽くし(結合マップのマッチング)、すべてのペアで独立したCHSHサブ・Circuitを実行します。これらはすべて単一ジョブで実行されます。

これによりCHSHはエンタングルメント品質のデバイス全体ベンチマークとなります: 手作業で選んだ単一のペアではなく、チップ全体の大部分でエンタングルメントを同時にテストします。これはすべてのペアがその隣のクロストークや並列Gate・エラーに悩まされる現実的な条件下です。すべてのペアで同時に不等式を破ることで、デバイスのどこでも真のエンタングルメントが利用可能であることが認定されます。

# -------------------------Step 1: Map classical inputs to a quantum problem-------------------------
# A CHSH test is bipartite, so we scale up by running one independent CHSH
# experiment on every disjoint Bell pair the device can host. A greedy
# matching of the coupling map gives a set of edges that share no qubits.
num_qubits = backend.num_qubits
used = set()
pairs = []
for qa, qb in backend.coupling_map.get_edges():
if qa not in used and qb not in used:
pairs.append((qa, qb))
used.update((qa, qb))
num_pairs = len(pairs)
print(
f"Tiling {backend.name} with {num_pairs} parallel Bell pairs "
f"({2 * num_pairs} of {num_qubits} qubits)"
)

# One parameterized CHSH sub-circuit per pair, all sharing the angle theta
theta = Parameter(r"$\theta$")
chsh_circuit = QuantumCircuit(num_qubits)
for qa, qb in pairs:
chsh_circuit.h(qa)
chsh_circuit.cx(qa, qb)
chsh_circuit.ry(theta, qa)

# Embed the two CHSH observables onto each pair's qubits (identity elsewhere)
obs1 = SparsePauliOp.from_list([("ZZ", 1), ("ZX", -1), ("XZ", 1), ("XX", 1)])
obs2 = SparsePauliOp.from_list([("ZZ", 1), ("ZX", 1), ("XZ", -1), ("XX", 1)])
observables = []
for qa, qb in pairs:
observables.append([obs1.apply_layout([qa, qb], num_qubits)])
observables.append([obs2.apply_layout([qa, qb], num_qubits)])

number_of_phases = 21
phases = np.linspace(0, 2 * np.pi, number_of_phases)
individual_phases = [[ph] for ph in phases]

# -------------------------Step 2: Optimize problem for quantum hardware execution-------------------------
pm = generate_preset_pass_manager(target=backend.target, optimization_level=3)
chsh_isa_circuit = pm.run(chsh_circuit)
isa_observables = [
[o[0].apply_layout(chsh_isa_circuit.layout)] for o in observables
]

# -------------------------Step 3: Execute using Qiskit primitives-------------------------
estimator_hw = Estimator(mode=backend)
estimator_hw.options.environment.job_tags = ["TUT_CI"]

pub = (chsh_isa_circuit, isa_observables, individual_phases)
job = estimator_hw.run(pubs=[pub])
print(f"Job ID: {job.job_id()}")
hw_result = job.result()

# -------------------------Step 4: Post-process and return result in desired classical format-------------------------
# evs has shape (2 * num_pairs, number_of_phases); rows alternate S1, S2
evs = np.asarray(hw_result[0].data.evs)
chsh1_all = evs[0::2]
chsh2_all = evs[1::2]

# A pair "violates" CHSH if its strongest witness exceeds the classical bound
peak = np.maximum(
np.abs(chsh1_all).max(axis=1), np.abs(chsh2_all).max(axis=1)
)
n_violate = int(np.sum(peak > 2))
print(
f"{n_violate}/{num_pairs} Bell pairs violated the CHSH inequality "
f"(mean peak witness {peak.mean():.2f}, classical bound 2)"
)

fig, ax = plt.subplots(figsize=(10, 6))

# Faint individual per-pair curves
for row in chsh1_all:
ax.plot(phases / np.pi, row, color="#1f77b4", alpha=0.2, lw=1)
for row in chsh2_all:
ax.plot(phases / np.pi, row, color="#ff7f0e", alpha=0.2, lw=1)

# Bold mean curves across all pairs
ax.plot(
phases / np.pi,
chsh1_all.mean(axis=0),
color="#1f77b4",
lw=2.5,
label=r"$\langle S_1 \rangle$ (mean)",
)
ax.plot(
phases / np.pi,
chsh2_all.mean(axis=0),
color="#ff7f0e",
lw=2.5,
label=r"$\langle S_2 \rangle$ (mean)",
)

# classical bound +-2 and Tsirelson bound +-2*sqrt(2)
ax.axhline(y=2, color="0.9", linestyle="--")
ax.axhline(y=-2, color="0.9", linestyle="--")
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)

ax.xaxis.set_major_formatter(tck.FormatStrFormatter("%g $\\pi$"))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=0.5))
ax.set_xlabel(r"$\theta$")
ax.set_ylabel("CHSH witness")
ax.set_title(
f"CHSH witnesses for {num_pairs} parallel Bell pairs on {backend.name}"
)
ax.legend()
plt.show()
Tiling ibm_pittsburgh with 64 parallel Bell pairs (128 of 156 qubits)
Job ID: d86efd5g7okc73el0rp0
63/64 Bell pairs violated the CHSH inequality (mean peak witness 2.75, classical bound 2)

Output of the previous code cell

薄い曲線は個々のベルペアを、太い曲線はデバイス全体の平均を示しています。すべてのペアが量子力学によって予測される同じ正弦波をトレースしており、薄い曲線間の広がりはペアごとのノイズのばらつきを反映しています。曲線が灰色の帯に入るところで、古典的境界±2\pm 2を超えており、印刷されたサマリーはほぼすべてのペアが同時にCHSH不等式を破っていることを確認しています。

ピークはデバイス・ノイズのためにTsirelson境界±22\pm 2\sqrt{2}に届いていませんが、結論は明確です: Backendは手作業で選んだ単一のペアだけでなく、チップ全体で同時に真のエンタングルメントを維持しています。これがCHSH実験が「スケール」する意味です: 1つの大きなCircuitとしてではなく、どこでも同時にエンタングルメントを認定する並列ベンチマークとして。

次のステップ

推奨事項

この内容に興味を持たれた方には、以下の資料をお勧めします: