量子コンピューターを使ったStern-Gerlach実験
このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた動作するPython環境が必要です:
qiskitv2.1.0以降qiskit-ibm-runtimev0.40.1以降qiskit-aerv0.17.0以降qiskit.visualizationnumpypylatexenc
上記パッケージのセットアップとインストールについては、Qiskitのインストールガイドをご覧ください。 実際の量子コンピューターでジョブを実行するには、IBM Cloudアカウントのセットアップガイドの手順に従って、IBM Quantum® のアカウントを作成する必要があります。
このモジュールはテスト済みで、2秒のQPU時間を使用しました。これはあくまでも推定値です。実際の使用量は異なる場合があります。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer 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'
下記でDr. Katie McCormickによるモジュールのウォークスルーをご覧になるか、こちらをクリックしてYouTubeでご覧ください。
背景
1900年代初頭、原子スケールにおける量子化された振る舞いの証拠が積み重なっていました。マックス・プランクによる紫外線破綻の説明や、オットー・シュテルンとヴァルター・ゲルラッハによる実験など、多くの重要な解釈やデータが、量子力学の体系が必要であること、そして特定の物理現象が量子化されていることを世界に示しました。Stern-Gerlach実験(1921年にシュテルンが考案し、1922年にシュテルンとゲルラッハが実施)の目的は、原子における角運動量の量子化を検証することでした。
同じ頃、原子の主流モデルはBohr-Sommerfeld模型でした。これはボーア模型の拡張であり、ボーア模型と同様に、電子が太陽の周りを公転する惑星のような特定の量子化された軌道に存在することを予測していました。

この取り扱いは最終的には原子の量子力学的な振る舞いを説明するには不十分であることが明らかになりますが、大まかには、原子の離散的なスペクトル線など多くの観測された現象を予測することができました。特定のエネルギーを持つ電子の量子化された軌道は、量子化された角運動量の値に対応しています。シュテルンとゲルラッハが実験で観測しようとしたのは、この軌道角運動量でした。ただし、この実験はスピンを含む任意の種類の量子化された角運動量にも適用できます。Stern-Gerlach実験がスピンに適用されると聞くことが多いかもしれません。元の実験が軌道角運動量に焦点を当てていたのは、単純にジョージ・ウーレンベックとサミュエル・ハウトスミットがスピンの存在を理論化したのが1925年のことだったからです。
角運動量の種類に関わらず、角運動量を持つ電荷は磁気モーメントを持ちます。軌道運動の古典的な取り扱いでは、電荷 、質量 、角運動量 を持つ粒子の磁気モーメント は次のように与えられると期待されます:
量子力学的な角運動量についてもほぼ同じ式が成り立ちますが、角運動量の種類に関連するg因子 と呼ばれる数値比を加える必要があります。異なる種類の角運動量を組み合わせたり、任意の種類に一般化したりする場合、 の代わりに が使われることが多いため、次のように書きます:
古典的な物体では です。電子では であり、様々な原子核や素粒子に対して多くの値が存在します。ここでの要点は、量子化された角運動量は量子化された磁気モーメントを意味するということです!
この磁気モーメントは磁場の中でトルクを受けます:
また、ゼロでない勾配を持つ磁場中では力を受けます:
上の式を一成分ずつ考えることが多いため、 成分で考えると便利です:
これらの式を組み合わせると、次の式が得られます:
シュテルンとゲルラッハは 因子について知りませんでしたが、この式にg因子が含まれていても、力はいくつかの既知または測定可能な定数と角運動量の積に等しくなります。したがって、既知の勾配を持つ磁場を使用し、磁場を通過する粒子のたわみを測定することで、角運動量に関する情報が得られるはずです。これがStern-Gerlach実験の核心です。

図. Stern–Gerlach実験[1]:不均一な磁場を通過する銀原子が、スピンに応じて上または下に偏向されます。古典的には画面上に連続分布が期待されますが、実験では2つの明確な点が見られます。
中性の銀原子がオーブンで加熱されました。銀原子のビームがオーブンから流れ出ると、ビームコリメーターを使って不均一な磁場の中心付近を通過する原 子のみが選別されました。もちろん、一部の原子は左右にわずかにずれ、弱い勾配の磁場や勾配のない磁場を経験します。したがって、左右に大きくずれた原子の振る舞いについてはあまり気にしません。関心があるのは、磁場の勾配が 方向にのみ力を及ぼすチャンネルの中心を進む原子に何が起こるかです。
古典的に何が期待されるでしょうか?
これらの原子がまるでかさばった古典的な磁石のように振る舞うとしたら、どうなるでしょうか?実験してみることができます。小さなネオジム磁石を大きくて強力な磁石の脇を通過させることを想像してください。小さな磁石の向きはランダムです。しかし、大きな磁石の脇を通過する際、小さな磁石はすばやく磁場に合わせて向きを変え、大きな磁石に引き寄せられます。大多数の小さな磁石は大きな磁石の方向へ偏向されます。鋭い観察者は「エネルギー保存はどうなるのか?」と疑問を持つかもしれません。
確かに、外部磁場の中にある磁気モーメントは、それに関連するポテンシャルエネルギーを持ちます:
したがって、磁気モーメントが外部磁場の中で回転すると、エネルギー変化が生じます:
小さな磁石が外部磁場に対して完全に反平行から平行に反転する特殊なケースでは、ポテンシャルエネルギーの減少に対応します:
では、そのエネルギーはどこへ行くのでしょうか?小さなネオジム冷蔵庫磁石のような古典的な磁石は多くの粒子を持ち、ほぼどんな量のエネルギーも熱として散逸することができます。磁気モーメントと外部磁場の間の初期および最終角度は何にでもなれ、少なくとも初期の向きはランダムになります。したがって、各小磁石ごとに異なる量のエネルギーが熱として散逸されます。しかし古典的には、古典粒子の集団はどんな量のエネルギーも熱として散逸できるため、これは問題ではありません。
古典的思考を原子スケールに適用すると何が期 待されるでしょうか?
少なくとも、原子スケールの磁石では事情が異なります。なぜなら、関与する粒子が少なく、エネルギーを散逸できる自由度も少ないからです。初期量子力学の提案では、さらに、電子のような個々の粒子が吸収できるエネルギーは量子化されており、電子はいくつかの特定の量のエネルギーしか吸収できないと示唆されました。ランダムな初期向きはランダムな量のエネルギーの散逸を必要とするため、量子化されたエネルギー準位を持つ系ではこれは不可能なはずです。過剰なエネルギーは熱として散逸できません。では、代わりに何が起こるのでしょうか?
理解度チェック
以下の問いを読み、答えを考えてから、三角形をクリックして答えを確認してください。
上記で説明した状況で何が起こるかを説明してください。つまり、熱としてエネルギーを散逸できない原子的に小さな磁石があります。したがって、初期の磁気ポテンシャルエネルギーは系内に留まらなければなりません。それでも、外部磁場がトルクをかけ、小さな磁 石を磁場に合わせようとします。何が起こるでしょうか?
答え:
小さな磁気モーメントは外部磁場に向かって回転します。しかし、一時的に整列した瞬間に回転運動エネルギーが残り、磁石はさらに回転して磁場を過ぎ、整列が崩れます。この振る舞いは大きな古典的磁石でも見られます。しかし、そのような古典的な系では、小さな磁気モーメントの振動はエネルギーが熱に散逸されることで最終的に止まります。しかし、そのような散逸機構のない系では、振動は無限に続くはずです。
上の答えで期待される振る舞いを踏まえると、画面上にどのような磁性粒子の分布が見られると期待しますか?
答え:
磁場の強い側への最大偏向(外部磁場と整列した状態から始まった粒子)から弱い側への最大偏向(外部磁場と反平行な状態から始まった粒子)まで、そしてその間のあらゆる偏向に対応するなめらかな分布が見られるでしょう。これらの極値の間のあらゆる初期向きに対応しています。

量子力学は何を予測するでしょうか?
おそらく最も奇妙な可能性は以下のものでしょう:電子の角運動量が量子化されているだけでなく、ある軸への射影も量子化されているとしたら?角運動量の大きさの量子化は興味深いですが、惑星の軌道が互いに交差しない固定した経路に落ち着き、特定の許容角運動量しか持たないという古典的な直感で議論しようとするかもしれません。しかし、もしその角運動量ベクトルが 軸上にしか向けられず、 軸に対して正確に平行か反平行しかなく、 成分にそれ以外の値を持つことができないとしたら?そして、別の方向で測定したとき、ベクトルは 方向に全体が向くか、 方向と反対を向くかのどちらかしかなく、その中間はないとしたら?それはあらゆる古典的な直感に反する奇妙なことでしょう。
理解度チェック
以下の問いを読み、答えを考えてから、三角形をクリックして答えを確認してください。
磁場方向への角運動量の射影が量子化されるという最後のケースで、画面上にどのような粒子の分布が見られると期待しますか?装置の中心を完全に通過する粒子だけを考えるか、勾配が弱い中心からわずかにずれた粒子も含めるかは自由です。ただし明確に述べてください。
答え:
装置の中心にある粒子は単一の不均一な磁場を経験し、磁気モーメントの向きが2つのうちの1つに測定されます。したがって、粒子は勾配と同じ方向に最大限に偏向されるか、勾配と反対方向に最大限に偏向されるかのどちらかであり、その中間はありません。もちろん、勾配が弱い両側では偏向が小さくなります。横方向に非常に大きくずれた位置では、粒子は完全に勾配の外にあり、偏向されない粒子の単一の領域だけが存在する可能性があります。

Qubitはこのテストにどのように役立つのでしょうか?
ほとんどの量子コンピューターは「Qubit」を使用します。これは古典的なビットの量子アナログです。より具体的には、古典的なビットの「オン」/「オフ」状態に類似した2準位系として設計されています。3準位系(「クトリット」と呼ばれる)や多準位系(「クーディット」と呼ばれる)を活用する量子コンピューティングのパラダイムも存在します。しかし、ほとんどの研究はQubitに集中しています。特に、IBM®の量子コンピューターは固定周波数トランズモンQubitと呼ばれるものを使用しています。これらは原子の軌道角運動量やスピン角運動量とはかなり異なります。しかし、電子のスピンと同様に、IBM®のQubitは光と相互作用し、測定を行うことができる量子力学的な系です。実際に、量子力学的スピンの状態と量子コンピューターの計算基底状態の間に類似が見られることがよくあります。例えば、「スピンアップ」状態が計算状態 0 に、「スピンダウン」が計算状態 1 に関連付けられていることがよく見られます:
これらの類似性を使って、IBM量子コンピューターにおける量子力学的な振る舞いを観測することができます。これは原子の軌道角運動量やスピン角運動量の量子力学的な振る舞いを模倣しています。これらの状態の線形結合を使って、任意の方向への角運動量に関する議論を拡張するための類似の観測を行います。
最初の実験:単一の測定
この最初の実験と、このモジュール全体を通じて、「Qiskitパターン」として知られる量子コンピューティングのフレームワークを使用します。このフレームワークはワークフローを以下のステップに分割します:
- ステップ1:古典的な入力を量子問題にマッピングする
- ステップ2:量子実行に向けて問題を最適化する
- ステップ3:Qiskit Runtime Primitivesを使って実行する
- ステップ4:後処理と古典的分析
これらのステップに従いますが、常に明示的にラベル付けするわけではありません。
ステップ1:古典的な入力を量子問題にマッピングする
ここでの古典的な入力は、Stern-Gerlach装置での測定前のスピンの向きです。測定前の量子状態の正確な性質についてはあまり心配しないでください。それはBellの定理に関する別のQiskit Classroomsモジュールのテーマです。
IBM量子コンピューターは 軸に沿って状態を測定することに注意してください。したがって、この最初の実験は 方向に磁場勾配があるStern-Gerlach実験と非常に似ています。後ほど、別の方向に沿って測定するようにシステムを変更する方法を見ていきます。
と 、つまり と の混合であるスピン状態のアナログを作ることから始めましょう。いくつかの初期値を提案しましたが、他の値やランダムな値を試してみてください。
import random
from numpy import pi
import numpy as np
# Use these lines to choose your own arbitrary state vector and normalize it.
# a = 2
# b = (1+1j)
# norm = np.sqrt(a*np.conjugate(a)+b*np.conjugate(b))
# a = a/norm
# b = b/norm
# print(a,b)
# Use these lines if you would rather look at at random spin orientations.
a = random.random()
b = random.random()
norm = np.sqrt(a * np.conjugate(a) + b * np.conjugate(b))
a = a / norm
b = b / norm
print(a, b)
0.7032089086145691 0.7109832845047109
次に、上の角度を量子Circuit のパラメータとして使用します。一度に1つの粒子のみを考慮するため、Circuit では1つのQubitのみを使用し、1つの古典レジスターのみが必要です。
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit, Parameter
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the quantum state
qc.initialize([a, b])
qc.measure(0, 0)
qc.draw("mpl")
ステップ2:量子実行に向けて問題を最適化する
実際の量子コンピューターで実験を実行するには、Qiskit Runtime Serviceをロードし、量子コンピューター(「Backend」)を選択する必要があります。以下では、利用可能な中で最も空いている量子コンピューターを選択します。
初回使用時に認証情報を保存するためのコードが以下にあります。ノートブックを共有する際に認証情報が誤って共有されないよう、環境に保存した後はノートブックからこの情報を削除してください。詳細については、IBM Cloudアカウントのセットアップと信頼できない環境でのサービスの初期化をご覧ください。
# Load the Qiskit Runtime service
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')
# Syntax for specifying a channel and instance (if you need to change from the default set above)
# service = QiskitRuntimeService(channel='<channel name here>', instance="<your instance name here>")
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
# Use the least busy backend, specify options as needed
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.least_busy()
print(backend.name)
ibm_sherbrooke
次に、Circuitをトランスパイルする必要があります。つまり、Circuitを選択した量子コンピューターで利用可能な基本ゲートにマッピングし、その量子コンピューター 上で実行するためにCircuitを最適化する必要があります。
# Transpile the circuit and optimize for running on the quantum computer selected
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
qc_ibm = pm.run(qc)
ステップ3:Qiskit Runtime Primitives を使った実行
これを実際の量子コンピューターで実行します。そのために必要なすべての構文を以下のコードブロックに示します。実際の量子コンピューターの利用時間を使い切ってしまった場合、またはインターネット接続がない場合は、次のコードブロックのコメントを解除してください。ローカルシミュレーター上でコードを実行できます。
# Specify that we want to use only a single shot, to represent a single measurement of a spin in a SG device.
num_shots = 1
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# 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.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# from qiskit_ibm_runtime import Batch,
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
実際の量子コンピューターで実験を実行できない場合は、以下のコードを使用してください。
# 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)
# num_shots = 1
# This runs the job
# dist = sampler.run([qc_ibm], shots = num_shots).result()
# This selects measurement counts for the 0th circuit, which in this case is the only circuit
# counts=dist[0].data.c.get_counts()
ステップ4:後処理と古典的解析
この非常に単純な実験では、古典的解析は実験結果の可視化のみで構成されます。
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'0': 1}
1回測定を行い、"0" が得られました。これは私たちにとって驚くことではありません。私たちは Qubit で構成された量子コンピューターを使っており、古典ビットが 0 または 1 を返すことには非常に慣れています。しかし忘れないでください。これは磁気モーメントを持つ粒子を使った実験の量子コンピューティング的な類比です。もし 0 と +1 の間に均等な分布を期待していたとすれば、最初の測定で一方の極値が得られたことは確かに驚きだったかもしれません。シュテルン=ゲルラッハ実験でこのような結果の量子化が観測されたことが、自然のより深い理解へと私たちを導き、そしてそれがやがて量子コンピューターの構築につながりました。
次に、多数の測定を行うとどうなるかを見てみましょう。
第2の実験:多数の粒子を測定する
このような測定の統計を収集するためには、ステップ1と2を繰り返す必要はありません。実験のショット数を増やすだけで十分です。以下のステップ3のインスタンスでショット数を自由に変えてみてください。
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
num_shots = 100
# Evaluate the problem using a QPU via Qiskit IBM Runtime
# 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.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()
# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()
前述のように、実際の量子コンピューターで実行できない場合は、第1の実験で示した上記のブロックのコメントを解除し、num_shots = 1 を num_shots = 100 以上に変更してください。
plot_histogram(counts)
測定結果として 0 が得られることも 1 が得られることもあることがわかります。それ以外の値は決して測定されないことに注目してください!ショット数を変えてみると、0 または 1 を測定する確率は、ショット数が異なる複数の実行間でほぼ一定していることがわかります。つまり、状態の準備の仕方が測定結果の確率をある程度決定しているようですが、1回1回の測定では 0 または 1 のどちらでも得られる可能性があります。
第3の実験:炉内のランダムスピン
シュテルン=ゲルラッハ実験では、研究者たちは炉から出てくる角運動量ベクトルの向きを指定することができませんでした。向きはランダムでした(あるいはさらに不思議なことでした!ベルの定理に関する Qiskit Classroom モジュールを参照してください)。その実験の合理的な類比は、Qubit の状態をランダムに初期化して多数回測定を行うことです。
ステップ1:古典的入力を量子問題にマッピングする
構築したい Circuit は前回と同じです。唯一の違いは、今回は自由パラメーター と を使って Circuit を構築する点です。それらのパラメーターの数値は、各実行ごとに割り当てられます。
# from qiskit.circuit import QuantumCircuit, Parameter
theta = Parameter("θ")
phi = Parameter("$\phi$")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add rotation gates for rotating the state of qubit 0 to random orientations
qc.rx(theta, 0)
qc.rz(phi, 0)
qc.measure(0, 0)
qc.draw("mpl")
1ショットのみで量子 Circuit を実行し、多数のランダムな設定についてそれを繰り返すのは、量子コンピューターとしては珍しいワークフローです。確かに実行は可能ですが、簡単のためにここではローカルシミュレーターを使用します。
# This uses a local simulator
from qiskit_aer import AerSimulator
# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
from qiskit.primitives import BackendSamplerV2
# This generates a simulator that mimics the real quantum system
backend_sim = AerSimulator.from_backend(backend)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend=backend)
# A list to store the accumulated probabilities of the two possible measurement outcomes.
probslist = {"0": 0.0, "1": 0.0}
# Choose how many "particles"/measurements
measurements = 100
num_shots = 1
for i in range(measurements):
# Assign a random orientation for each measurement
phi = random.random() * 2 * pi
theta = random.random() * 2 * pi
angles = [phi, theta]
circuit = qc.assign_parameters(angles)
qc_ibm = pm.run(circuit)
# Run the circuit
# job = sampler.run([circuit],num_shots = 1)
dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
# Update the list of probabilities
zeroterm = dist[0].data.c.get_counts().get("0") or 0
oneterm = dist[0].data.c.get_counts().get("1") or 0
probslist.update({"0": probslist.get("0") + zeroterm})
probslist.update({"1": probslist.get("1") + oneterm})
probslist.update({"0": probslist.get("0") / measurements})
probslist.update({"1": probslist.get("1") / measurements})
# print(probslist)
plot_histogram(probslist)
Qubit のランダムな初期状態(シュテルン=ゲルラッハ実験における角運動量のランダムな向きに対応)が、0 と 1 の状態を同程度の数で生成すること(スピンアップとスピンダウンが同程度の数で現れること)がわかります。これはまさに元のシュテルン=ゲルラッハ実験が示したことです。
第4の実験:繰り返し測定
Qubit がランダムな状態から始まると、どちらかの極値が測定される確率がほぼ 50:50 であることがわかります。しかし、測定後の Qubit の状態(または粒子の角運動量)はどうなるのでしょうか?それを調べるために、同じ Qubit を複数回測定できる Circuit を定義する必要があります。このために使用できる Circuit を定義しましょう。 と の両方の状態を測定できる可能性を持たせたいので、デフォルトの 状態から Qubit の初期状態を回転させるものが必要です。この場合、 であるアダマール Gate を使用します。デフォルトでは、これらの測定は両方とも 軸方向であることに注意してください。
from qiskit import QuantumCircuit
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the qubit to be a mixture of 0 and 1 states.
qc.h(0)
# Add a first measurement
qc.measure(0, 0)
qc.barrier()
# Add a second measurement
qc.measure(0, 1)
qc.draw("mpl")
qc_ibm = pm.run(qc)
# Step 3: Run the job
num_shots = 1000
dist = sampler.run([qc_ibm], shots=num_shots).result()
# To run on a simulator, uncomment the line below and comment out the line above.
# dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
counts = dist[0].data.c.get_counts()
print(counts)
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)
上の図では、ビンに "00"、"01" などのラベルが付いています。ここで、これらの数字は「第2の測定結果、第1の測定結果」を表します。つまり "00" は両方の測定で 状態が得られたことを意味し、"01" は第1の測定で 、第2の測定で が得られたことを意味します。Qubit の大部分は を2回測定されるか、 を2回測定されるかのどちらかでした。Qubit が一方の状態で測定された後に別の状態で測定されることは非常まれであり、そのようなことが起きた少数のケース(約1%)はノイズによるものです。今回の場合、そのノイズは実際の量子システムの挙動に合わせてシミュレートされています。この連続した測定間で観測される相関は、スピン角運動量を持つ粒子のシュテルン=ゲルラッハ型の測定でも観測されます。粒子が「スピンアップ」として測定されると、その直後の測定でも再び「スピンアップ」が得られます(ノイズによる小さなばらつきを除けば)。
これは些細なことに思えるかもしれません。結局のところ、Qubit がある状態で測定されたとして、すぐに再び測定すれば、なぜ同じ状態でないはずがあるでしょうか?しかし、この微妙な点にしっかりと着目すれば、この現象を記述するための数学的ツールを選ぶ助けにな るかもしれません。
これまでの実験の分析
これまでの実験からいくつかの観察をまとめてみましょう:
- 量子力学的システムの測定は、「許容される値」のセットの中の1つしか生じません。Qubit やスピン-1/2 粒子のような2準位系では、測定は2値の結果のいずれか一方しか生じません。
- 2値系の状態をランダムに初期化すると(炉から出てくるスピン-1/2 粒子のように)、2値の測定結果のどちらも得られる可能性があります。
- 一度測定が行われてシステムの状態がわかると、同じ物理的観測量を繰り返し測定してもその状態は変化しません!つまり、一度 0 状態が得られれば、再び測定しても 0 状態のままです(システム内の~0.1%から1%程度のわずかなノイズを除けば)。
まだ量子力学の確率的な性質や、状態が固有状態に「崩壊する」ことについて議論していないことに明示的に注意してください。上記の観察だけを使うと、 方向に2回測定しても同じ結果が得られることから、特定の量子力学的状態 を定数倍を除いて変化させない数学的操作 ()を探したくなるかもしれません。最終的に、その探索はすべての挙動を記述することに失敗します。しかし、いくつかのことは記述できるので、もう少し追求してみましょう。
そのような操作は存在します。行列演算はあるベクトルを変化させますが、他のベクトル(固有ベクトル)には定数倍を除いて変化を与えません。例えば、行列 とベクトル を
および
と定義すると、
しかし、別のベクトル に対しては、