Quantum Native Dojoでベル(CHSH)の不等式を勉強してみた

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$

## はじめに

[Quantum Native Dojo](https://github.com/qulacs/quantum-native-dojo)でベル(CHSH)の不等式について勉強し、自作の量子計算シミュレータ[qlazy](https://github.com/samn33/qlazy)を使って、机上実験してみたよ。

## Quantum Native Dojoについて

[Quantum Native Dojo](https://github.com/qulacs/quantum-native-dojo)は、[株式会社QunaSys](https://qunasys.com)と何名かのContributorのみなさまによって、制作・メンテナンスされている、量子コンピュータに関する自習用の教材です。

量子コンピュータについて自習しようとすると、ありがちな選択肢としては、

1. 書籍を借りたり、買ったりして読む
2. Webで公開されている解説記事を読む
3. arXivなどで公開されている研究論文を読む
4. 大学などが公開・提供している講義動画を視聴する

というあたりが代表的なやり方かと思います。各々良い点、悪い点があって、

1. 自分のペースで確実に理解が進められるが、長時間読むと眠くなる＆途中で飽きることがある(自分のことです、汗)
2. 検索すれば素早く大抵のことはわかるが、断片的な知識しか得られない
3. 最新の研究動向や新知識を得ることができるが、高度な専門性が求められる＆大抵英語です
4. 読むことをせずとも勝手に情報・知識が入ってくるので楽な反面、自分の理解ペースに合わない場合、消化不良を起こす＆眠くなる(再び自分のことです、汗)

てなところかと思います。

それに対し、[Quantum Native Dojo](https://github.com/qulacs/quantum-native-dojo)は、Pythonの開発者コミュニティの中で、よく使われているJupyter Notebookを使って、実際に量子コンピュータのシミュレータ([Sympy](https://www.sympy.org/en/index.html)や[qulacs](https://github.com/qulacs/qulacs)など)で実行しながら、学んでいけるようになっています。なので、プログラムが書けるエンジニアであれば、飽きずに自分のペースで学習していけると思います。また、量子コンピュータの基本から最新のNISQのアルゴリズムまで網羅されていて、各々の分野で初学者向けにポイントとなる事項が押さえられています(と思います)。なので、自分の知識レベルやニーズに応じて、必要なところをつまみ食いしつつ、深めていくきっかけにもできると思います。さらに、[Qulacs Slack Community]
(https://join.slack.com/t/qulacs/shared_invite/enQtNDY3Njc1NjU5MDE1LTY4MTNlNDQzYjA1ZGUzZGFiNDQ1MzE2Yjg4ZmM4YjUyNGM0NmNmMjA5NmI2YWFlZDk2ODE1OTUzZTE5YjRmZWU)で、わからないところはいろいろ聞くことができる場も用意されています。

とはいえ、2019年4月26日にv0.1.0が公開されたばかりなので、学習者等からのフィードバックを得ながら、これからどんどんコンテンツが更新・追加されていくのだと思います。期待しつつ、自身の勉強のお伴の一つにしていければと思います。


## ベル(CHSH)の不等式

さて、それではベルの不等式です。が、その前に、この不等式が編み出された背景を少々描写してみたいと思います。

### 背景

量子力学理論が構築されつつある1930年代のことです。量子エンタングルメント状態にある２つの粒子の一方を観測すれば、直ちにもう一方の粒子の状態が定まってしまうという、不思議な遠隔伝播作用が理論の中にあるのはまかりならん、そんなことを許す理論は不完全なものである、というアインシュタインたちの主張がありました(論文著者の頭文字をとって「ERPパラドックス」と呼ばれていました)。

それに呼応する形で、量子力学理論を完全ならしめるべく、「隠れた変数理論」なるものを編み出そうとする動きがありました。これは、まだ我々の知らない隠れた変数があって、それが系の状態を予め決めているのだということを主張する理論です。つまり、２つの粒子が量子エンタングルした時点で(測定する前に)、測定したときに何が観測されるかが決まっている、というものです。測定しないとわからないというのは、我々がいまだその変数が何たるかを知らないからである、というわけです。測定前に対象となる実体の状態が定まっているということ自体は、きわめて自然な日常感覚にそった主張ですよね。アインシュタインが、当時の量子力学擁護派に対して、「君は、君が見上げているときだけ月が存在していると本当信じるのか？」と批判した気持ちはよくわかります。このような量子力学批判者たちの考え方を一言で「局所実在性」というようです。「実在性」というのは、測定前に実体がちゃんと定まってあるということ、「局所性」というのは、あらゆる作用は局所的な作用の総和として現れるということです。

この「局所実在性」が本当に成立しているのかどうかを検証するべく、1964年にジョン・ベルが編み出したのが「ベルの不等式」です。「局所実在性」が成り立つとすると、必ず「ベルの不等式」が成立します。これで決着！と言いたいところですが、この「ベルの不等式」をどうやって実験的に検証するかという難しい問題があり、はじめて検証されたのが、ようやく1982年、アラン・アスペらによってでした。しかも、否定的に検証されたのです！(つまり、量子の世界では「局所実在性」は成り立っていないということ！)

ちょっと背景説明が長くなってしまいましたが、「ベルの不等式」の説明に入ります。ベルの不等式にはいろんなバリエーションがあるらしいのですが、[Quantum Native Dojo](https://github.com/qulacs/quantum-native-dojo)の「[1.c_CHSH-inequality_etc.ipyb](https://github.com/qulacs/quantum-native-dojo/blob/master/notebooks/1.c_CHSH-inequality_etc.ipynb)」には、「CHSHゲーム」という形で解説(コラム)がありますので、ほぼ受け売り＆自分のつたない知識も添えつつ、ざっくり説明してみます。

### CHSHゲーム

AliceとBobが協力して、Charlieが出すランダムビットに対して、あるパターンに適合するように反応し、適合に成功したらAlice,Bob連合の勝ち、失敗したら負け、というゲームです。

Charilieが繰り出すのは{0,1}の系列です。それをAliceとBobに各々渡します。Aliceは、$x$(0または1)を受け取ったら、それに対して$a_x$(0または1)という値を返します。Bobは、$y$(0または1)を受け取ったら、それに対して$b_y$(0または1)という値を返します。このとき、AliceとBobが、$x \land y = a_x \oplus b_y$を満たす$a_x,b_y$を返せば勝ちになります。AliceとBobは、各々受け取った$x,y$に対してどんな$a_x,b_y$を返せば勝てるでしょうか、というのが、このゲームを通して考えたいことです。前提として、AliceとBobは勝率最大化の戦略を事前に協議できるが、ゲームが始まったらコミュニケーションすることはできない、しかし、エンタングルした２つの粒子を各々実験室に持ち込むことは可能とします。というわけで、AliceとBobは、なんとかエンタングルした粒子を利用して、勝率最大化のための戦略を考えるということになるわけです(と思ってください)。

ここで、結論を先に言います。もし、何らかの「隠れた変数」によって２つの粒子がエンタングルしているとするならば、どうやっても彼らの勝率は高々0.75に抑えられます。一方、「隠れた変数」がなくて、「遠隔伝播作用」が許されるとするならば、彼らの勝率の最大値は約0.85程度にまで上がります。このことを実際に実験室で行い、「勝率」が0.75を超えるということを示したのが、1982年のアスペの実験でした。

#### ベルの不等式(CHSHの不等式)

さて、「ベルの不等式」を説明すると言いつつ、まだ説明していませんでした。実は、「隠れた変数」が存在している場合に、必ず成り立つ不等式を1964年にベルが見つけ出しました。で、この不等式が成り立つとするならば、どう頑張ってもAliceとBobの勝率は0.75を超えられない、ということが導けるのです。

いま、Aliceが$A$という測定をした結果、$a$という値(0または1)を得、$A'$という測定をした結果、$a'$という値(0または1)を得たとします。また、Bobが$B$という測定した結果、$b$という値(0または1)を得、$B'$という測定をした結果、$b'$という値(0または1)が得たとします(やや抽象的な記述になっていますが、例えば、エンタングルした粒子の一方をAliceが角度$\theta_a$で測定することを$A$、角度$\theta_a'$で測定することを$A'$とし、他方の粒子をBobが角度$\theta_b$で測定することを$B$、角度$\theta_b'$で測定することを$B'$とイメージしていただければ良いです)。この測定を何度も繰り返します(AliceとBobはどっちの測定をするかを毎回
適当に切り替えるものとします)。すると、$a,a',b,b'$についてある種の相関を計算することができて、その絶対値が2を超えることはありません、ということをベルは証明しました。以下が「ベルの不等式(CHSH不等式)」です($<>$は期待値を表します)。

```math
|<ab> + <a'b> + <ab'> - <a'b'>| \leq 2
```

この不等式から、CHSHゲームの勝率の上限を考えてみます。AliceとBobは、{0,1}の値を返すので、いまの想定に合わせるために、$a = (-1)^{a_0}, a' = (-1)^{a_1}$と定義します。入力ビット$(x,y)$がランダムに与えられたときに、２人が勝つ
 ($x \land y = a_x \oplus b_y$) 確率を$p_{xy}$とすると、

```math
\begin{align}
&<ab> = p_{00} - (1 - p_{00}) = 2p_{00} - 1 \\
&<ab'> = 2p_{01} - 1 \\
&<a'b> = 2p_{10} - 1 \\
&<a'b'> = 1 - 2p_{11} \\
\end{align}
```

なので、２人がゲームに勝つ確率の期待値は、

```math
<p> = (p_{00} + p_{01} + p_{10} + p_{11}) / 4 \leq 3/4 = 0.75

```

となります。そして、ちょっと考えればわかりますが、勝率最大化のための戦略は、「２人とも、どんな(x,y)をもらったとしても、ひたすら0を返す」です。

#### Tsirelsonの不等式

さて、それでは「隠れた変数」=「局所実在性」がないとした場合、どうなるかというと、先程の「ベルの不等式(CHSH不等式)」は、以下のように変わります(「Tsirelsonの不等式」と呼ばれています)。

```math
|<ab> + <a'b> + <ab'> - <a'b'>| \leq 2 \sqrt{2}
```

これを前提にすると、２人の勝率の上限も以下のように変わります。

```math
<p> = (p_{00} + p_{01} + p_{10} + p_{11}) / 4 \leq 1/2 + 1/2\sqrt{2} \approx 0.853
```

このとき、勝率最大化のための戦略は、

```math
(\ket{0}_A \ket{0}_B + \ket{1}_A \ket{1}_B) / \sqrt{2}
```

というエンタングルした２つの粒子を用意し各々をAliceとBobに渡しておいた上で、

* $x=0$のとき、Aliceは$Z$基底で粒子Aを測定し、上向きを観測すれば$a=0$、下向きを観測すれば$a=1$を返す
* $x=1$のとき、Aliceは$X$基底($=RY(\pi/2)$基底)で粒子Aを測定し、上向きを観測すれば$a=0$、下向きを観測すれば$a=1$を返す
* $y=0$のとき、Bobは$RY(\pi/4)$基底で粒子Bを測定し、上向きを観測すれば$b=0$、下向きを観測すれば$b=1$を返す
* $y=1$のとき、Bobは$RY(-\pi/4)$基底で粒子B測定し、上向きを観測すれば$b=0$、下向きを観測すれば$b=1$を返す

ということをすれば良いです(Quantum Native Dojoではもっと一般的な記述をされていますが、ここではスピンの上下測定をイメージした方がわかりやすいかと思い、上向き下向きという言い方にしてみました。また、Bobが測定する基底は、この後の自作シミュレータでの定義に合わせるため、$RY(\pi/4)$としました。ブロッホ球の上でY軸周りに$\pi/4$だけ傾けた基底という意味ですが、もしかすると自分の定義の仕方が間違っているのかも、、と思いつつ)。

## シミュレーション

[qlazy](https://github.com/samn33/qlazy)を使って、「ベルの不等式(CHSH不等式)」に基づいた戦略(Classical Strategy)と、「Tsirelson不等式」に基づいた戦略(Quantum Strategy)で、その勝率が本当に「0.75」および「0.853」になるのかを試してみました。以下に、そのコードを示します。

【2021.9.5追記】[qlazy](https://github.com/samn33/qlazy)最新版でのソースコードは[ここ](https://github.com/samn33/qlazy/blob/master/example/py/CHSHInequality)に置いてあります。

```python
import random
from qlazypy import QState

def classical_strategy(trials=1000):

    win_cnt = 0
    for _ in range(trials):

        # random bits by Charlie (x,y)
        x = random.randint(0,1)
        y = random.randint(0,1)

        # response by Alice (a)
        a = 0

        # response by Bob (b)
        b = 0

        # count up if they win
        if (x and y) == (a+b)%2:
            win_cnt += 1

    print("== result of classical strategy (trials:{0:d}) ==".format(trials))
    print("* win prob. = ", win_cnt/trials)

def quantum_strategy(trials=1000):

    win_cnt = 0
    for _ in range(trials):

        # random bits by Charlie (x,y)
        x = random.randint(0,1)
        y = random.randint(0,1)

        # make entangled 2 qubits (one for Alice and another for Bob)
        qs = QState(2).h(0).cx(0,1)
        
        # response by Alice (a)
        if x == 0:
            # measurement of Z-basis (or Ry(0.0)-basis)
            sa = qs.mx(id=[0], shots=1).lst
            # sa = qs.m(id=[0], shots=1, angle=0.0, phase=0.0).lst
            if sa == 0:
                a = 0
            else:
                a = 1
        else:
            # measurement of X-basis (= Ry(0.5*PI)-basis)
            sa = qs.m(id=[0], shots=1, angle=0.5, phase=0.0).lst
            if sa == 0:
                a = 0
            else:
                a = 1

        # response by Bob (b)
        if y == 0:
            # measurement of Ry(0.25*PI)-basis
            sb = qs.m(id=[1], shots=1, angle=0.25, phase=0.0).lst
            if sb == 0:
                b = 0
            else:
                b = 1
        else:
            # measurement of Ry(-0.25*PI)-basis
            sb = qs.m(id=[1], shots=1, angle=-0.25, phase=0.0).lst
            if sb == 0:
                b = 0
            else:
                b = 1

        # count up if they win
        if (x and y) == (a+b)%2:
            win_cnt += 1

        del qs
            
    print("== result of quantum strategy (trials:{0:d}) ==".format(trials))
    print("* win prob. = ", win_cnt/trials)

if __name__ == '__main__':
    
    classical_strategy()
    quantum_strategy()
```

結果は、


```sh
== result of classical strategy (trials:1000) ==
* win prob. =  0.748
== result of quantum strategy (trials:1000) ==
* win prob. =  0.844
```

の通りで、だいたい理論が予測する通りの結果になりました。何度も実行してみるとわかりますが、Charlieが繰り出すビット列の具合(分布)によって、結果は変わります。ときどき上限値をちょっと上回る場合もあったりします。また、測定の順番を変えて、Bobが測定した後に、Aliceが測定するとしても、同じような結果になります。

## まとめ

[Quantum Native Dojo](https://github.com/qulacs/quantum-native-dojo)の「ベルの不等式(CHSH不等式)」についての解説(コラム)は問題設定と結論がコンパクトにまとまっていて、シミュレータで試すのは、割とすぐにできました。ただし、数学的な証明がどうなされたのかは、ちゃんと行間を理解するべく、自分自身、もう少し勉強を進めないといけない感じです。哲学的にも、このあたりの話題は難しいですね。

そういう意味で、まだ説明しきれていないことを以下に列挙します。

* ベル(CHSH)の不等式の導出
* Tsirelsonの不等式の導出
* Quantum Strategyの導出(勝率の上限値も含め)

それから、「隠れた変数」と「局所実在性」とをほぼ同じ意味で記載してしまいましたが、どうも正確には違っているようで、「ベルの不等式」は、量子エンタングルした粒子のように局所的な「隠れた変数」が存在するときに成り立っているものらしいです。このあたりも、適当に省いてしまいました。

今後、適宜補足していきたいと思います。

あと、量子コンピュータ界隈のトピックとして、NISQのアルゴリズムが結構研究されているようです。このあたり、Quantum Native Dojoに面白そうな事例が掲載されているので、参考にしながら、引き続き勉強してみたいと思います。

以上