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

CHSH不等式

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

背景

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

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

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

要件

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

  • Qiskit SDK v1.0以降、visualizationサポート付き
  • Qiskit Runtime (pip install qiskit-ibm-runtime) v0.22以降

セットアップ

# 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

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

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

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

各観測値は+1+1または1-1です。明らかに、項B±bB\pm bの1つは00で、もう1つは±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

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

理論についてもっと学びたい場合は、John WatrousによるEntanglement in Actionを探索してください。

量子コンピューター内の2つの量子ビット間にエンタングルペアを作成し、ベル状態Φ+=00+112|\Phi^+\rangle = \frac{|00\rangle + |11\rangle}{\sqrt{2}}を作成します。Estimatorプリミティブを使用すると、2つのCHSH量S1\langle S_1\rangleS2\langle S_2\rangleの期待値を計算するために必要な期待値(AB,Ab,aB\langle AB \rangle, \langle Ab \rangle, \langle aB \rangle、およびab\langle ab \rangle)を直接取得できます。Estimatorプリミティブの導入前は、測定結果から期待値を構築する必要がありました。

2番目の量子ビットをZZ基底とXX基底で測定します。最初の量子ビットも直交基底で測定しますが、2番目の量子ビットに対して角度を持ち、00から2π2\piの間でスイープします。ご覧のとおり、Estimatorプリミティブはパラメータ化された回路の実行を非常に簡単にします。一連のCHSH回路を作成する代わりに、測定角度を指定するパラメータと、パラメータの一連の位相値を持つ1つのCHSH回路を作成するだけです。

最後に、結果を分析し、測定角度に対してプロットします。測定角度の特定の範囲で、CHSH量の期待値S1>2|\langle S_1\rangle| > 2またはS2>2|\langle S_2\rangle| > 2となり、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'

パラメータ化されたCHSH回路を作成

まず、パラメータθ\thetaを持つ回路を記述します。これをthetaと呼びます。Estimatorプリミティブは、観測可能量の期待値を直接提供することで、回路構築と出力分析を大幅に簡素化できます。特にノイズのあるシステムでの短期的なアプリケーションにとって、多くの興味深い問題は期待値の観点から定式化できます。Estimator (V2)プリミティブは、提供された観測可能量に基づいて測定基底を自動的に変更できます。

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

後で割り当てる位相値のリストを作成

パラメータ化されたCHSH回路を作成した後、次のステップで回路に割り当てる位相値のリストを作成します。次のコードを使用して、00から2π2 \piの範囲で等間隔の21個の位相値のリスト、つまり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 list of lists in order to work
individual_phases = [[ph] for ph in phases]

観測可能量

期待値を計算する観測可能量が必要です。このケースでは、各量子ビットの直交基底を見ており、最初の量子ビットのパラメータ化されたYY-回転により、2番目の量子ビット基底に対してほぼ連続的に測定基底をスイープできます。したがって、観測可能量ZZZZZXZXXZXZXXXXを選択します。

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

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

総ジョブ実行時間を短縮するため、V2プリミティブはターゲットシステムがサポートする命令と接続性に準拠する回路と観測可能量(命令セットアーキテクチャ(ISA)回路と観測可能量と呼ばれる)のみを受け入れます。

ISA回路

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観測可能量

同様に、Runtime Estimator V2でジョブを実行する前に、観測可能量をバックエンド互換にするために変換する必要があります。SparsePauliOpオブジェクトのapply_layoutメソッドを使用して変換を実行できます。

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

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

Estimatorへの1回の呼び出しで実験全体を実行するため、Qiskit Runtime Estimatorプリミティブを作成して期待値を計算できます。EstimatorV2.run()メソッドは、primitive unified blocs (PUBs)のイテラブルを取ります。各PUBは(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()

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

Estimatorは両方の観測可能量、ZZZX+XZ+XX\langle ZZ \rangle - \langle ZX \rangle + \langle XZ \rangle + \langle XX \rangleZZ+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

図では、線と灰色の領域が境界を区切っています。最も外側の(一点鎖線)線は量子境界(±2\pm 2)を区切り、内側の(破線)線は古典境界(±22\pm 2\sqrt{2})を区切っています。CHSH証人量が古典境界を超える領域があることがわかります。おめでとうございます! 実際の量子システムでCHSH不等式の破れを実証できました!

チュートリアル調査

このチュートリアルに関するフィードバックを提供するため、この短い調査にご協力ください。お客様の洞察は、コンテンツ提供とユーザーエクスペリエンスの改善に役立ちます。

調査へのリンク