量子状態の本質:隠れた変数とベルの不等式
このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた Python 環境が必要です:
qiskitv2.1.0 または新しいqiskit-ibm-runtimev0.40.1 または新しいqiskit-aerv0.17.0 または新しいqiskit.visualizationnumpypylatexenc
上記のパッケージをセットアップしてインストールするには、 Qiskitのインストールガイドをご覧ください。 実際の量子コンピュータでジョブを実行するには、 IBM Quantum® のアカウントを設定する必要があります。 IBM Cloud アカウントの設定ガイドの手順に従ってください。
このモジュールはテストされ、12秒のQPU時間を使用した。 これはあくまでも目安である。 実際の使用方法は異なる場合があります。
# 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'ケイティ博士( McCormick )によるモジュールのウォークスルーを以下でご覧いただくか、 こちらをクリックして YouTube でご覧ください。
背景
量子力学の多くの計算では、系の状態を知ることから始める。 今日は、"測定前の粒子の状態について何が言えるのか?"という疑問に答えたい 測定することが許されないのであれば、どうやって知ることができるのか?
この疑問は量子力学の初期にまでさかのぼる。 この分野のパイオニアたちは、アインシュタインや他の多くの人たちと、粒子は単に測定前の未知の状態にあるだけだと言って、派閥に分かれてしまった。 また、マックス・ボルンや後のニールス・ボーアなどは、粒子の状態は、単に人間にとって未知であるだけでなく、測定以前に自然界で真に決定されていないものであると、より急進的な主張を行った。 そして、測定は確率的に粒子を明確な状態に崩壊させる。 この説明に不満だったアインシュタインが、"Gott würfelt nicht"(神はサイコロを振らない)と言ったのは有名な話だ
この見解の相違が表面化してから数十年間、多くの人がこの問題に答えが出ることはないだろう、あるいは見解の相違だと考えていた。 そして1964年、北アイルランドの物理学者ジョン・ベルが、この疑問に明確に答えることができるある実験の統計について探求した論文を書いた。 彼は、あるテストにおいて、定義された(しかし未知の)量子状態から得られる統計量と、自然界では未決定である量子状態から得られる統計量とが異なることを示した。
ベルの論文が発表された当時は、物理学の最前線にいる研究者以外には、統計の実験的検証は不可能であった。 しかし今日、 IBM クアンタムは、世界中の学生がクラウド経由で遠隔から、しかも無料で本物の量子デバイスを使用し、量子状態の本質を探求することを可能にした。 これが今日の仕事だ。
思考実験の設定:スピンの量子もつれ
スピンを持たない粒子が、それぞれスピンを持つ2つの粒子に崩壊する過程がある。 スピンは角運動量の一種であるため、角運動量保存の法則からすると、出てくる2つの粒子のスピンは正確に逆向きでなければならない。 実際、これは実験的に観察されている。
例えば、中性のπ中間子が陽電子と電子に崩壊することがある: これらの粒子が何であるか知らなくても心配はいらないし、この崩壊タイプが比較的あり得ないと知っているほどよく分かっていても心配はいらない。 ただ、出てくる粒子の一方がスピンアップしていれば、もう一方はスピンダウンしているはずで、その逆も然りである。 もちろん、"上 "と "下 "について特別なことは何もない。私たちがよく または と呼んでいるものに沿って測定が行われる場合、同じような反アライメントが観察される。この崩壊は、過去にどのような測定が行われたかについての疑問を回避することができるため、私たちにとって考慮すべき説得力のある文脈である。陽電子と電子は崩壊の瞬間まで存在すらしていなかったのだ。
私たちは、 中間子を崩壊させ、不均一磁場の影響下で、出てくる粒子の偏向を見ることができる。 スピンを偏向させるために使用される不均一場は、量子力学的スピンの存在の証拠を(偶然にも)集めるために最初に使用した研究者にちなんで、しばしばシュテルン・ゲルラッハ装置と呼ばれる。 電子と陽電子も荷電しているため(シュテルン・ゲルラッハ実験の銀原子とは異なる)、ここでの話は元の実験よりも複雑であることに注意されたい。 しかし、我々は荷電粒子が磁場の中でどのように動くかを知っているので、その影響を差し引くことができる。 以下では、計算で使われる偏向は電荷ではなく粒子のスピンによるものと仮定する。 その結果、我々の目的にとっては、どちらの観測者が陽電子を受け取り、どちらが電子を受け取るかは問題ではない。 実験のセットアップは次のようなものだ:
中間子が崩壊するとき、電子が一方向に、陽電子がもう一方向に追い出される。 これら2つの粒子はそれぞれ不均一な磁場中を移動し、磁場の方向に偏向するか、磁場と反対方向に偏向する。
多くの中間子の発生源があれば、その統計を取ることができる。 左側の観察者と右側の観察者(それぞれルーカスとリアーナと呼ぶ)が常に同じ軸に沿って測定する場合、これらの統計はあまり面白くないだろう:一方が測定値を上げるたびに、もう一方は測定値を下げる。 しかし、もし選手が好きな方向に沿って自由にスピンを測定することができれば、もっと面白いものが見つかるかもしれない。
粒子がスピン角運動量を持って飛び出し、それを2人の観測者が測定するという上記の実験は、当初アインシュタイン、ポドルスキー、ローゼン(EPR)がこの論文で提案したもので、これは「EPR実験」と呼ばれることもある。
選択肢
わかりやすくするために、この2つの歴史的視点をもう一度整理してみよう:
選択肢1 (アインシュタイン):2つのスピン(電子と陽電子)は、たとえそれが何であるかわからなくても、どのような軸に沿った測定結果も、自然によってあらかじめ決定されているという意味で、決定されている。 これは、スピンが空間において、私たちにはわからないが、実在する、明確に定義された方位を持っていると考えることができるだろう。 あるいは、 、 、 、またはその中間に沿った測定結果を決定する一連の情報や指示と考えることもできる。 陽電子のスピンを測定すると(例えばz方向に沿って)、陽電子はz方向または -z。 しかし、電子スピンは陽電子スピンと反対から始まったことが分かっているので、陽電子スピンが+zに沿って測定される場合、電子スピンは -z。 角運動量を保存する指示(スピンが反整列している)という初期条件以外には、2つのスピンの間には何のつながりもない。 このオプションは "隠れた変数 "と呼ばれることもある。つまり、異なる軸に沿った投影は決定されているが、私たちには隠されているということだ。
オプション2 (ボルン):スピンは両方とも初期状態では未定である...単に未知であるだけでなく、物理的に定義されていない。 陽電子スピンを測定することで、あらゆる可能性の空間が、+z軸または -z 軸に沿った単一の決定された状態に「折り畳まれる」。 この陽電子の測定によって、電子のスピンも、陽電子とは正反対の、zに沿った明確な投影に崩壊させられる。 この効果は、陽電子と電子の間の空間全体に広がって起こる。 これは "spooky action at a distance "と呼ばれているが、もっと大げさに "non-local physics "と呼ぶこともできるだろう。
理解度チェック
アインシュタインの説とボルンの説を実験的に区別できれば素晴らしいですね。 どちらの選択肢が正しかったとしても、同じ結果が得られるような実験にはどのようなものがあるでしょうか? この2つの選択肢で結果が異なるような実験を思いつきますか?
注: アインシュタインの案とボルンの案で異なる結果が得られるような実験を考案できれば、非常に印象的でしょう。人類がそのような実験を思いつくまでに、何十年もの歳月を要したのですから。
これまで説明した実験(つまり、陽電子と電子が反整列している状態で正味のスピンがない)にこだわると、 、 、 に沿って両方のスピンを測定すると、角運動量保存のため、どの選択肢が正しいかとは無関係に、常に反対の符号が得られます。 ある粒子(例えば電子)のスピンをある方向(例えば )に沿って測定すると、もう1つの粒子(陽電子)のスピンは に沿って測定されることになります。その代わりに、陽電子のスピンを の方向に沿って測定すると、 か のどちらかになる可能性が等しくなります。これは、隠された指示がそう言っているからか(アインシュタインのオプション1)、電子のスピンを測定した後に陽電子のスピンの確率分布が更新され、新しい確率分布が (ボルンのオプション2)と半々で一致するからでしょう。 これらの点については、以下で詳しく説明する。
spin-1 陽電子と電子のような)2つの粒子のスピンは反整列ではなく、整列していなければならない。 一方の粒子を に沿って測定した場合、もう一方の粒子を 軸に沿って測定すると、 のようになる。 以前と同様、これはどちらのオプションでも起こりうる。
このレッスンの残りは、アインシュタインとボルンの選択肢を区別できる実験に費やされるので、ここではあまり詳しく説明しない。 しかし、トリックの一部は、2つの粒子を異なる方向( と のような、あるいは従来のデカルト軸の間の方向)に沿って測定することである。 あとは、量子力学の予測と、隠れ変数のような古典的情報の予測から、異なる結果が得られる正確な確率を注意深く考えることから生まれる。
どちらのオプションでも、ルーカスとリアーナという2人の観測者が同じ軸に沿って測定した場合、どちらのオプションが正しいかにかかわらず、2人のスピンは反アラインになると予想される。 その理由については、以下の図をご覧いただきたい。
上の図は、アインシュタインのオプションを示したものである。 スピンの方向は逆に決まっている。 軸に沿って測定すると、一方は に沿い、もう一方は に沿う。陽電子は に沿い、電子は に沿うと仮定する理由はない。画像は単にスピンが反対方向に測定されることを示している。 実際、アインシュタインのオプションの場合、あるスピンが最終的に測定される方向に沿ってスピンの成分を持つ必要はない。 アインシュタインのオプションの最も弱い声明は、スピンに格納されている命令のセットがあり、それがどの軸に沿って測定したときに測定結果がどうなるかを決定するというものである。 これらの命令が単純なベクトル(下図参照)の形をしていることは、説明するまでもないだろう。
下図はボルンのオプションを示したもので、陽電子と電子のスピンの方向は確率分布の中に散らばり、明確な方向はない。 分布の形を深読みしてはいけない。 それぞれのスピンは、互いに反対である限り、実際にはどの方向を向く確率もゼロではない。 ボルンのオプションの場合でも、角運動量は保存されなければならないことに注意してください。 つまり、スピンが を指すように確率の波の一方が "崩壊 "すれば、もう一方は を指し、反対方向に偏向することになる。 オプションは同じに見える。
しかし、図4と図5に示すように、観測者LとRが、それぞれ120度離れた3つの軸のいずれかに沿って測定できる場合はどうなるか。 各観測者は、スピンを測定する軸(a、b、c)をランダムに決めることができる。 この2つは同じ軸に沿って測定する必要はない。 各観測者が測定するとき、自分の選んだ軸に正の投影を見つけるかもしれないし、負の投影を見つけるかもしれない。 例えば、ルーカスとリアーナは+aと -b、または+bと+cを測定するかもしれない。 たまたま同じ軸に沿って測定することを選択した場合、投影において反対の符号を得なけれ ばならないことに注意しよう:+aと -a、+bと -b、または+cと -c。 次のセクションでは、ルーカスとリアーナが測定した軸で同じ符号(++または--)になる確率と、反対の符号(+-)または(-+)になる確率を計算する方法を説明する。
上の2つの図は、この新しい3軸測定シナリオで考えられる隠れ変数の解釈を示している。 つまり、スピンがベクトルとしてすでに決定されているか、あるいは、たとえ測定前には実験者が知ることができなくても、可能性のあるすべての測定の結果があらかじめ決定されているような物理的命令のセットが何らかの形でシステムに組み込まれているかのどちらかである。 代替案を以下に示す。 結果の確率分布が存在し、この分布からさまざまな測定結果の可能性についてある程度知ることができるが、測定に先立つ性質上、結果は未確定である。
私たちは、"2人のプレーヤーはどれくらいの頻度でスピンの投射の同じサインを見つけるべきか?"と自問することができる つまり、どの軸に沿って測定したかを記録しているわけではなく、単に同じ符号を見つけたか、違う符号を見つけたかを記録しているだけなのだ。 アインシュタインの選択肢とボルンの選択肢が、このより複雑な測定スキームで同じ結果をもたらすかどうかは明らかではない。 しかし、図4と図5から明らかなように、差があるのは 。 アインシュタインのオプションで示されたケースの場合、 スピンの軸 への投影を測定すると、 が確実に得られ、 スピンの軸 への投影を測定すると、 が(かろうじて)得られます。 しかし、ボルンのオプションでは、可能性は広く開かれている。 角運動量が保存されているのは事実だ。 しかし、2つの磁場は同じ軸を向いていないので、粒子は(磁場との相互作用によって)異なる軸に倒れなければならない状況に追い込まれる。 次のセクションでは、量子力学を使って、ルーカスとリアーナが測定された軸で同じ符号(++または--)を得る確率と、反対の符号(+-または-+)を得る確率を決定する。
予測
アインシュタインの立場(隠れた変数)は何を予測するのか?
もしアインシュタインのオプションが本当なら、 と の任意のペアは、それらのスピンにベクトル成分のセットを持つことになる。 例えば、電子は成分 を持つかもしれないが、その場合、陽電子は成分 を持たなければならない。ここでは、各軸への投影の符号を指定しているだけで、大きさを指定しているわけではない。 このような崩壊が非常に多数( )起こるようにし、以下の表を作成するために測定値を集めたとしよう。
人口 | パーティクル1 | パーティクル2 |
|---|---|---|
上の表の各ケースについて、ルーカスとリアーナの軸には9つの選択肢が考えられる: 、 、 、 、 、 、 、 。この表から読むと、2人のオブザーバーが1行目と8行目で同じ符号を測定する確率はゼロである。 2行目から7行目まで、同じ符号を得るには4つの方法がある:
同じ符号: 、 反対のサイン , , 、
つまり、アインシュタインのオプションが量子状態の正しい解釈であるならば、ルーカスとリアーナがランダムに選んだ軸に同じ符号のスピンを投影する確率は、すべての可能な母集団を合計したものになる: ここで等式が成り立つのは、 。
理解度チェック
上のグラフの2行目では、ルーカスとリアーナの測定値が同じ符号になる可能性のあるすべての方法と、異なる符号になる可能性のあるすべての方法を列挙した。 これを3列目も繰り返す。
同じ符号: 、
反対側のサイン , , 、
上の表は "母集団 "を示している。つまり、もし隠れ変数の扱いが正しければ、自然が生み出す各タイプの命令の数はわからないということだ。 から の分布がどのようなものであっても、測定から同じ符号が得られる確率は常に4/9以下であることを示せ。
まず、 が一定であるように、全測定試行回数が一定であると仮定することから始めよう。 の場合、式は次のようになる
ここで、 または のどちらかだとする
すべての試行の合計、 は以前と同じである。 しかし、 または が0から増えているので、 から の合計は以前より少なくなっているはずである。 特に、 から までの合計は、 よりも小さい
すべての可能なケースを組み合わせると、 となる。
汎化
上記の処理では、特定の軸に沿った測定を考慮した。 もちろん、どの軸に沿った測定も可能だ。 つの粒子の2つのスピンベクトルを と と呼ぶことにする。2粒子系の状態が のよく定義された値に対応するような隠れ変数を とします。 を の確率密度とします。 最後に、スピンベクトルと隠れた変数が与えられたときに、どちらかの粒子(AまたはB)に対して行われる測定の結果があらかじめ決定されているものとして、記号 と を選びます。 批判的に言えば、 は から独立しており、 は から独立していることに注意されたい。ここで、AとBの測定値間の相関に関連する質問をいくつでも投げかけることができる。 特に、次の式で与えられる期待値について尋ねることができる
これらの値について、 、 、 に対する正規化など、いくつかの標準的な仮定が与えられれば、2つの粒子間の相関が次の関係に従うことを示すことができる
ここで、 と はシステムのスピン状態であり、 と は参照スピン状態(システムの他の可能なスピン状態)です。 これは、現在「ベルの不等式」として知られている不等式の一種である。 ここではこの一般的な形は使わない。 その代わりに、ある特定の実験セットアップに焦点を当て、そのセットアップを量子回路にマッピングできるようにする。
ボーンの解釈(非決定論的量子力学)は何を予測するのか?
ルーカスはある軸を選び、ある粒子のスピンがプラスかマイナスのどちらかの方向にあることを見つける。 彼が何を得たにせよ、 の軸がその方向になるように、軸の向きを変えよう。 中間子の崩壊後、測定前の初期状態を次のように書くことができる
リアーナは自分の粒子のスピンを、ルーカスのスピンと相対的な角度( )で別の方向に沿って測定する。 任意の方向 に沿ったスピン演算子は次式で与えられる
この演算子の固有状態は
理解度チェック
が上記の演算子 の固有状態であることを検証し、固有値を求めよ。
と を用いると、次のようになる
これは、 が固有状態であり、対応する固有値が であることを示している。
Lucasが選んだ軸に沿った正方向のスピンを測定する確率 Rihannaも選んだ方向に沿った正方向のスピンを測定する確率 は次のようになります
理解度チェック
についても同様である。同じように
これらの結果を加えると、測定された2つの軸の符号の確率は同じであることがわかる 。
理解度チェック
この結果の計算をチェックするために何ができますか? はっきりさせておきたいのは、私たちは、それが自然界と一致しているかどうかをまだ検証してほしいとは頼んでいない。
(1) についても同様の計算を行い、確率の保存を検証する。
(2) 既知のケースをチェックする。 を挿入する。そうすると、 、2人の観測者がそれぞれ同じ軸に沿ってスピンを測定することになり、角運動量保存則に反することになる。 したがって、その確率はゼロになると予想され、実際、 を挿入すると、 が得られる。
(3) 別の既知のケースをチェックする。 を試す。何を入手すべきか。 に気をつけて。
私たちは特に、軸が互いに対して にある場合をスケッチしていた。 ルーカスがどの方向( , , または )を選んだとしても、それを と呼ぶ。そして、Rihannaは , , のいずれかに沿って測定することをランダムに選択する。彼女の選択がLucasの選択(符号まで)と同じであれば、2人は に沿って測定していることになり、Rihannaが も測定する確率はゼロである。 リアーナの軸の選択はルーカスの選択とは無関係なので、これは1/3の確率で起こるはずだ。 それ以外の選択肢の場合、リアーナは (時間の1/3)から ラジアン、または (時間の1/3)から ラジアンのいずれかの軸に沿って測定することになる。 そしてもちろん、これらの軸のいずれかに沿って、スピンはプラス方向かマイナス方向かを測定することができる。 これで、ルーカスとリアーナが同じサインを得る確率の合計が出た:
WOW
我々はそれを示しただけだ
一歩下がってみよう。
アインシュタインとボルンの選択肢は、測定の前に何が起こるかについての記述に違いがあるだけなので、常に同じ結果が得られるように思われた。 そして、ある軸に沿ったスピン測定の符号を事前に決定する指示があったと仮定すると、測定が同じ符号をもたらす確率の制約が得られました 。そして、量子力学のように確率分布を仮定しました。 を計算し、 に異なる値を求めた。量子力学からの予測は、隠れた変数の扱いによって許容される値よりも高い。 だから、実際に実験をして、量子力学的な状態が測定前に自然界で決定されているのか、それとも本当に起こりうる状態の確率的重ね合わせの中にあるのかを発見することができる。
この実験は、多くの場合光子であるさまざまな物理系を使って何度も行われてきた。 測定の偏り、測定のタイミング(同時性)、その他多くの微妙な考慮事項がある。 何十年もの間、こうした微妙な問題に対する懸念は着実に薄れてきた。 しかし、 IBM® 量子コンピュータを使用することで、ここで得られる答えが正しいということは、現在では広く合意されている。
実際の量子コンピューターでテストしよう!
上記の取り扱いに従い、ルーカスの測定方向を と定義しよう。これは代数的アプローチでも便利であったが、量子計算では特に便利である。一般的に測定されるのは、 に沿った量子ビットの射影だからである。 の場合と同じ確率条件を与える量子回路を作りたい。平面の向きは自由で、 、次のようになる。
議論の指針として、 IBM 量子コンピューターについて少し知っておく必要がある。 まず、量子ビットは の状態で初期化される。 前述したように、測定は 。 つまり、上記の複雑な式を得るために、測定基底状態 と量子ビットの初期状態 の間にどのような演算子を挿入できるかを決定することが目的である。 そのためには、量子コンピューティングの基本的なゲートをおさらいする必要がある。
ゲート:NOT演算に相当する。 単一量子ビットゲート。
Qiskitでは、 ゲートで回路を作ると次のようになる:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
ハダマードゲート:重ね合わせ状態を作り出す。 単一量子ビットゲート。
ハダマードゲートを使った回路は次のように作られる:
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
CNOT Controlled-NOTゲート:このゲートは、コントロールとターゲットの2つの量子ビットを使用する。 変更されていない制御量子ビットの状態をチェックする。 しかし、もし制御量子ビットが の状態であれば、ゲートはターゲット量子ビットの状態を変化させる。もし制御量子ビットが の状態であれば、変化は全く起こらない。 以下の表記では、1番目の量子ビットをコントロール、2番目の量子ビットをターゲットとする。
CNOTゲートは、2つの量子ビットを必要とするので、回路的には少し違って見える。 これが実施方法だ:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
qc.cx(0,1) に記載されている最初の量子ビットがコントロールで、2番目の量子ビットがターゲットであることに注意。 図式的に言えば、"+"マークか十字架があるのがターゲットだ。
回転Yゲート:Y軸を中心に状態を回転させる。 これは1量子ビットのゲートである。
最後に、回転ゲートは、ゲートのタイプ、回転量、ゲートが置かれる量子ビットを順に指定することで実装される:
import numpy as np
pi = np.pi
qc = QuantumCircuit(2)
qc.ry(pi / 2, 0)
qc.draw("mpl")Output:
ゲート名 ry は、回転が発生する軸を指定する。 最初の引数 は回転量を表し、2番目の引数はゲートが置かれる量子ビットを指定する。
理解度チェック
上記で紹介した構文、または新たに紹介した構文を使って、4つの異なるタイプの量子ゲートを含む任意の量子回路を作ってください。
もちろん、可能性は無限にある。 以下に例を 1 つ示します。
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")
物理実験から量子回路へ
これらのゲートの操作から、例えば、 :
には、重ね合わせを得るためのハダマードゲートと、もつれを作り出すためのCNOTゲートが含まれる可能性が高い。
H、X、CNOTゲートを使って、 を にする:
ここで 、Lをコントロール、RをターゲットとするCNOTゲートを意味する。 これで、州のRの部分を因数分解することができる:
これで、量子ビットのデフォルトの開始状態で動作する量子ゲートとして、ケットを完全に記述したことになる。
ここで、 に作用する を使って、 の式のブラジャーを求めることができる。
これらの結果を組み合わせると、確率 を次のように書くことができる
これによって、量子回路の作り方が明示される。 ルーカスとリアーナが測定した粒子の量子状態を表す量子ビットに、X、H、CNOT、 ゲートを適用し、測定を行って確率を求める。
IBM Quantumは、我々がQiskitパターンと呼ぶフレームワークを使って量子コンピューティングの問題に取り組むことを推奨している。 以下のステップで構成される。
- ステップ1:問題を量子回路にマップする
- ステップ2:実際の量子ハードウェア上で動作するように回路を最適化する
- ステップ 3: ランタイム・プリミティブを使って、 IBM 量子コンピュータ上でジョブを実行する
- ステップ4:結果の後処理
基本的に、上でやった作業はすべてステップ1だった。 出来上がった回路をQiskitを使って作ってみよう!
ステップ1: 結果を量子回路にマッピングする
# 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つの量子回路を作り、その結果を合計する必要がある。 最初の1つについては丁寧に説明し、最後の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")Output:
以下のコードは、3つの回路をより合理的な方法で素早く構築する。 3つの回路の違いは、2つの量子ビットを 。
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")Output:
ここでは、「 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)各サーキットのカウントを見ると、2つは基本的に同じで、3つ目はまったく異なっている。
plot_histogram(counts_list)Output:
可能性のある結果のリストを作り、3つの回路それぞれからの各状態のカウントをすべて合計して、全体の確率を求めよう。
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)Output:
{'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")Output:
ステップ3: ランタイムプリミティブを使用して、 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)Output:
{'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_listOutput:
[None, None, None]
ステップ4:後処理と分析
一歩戻って復習してみよう:隠れ変数の扱いと3つのオフセット軸を使って、我々は測定値が同じ符号になる確率の制約を求めた 。次に、量子力学と同じように確率分布を仮定し、その確率に異なる値を求めた。 。量子力学からの予測は、隠れた変数の扱いによって許される予測よりも高い。 つまり、量子力学的な状態が測定前に自然界で決定されているのか、それとも本当に起こりうる状態の確率的重ね合わせの中にあるのかを実験的に知ることができる。
私たちは、ルーカスとリアーナがスピンの投影のいずれかの符号を測定した場合に対応する4つの可能な結果があるように量子回路を設計した:00、01、10、11である。 00と11の場合、ルーカスとリアーナは同じサインを測り、01と10の場合は反対のサインを測る。 非常によく近似すると、ルーカスとリアーナが同じサインを得る確率は約50%であり、 よりも確実に大きいことがわかる。これは、この確率分布を説明できる隠れ変数のセットが存在しないことを意味し、隠れ変数の扱いは実験と両立しない。
量子力学的な実験結果にはさまざまな解釈があり、実験セットアップには微妙な点が多く、たびたび見直されている。 しかし、これまでのところ、量子力学の原理と量子状態の確率論的解釈が結果を正確に説明している。 マックス・ボルンは正しかったようだ。
もう一度だけ、この意味を考えてみよう。 崩壊現象から2つの粒子が出現し、2つの粒子は異なる方向に、おそらく長い時間移動する。 スピンは明確に定義された状態にはなく、将来の測定結果を決定するための隠れ変数の指示も持っていない。 しかし、一方(例えば )の測定は、もう一方の粒子のスピンを の方向に沿って測定する実験の結果を必然的に決定する(それは でなければならない)。このことは、ある粒子の物理学に関する何かが、もう一方の粒子(おそらくは遠くにある粒子)に対して行われることによって決定されることを意味する。 これが、人々が現実を「非局所的」と呼ぶに至った状況のひとつである。
これまで説明してきたような2つの粒子は、一方を測定することでもう一方に影響を与えることができるという意味で、何らかの形で「つながっている」。 私たちはこのような粒子を「もつれ」と呼んでいる。 エンタングルメントは単なる相関関係ではない。 例えば、磁石の北端を上にして一方に吐き出し、北端を下にしてもう一方に吐き出す古典的な機械を作ることができる。 このような磁石は完全に反相関している可能性がある。 しかし、一方を測定しても、他方には何の影響もない。 量子力学的なエンタングルメントでは、粒子Aは未定義の状態(あるいは多くの状態が混在した状態)にある可能性があり、全く別の粒子(例えばB)の測定によって、定義された状態に突き止めることができる。 クラシックの世界にはそんなものは存在しない。
これはしばしば、まったく新しい疑問や可能性をもたらす。 量子コンピュータのように、エンタングルメント(もつれ)を使って計算するようなアイデアだ! エンタングルメント(もつれ)を使って光よりも速く情報を送ろうとするなど、魅力的だが失敗に終わるものもある。 私たちは、あなたが思いつく限りの質問をし、他の人々がどのようにこれらの現象を調査したかを読むことを勧める。 量子力学の世界を探求するのは簡単ではないが、ここではいくつかのリソースを紹介しよう:
IBM 量子コース:
興味深い量子力学の論文
量子力学の教材
- コロラド大学の量子Iコース教材。
量子力学の教育研究
- 上級量子力学における生徒の困難さのレビュー by C. シンとE. マーシュマン
質問
指導者は、このノートがどのように使用されているかについての簡単なアンケートに答えることで、解答と一般的なカリキュラムにおける配置についてのガイダンスが付いたバージョンのノートを要求することができる。
重要な概念:
- 量子力学は決定論的なのか確率論的なのか。
- 隠れた変数、つまり局所的実在論は、量子力学の観測結果とは一致しない。 つまり、量子力学で観測される相関関係は、単に未知の変数によって説明できるものではない。
- 量子力学は確率論的である。
- エンタングルメントは現実であり、観測可能である。
- エンタングルメントは相関関係だけではない。
- 現実世界のシナリオを量子コンピューターにマッピングすることができる。
- 隠れた変数とは、自然界では特定されているが、人間には未知の量のことで、この文脈では存在しない。
正誤問題:
- T/F アルベルト・アインシュタインは、量子力学は理論として不完全であると主張した。なぜなら、量子力学は結果の確率を記述しているだけで、その結果を決定する根本的なメカニズムを記述していないからである。
- T/F 「隠れた変数」とは、2つの量子力学的粒子がもつれ合う可能性があるという考え方のこと。
- T/F いかなる2つの相関系も量子力学的にもつれる。
- T/F 量子力学的なもつれは数学を正しく理解するために重要だが、実験ではそれを見ることはできない。
- T/F ほとんどの場合、量子力学では実験の正確な結果を知ることはできない。
- T/F 量子力学では、ある条件下では、粒子Aと粒子Bが接触しておらず、粒子を交換していなくても、粒子Aの状態が粒子Bの状態に影響されることがある。
- T/F 現実世界の実験を量子回路にマッピングすることができる。
MCの質問:
-
spin-0 粒子が2つの spin-1/2 粒子AとBに崩壊するとする。 粒子 A に測定が行われ、そのスピンが に沿って投影されていることが明らかになる。粒子B
- a. 間違いなく、スピンが投影されている
- b. 間違いなく、スピンが投影されている
- c. 間違いなく、スピンが投影されている
- d. どの軸を測っても、間違いなく負のスピンが投影されている。
-
spin-0 粒子は、 spin-1/2 2つの粒子AとBに崩壊する。 粒子Aが に沿った投影を持つように測定された場合、粒子Bの測定で可能な投影はどれか 該当するものすべてに○をつけてください。
- a.
- b.
- c.
- d.
- e.
- f.
-
spin-0 粒子が2つの spin-1/2 粒子AとBに崩壊するとする。 測定前の粒子Aの状態を最もよく表すものは何か。
- a. 粒子Aのスピンは に沿っている。
- b. 粒子Aのスピンは に沿っている。
- c. 粒子Aのスピンは に沿っている。
- d. 粒子Aのスピンはある方向に沿って定義されるが、他の方向には定義されない。
- e. 粒子Aのスピンの向きは、測定前は自然界では未定である。
-
ハダマルドゲートについて正しいものはどれか? 該当するものをすべて選択します。
- a.
- b.
- c.
- d.
-
Xゲートについて正しいものはどれか? 該当するものをすべて選択します。
- a.
- b.
- c.
- d.
- e.
-
次のうち、2量子ビットゲートはどれか?
- a. X
- b.
- c. H
- d. CNOT
-
ある量子ビットが の状態にあるとする。 の状態にあることを測定する確率は?
- a. ノイズのないシミュレーターでは100%、実際の量子コンピューターではほぼ100%
- b. ノイズのないシミュレータではほぼ100%、実際の量子コンピュータでは正確に100%
- c. ノイズのないシミュレーターでは正確に0%、実際の量子コンピューターではほぼ0%
- d. ノイズのないシミュレーターではほぼ0%、実際の量子コンピューターでは正確に0%
ディスカッションの質問:
-
友人A、B、Cが、ベルの不等式に関連するこの実験室の結果について話し合っている。 具体的には、彼らは、軸に沿って同じ符号を測定する量子力学的確率が、隠れ変数の扱いによって許容される確率よりも大きいことを示す画像を見ている。 。友人Aは "これは測定の前にスピンの状態を知らなかったことを意味する "と言っている 友人Bは「いや、それ以上だよ。 これは、測定前にスピンがすでに特定の方向を向いていないことを意味する。 でも、スピンの状態は何らかの方法で決定されたり、保存されたりするかもしれない」友人Cは言う。 つまり、未来のスピンの状態は、測定前に自然が決めたものでもないのだ 誰の意見に賛成ですか?
-
エンタングルメントのような量子力学的現象が、現実が非局所的であることを示していることを説明しなさい。
-
ここで得られた結果に納得するために、さらにどのような実験をしたいですか?
-
ベルの不等式は、等間隔に配置された3つの軸 、 、 でのみ探究できるだろうか?他の軸数でも可能か? これはどのようなものだろうか? それでも、隠れた変数が予測する確率と確率論的量子力学が予測する確率には違いがあるのだろうか?