量子状態の本質:隠れた変数とBellの不等式
このQiskit in Classroomsモジュールを使用するには、以下のパッケージがインストールされた、動作するPython環境が必要です:
qiskitv2.1.0以降qiskit-ibm-runtimev0.40.1以降qiskit-aerv0.17.0以降qiskit.visualizationnumpypylatexenc
上記パッケージのセットアップとインストール方法については、Qiskitのインストールガイドを参照してください。 実際の量子コンピューターでジョブを実行するには、IBM Cloudアカウントのセットアップガイドの手順に従って、IBM Quantum®のアカウントを作成する必要があります。
このモジュールはテスト済みであり、QPU時間を12秒使用しました。これはあくまで目安であり、実際の使用量は異なる場合があります。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
以下でKatie McCormick博士によるモジュールウォークスルーをご覧いただくか、こちらからYouTubeでご視聴ください。
背景
量子力学における多くの計算では、系の既知の状態から出発します。その状態は通常、測定によって得られます。今日は「測定前の粒子の状態について、何が言えるか?」という問いに答えたいと思います。自然な付随の問いは、「測定が許されないなら、どうやって知ることができるか?」です。
この問いは量子力学の黎明期にさかのぼります。この分野の先駆者たちは派閥に分かれました。アインシュタインをはじめ多くの人は、測定前の粒子は単に未知の状態にあるだけだと主張しました。一方、マックス・ボルン、そして後にニールス・ボーアはより根本的な主張をしました。測定前の粒子の状態は、人間にとって単に未知なのではなく、自然によって本当に未決定であると述べたのです。そして測定が粒子を確率的に定まった状態へと崩壊させます。アインシュタインはこの説明に納得せず、有名な言葉を残しました。「Gott würfelt nicht」—大まかに訳すと「神はサイコロを振らない」です。
この意見の相違が生まれてから数十年間、多くの人はこの問いは永遠に答えられないか、あるいは視点の問題だと考えていました。そして1964年、北アイルランド出身の物理学者ジョン・ベルは、この問いに決定的に答えられる特定の実験の統計を探求した論文を発表しました。彼は、ある特定のテストにおいて、定まった(しかし未知の)量子状態からは一組の統計が得られ、自然によって未決定な量子状態からは別の統計が得られることを示しました。
ベルの論文が発表された当時、関連する統計の実験的検証は、物理学の最前線の研究者以外には手の届かないものでした。しかし今日、IBM Quantumのおかげで、世界中の学生がクラウド経由でリモートから、無料で実際の量子デバイスを使い、量子状態の本質を探求することができるようになりました。これが本日行うことです。
思考実験のセットアップ:スピンのもつれ
スピンを持たない粒子がそれぞれスピンを持つ2つの粒子に崩壊する過程があります。スピンは角運動量の一種であるため、角運動量保存則から、生成された2つの粒子のスピンは正確に反平行でなければならないことが示唆されます。実際、これは実験的に観測されています。
例として、中性パイ中間子が陽電子と電子に崩壊する場合があります: それらの粒子が何であるか知らなくても構いませんし、またこの崩壊型が比較的まれであることをよく知っていても構いません。ただ、生成された粒子の一方がスピンアップであれば、もう一方はスピンダウンでなければならない、ということだけ覚えておいてください。もちろん「上」と「下」には特別な意味はありません。やと呼ばれる方向に沿って測定しても、同じ反平行性が観測されます。この崩壊は考察に好都合な文脈です。なぜなら、過去に行われた測定についての疑問を回避できるからです。陽電子と電子は崩壊の瞬間まで存在すらしていなかったのです。
中間子を崩壊させ、不均一磁場の影響の下で生成された粒子の偏向を観察することができます。スピンを偏向させるために使用される不均一磁場は、最初にそれを使用して(偶然に)量子力学的スピンの存在の証拠を集めた研究者たちにちなんで、シュテルン=ゲルラッハ装置と呼ばれることがよくあります。なお、ここでの話は元の実験よりも複雑です。なぜなら、電子と陽電子は(シュテルン=ゲルラッハ実験の銀原子とは異なり)電荷を持っているからです。しかし荷電粒子が磁場内でどのように動くかは分かっており、その効果を差し引くことができます。以下では、計算に使用する偏向が粒子のスピンによるものであり、電荷によるものではないと仮定します。その結果、私たちの目的においては、どちらの観測者が陽電子を受け取り、どちらが電子を受け取るかは重要ではありません。実験のセットアップは次のようなものです:

中間子が崩壊すると、電子が一方向に、陽電子がもう一方向に放出されます。これら2つの粒子はそれぞれ不均一磁場を通過し、磁場の方向か、磁場と逆方向かのいずれかに偏向されます。
多数の中間子の線源があれば、これについての統計を収集できます。左側の観測者と右側の観測者(それぞれルーカスとリアナと呼びましょう)が常に同じ軸に沿って測定する場合、この統計はあまり面白くありません。一方が上を測定するたびに、もう一方は下を測定します。一方がページの手前向きを測定するたびに、もう一方はページの奥向きを測定します。といった具合です。しかし、プレーヤーが好きな方向にスピンを測定できる場合、より興味深いことが分かるかもしれません。
上述の実験(スピン角運動量を持つ粒子が飛び出し、2人の観測者によって測定される)は、アインシュタイン、ポドルスキー、ローゼン(EPR)によってこの論文で最初に提案されました。これは「EPR実験」と呼ばれることがあります。
選択肢
明確にするために、2つの歴史的な視点を改めて述べましょう:
選択肢1(アインシュタイン):2つのスピン(電子と陽電子)は「決定されている」、つまり、任意の軸に沿ったあらゆる測定の結果は、たとえ私たちが知らなくても、自然によって事前に決まっているという意味です。これは、スピンが空間内に何らかの実在する、明確な向きを持っており、私たちには知られていないが存在するというイメージで考えることができます。あるいは、、、またはその間の任意の方向に沿った測定の結果を決定する情報や指示の集合として考えることもできます。陽電子のスピンを測定する(たとえばz方向に沿って)と、それはz方向または-z方向に向きを合わせます。電子スピンは陽電子スピンと反対向きから始まったことが分かっているので、陽電子スピンが+zと測定された場合、電子スピンは-zと測定されます。しかしこれは電子スピンに対して因果的影響を与えません。角運動量を保存する(スピンが反平行である)指示という初期条件以外に、2つのスピン間に接続はありません。この選択肢は「隠れた変数」と呼ばれることがあります。つまり、様々な軸への射影は決まっているが、私たちには隠されているということです。
選択肢2(ボルン):スピンはどちらも初期状態では未決定です…単に未知なのではなく、測定されるまでは物理的に不定義であり、明確な向きも実験結果についての指示もありません。陽電子スピンを測定することで、全可能性の空間が単一の決定した状態、つまり+zまたは-z軸方向のいずれかへと「崩壊」します。この陽電子の測定が、電子スピンもzに沿った明確な射影へと崩壊させ、陽電子とは正反対になります。この効果は陽電子と電子の間の空間を越えて生じます。これは「不気味な遠隔作用」と呼ばれてきましたが、より控えめに「非局所的な物理」と呼ぶこともできます。
理解の確認
以下の問いを読み、自分で考えてから、三角形をクリックして解答を確認しましょう。
アインシュタインとボルンの選択肢を実験的に区別できれば素晴らしいでしょう。どちらの選択肢が正しくても同じ結果をもたらす実験にはどのようなものがありますか?2つの選択肢で異なる結果をもたらす実験を思いつくことはできますか?注意 アインシュタインとボルンの選択肢で異なる結果をもたらす実験を考えつければ非常に印象的です。人類がそのような実験を考えるのに数十年かかりました。
回答:
これまでに説明した実験(陽電子と電子が反平行のスピンを持ち、正味スピンがゼロ)にとどまれば、、、またはに沿った両方のスピンの測定は、どちらの選択肢が正しくても、角運動量の保存によって常に反対の符号をもたらします。一方の粒子(たとえば電子)のスピンをある方向(たとえば)に沿って測定するということは、もう一方の粒子である陽電子のスピンがに沿って測定されることを意味します。代わりに陽電子のスピンを方向に測定すると、またはが等しい確率で出てきます。これは隠された指示がそう指定しているから(アインシュタインの選択肢1)かもしれませんし、電子スピンの測定後に陽電子スピンの確率分布が更新され、新しい確率分布がの間で50対50に分割されることと矛盾しないから(ボルンの選択肢2)かもしれません。これらの点については以下でより詳しく説明します。
スピン1の粒子の崩壊(生成された2つの粒子が陽電子と電子のように、反平行ではなく平行にスピンを持たなければならない場合)を考えると、答えはほんの少し異なります。一方がに沿って測定された場合、もう一方の粒子の軸に沿った測定もをもたらす必要があります。同様です。以前と同様に、これはどちらの選択肢からも生じる可能性があります。
このレッスンの残りは、アインシュタインとボルンの選択肢を区別できる実験に捧げられていますので、ここではあまり詳しく説明しません。ただし、トリックの一部は2つの粒子を異なる方向(とのような、あるいは従来のデカルト軸の間のある方向)に沿って測定することです。残りは、量子力学の予測と隠れた変数のような古典的情報の予測から、異なる結果を得る正確な確率を慎重に検討することから来ています。
どちらの選択肢でも、2人の観測者ルーカスとリアナが同じ軸に沿って測定する場合、どちらの選択肢が正しいかに関わらず、反平行のスピンが得られると予想されます。その理由は以下の図を考えれば分かります。

上の図はアインシュタインの選択肢を示しています。スピンの方向は反対で、決まっています。軸に沿って測定すると、一方はに沿って、もう一方はに沿って測定されます。陽電子がに、電子がにあると仮定する理由はありません。図は単に、スピンが反対方向に測定されることを示しているだけです。実際、アインシュタインの選択肢の場合、あるスピンは最終的に測定される方向のスピン成分を実際には持たなくてもよいです。アインシュタインの選択肢の最も弱い主張は、任意の軸に沿って測定したときの測定結果を決定する何らかの指示の集合がスピンに格納されているというものです。これらの指示が単純なベクトルの形をしているとイメージする必要はありません(下図参照)。これについては後で戻ります。

以下の図はボルンの選択肢を示しており、陽電子と電子のスピンの方向が確率分布の中に広がっており、明確な方向を持っていません。分布の形を深読みしないでください。各スピンは実際には、互いに反対を向いている限り、任意の方向を指す0でない確率を持つことができます。議論のために視覚的に区別できるよう、単に円の一部として描いています。ボルンの選択肢の場合でも、角運動量は保存されなければならないことに注意してください。したがって、もし確率の波の一方が「崩壊」してスピンが方向を指すならば、もう一方はを指し、逆方向に偏向されます。2つの選択肢は同一に見えます。

しかし、観測者LとRが、各対が120度離れた3つの軸のいずれかに沿って測定できる場合(図4と図5に示すように)はどうでしょうか。各観測者は、どの軸(a、b、またはc)に沿ってスピンを測定するかをランダムに決めることができます。2人が同じ軸に沿って測定する必要はありません。各観測者が測定すると、選んだ軸への正の射影か、負の射影かのどちらかが見つかります。たとえば、ルーカスとリアナは+aと-b、または+bと+cを測定するかもしれません。偶然に同じ軸に沿って測定することにした場合、射影の符号が必ず逆になる(+aと-a、+bと-b、または+cと-c)ことに注意してください。たとえば、両者が+aを見つけることはできません。次のセクションでは、ルーカスとリアナが選択した軸で同じ符号(++または--)を得る確率と、異なる符号(+-または-+)を得る確率を計算する方法を見ていきます。

上の2つの図は、この新しい3軸測定シナリオにおける隠れた変数の解釈の可能性を示しています。つまり、スピンはベクトルとしてすでに決まっているか、またはすべての可能な測定の結果があらかじめ決まっている何らかの物理的な指示の集合がシステムに組み込まれているか(測定前に実験者には知ることができなくても)のどちらかです。代替案を以下に示します。結果のある確率分布が存在し、この分布は異なる測定結果の可能性について何かを教えてくれますが、結果は測定前には自然によって未決定です。

「2人のプレーヤーがスピンの射影の同じ符号を得る頻度はどのくらいか?」と自問できます。つまり、どの軸に沿って測定したかを記録するのではなく、単に同じ符号を見つけたか、異なる符号を見つけたかを記録するのです。アインシュタインとボルンの選択肢がこのより複雑な測定スキームで同じ結果をもたらすかどうかは自明ではありません。しかし、図4と5から、差が生まれるがあることは明らかです。アインシュタインの選択肢の場合、スピンの軸への射影の測定は確実にをもたらし、スピンの軸への射影はを(わずかに)もたらします。しかしボルンの選択肢では、可能性は完全に開かれています。角運動量は依然として保存されます。しかし2つの磁場が同じ軸に沿って向いていないため、粒子は(磁場との相互作用を通じて)異なる軸に崩壊しなければならない状況に強制されます。次のセクションでは、量子力学を使って、ボルンの選択肢に基づいて、ルーカスとリアナが測定した軸で同じ符号(++または--)を得る確率と、異なる符号(+-または-+)を得る確率を決定します。
予測
アインシュタインの選択肢(隠れた変数)は何を予測するか?
アインシュタインの選択肢が正しいとすると、とのどのペアもそれらのスピンにベクトル成分の集合を持ちます。たとえば、電子は成分を持つかもしれず、その場合、陽電子は成分を持たなければなりません。ここでは各軸への射影の大きさではなく、符号のみを指定しています。非常に多くの数のそのような崩壊が起こることを想像し、以下の表を埋めるための測定を収集します。
| 集団 | 粒子1 | 粒子2 |
|---|---|---|
上の表の各行について、ルーカスとリアナの軸の選択は9通りあります:、、、、、、、、です。この表を読むと、1行目と8行目については2人の観測者が同じ符号を測定する確率はゼロです。2行目から7行目については、同じ符号を得る方法が4通りあります。2行目についてのみ示します:
同じ符号:、、、 異なる符号:、、、、
したがって、アインシュタインの選択肢が量子状態の正しい解釈であれば、すべての可能な集団にわたって合計した、ルーカスとリアナがランダムに選んだ軸でスピン射影の同じ符号を得る全確率は次のようになります: 等号が成り立つのはの場合のみです。
理解の確認
以下の問いを読み、自分で考えてから、三角形をクリックして解答を確認しましょう。
上の表の2行目について、ルーカスとリアナが測定で同じ符号を得るすべての可能な方法と、異なる符号を得る方法をすべてリストアップしました。3行目についても同じことをしてください。
回答:
同じ符号:、、、
異なる符号:、、、、
上の表は「集団」を指しています。つまり、隠れた変数の扱いが正しい場合、自然が各タイプの指示をどれだけ生成するかは分かりません。からの分布がどのようなものであっても、測定から同じ符号を得る確率が常に4/9以下であることを示してください。
回答:
が定数になるような、一定の総測定試行数を仮定することから始めましょう。の特別な場合、式は次のように簡略化されます
またはであるとします。すると
すべての試行の合計は以前と同じです。しかしまたはが0から増加したため、からの合計は以前より小さくなっているはずです。特に、からの合計はより小さいです。したがって
すべての可能な場合をまとめると、となります。
一般化
上の扱いでは、特定の軸に沿った測定を考えました。もちろん、任意の軸に沿って測定することができます。2つの粒子の2つのスピンベクトルをととします。を、2粒子系の状態がの明確な値に対応するような何らかの隠れた変数とします。をにおける確率密度とします。最後に、スピンベクトルと隠れた変数が与えられたときに、いずれかの粒子(AまたはB)に対して行われた測定のあらかじめ決まった結果を表す記号とを選びます。重要なのは、がに依存せず、がに依存しないことです。AとBの測定間の相関に関して任意の数の問いを立てることができます。特に、以下で与えられる期待値について問うことができます
、、上の規格化などのこれらの値に関する標準的な仮定を与えると、2つの粒子間の相関が次の関係に従うことを示すことができます
ここでとはシステムのスピン状態であり、とは参照スピン状態(システムの他の任意のスピン状態)です。これは現在「Bell不等式」として知られている不等式のクラス全体の1つです。ここではこの一般的な形式は使用しません。代わりに、その設定を量子Circuit にマッピングできるように、1つの特定の実験セットアップに焦点を当てます。
ボルンの選択肢(非決定論的な量子力学)は何を予測するか?
ルーカスはある軸を選び、一方の粒子のスピンが正または負の方向のどちらかにあることを見つけます。彼が得たものが何であれ、軸がその方向になるように軸を向けます。すると中間子の崩壊後、測定前の初期状態を次のように書くことができます
リアナは彼女の粒子のスピンをルーカスのものに対して角度だけ回転した別の方向に沿って測定します。任意の方向に沿ったスピン演算子は次のように与えられます
この演算子の固有状態は次のとおりです
理解の確認
以下の問いを読み、自分で考えてから、三角形をクリックして解答を確認しましょう。
が上の演算子の固有状態であることを確認し、固有値を求めてください。
回答:
とを使うと
これによりが固有状態であり、対応する固有値がであることが示されます。
ルーカスがスピンを正方向に測定、リアナも彼女が選んだ方向に正のスピンを測定する確率は
理解の確認
以下の問いを読み、自分で考えてから、三角形をクリックして解答を確認しましょう。
についても同様にしてください。それもに等しいことを確認してください。
回答:
これらの結果を合計すると、2つの測定軸の符号が同じになる確率はとなります。
理解度チェック
以下の質問を読み、答えを考えてから、三角形をクリックして解答を確認してください。
この結果の計算を確認するにはどうすればよいでしょうか?ここでは、自然界と一致するかどうかを検証するのではなく、すべての計算に誤りがないかを確認することだけを求めています。
解答:
(1) について同様の計算を行い、確率の保存を検証します。
(2) 既知のケースを確認します。 を代入してみましょう。このとき は、2人の観測者がそれぞれ同じ軸に沿ってスピンを測定するケースに対応しますが、これは角運動量保存則に反します。したがってその確率はゼロになるはずであり、実際に を代入すると となります。
(3) 別の既知のケースを確認します。 を試してみましょう。何が得られるべきでしょうか? に注意してください。
の相対角度を持つ軸のケースを具体的に考えていました。ルーカスが得た方向(、、または )が何であれ、それを と呼ぶことにします。リアナはランダムに 、、または のいずれかの軸に沿って測定します。もし彼女の選択がルーカスの選択と(符号を除いて)同じであれば、2人ともに 軸に沿って測定することになり、リアナが を測定する確率はゼロです。これはリアナの軸の選択がルーカスの選択に依存しないため、1/3 の確率で起こります。その他の選択では、リアナは から ラジアン離れた軸(1/3 の確率)または ラジアン離れた軸(1/3 の確率)に沿って測定します。もちろん、それらの軸のいずれかに沿っても、スピンは正または負の方向に測定される可能性があります。これにより、ルーカスとリアナが同じ符号を得る合計確率は次のようになります:
驚くべき結果
私たちはたったいま次のことを示しました:
少し立ち止まって考えてみましょう。
アインシュタインとボルンの考え方は、測定前に何が起きるかの記述が異なるだけで、常に同じ結果をもたらすように思われていました。それにもかかわらず、特定の軸に沿ったスピン測定の符号をあらかじめ決定する「隠れた指示」が存在すると仮定すると、同じ符号を得る確率に制約 が課されることがわかりました。一方、量子力学の確率分布を仮定すると、 という異なる値が得られました。量子力学の予測は、隠れた変数による扱いで許されるものより高い値です。つまり、量子力学的な状態が測定前に自然によって決定されているのか、それとも可能な状態の確率的重ね合わせにあるのかを、実際に実験で確かめることができるのです。
この実験は、光子など多くの異なる物理システムを使って何度も行われてきました。測定のバイアスや測定の同時性(同時刻性)など、多くの微妙な検討事項があります。数十年にわたって、そのような微妙な点への懸念は着実に払拭されてきました。現実についての理解が深まるにつれて依然として検証は続けられていますが、IBM® の量子コンピューターを使ってここで得られる答えは正しいというのが、現在では広く合意されています。
実際の量子コンピューターを使って検証しよう!
上記の取り扱いに合わせて、ルーカスの測定方向を と定義しましょう。これは代数的アプローチでも便利でしたが、量子計算においては特に便利です。なぜなら、通常測定されるのは qubit の 方向への射影だからです。 の確率条件が上記のものと一致するような量子 Circuit を作りたいと思います。平面の向きを となるように自由に選ぶことができ、次の式が得られます:
IBM 量子コンピューターについていくつかのことを理解する必要があります。まず、qubit は 状態に初期化されます。前述のとおり、測定は 軸に沿って行われます。したがって目標は、測定基底状態 と qubit の初期状態 の間に挿入できる演算子を特定し、上記の複雑な式を得ることです。そのために、量子計算における基本的な Gate をいくつか復習する必要があります。
Gate:NOT 演算と同等の操作です。1 qubit Gate です。
Qiskit では、 Gate を含む Circuit は次のように作成します:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")
アダマール Gate:重ね合わせ状態を生成します。1 qubit Gate です。
アダマール Gate を含む Circuit は次のように作成します:
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")
CNOT 制御 NOT Gate:この Gate は制御 qubit とターゲット qubit の2つを使います。制御 qubit の状態を確認しますが、その状態は変化しません。制御 qubit が の状態にある場合、Gate はターゲット qubit の状態を変化させます。制御 qubit の状態が の場合は何も変化しません。以下の表記では、最初の qubit が制御、2番目がターゲットとします。
CNOT Gate は2つの qubit を必要とするため、Circuit では少し異なる見た目になります。実装は次のとおりです:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")
qc.cx(0,1) で最初にリストされる qubit が制御、2番目がターゲットであることに注意してください。図式的には、ターゲットは「+」記号またはクロスが付いている方です。
Y軸回転 Gate:状態を y 軸周りに回転させます。1 qubit Gate です。
最後に、回転 Gate は、Gate の種類、回転量、Gate を配置する qubit の順に指定して実装します:
import numpy as np
pi = np.pi
qc = QuantumCircuit(2)
qc.ry(pi / 2, 0)
qc.draw("mpl")
Gate 名 ry は回転が行われる軸を指定します。第1引数の は回転量を、第2引数は Gate を配置する qubit を指定します。
理解度チェック
以下の質問を読み、答えを考えてから、三角形をクリックして解答を確認してください。
上記で紹介または復習した構文を使って、4種類の量子 Gate を含む任意の量子 Circuit を作成してください。
解答:
もちろん、無限に多くの可能性があります。以下はその一例です:
qc=QuantumCircuit(2)
qc.ry(pi/2,0)
qc.cx(1,0)
qc.x(1)
qc.h(0)
qc.cx(0,1)
qc.draw("mpl")
物理実験から量子 Circuit へ
これらの Gate の動作から、例えば の式にあるケット:
は、重ね合わせを得るためのアダマール Gate と、エンタングルメントを生成するための CNOT Gate を含む可能性が高いことがわかります。
ここでは H、X、CNOT Gate を使って を に変換します:
ここで は L を制御、R をターゲットとする CNOT Gate を意味します。状態の R の部分を因数分解できます:
これで、ケットが qubit のデフォルトの初期状態に作用する量子 Gate として完全に表現されました。
次に、 を に作用させて、 の式のブラを得ます。
これらの結果を組み合わせると、確率 を次のように書けます:
これにより、量子 Circuit をどのように構築するかについて明確な指示が得られます。ルーカスとリアナによって測定される粒子の量子状態を表す qubit に X、H、CNOT、 Gate を適用し、測定を行って確率を求めます。
IBM Quantum は、Qiskit パターンと呼ばれるフレームワークを使って量子コンピューティングの問題に取り組むことを推奨しています。このフレームワークは以下のステップで構成されています。
- ステップ 1:問題を量子 Circuit にマッピングする
- ステップ 2:実際の量子ハードウェアで実行するために Circuit を最適化する(Transpiler を使用)
- ステップ 3:Runtime Primitives を使って IBM 量子コンピューターでジョブを実行する
- ステップ 4:結果をポスト処理する
上記で行った作業のほぼすべてがステップ 1 にあたります。Qiskit を使って結果の Circuit を構築しましょう!
ステップ 1:結果を量子 Circuit にマッピングする
# We'll begin by importing qiskit and a visualization module so that we can plot a
# histogram of our results.
from qiskit.visualization import plot_histogram
リアナの選択した軸がルーカスの軸から ラジアン離れているのが 1/3 の確率、 ラジアン離れているのが 1/3 の確率、そして同じ軸を選ぶのが 1/3 の確率であることを思い出してください。そのため、これらの3つのケースに対して実際には3つの量子 Circuit を作成し、結果を合計する必要があります。最初の Circuit については丁寧に説明し、残りの2つは単純に示すだけにします。
# We start by declaring our first quantum circuit, and giving it two qubits (the first "2") and two
# classical bits for storing outputs (the second "2")
# Define registers
from qiskit import ClassicalRegister, QuantumRegister
qr = QuantumRegister(2, "q")
cr = ClassicalRegister(2, "c")
qc1 = QuantumCircuit(qr, cr)
# We know from our analysis above that we need an X gate acting on each of the qubits (L and R)
qc1.x([0, 1])
# We need a Hadamard gate acting on Lucas's qubit, which we're calling the 0th qubit.
qc1.h(0)
# The controlled-NOT gate uses the 0th qubit (Lucas's) as the control and the 1st qubit (Rihanna's)
# as the target.
qc1.cx(0, 1)
# The rotation gate acts on the 1st qubit (Rihanna's) and has an argument of -2 pi/3
qc1.ry(-2 * pi / 3, 1)
# Finally, we want to measure all the qubits in the circuit to obtain measurement probabilities, and
# store the results in the classical bits.
qc1.measure([0, 1], [0, 1])
# Now we can draw the first of the three circuits that will check Bell's inequality for us.
qc1.draw(output="mpl")
以下のコードでは、3つの Circuit すべてをよりスマートな方法で構築します。3つの Circuit の違いは、 軸周りに qubit を回転させる量だけであることに注意してください。
qcs = [QuantumCircuit(2, 2), QuantumCircuit(2, 2), QuantumCircuit(2, 2)]
for i in range(0, len(qcs)):
qcs[i].x([0, 1])
qcs[i].h(0)
qcs[i].cx(0, 1)
qcs[0].ry(-2 * pi / 3, 1)
qcs[1].ry(-4 * pi / 3, 1)
qcs[2].ry(-2 * pi / 3, 1)
qcs[2].ry(-4 * pi / 3, 1)
for i in range(0, len(qcs)):
qcs[i].barrier()
qcs[i].measure([0, 1], [0, 1])
counts_list = [None] * len(qcs)
qcs[0].draw(output="mpl")
次に、StatevectorSampler と呼ばれる Qiskit のプリミティブを使用します。サンプラーとは、システムのすべての可能な状態をサンプリングして、各状態を得る確率(場合によっては準確率)を返すように設計されたプリミティブです。「ショット数」を指定して、各状態の「カウント」を確認することができます。
from qiskit.primitives import StatevectorSampler
sampler = StatevectorSampler()
# Start a job that will return shots for all 100 parameter value sets.
for i in range(0, len(qcs)):
pub = qcs[i]
job = sampler.run([pub], shots=10000)
# Extract the result for the 0th pub (this example only has one pub).
result = job.result()
data_pub = result[0].data
counts = data_pub.c.get_counts()
counts_list[i] = counts
# plot_histogram(counts)
各 Circuit のカウントを見ると、そのうちの2つはほぼ同一で、3番目は大きく異なっていることがわかります。
plot_histogram(counts_list)
考えられる結果のリストを作成し、全体的な確率を得るために3つの Circuit それぞれの各状態のカウントを合計しましょう。
outcomes = ("00", "01", "10", "11")
# Here we convert "None"s into 0's so that we can sum.
for i in range(0, len(qcs)):
for j in range(0, len(outcomes)):
if counts_list[i].get(outcomes[j]) is None:
counts_list[i].update({outcomes[j]: 0})
# Here we create a dictionary that holds all the outcomes and sums over their appearances
# in each of the circuits.
total_counts = {}
for i in range(0, len(outcomes)):
total_counts[outcomes[i]] = sum(
counts_list[j].get(outcomes[i]) for j in range(0, len(qcs))
)
各結果の合計カウントを出力し、ヒストグラムをプロットします。
print(total_counts)
plot_histogram(total_counts)
{'00': 7493, '01': 7432, '10': 7605, '11': 7470}
理解度チェック
以下の質問をよく読み、答えを考えてから、三角形をクリックして解答を確認してください。
上の図は、隠れた変数と決定論が予測する結果と一致していますか?それとも、確率論的(かつ非局所的な)量子力学の予測と一致していますか?
解答:
確率論的で非局所的な量子力学の予測と一致しています。隠れた変数による取り扱いでは、同じ符号が得られる確率は4/9以下と予測されていました。量子力学では確率50%と予測されていました。上のヒストグラムは、00または11となる確率が49.97%であることを示しています。これは確率論的な量子力学の予測に非常に近い値であり、さらに重要なことに、隠れた変数による取り扱いで許容される範囲を超えています。
これは自然界の何かを証明しているのでしょうか?
解答:
いいえ!私たちはシミュレーターを使っていました!シミュレーターとは、確率論的な量子力学の法則に従って動作するようにプログラムされたコンピューターです。あるルールを提案し、そのルールに従うようにコンピューターをプログラムした場合、そのルールに従えることは、ルールが正しいことの証明にはなりません!これを証明する唯一の方法は、本物の量子コンピューターを使うことです!
ステップ2:本物のハードウェア上で実行するために量子回路を最適化する
最初にシミュレーターを使ってコードをデバッグしましたが、本当は本物のハードウェア上で実行したいと考えています。結局のところ、シミュレーターは上記の方程式に基づいて量子力学的であるふりをしているにすぎません。シミュレーターがそれらの方程式の正しさを示しても、私たちを説得するにはあまり効果がありません。本物の量子コンピューターに何が起きているかを教えてもらいたいのです!そこで、使用したい量子コンピューターを選択します。特定の特性を持つデバイスを選ぶことが重要な場合もありますが、多くの場合は単に最も空いているデバイスを使えば十分です。
以下のコードには、初回使用時に認証情報を保存するためのコードが含まれています。認証情報を環境に保存した後は、ノートブックからその情報を必ず削除してください。ノートブックを共有する際に認証情報が誤って共有されないようにするためです。詳細なガイダンスについては、IBM Cloudアカウントのセットアップおよび信頼できない環境でのサービスの初期化を参照してください。
from qiskit_ibm_runtime import QiskitRuntimeService
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, min_num_qubits=qcs[0].num_qubits, simulator=False
)
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qcs_isa = qcs
for i in range(0, len(qcs)):
qcs_isa[i] = pm.run(qcs[i])
qcs_isa[i].draw(output="mpl", idle_wires=False, style="iqp")
qcs_isa[2].draw(output="mpl", idle_wires=False, style="iqp")
ステップ3:Runtime primitiveを使ってIBM量子コンピューター上でジョブを実行する
本物の量子ハードウェア上で実行できるように回路を最適化し、シミュレーターを使ってコードをデバッグしたので、いよいよ本物の量子コンピューターから統計データを収集し、アインシュタインとボルンの間の論争に決着をつける準備が整いました。
from qiskit_ibm_runtime import SamplerV2 as Sampler
# from qiskit_ibm_runtime import Session
# sampler.options.default_shots = 1000
# Start a job that will return shots for all 100 parameter value sets.
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex
# Plan, and On-Prem (IBM Quantum Platform API) Plan users.
# result_list = [None] * len(qcs)
# real_counts_list = [None] * len(qcs)
# with Session(backend=backend) as session:
# sampler = Sampler(mode=session)
# for i in range(0, len(qcs)):
# # Define the primitive unified bloc (pub)
# pub = qcs[i]
# job = sampler.run([pub], shots=10000)
# # Extract the result for the 0th pub (this example only has one pub).
# result_list[i] = job.result()
# data_pub = result_list[i][0].data
# counts = data_pub.c.get_counts()
# real_counts_list[i] = counts
# # plot_histogram(counts)
# Open users can still carry out this experiment, but without reserving a session of use, meaning
# repeated queuing is possible.
from qiskit_ibm_runtime import Batch
batch = Batch(backend=backend)
sampler = Sampler(mode=batch)
result_list = [None] * len(qcs)
real_counts_list = [None] * len(qcs)
for i in range(0, len(qcs)):
# Define the primitive unified bloc (pub)
pub = qcs[i]
job = sampler.run([pub], shots=10000)
# Extract the result for the 0th pub (this example only has one pub).
result_list[i] = job.result()
data_pub = result_list[i][0].data
counts = data_pub.c.get_counts()
real_counts_list[i] = counts
# Close the batch because no context manager was used.
batch.close()
outcomes = ("00", "01", "10", "11")
# Here we convert "None"s into 0's so that we can sum.
for i in range(0, len(qcs)):
for j in range(0, len(outcomes)):
if real_counts_list[i].get(outcomes[j]) is None:
real_counts_list[i].update({outcomes[j]: 0})
# Here we create a dictionary that holds all the outcomes and sums over their appearances
# in each of the circuits.
real_total_counts = {}
for i in range(0, len(outcomes)):
real_total_counts[outcomes[i]] = sum(
real_counts_list[j].get(outcomes[i]) for j in range(0, len(qcs))
)
print(real_total_counts)
plot_histogram(real_total_counts)
{'00': 7542, '01': 7503, '10': 7304, '11': 7651}
# This syntax allows you to run the job on a simulator, in case you have exhausted your allotted
# time on real IBM quantum computers.
# But we strongly advise running this on real quantum computers, since this is meant to be a check
# of the behavior of real quantum systems.
# This uses a local simulator
# from qiskit_aer import AerSimulator
# This generates a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend = backend_sim)
# result_list = [None] * len(qcs)
# counts_list = [None] * len(qcs)
# for i in range(0, len(qcs)):
# Define the primitive unified bloc (pub)
# pub = qcs[i]
# job = sampler.run([pub], shots=10000)
# Extract the result for the 0th pub (this example only has one pub).
# result_list[i] = job.result()
# data_pub = result_list[i][0].data
# counts = data_pub.c.get_counts()
# counts_list[i] = counts
# data_pubs = (result_list[0][0].data,result_list[1][0].data,result_list[2][0].data)
# outcomes = ("00", "01", "10", "11")
# Here we convert "None"s into 0's so that we can sum.
# for i in range(0, len(qcs)):
# for j in range(0, len(outcomes)):
# if counts_list[i].get(outcomes[j]) is None:
# counts_list[i].update({outcomes[j]: 0})
# Here we create a dictionary that holds all the outcomes and sums over their appearances
# in each of the circuits.
# total_counts = {}
# for i in range(0, len(outcomes)):
# total_counts[outcomes[i]] = sum(
# counts_list[j].get(outcomes[i]) for j in range(0, len(qcs))
# )
# print(total_counts)
# plot_histogram(total_counts)
counts_list
[None, None, None]
ステップ4:後処理と分析
ここで少し立ち止まって振り返りましょう。隠れた変数による取り扱いと3つのオフセット軸を用いることで、測定が同じ符号を与える確率に対する制約 を導きました。次に量子力学における確率分布を仮定し、その確率に対して__異なる値__ を得ました。量子力学の予測は、隠れた変数による取り扱いで許容される値よりも高くなっています。したがって、量子力学的な状態が測定前に自然界によって決定されているのか、それとも本当に可能な状態の確率的な重ね合わせにあるのかを、実験的に確かめることができます。
私たちは、ルーカスとリアーナがスピン投影の一方の符号または他方を測定する4つの可能な結果(00、01、10、11)に対応するように量子回路を設計しました。00と11の場合、ルーカスとリアーナは同じ符号を測定し、01と10の場合は逆の符号を測定します。ルーカスとリアーナが同じ符号を得る確率は非常に良い近似でおよそ50%であり、明らかに を超えています。これは、その確率分布を説明できる隠れた変数の集合が存在しないことを意味し、隠れた変数による取り扱いは実験結果と相容れません。
量子力学の実験結果にはさまざまな解釈があり、実験セットアップには多くの細かな点があって、それらは折に触れて見直されています。しかし今のところ、量子力学の原理と量子状態の確率論的解釈は実験結果を正確に記述しています。マックス・ボルンは正しかったようです。
この意義についてもう少し考えてみましょう。2つの粒子が崩壊現象から生じ、それぞれ異なる方向に、場合によっては長い時間をかけて移動します。それらのスピンはいかなる確定的な状態にもなく、将来の測定結果を決定するための隠れた変数の「指示書き」も持っていません。しかし、一方の粒子(たとえば 方向)を測定することは、もう一方の粒子のスピンの 方向の実験結果(必ず )を必然的に決定します。つまり、ある粒子の物理的性質が、場合によっては遠く離れた別の粒子に対して何をしたかによって決まるということです。このような状況から、現実が「非局所的」であると表現されることがあります。
これまで説明してきた2つの粒子は、一方の測定がもう一方に影響を与えるという意味で、ある種「つながっている」と言えます。このような粒子を「エンタングル状態にある」と言います。エンタングルメントは単なる相関以上のものです。たとえば、一方に北端を上向きにした磁石を、もう一方に北端を下向きにした磁石を放出する古典的な機械を作ることもできます。そのような磁石は完全に逆相関になりえます。しかし、一方を測定してももう一方には何も影響しません。量子力学的なエンタングルメントでは、粒子Aは未定義の状態(あるいは多くの状態の混合)にある可能性があり、全く別の粒子(例えばB)への測定を通じて、粒子Aを定義された状態に確定させることができます。古典的な世界ではそのようなことは存在しません。
これはしばしば、全く新しい疑問と可能性の世界を開きます。量子コンピューターのようにエンタングルメントを計算に使うといった、実在するアイデアもあります!光より速く情報を送るためにエンタングルメントを使おうとするような、魅力的に見えても実現できないことがわかるアイデアもあります。浮かんでくるすべての疑問を大切にし、他の人々がこれらの現象をどのように探求してきたかについて読んでみることをお勧めします。探求すべき量子力学の世界はまだまだ広がっていますが、以下はその一部として参考になるリソースです。
IBMの量子コンピュータコース:
興味深い量子力学論文:
量子力学の教育リソース:
- コロラード大学の量子力学Iコース教材
量子力学の教育研究:
- C. SinghおよびE. Marshmanによる上級量子力学における学生の困難点のレビュー
問題
インストラクターの方は、このノートブックの使用方法についての簡単なアンケートに記入することで、解答キーと一般的なカリキュラムへの配置に関するガイダンス付きのノートブックを申請できます。
重要な概念
- 量子状態が測定前に単に未知なのか、それとも自然界によって未決定なのか、量子力学が決定論的か確率論的かについて、歴史的な論争がありました。
- 隠れた変数、したがって局所実在論は量子力学の観測と矛盾します。すなわち、量子力学で観測される相関は、私たちに単に未知であるだけの確定した変数では説明できません。
- 量子力学は確率論的です。
- エンタングルメントは実在し、観測可能です。
- エンタングルメントは単なる相関ではありません。
- 実世界のシナリオを量子コンピューターにマッピングできます。
- 隠れた変数とは、自然界によって指定されているが人間には未知の量のことであり、このような文脈では存在しません。
正誤問題
- 正/誤:アルベルト・アインシュタインは、量子力学は理論として不完全であると主張した。なぜなら、量子力学は結果の確率しか記述せず、その結果を決定する根本的なメカニズムを記述していないからである。
- 正/誤:「隠れた変数」とは、2つの量子力学的粒子がエンタングル状態になり得るという考えを指す。
- 正/誤:相関している任意の2つの系は、量子力学的にエンタングル状態にある。
- 正/誤:量子力学的エンタングルメントは数学を正しく行う上で重要であるが、実験では観測できない。
- 正/誤:量子力学では、ほとんどの場合、実験の正確な結果を教えてくれず、特定の結果が測定される確率しかわからない。
- 正/誤:量子力学では、特定の条件下で、粒子Aと粒子Bが接触していなくても、また粒子を交換していなくても、粒子Aの状態が粒子Bの状態によって影響を受けることがある。
- 正/誤:実世界の実験を量子回路にマッピングできる。
多肢選択問題
-
スピン0の粒子がスピン1/2の粒子AとBに崩壊するとします。粒子Aを測定したところ、そのスピンが の向きであることが判明しました。粒子Bは今や
- a. 必ず の向きのスピン投影を持つ
- b. 必ず の向きのスピン投影を持つ
- c. 必ず の向きのスピン投影を持つ
- d. 測定されるどの軸においても必ず負のスピン投影を持つ
-
スピン0の粒子がスピン1/2の粒子AとBに崩壊します。粒子Aが の向きのスピン投影を持つことが測定された場合、粒子Bの測定で可能なスピン投影はどれですか?当てはまるものをすべて選んでください。
- a.
- b.
- c.
- d.
- e.
- f.
-
スピン0の粒子がスピン1/2の粒子AとBに崩壊するとします。いかなる測定も行われる前の粒子Aの状態として最もよく表すものはどれですか?
- a. 粒子Aのスピンは の向きにある。
- b. 粒子Aのスピンは の向きにある。
- c. 粒子Aのスピンは の向きにある。
- d. 粒子Aのスピンはある方向には確定しているが、別の方向には確定していない。
- e. 粒子Aのスピンの向きは、いかなる測定が行われる前も、自然界によって未決定である。
-
アダマール(Hadamard)Gateについて正しいものはどれですか?当てはまるものをすべて選んでください。
- a.
- b.
- c.
- d.
-
X Gateについて正しいものはどれですか?当てはまるものをすべて選んでください。
- a.
- b.
- c.
- d.
- e.
-
2Qubit Gateはどれですか?
- a. X
- b.
- c. H
- d. CNOT
-
あるQubitが の状態にあるとします。それを の状態で測定する確率はどれですか?
- a. ノイズのないシミュレーターでは正確に100%、本物の量子コンピューターでは100%に近い
- b. ノイズのないシミュレーターでは100%に近く、本物の量子コンピューターでは正確に100%
- c. ノイズのないシミュレーターでは正確に0%、本物の量子コンピューターでは0%に近い
- d. ノイズのないシミュレーターでは0%に近く、本物の量子コンピューターでは正確に0%
ディスカッション問題:
-
友人A、B、Cがこの実験の結果についてベルの不等式に関連して議論しています。具体的には、量子力学的に同じ符号を測定する確率が隠れた変数による処理で許容される値よりも大きいことを示す図を見ています:。友人Aは「これは、測定前にスピン状態が分かっていなかったということを意味する」と言います。友人Bは「いや、それ以上のことだ。測定前にスピンがすでに特定の方向を向いているわけではないということを意味する。ただし、スピン状態は何らかの形で決定されたり、記憶されたりしている可能性はある」と言います。友人Cは「いや、さらにそれ以上だ。測定前に自然界においてさえ、将来のスピン状態は決まっていなかったということを意味する」と言います。あなたは誰に同意しますか?またその理由は何ですか?
-
エンタングルメントのような量子力学的現象が、いかに現実が非局所的であることを示しているか説明してください。
-
ここで得られた結果を自分自身で確認するために、どのような追加実験を行いたいですか?
-
ベルの不等式は、等間隔に配置された3つの軸 、、 のみで検証できるのでしょうか?他の数の軸でも検証できますか?その場合、実験はどのような形になりますか?隠れた変数の予測と確率的量子力学の予測との間に、依然として確率の差が生じるでしょうか?