量子コンピュータを用いたシュテルン・ゲルラッハ実験
このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた Python 環境が必要です:
qiskitv2.1.0 または新しいqiskit-ibm-runtimev0.40.1 または新しいqiskit-aerv0.17.0 または新しいqiskit.visualizationnumpypylatexenc
上記のパッケージをセットアップしてインストールするには、 Qiskitのインストールガイドをご覧ください。 実際の量子コンピュータでジョブを実行するには、 IBM Quantum® のアカウントを設定する必要があります。 IBM Cloud アカウントの設定ガイドの手順に従ってください。
このモジュールはテストされ、2秒の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 でご覧ください。
背景
1900年代初頭、原子スケールで量子化された振る舞いを示す証拠が増えつつあった。 マックス・プランクによる紫外カタストロフィの説明や、オットー・シュテルンやワルター・ゲルラッハによる実験のような、多くのデータ解釈の成功は、量子力学の体系が必要であり、ある種の物理現象は量子化されるということを世界に確信させる上で重要だった。 シュテルン・ゲルラッハ実験(1921年にシュテルンが発案し、1922年にシュテルンとゲルラッハが実施)の場合、目的は原子の角運動量の量子化を確認することだった。
同じ頃、原子のモデルとして一般的だったのがボーア・ゾンマーフェルド・モデルで、これはボーア・モデルを拡張したもので、ボーア・モデルと同様に、電子は太陽の周りを回る惑星と同じような一定の量子化された軌道を描いて存在すると予測していた。
最終的に、この扱いは原子の量子力学的な振る舞いを説明するには不十分であることが判明したが、大まかには、原子の離散的なスペクトル線のように、観測された多くの現象を予測していた。 特定のエネルギーを持つ電子の量子化された軌道は、角運動量の量子化された値に対応する。 スターンとゲルラッハが実験で観測しようとしたのはこの軌道角運動量であるが、この実験はスピンを含むあらゆるタイプの量子化角運動量に適用される。 シュテルン・ゲルラッハの実験をスピンに応用したことはよく耳にする。 最初の実験の焦点は軌道角運動量であったが、それは単にジョージ・ウーレンベックとサミュエル・ガウズミットが1925年までスピンの存在を理論化しなかったからである。
角運動量の種類に関係なく、角運動量を持つ電荷は磁気モーメントを持つ。 軌道運動の古典的な扱いでは、電荷 、質量 、角運動量 を持つ粒子は、次式で与えられる磁気モーメント を持つと予想される
量子力学的角運動量についてもほぼ同じ式が成り立つことがわかった。ただし、角運動量の種類に関係する数値比(g-factor と呼ばれる)を加えるという注意点がある。異なる種類の角運動量を組み合わせたり、任意の種類の角運動量に一般化したりする場合、 の代わりに を使うことがよくある:
古典的な物体については 。電子については、 、様々な原子核や素粒子については多くの値がある。 ここで重要なのは、角運動量が量子化されるということは、磁気モーメントも量子化されるということだ!
この磁気モーメントは磁場中でトルクを発生する:
そしてそれは、勾配がゼロでない磁場の中で力を経験する:
上の式は、一度にひとつの要素で考えることが多いので、 -の要素で考えると便利かもしれない:
式を組み合わせると、次のようになる
シュテルンとゲルラッハは、 のファクターについて知らなかったが、このファクターが式に含まれていたとしても、いくつかの既知の、あるいは測定可能な定数×角運動量に等しい力があることになる。 つまり、既知の勾配を持つ磁場を使い、磁場を通過する粒子の偏向を測定すれば、角運動量に関する情報が得られるはずだ。 これがシュテルン・ゲルラッハ実験の核心である。
図。 シュテルン・ゲルラッハ実験 [1]: 不均一磁場中を銀原子が移動し、そのスピンによって上下に偏向される。 古典的には、画面上には連続的な分布があると予想されるが、実験では2つの明確な点が見られる。
中性銀原子をオーブンで加熱した。 銀原子のビームがオーブンから流れると、ビームコリメータを使って不均一磁場の中心付近を進む原子だけを選択した。 もちろん、左右に少しずれている原子もあり、フィールドの勾配が弱くなったり、まったく勾配がなくなったりする。 だから、私たちは左右に離れた原子の挙動を過度に気にすることはない。 磁場勾配が原子を -方向のみに偏向させる力をもたらす。チャネルの中心を移動する原子に何が起こるかに興味がある。
古典的には何を期待すべきか?
もしこれらの原子が、かさばる古典的な磁石とまったく同じだったら、どのように振る舞うだろうか? 実験はできる。 小さなネオジム磁石を、大きくて強力な磁石の前に発射することを想像してみてほしい。 小さな磁石の向きはランダムだ。 しかし、大きな磁石の前を通り過ぎると、磁石はすぐに磁場に向きを変え、大きな磁石に引き寄せられる。 小さな磁石の大半は、大きな磁石の方に偏向する。 鋭い観察者なら、"省エネはどうなんだ?"と疑問に思うかもしれない
実際、外部磁場中の磁気モーメントにはポテンシャルエネルギーがある:
つまり、外部磁場の中で磁気モーメントが回転すると、次のようなエネルギーの変化が生じる:
外部磁場と完全に反整列した小さな磁石が反転して整列する特殊な場合、これはポテンシャルエネルギーの減少に相当する:
では、そのエネルギーはどこへ行くのか? 小さな冷蔵庫用ネオジム磁石のような古典的な磁石は、粒子が多く、ほとんどすべての量のエネルギーを熱として放散することができる。 磁気モーメントと外部磁場の間の初期角度と最終角度は何でもよく、少なくとも初期配向はランダムであろう。 つまり、それぞれの小さな磁石に対して、異なる量のエネルギーが熱として放散されることになる。 古典的な粒子のアンサンブルは、いくらでもエネルギーを熱として放散することができるからだ。
原子スケールに古典的思考を適用すると、どのようなことが予想されるだろうか?
少なくとも、原子スケールの磁石の場合はそうではない。なぜなら、作用している粒子の数が少なく、エネルギーが散逸する自由度が少ないからだ。 初期の量子力学の提案では、電子のような個々の粒子が吸収できるエネルギーは量子化され、電子は数個の特定のエネルギーしか吸収できないとされていた。 ランダムな初期配向は、ランダムな量のエネルギーの散逸を必要とするので、エネルギー準位が量子化された系では不可能なはずである。 余分なエネルギーを熱として放散することができなかったのだ。 では、その代わりに何が起こるだろうか?
理解度チェック
上記のような状況で何が起こると思うか説明してください。 つまり、熱としてエネルギーを放散できない原子レベルで小さな磁石がある。 そのため、初期の磁気ポテンシャルエネルギーは系に残っていなければならない。 しかし、外部磁場によってトルクがかかり、小型磁石を回転させて外部磁場に合わせようとする。 何が起こりますか。
小さな磁気モーメントは、外磁場と一直線になるように回転する。 しかし、瞬間的に整列しても、回転運動エネルギーがあるため、フィールドを越えて回転し続け、また整列から外れてしまう。 この挙動は、大きな古典磁石でも見られる。 しかし、そのような古典的な系では、エネルギーが熱に放散されるため、小さな磁気モーメントの振動はやがて止まる。 しかし、そのような散逸メカニズムがない系では、振動は無限に続くはずである。
上記の回答で予想される挙動を考えると、スクリーン上にどのような磁性粒子の分布が見られると予想されますか?
磁場の強い側への最大偏向(たまたま外磁場と一直線に並んでスタートした粒子)から、磁場の弱い側への最大偏向(外磁場と反一直線に並んでスタートした粒子)までの滑らかな分布と、その間のあらゆる偏向、それらの極値間のあらゆる初期方位に対応する。

量子力学は何を予測するだろうか?
おそらく、最も奇妙な可能性は次のようなものだろう:電子の角運動量が量子化され、ある軸への投影も量子化されたとしたらどうだろう? 角運動量が大きさとして量子化されるのは興味深いが、古典的な直観を使って、惑星の軌道が互いに交差しない固定軌道に落ち着き、ある一定の許容角運動量しか持たないことを論証しようとするかもしれない。 しかし、もしその角運動量ベクトルが、 に沿って正確に指すか、 と正反対に指すかだけで、 に沿って他の成分を持たないとしたら?別の方向に沿って測定したとき、そのベクトルが に沿って完全に指すか、 と正反対に指すかだけで、その間に何もないとしたらどうだろう? 古典的な直観を覆すような奇妙なことだ。
理解度チェック
場の方向に沿った角運動量の投影が量子化されているこの最後のケースでは、スクリーン上の粒子の分布はどのようなものになると予想されますか? 装置の中心を完全に通過する粒子だけを考慮することも、中心からわずかに外れてグラデーションが弱くなる粒子を含めることも自由です。 はっきり言えばいい。
装置の中心にある粒子は、単一の不均一磁場を経験し、すべての粒子が磁気モーメントに対して2つの方向のいずれかを持つことが測定される。 つまり、勾配に沿って最大に偏向されるか、勾配に逆らって最大に偏向されるかのどちらかであり、その中間はない。 もちろん、勾配が弱くなる両側では、たわみは小さくなる。 横方向の位置が非常に大きい場合、粒子は完全に勾配の外側にあり、偏向していない粒子の領域が1つだけ存在する可能性がある。

量子ビットはこれを検証するのにどのように役立つのでしょうか?
ほとんどの量子コンピューターは「量子ビット」、つまり古典的ビットの量子アナログを使用している。 より具体的には、古典的なビットの「オン」/「オフ」状態に類似した、2レベルシステムとなるように設計されている。 量子コンピューティングパラダイムには、3レベルシステム(いわゆる "qutrits")や多レベルシステム("qudits "と呼ばれる)を利用するものが存在する。 しかし、ほとんどの研究は量子ビットに集中している。 特に、 IBM® 量子コンピュータは、固定周波数のトランスモン量子ビットと呼ばれるものを使用している。 これらは、原子の軌道角運動量やスピン角運動量とはかなり異なる。 しかし、電子のスピンのように、 IBM®。量子ビットは光と相互作用できる量子力学的なシステムであり、その上で測定を行うことができる。 実際、量子力学的なスピンの状態と量子ビットの計算状態がしばしば類推される。 例えば、"スピンアップ "状態は "計算0 "状態、"スピンダウン "状態は "計算1 "状態に関連づけられることが多い:
これらの類似点を利用して、 IBM 量子コンピューターで、原子の軌道角運動量やスピン角運動量の量子力学的挙動を模倣した量子力学的挙動を観測することができる。 我々は、これらの状態の線形結合を使用して同様の観測を行い、任意の方向に沿った角運動量に議論を拡張できるようにする。
最初の実験:単一測定
この最初の実験とモジュール全体を通して、私たちは「Qiskitパターン」として知られる量子コンピューティングのフレームワークを使用する:
- ステップ1:古典的入力を量子問題にマップする
- ステップ2:量子実行のための問題の最適化
- ステップ 3:
IBM Quantumプリミティブを使用して実行する - ステップ4:後処理と古典的分析
私たちは通常、これらのステップに従うが、必ずしも明示的にラベルを貼るとは限らない。
ステップ1:古典的な入力を量子問題にマッピングする
ここでは、古典的な入力は、シュテルン-ゲルラッハ装置で測定する前のスピンの配向である。 測定前の量子状態の正確な性質について心配しすぎる必要はない。 これはQiskit Classroomsの別のモジュール、ベルの定理のテーマである。
IBM、量子コンピュータは 。 したがって、この最初の実験は、 に沿った磁場勾配を用いたシュテルン・ゲルラッハ実験と非常によく似たものになる。異なる方向に沿って測定するためにシステムをどのように変更するかについては、後で説明する。
つまり、 と の混合物、あるいは と の混合物である。我々はいくつかの初期値を提案しました。 しかし、他の値やランダムな値で遊ぶのも自由だ。
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)Output:
0.7032089086145691 0.7109832845047109
では、上記の角度を量子回路のパラメータとして使ってみよう。 我々は一度に1つの粒子だけを考えているので、回路で使用する量子ビットは1つだけであり、必要な古典レジスタも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")Output:
ステップ2:量子実行のための問題最適化
実際量子コンピュータ上で実験を実行するには、 IBM Quantum Compute Service にログインし、量子コンピュータ(または「バックエンド」)を選択する必要があります。 以下では、利用可能な量子コンピュータの中から、最も負荷の少ないものを選択するだけです。
初回使用時に認証情報を保存するためのコードが以下にあります。 ノートブックを自分の環境に保存した後、必ずこの情報をノートブックから削除してください。そうすれば、ノートブックを共有するときにあなたの認証情報が誤って共有されることはありません。 詳しいガイダンスについては、 IBM Cloud アカウントの設定および信頼できない環境でのサービスの初期化を参照してください。
# Load IBM Quantum Compute 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)Output:
ibm_sherbrooke
つまり、選択した量子コンピューターで利用可能なベースゲートに回路をマッピングし、その量子コンピューター上で動作するように回路を最適化しなければならない。
# 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: IBM Quantum プリミティブを使用して実行する
では、これを実際の量子コンピューターで動かしてみよう。 そのために必要な構文はすべて、以下のコードブロックにある。 実際の量子コンピューターで割り当てられた時間を使い果たした場合、あるいはインターネット接続がない場合は、次のコードブロックのコメントを外すと、ローカルシミュレーター上でコードを実行することができる。
# 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)Output:
counts = {'0': 1}
1回測定して "0 "だった。 これは私たちにとって驚きではない。 私たちは量子ビットで構成された量子コンピュータを使っていることを知っており、古典的なビットが0か1を返すことに非常に慣れている。 しかし、これは磁気モーメントを持つ粒子で行われた実験の量子コンピューティング・アナログであることに留意してほしい。 もし、0と+1の間に均等な広がりがあると予想していたなら、最初の測定で極端な値が1つ出たことに驚いたかもしれない。 シュテルン=ゲルラッハ実験におけるこの驚くべき量子化こそが、私たちを自然に対するより深い理解へと導き、ひいては量子コンピュータの構築に役立ったのである。
測定値のアンサンブルを作るとどうなるか見てみよう。
第二の実験:多数の粒子の測定
このような多くの測定値の統計を取るには、ステップ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()前回同様、実際の量子コンピューターで実行できない場合は、最初の実験から上記のブロックのコメントを外し、 num_shots = 1 を num_shots = 100 以上に変更するだけでよい。
plot_histogram(counts)Output:
0を計測することもあれば、1を計測することもある。 それ以外のことを測定することはない! ショットの回数を変えてみると、0か1の確率は、ショットの回数を変えてもかなり一貫していることに気づくだろう。 つまり、状態の準備に関する何かが、測定結果の確率を決定しているようである。
第三の実験:オーブン内でのランダムな回転
シュテルン・ゲルラッハ実験では、研究者たちは、角運動量ベクトルがオーブンから現れる角度を指定することはできなかった。 向きはランダムだった(あるいは、もっと謎めいたものだった)! ベルの定理に関するQiskit Classroomモジュールを参照)。 この実験の合理的なアナログは、量子ビットの状態をランダムに初期化し、何度も測定を行うことだろう。
ステップ1:古典的な入力を量子問題にマッピングする
作りたい回路は前と同じだ。 唯一の違いは、今回、自由パラメータ と を持つゲートを使って回路を構成することである。そして、これらのパラメーターの数値は、新しい実行ごとに割り当てられる。
# 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")Output:
量子回路を1ショットだけ実行し、多数のランダムな構成で実行することは、量子コンピューターとしては異例のワークフローである。 確かにそれは可能だが、ここでは簡単のため、ローカル・シミュレーターを使うことにする。
# 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)Output:
つまり、量子ビットのランダムな初期状態(シュテルン・ゲルラッハ実験における角運動量のランダムな向きに対応する)は、0と1の状態を同程度の数(スピンアップとスピンダウンの状態を同程度の数)生み出すことがわかる。 これこそ、シュテルン・ゲルラッハの実験が示したものだ。
第四の実験:反復測定
量子ビットがランダムな状態からスタートする場合、一方の極値を測定する確率と他方の極値を測定する確率はほぼ半々であることがわかる。 しかし測定の後、量子ビットの状態(あるいは粒子の角運動量)はどうなるのだろうか? それに答えるためには、同じ量子ビットを複数回測定できる回路を定義する必要がある。 これを調べるための回路を定義してみよう。 我々は、 と の両方の状態を測定する可能性を許容したいので、qubitの初期状態をデフォルトの 状態から回転させる何かが必要である。 この場合、 から、ハダマードゲート を使用する。デフォルトでは、これらの測定はどちらも に沿って行われる。
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)Output:
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)Output:
上の図では、ビンに "00"、"01 "といったラベルが貼られている。 ここで、これらの数字は「2番目の結果、1番目の結果」を指している。 つまり、"00 "は両方の測定で の状態が得られたことを意味し、"01 "は最初の測定で 、2回目の測定で が得られたことを意味する。大半の量子ビットは、 の状態が2回測定されるか、 の状態が2回測定された。 量子ビットがある状態で測定され、その後別の状態で測定されることは非常にまれであり、そのような現象が起きた数少ないケース(♪~1%)はノイズによるものである。 この場合、ノイズは実際の量子システムの挙動に合わせてシミュレートされている。 このような連続測定間の相関は、スピン角運動量を持つ粒子のシュテルン-ゲルラッハ型測定でも観察される。 ある粒子が "スピンアップ "であると測定された場合、その直後に行われる次の測定では、再び "スピンアップ "となる(ノイズによる若干の変動はある)。
これは些細なことに思えるかもしれない。 結局のところ、ある量子ビットがある状態にあると測定された後、私がそれをもう一度素早く測定したら、なぜまだその状態にないのだろうか? しかし、この微妙さを本当に理解すれば、この現象を記述する数学的な道具を選ぶ助けになるかもしれない。
これまでの実験の分析
これまでの実験から、いくつかの気づきを集めてみよう:
- 量子力学的システムの測定は、一連の「許容値」のうちの1つしか得られない。 量子ビットや spin-1/2 粒子のような二値系では、測定は二値の結果のどちらか一方しか得られない。
- 二進法の状態をランダムに初期化すると(オーブンから出てくる spin-1/2 粒子のように)、二進法の測定結果のどちらかが可能になる。
- 一度測定が行われ、システムの状態が分かれば、同じ物理的観測量の測定を繰り返しても状態は変わらない! つまり、一度0の状態を得ても、再度測定すると0の状態のままである(システム内のわずかなノイズ ~0.1 %~1%)。
量子力学の確率論的な性質についてはまだ触れていないし、状態を固有状態に「折り畳む」ことについても何も言っていない。 上記の観察結果だけを用いると、ある特別な量子力学的状態の集合 を、おそらく定数まで変化させない数学的操作 を探したくなるかもしれない。 、 に沿って2回測定すると同じ結果が得られるからだ。 結局のところ、その検索は私たちが目にするすべての行動を説明することはできないだろう。 しかし、いくつかのことを説明することができるので、もう少し追求してみることにする。
そのような作戦は存在する。 あるベクトルに対する行列演算はベクトルを変化させ、他のベクトル(固有ベクトル)に対する行列演算は定数までベクトルを変化させない。 例えば、行列 とベクトル
および
以下にご注意ください。
しかし、他のベクトル、例えば については、次のようになる
行列を使って粒子のスピンを記述しようとするかもしれないし、「状態ベクトル」と呼ばれるベクトルを使って測定後の粒子の状態を記述しようとするかもしれない。 このような行列や状態ベクトルにどのような値を入れるべきかはまったく明らかではないが、これまでの測定から得られた唯一の性質は、状態をラベル付けするために使用できる、0か1( spin-1/2 粒子の文脈では「スピンアップ」または「スピンダウン」)を測定する確率であろう。 状態ベクトルのエントリーは、この確率(正確には確率、"確率の振幅"、つまりエントリーを二乗して確率を求める、など)に関連していると考えるべきだ。 しかしこの時点では、これらの行列のエントリーが厳密に実数であるべきか、複素数であるべきか、あるいは何であるべきかはわからない。 念のため、ベクトルと行列が以下を満たすような枠組みを開発してみよう:
- マトリックス演算子は可能な限り実験に接続される。 例えば、スピン行列の固有値と実験的に観測されたスピンの投影を関連付けることができる。
- 状態ベクトルは次のように確率に接続する:粒子が状態ベクトル にある場合、その後の測定で粒子が状態 にあることがわかる確率は です。
これによって、最初のマトリックスを開発する際の自由度が大きく広がった。 例えば
ここでいう とは、量子コンピューターと spin-1/2 システムには非常によく似た状態があり、しばしば互いに対応付けられるということである。 これらは異なるシステムを指しているため、まったく同じではないことは明らかだ。 しかし、これらの2状態システムを記述する代数は、同じルールに適合する可能性がある(ネタバレ注意:適合する!)。 このランダムな選択は、すでに1つの素晴らしい属性を持っていることに注意してほしい。 以下にご注意ください。
つまり、ある粒子がすでに の状態にある場合、その後の測定で が得られる確率は(ノイズの影響を除けば)1である。 というのも、ある状態がいったん0あるいは "スピンアップ "状態になると、その後の測定でもその状態が維持されることがすでに分かっているからだ。 上記の確率は確かに100%のはずだ。
理解度チェック
なぜなのか?
よりも良い選択だ、
測定の確率を内積の2乗に関連付けようとする我々の試みは、各ベクトルの大きさを1にする必要があることを意味する。 つまり、すべての に対して 、状態 にあるものが状態 にある確率は100%だからである。 これは「正常化条件」として知られている。
なぜなのか?
よりも良い選択だ、
それは異なります。 を最初に選ばなければならない理由はない。むしろ、これは慣例なのだ。 しかし、いったんその選択をすれば、その後の選択には一定の制約が課される。 下記を参照してください。
上記の実験では、最初にある状態( )にある量子ビットが、その後の測定でもその状態のままであることがわかったことを思い出してほしい。 これは、 にある量子ビットが(ノイズの影響を除けば) の状態で測定される確率がゼロであることを意味する。 内積と測定の確率との間に必要な関係は、次のようになる
一般性を損なうことなく、状態ベクトル を書くことができる。そして、次のように書くことができる
という要件、いわゆる「正規化条件」は、 を教えてくれる。これだけでは、 に対して、 に制限されるだけである。 を選ぶ理由は他にもあるが、それはこのトピックの紹介には及ばない。 今のところは、 がひとつの解決策であることで十分だろう。
私たちの分析はかなり進んでいる。 状態ベクトルの形式を選択することで、ここで働いている物理現象について何かを記述する行列を構築することができる。 特に、オリジナルのStern-Gerlach実験では、 軸に沿ったスピン角運動量成分に基づいて軌道の分裂を測定したため、まさにそれを記述する演算子が必要です。 。実験とのもう一つの重要な関連は、偏向量、移動時間、既知の磁場強度から、スピンの 成分の大きさを決定できることです。 これには実験装置の精度について多くの仮定が必要であるが、ここでは単純に、スピン角運動量の測定されたz成分が であることを再確認する。
そして、実験的に観測されたスピン成分に対応する固有値を持つ、実固有値(エルミート行列によって満たされる)を持つ行列を求めている。 一般性を失うことなく、 、と書くことができる:
を組み合わせ、 の総合係数を引くと、次のようになる
これは、量子力学の教科書には必ず載っている、よく知られたスピン-z演算子である。 この場合、「パウリ-ズ」作用素となり、通常 と表記される:
このパウリ演算子(および関連する行列)は、量子コンピュータのトランスモン量子ビットの状態など、2つの準位や2つの可能な測定結果を含む多くの物理系を記述することができるので、これは有用である。
この件に関連する他のオペレーターや状態に目を向ける前に、多くの人が誤解している事実をひとつ取り上げなければならない。 オペレーターの行動は測定とは違う。 ある意味では、「そんなことはない! ひとつは数学的な計算の一部として紙の上で起こることで、もうひとつは研究室で物理的なシステムに対して起こることだ」 その通りだが、それ以上だ。 スピンの -成分の測定を行うと、系の初期状態に関係なく、常に「スピンアップ」または「スピンダウン」の状態が得られます。 私たちはこのことを、量子コンピューティングのアナロジーである と で見た。状態を数百のランダムな向きになるように初期化し、測定すると常に か のどちらかが得られた。これは、測定が状態を固有状態に「折り畳む」こととして知られている。 これは、ある状態にマトリックスを適用したときには起こらない。 以下の質問を試してみてください。
理解度チェック
スピン状態の粒子から始めるとする
(a) この状態ベクトルに対して 演算子を作用させると何が得られるか? (b)この粒子のスピンの 成分を1回測定した場合、何が得られますか? (c)この状態と同じ粒子を多数用意し、スピンの 成分を何千回も測定すると何が得られるか?
(a)あなたは
これで完了です。 実験結果はない。 行列をベクトルに適用するだけで、わずかに異なるベクトルを得ることができる。このベクトルには新たに"-"記号が付き、プレファクター( )があるため、もはや大きさは1ではない。
(b) または が得られる。これは、それぞれ または の 軸上のスピンの投影を観察することに相当する。 各結果の確率を求めることもできる
つまり、スピンアップ状態の可能性が20%高いとはいえ、どちらの結果も可能であり、これら2つの状態のどちらか一方しか得られない。
(c)パート(b)で計算された測定確率によると、測定のおよそ60%がスピンアップ粒子を、およそ40%がスピンダウン粒子を生成します。
原子のスピンアップ状態と量子ビット状態のアナロジーを用いて、前問の(b)と(c)の部分の答えを検証しなさい:
量子回路をコード化して望ましい初期状態を作り出し、実際のハードウェアかシミュレータを使って、1回の測定結果や数百、数千回の測定結果をチェックする。
#Use the backend sampler for part (b) because it allows us to use a single shot. from qiskit_aer import AerSimulator backend_sim = AerSimulator.from_backend(backend) from qiskit.primitives import BackendSampler sampler = BackendSampler(backend = backend_sim) #Create a quantum circuit to initialize the state. import math psi = [math.sqrt(3/5),math.sqrt(2/5)] qc = QuantumCircuit(1,1) qc.initialize(psi, [0]) #Add measurement to the circuit qc.measure(0,0) qc.draw('mpl') #Set num_shots =1 for part (b) and num_shots = 1000 or more for part (c). num_shots = 1000 #Run the job and print the result. You should obtain only 0 or 1 in part (b) for a single shot. #You should obtain a probability distribution with approximately 60% 0 and 40% 1 in part (c) dist = sampler.run([qc_ibm], shots = num_shots).result() counts=dist[0].data.c.get_counts() print(counts) #You should obtain {0: 599, 1: 401} or something equivalently close to the 60%-40% distribution predicted.
第五の実験:異なる観測量の測定
これまでのところ、z軸に沿った測定しか行っていない。 シュテルン・ゲルラッハ実験では、例えばX軸に沿って測定したい場合、単純に不均一磁場を の軸に沿って向け、スクリーン上の に沿った偏向を探すことになる。 IBM しかし量子コンピュータは、1つの軸( )に沿ってしか測定できないように設計されている。 に沿って状態を測定するには、「基底の変更」を行わなければならない。 つまり、ブロッホ球の に沿った状態を 、またその逆を実行しなければならない。 これを実装する方法はいくつかあるが、好ましいのはハダマードゲートだ:
理解度チェック
、次のことを示す。
、次のことを示す。
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add a hadamard gate to rotate into the x-basis
qc.h(0)
qc.measure(0, 0)
qc.draw("mpl")Output:
この回路はシステムを回転させるので、( に沿って)測定すれば、回転前の の特性がわかる。 量子コンピュータは状態を に対応する に初期化することはすでに知っています。初期状態が の場合、 に沿ったスピンの投影を測定するとどうなるか見てみましょう。このステップをシミュレータで示し、異なる初期化を持つ他の回路の統計量を探索するように促します。
from qiskit.primitives import StatevectorSampler as Sampler
sampler_sv = Sampler()
job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())Output:
{'1': 4977, '0': 5023}
このことは、 (または同等の意味で、 )にある量子ビットの場合、 または に沿った投影を測定する確率はほぼ半々であることを示している。 ある意味、これは完全に理にかなっている。 結局のところ、何かがz方向を向いていたとしても、 を特に好むことはないだろう。もし (または )の状態から始めるなら、同じことが言えるかもしれない。確認してみよう:
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Add a NOT gate and hadamard gate. Measure.
qc.x(0)
qc.h(0)
qc.measure(0, 0)
qc.draw("mpl")Output:
job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())Output:
{'0': 4935, '1': 5065}
そのとおりです! ここでも、 に沿って投影を測定する確率は半々であることがわかる。 に沿った測定との類似性から、 に沿って確実にある状態に崩壊した粒子が、その後 に沿って測定される確率はゼロではないかとも考えられる。確認してみよう:
from qiskit import QuantumCircuit
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Rotate into x-basis using a Hadamard gate, then make two measurements in succession
qc.h(0)
qc.measure(0, 0)
qc.barrier()
qc.measure(0, 1)
qc.draw("mpl")Output:
job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())Output:
{'00': 504, '11': 520}
予想通り、投影が に沿って行われ、後に再び に沿って行われる結果が得られ、投影が最初は に沿って行われ、後に再び に沿って行われる結果が得られた。 投影が から 、あるいはその逆に切り替わるケースは見られない。 私たちは観察結果を収集し、それを使って行列形式の演算子や状態ベクトルを開発することができる。
私たちは知っている:
- または に沿った明確な投影を持つ州は、 に沿った投影を持つ確率が50%、 に沿った投影を持つ確率が50%である。
- に沿った明確な突起を持つ州が、後に に沿った突起を持つことが判明する可能性はゼロであり、その逆もまた然りである。
これらの結果を用いて、 に沿った定数正投影を持つ状態(これを と呼ぶ)と、 に沿った定数負投影を持つ状態(これを と呼ぶ)を構築することができる。これらの状態から、 で行ったのとまったく同じように、 に対応する行列を構成することができる。これらは学習者のための練習問題とする。 同様に、 の軸に沿って測定する実験を構築し、 と のベクトルを決定し、最後に の式を得ることができる。
これらのベクトルと行列をまとめると、次のようになる
質問
指導者は、このノートがどのように使用されているかについての簡単なアンケートに答えることで、解答と一般的なカリキュラムにおける配置についてのガイダンスが付いたバージョンのノートを要求することができる。
重要な概念:
- spin-1/2 粒子の場合、ある軸上のスピンの投影を測定すると、しばしば「アップ」と「ダウン」と呼ばれる2つの結果のどちらかしか得られない。
- Qubitsは、しばしば および と呼ばれる2つの状態のうちの1つでしか測定できない。
- spin-1/2、量子コンピュータの量子ビットを使ってシュテルン・ゲルラッハ実験をモデル化することができる。
- 同じ粒子/量子ビットの同じ物理観測量を繰り返し測定すると、(システムがノイズによって摂動されない限り)同じ結果が得られる。
- シュテルン-ゲルラッハ実験や量子コンピュータを用いた類似の実験から得られた結果を用いて、量子力学的スピンを記述する状態ベクトルと行列演算子の系を導くことができる。
正誤問題:
- T/F 実験的観察から出発して、 を表すベクトルとして唯一有効な選択肢は以下の通りである。
- T/F の場合、 の唯一の選択肢は である(グローバル・フェーズまで)。
- T/F の状態にあると測定された粒子は、 に沿って測定すると、 の状態にあることがわかる。
- T/F の状態にあると測定された粒子は、 に沿って測定すると、 の状態にあることがわかる。
- T/F の状態にあると測定された粒子は、 に沿って測定すると、常に の状態にあることがわかる。
MCの質問:
-
最初に にある粒子が の状態で測定される確率は?
- a. 0%
- b. 25%
- c. 50%
- d. 71%
- e. 100%
-
最初に にある粒子が の状態で測定される確率は?
- a. 0%
- b. 25%
- c. 50%
- d. 71%
- e. 100%
-
spin-1/2 粒子の状態 は、どのような量子コンピューティングの状態に最もよく関連しているか?
- a.
- b.
- c.
- d.
- e. 上記のいずれでもない
ディスカッションの質問:
- 3人の友人が量子測定と演算子について議論している。 友人Aは、「 に沿って測定をすることと、オペレーター を使って行動することは同じことだ」と言う 友人Bは、"手順が違うだけで、結果は同じだよ "と言う 友人Cは、「両者はまったく違う 誰の意見に賛成ですか?
自由回答問題:
- 実験的観察と提案された構文を考えると
大局的位相まで
、標準的な結果が得られる。
- 実験的観察と提案された構文を考えると
そして、チャレンジ問題3の結果を使用する:
大局的位相まで
謝辞
[1] Tatouteによる-自身の仕事、CC BY-SA 4.0、 https://commons.wikimedia.org/w/index.php?curid=34095239