Japanese
言語
English
Japanese
Spanish

注釈

このページは docs/tutorials/chsh_with_estimator.ipynb から生成されました。

Estimator primitiveを用いたCHSH不等式の破れの証明

このチュートリアルでは、Estimator primitive を用いてCHSH不等式の破れを実証する実験を量子コンピューターで行います。

CHSH不等式の破れは、量子力学が局所的な隠れた変数理論と相容れないことを示します。これは、量子力学の基礎を理解する上で重要な実験です。これを量子コンピューターで実証することは、ほんの数年前まで、インパクトのある学術誌に掲載される価値のある、大きな科学的ブレークスルーでした。[1] QiskitとIBM Quantumシステムを使って、自宅でこの実験を行えるのは本当に信じられないことです。

始める前に

このチュートリアルには、Qiskit Runtimeのサービスインスタンスが必要です。まだの方は、Qiskitの 入門ガイド の指示に従ってセットアップしてください。

背景情報

CHSH不等式

CHSH不等式は、著者であるClauser、Horne、Shimony、Holt にちなんで名付けられ、ベルの定理を実験的に証明するために使用されています。この定理は、局所的な隠れた変数理論は量子力学におけるエンタングルメントのいくつかの結果を説明できないと主張するものです。

この実験では、量子もつれのペアを作り、それぞれの量子ビットを2つの異なる基底で測定します。第一量子ビットの基底を \(A\)\(a\) 、第二量子ビットの基底を \(B\)\(b\) とラベル付けします。これにより、CHSH量 \(S_1\) を計算することができます。

\[S_1 = A(B-b) + a(B+b).\]

各オブザーバブルは \(+1\) または \(-1\) のいずれかです。 明らかに、項 \(B\pm b\) の 1 つは 0 でなければならず、もう 1 つは \(\pm 2\) でなければなりません。 したがって、 \(S_1 = \pm 2\) です。 \(S_1\) の平均値は次の不等式を満たさなければなりません。

\[|\langle S_1 \rangle|\leq 2.\]

\(S_1\)\(A\)\(a\)\(B\)\(b\) で展開すると、次のようになります。

\[|\langle S_1 \rangle| = |\langle AB \rangle - \langle Ab \rangle + \langle aB \rangle + \langle ab \rangle| \leq 2\]

別の CHSH 量 \(S_2\) を定義できます。

\[S_2 = A(B+b) - a(B-b),\]

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

\[|\langle S_2 \rangle| = |\langle AB \rangle + \langle Ab \rangle - \langle aB \rangle + \langle ab \rangle| \leq 2\]

もし、量子力学が局所的な隠れた変数理論で記述できるのであれば、上記の不等式は成立するはずです。しかし、このノートで示すように、量子コンピューターではこの不等式が破られる可能性があります。従って、量子力学は局所的な隠れた変数理論とは相容れません。

もっと詳しく知りたい方は、 Qiskitテキストブック にあるCHSH不等式についての章を読んでみてください。

概要

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

\(Z\) および \(X\) 基底で 2 番目の量子ビットを測定します。 最初の量子ビットも直交基底で測定されますが、2 番目の量子ビットに対して角度があり、\(0\) から \(2\pi\) の間でスイープします。 ご覧のとおり、Estimator primitive により、パラメーター化された回路の実行が非常に簡単になります。 一連の CHSH 回路を作成する代わりに、測定角度を指定するパラメーターとパラメーターの一連の位相の値を使用して 1つ の CHSH 回路を作成するだけで済みます。

最後に、結果を分析し、測定角度に対してプロットします。 測定角度の特定の範囲で、CHSH 量の期待値 が \(|\langle S_1\rangle| > 2\) または \(|\langle S_2\rangle| > 2\) であることがわかります。これは、CHSH 不等式の破れを示しています。

注記

この不等式の破れで、局所性や実在性が否定されたと主張するためには、いくつかの抜け穴を塞がなければならないことを、専門家のために言及しておく必要があります。議論については、Qiskitテキストブック の CHSH の章の最後の段落( “Exercise” の項の直前)を参照してください。

ステップ1:CHSH回路の作成

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

まず、パラメータ \(\theta\)theta と呼ぶことにして、回路を書きます。Estimator primitiveは、観測値の期待値を直接提供することにより、回路の構築と出力の解析を非常に簡単に行うことができます。多くの興味深い問題、特にノイズのあるシステムを使う近未来のアプリケーションは、期待値で定式化できます。最大限の一般化を図るため、Estimator primitive は測定のない回路が必要です。

[1]:
from qiskit.circuit import Parameter
from qiskit import QuantumCircuit

theta = Parameter("$\\theta$")

chsh_circuits_no_meas = QuantumCircuit(2)
chsh_circuits_no_meas.h(0)
chsh_circuits_no_meas.cx(0, 1)
chsh_circuits_no_meas.ry(theta, 0)
chsh_circuits_no_meas.draw("mpl")
[1]:
../_images/tutorials_chsh_with_estimator_8_0.png

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

パラメーター化された CHSH 回路を作成したら、次の手順で回路に割り当てる位相の値のリストを作成します。 以下のコードを使用して、等間隔、つまり \(0\), \(0.1 \pi\), \(0.2 \pi\), …, \(1.9 \pi\), \(2 \pi\)\(0\) から \(2 \pi\) までの範囲の 21 の位相の値のリストを作成します。

[2]:
import numpy as np

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]

ステップ2: 回路をクラウド上の量子コンピューターに送信する

Qiskit Runtime サービスに接続する

回路を実行する前に、 `最初のステップ__<#before-you-begin>`__で作成したQiskit Runtimeサービスインスタンスに接続する必要があります。このチュートリアルは、シミュレーター上で実行します。

[3]:
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = "ibmq_qasm_simulator"  # use the simulator

Estimator primitive を使用してパラメーター化された回路を実行する

次に、期待値を計算するためのオブザーバブルが必要です。 私たちの場合、各量子ビットの直交基底を見て、最初の量子ビットのパラメーター化された \(Y-\) 回転が、2 番目の量子ビットの基底に関してほぼ連続的に測定基底をスイープするようにします。 したがって、オブザーバブル \(ZZ\), \(ZX\), \(XZ\), \(XX\) を選択することにします。

[4]:
from qiskit_ibm_runtime import Estimator, Session
from qiskit.quantum_info import SparsePauliOp

ZZ = SparsePauliOp.from_list([("ZZ", 1)])
ZX = SparsePauliOp.from_list([("ZX", 1)])
XZ = SparsePauliOp.from_list([("XZ", 1)])
XX = SparsePauliOp.from_list([("XX", 1)])

ops = [ZZ, ZX, XZ, XX]
chsh_est_sim = []

# Simulator
with Session(service=service, backend=backend):
    estimator = Estimator()
    for op in ops:
        job = estimator.run(
            circuits=[chsh_circuits_no_meas] * len(individual_phases),
            observables=[op] * len(individual_phases),
            parameter_values=individual_phases,
        )
        est_result = job.result()
        chsh_est_sim.append(est_result)

ステップ 3: 結果の分析

回路を実行した後、CHSH 証人関数を構築する必要があります。 最初に、構築した 4 つの回路群(2つの量子ビットに2つの測定基底)の結果のパリティーを調べることによって、量 \(\langle AB \rangle\), \(\langle Ab \rangle\), \(\langle aB \rangle\), \(\langle ab \rangle\) を構築します。 次に、これらの量を使用して、以前に定義した証人関数を構築します。

[5]:
# <CHSH1> = <AB> - <Ab> + <aB> + <ab>
chsh1_est_sim = (
    chsh_est_sim[0].values
    - chsh_est_sim[1].values
    + chsh_est_sim[2].values
    + chsh_est_sim[3].values
)

# <CHSH2> = <AB> + <Ab> - <aB> + <ab>
chsh2_est_sim = (
    chsh_est_sim[0].values
    + chsh_est_sim[1].values
    - chsh_est_sim[2].values
    + chsh_est_sim[3].values
)

観測値が返されるので、自分たちで観測値を作る必要がないことに注意してください。計算された期待値は result.values で与えられます。返ってくるのは非常に小さなデータです。

[6]:
import matplotlib.pyplot as plt
import matplotlib.ticker as tck

fig, ax = plt.subplots(figsize=(10, 6))
# results from a simulator
ax.plot(phases / np.pi, chsh1_est_sim, "o-", label="CHSH1 Simulation")
ax.plot(phases / np.pi, chsh2_est_sim, "o-", label="CHSH2 Simulation")
# classical bound +-2
ax.axhline(y=2, color="r", linestyle="--")
ax.axhline(y=-2, color="r", linestyle="--")
# quantum bound, +-2√2
ax.axhline(y=np.sqrt(2) * 2, color="b", linestyle="-.")
ax.axhline(y=-np.sqrt(2) * 2, color="b", linestyle="-.")
# 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 title, labels, and legend
plt.title("Violation of CHSH Inequality")
plt.xlabel("Theta")
plt.ylabel("CHSH witness")
plt.legend()
[6]:
<matplotlib.legend.Legend at 0x7f9a93cabeb0>
../_images/tutorials_chsh_with_estimator_19_1.png

図では、赤の破線が古典的境界 (\(\pm 2\))、青の点線は量子的境界 (\(\pm 2\sqrt{2}\))を区切っています。実験結果はシミュレーション結果の一般的な傾向に似ており、CHSHの証人量が古典的な境界を越えている領域があることがわかります。おめでとうございます! あなたは、実際の量子系でCHSH不等式の破れを実証することに成功しました!

概要

このチュートリアルでは、パラメーター化されたCHSH回路を作成し、Estimator primitive を使って実行し、結果を解析してCHSH不等式の破れを実証しています。Estimator primitive はパラメーター化された回路の実行を非常に簡単にするだけでなく、観測値の期待値を得るためのワークフローを大幅に簡素化することができることがおわかりいただけたと思います。

参考文献

  1. Córcoles, A. (n.d.), Local Reality and the CHSH Inequality. In A. Abbas, et al. Learn Quantum Computation Using Qiskit. URL: https://qiskit.org/textbook/ch-demos/chsh.html (accessed 07/13/2022) (2020).

Qiskit のバージョンと著作権

[7]:
import qiskit_ibm_runtime

qiskit_ibm_runtime.version.get_version_info()
[7]:
'0.7.0'
[8]:
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.21.0
qiskit-aer0.10.4
qiskit-ibmq-provider0.19.2
qiskit0.37.0
System information
Python version3.9.12
Python compilerClang 12.0.0
Python buildmain, Apr 5 2022 01:53:17
OSDarwin
CPUs8
Memory (Gb)16.0
Thu Jul 14 14:27:57 2022 CEST

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.