メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

量子コンピューターを使ったStern-Gerlach実験

このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた動作するPython環境が必要です:

  • qiskit v2.1.0以降
  • qiskit-ibm-runtime v0.40.1以降
  • qiskit-aer v0.17.0以降
  • qiskit.visualization
  • numpy
  • pylatexenc

上記パッケージのセットアップとインストールについては、Qiskitのインストールガイドを参照してください。 実際の量子コンピューターでジョブを実行するには、IBM Cloudアカウントのセットアップガイドの手順に従って、IBM Quantum® のアカウントを作成する必要があります。

このモジュールはテスト済みで、2秒のQPU時間を使用しました。これはあくまでも推定値です。実際の使用量は異なる場合があります。

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_aer": "qiskit-aer", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
# 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で参照してください。


背景​

1900年代初頭、原子スケールにおける量子化された振る舞いの証拠が積み重なっていました。マックス・プランクによる紫外破綻の説明のようなデータの優れた解釈や、オットー・シュテルンとヴァルター・ゲルラッハによる実験の数々が、量子力学の体系が必要であること、そして特定の物理現象が量子化されていることを世界に納得させるうえで決定的な役割を果たしました。シュテルン=ゲルラッハ実験(1921年にシュテルンが考案し、1922年にシュテルンとゲルラッハが実施)の目的は、原子における角運動量の量子化を検証することでした。

同じ頃、原子の主流モデルはBohr-Sommerfeld模型でした。これはボーア模型の拡張であり、ボーア模型と同様に、電子が太陽の周りを公転する惑星のような特定の量子化された軌道に存在することを予測していました。

Bohr-Sommerfeld模型の図。中心の点が原子核を表す。その周りの円または楕円が原子軌道を表し、太陽の周りの惑星の公転軌道に非常によく似ている。エネルギーの高い軌道は原子核から遠い位置にある。

この取り扱いは最終的には原子の量子力学的な振る舞いを説明するには不十分であることが明らかになりますが、大まかには、原子の離散的なスペクトル線など多くの観測された現象を予測することができました。特定のエネルギーを持つ電子の量子化された軌道は、量子化された角運動量の値に対応しています。シュテルンとゲルラッハが実験で観測しようとしたのは、この軌道角運動量でした。ただし、この実験はスピンを含む任意の種類の量子化された角運動量にも適用できます。Stern-Gerlach実験がスピンに適用されると聞くことが多いかもしれません。元の実験が軌道角運動量に焦点を当てていたのは、単純にジョージ・ウーレンベックとサミュエル・ハウトスミットがスピンの存在を理論化したのが1925年のことだったからです。

角運動量の種類に関わらず、角運動量を持つ電荷は磁気モーメントを持ちます。軌道運動の古典的な取り扱いでは、電荷 qq、質量 mm、角運動量 L⃗\vec{L} を持つ粒子の磁気モーメント μ\mu は次のように与えられると期待されます:

μ⃗=q2mL⃗\vec{\mu} = \frac{q}{2m}\vec{L}

量子力学的な角運動量についてもほぼ同じ式が成り立ちますが、角運動量の種類に関連するg因子 gg と呼ばれる数値比を加える必要があります。異なる種類の角運動量を組み合わせたり、任意の種類に一般化したりする場合、L⃗\vec{L} の代わりに J⃗\vec{J} が使われることが多いため、次のように書きます:

μ⃗=gq2mJ⃗\vec{\mu} = \frac{gq}{2m}\vec{J}

古典的な物体では g=1g=1 です。電子では g≈2g\approx 2 であり、様々な原子核や素粒子に対して多くの値が存在します。ここでの要点は、量子化された角運動量は量子化された磁気モーメントを意味するということです!

この磁気モーメントは磁場の中でトルクを受けます:

τ⃗=μ⃗×B⃗\vec{\tau}=\vec{\mu}\times \vec{B}

また、ゼロでない勾配を持つ磁場中では力を受けます:

F⃗=∇(μ⃗⋅B⃗)\vec{F} = \nabla(\vec{\mu}\cdot\vec{B})

上の式を一成分ずつ考えることが多いため、zz 成分で考えると便利です:

Fz=μzdBzdzF_z = \mu_z \frac{dB_z}{dz}

これらの式を組み合わせると、次の式が得られます:

Fz=gq2mdBzdzJzF_z = \frac{gq}{2m} \frac{dB_z}{dz} J_z

シュテルンとゲルラッハは gg 因子について知りませんでしたが、この式にg因子が含まれていても、力はいくつかの既知または測定可能な定数と角運動量の積に等しくなります。したがって、既知の勾配を持つ磁場を使用し、磁場を通過する粒子のたわみを測定することで、角運動量に関する情報が得られるはずです。これがStern-Gerlach実験の核心です。

不均一な磁場を通過する銀原子が、スピンに応じて上または下に偏向される様子。古典的には画面上に連続分布が期待されるが、実験では2つの明確な点が見られる。

図. Stern–Gerlach実験[1]:不均一な磁場を通過する銀原子が、スピンに応じて上または下に偏向されます。古典的には画面上に連続分布が期待されますが、実験では2つの明確な点が見られます。

中性の銀原子がオーブンで加熱されました。銀原子のビームがオーブンから流れ出ると、ビームコリメーターを使って不均一な磁場の中心付近を通過する原子のみが選別されました。もちろん、一部の原子は左右にわずかにずれ、弱い勾配の磁場や勾配のない磁場を経験します。したがって、左右に大きくずれた原子の振る舞いについてはあまり気にしません。関心があるのは、磁場の勾配が zz 方向にのみ力を及ぼすチャンネルの中心を進む原子に何が起こるかです。

古典的に何が期待されるでしょうか?​

これらの原子がまるでかさばった古典的な磁石のように振る舞うとしたら、どうなるでしょうか?実験してみることができます。小さなネオジム磁石を大きくて強力な磁石の脇を通過させることを想像してください。小さな磁石の向きはランダムです。しかし、大きな磁石の脇を通過する際、小さな磁石はすばやく磁場に合わせて向きを変え、大きな磁石に引き寄せられます。大多数の小さな磁石は大きな磁石の方向へ偏向されます。鋭い観察者は「エネルギー保存はどうなるのか?」と疑問を持つかもしれません。

確かに、外部磁場の中にある磁気モーメントは、それに関連するポテンシャルエネルギーを持ちます:

U=−μ⃗⋅B⃗=−μBcos⁡(θ)U = -\vec{\mu}\cdot \vec{B} = -\mu B \cos(\theta)

したがって、磁気モーメントが外部磁場の中で回転すると、エネルギー変化が生じます:

ΔU=Uf−Ui=−μB(cos⁡(θf)−cos⁡(θi)).\Delta U = U_f - U_i = -\mu B (\cos(\theta_f) - \cos(\theta_i)).

小さな磁石が外部磁場に対して完全に反平行から平行に反転する特殊なケースでは、ポテンシャルエネルギーの減少に対応します:

ΔU=Uf−Ui=−μB(cos⁡(0)−cos⁡(π))=−2μB.\Delta U = U_f - U_i = -\mu B (\cos(0) - \cos(\pi)) = -2\mu B.

では、そのエネルギーはどこへ行くのでしょうか?小さなネオジム冷蔵庫磁石のような古典的な磁石は多くの粒子を持ち、ほぼどんな量のエネルギーも熱として散逸することができます。磁気モーメントと外部磁場の間の初期および最終角度は何にでもなれ、少なくとも初期の向きはランダムになります。したがって、各小磁石ごとに異なる量のエネルギーが熱として散逸されます。しかし古典的には、古典粒子の集団はどんな量のエネルギーも熱として散逸できるため、これは問題ではありません。

古典的思考を原子スケールに適用すると何が期待されるでしょうか?​

少なくとも、原子スケールの磁石では事情が異なります。なぜなら、関与する粒子が少なく、エネルギーを散逸できる自由度も少ないからです。初期量子力学の提案では、さらに、電子のような個々の粒子が吸収できるエネルギーは量子化されており、電子はいくつかの特定の量のエネルギーしか吸収できないと示唆されました。ランダムな初期向きはランダムな量のエネルギーの散逸を必要とするため、量子化されたエネルギー準位を持つ系ではこれは不可能なはずです。過剰なエネルギーは熱として散逸できません。では、代わりに何が起こるのでしょうか?

理解度チェック​

上記で説明した状況で何が起こるかを説明してください。つまり、熱としてエネルギーを散逸できない原子的に小さな磁石があります。したがって、初期の磁気ポテンシャルエネルギーは系内に留まらなければなりません。それでも、外部磁場がトルクをかけ、小さな磁石を磁場に合わせようとします。何が起こるでしょうか?

答え

小さな磁気モーメントは外部磁場に向かって回転します。しかし、一時的に整列した瞬間に回転運動エネルギーが残り、磁石はさらに回転して磁場を過ぎ、整列が崩れます。この振る舞いは大きな古典的磁石でも見られます。しかし、そのような古典的な系では、小さな磁気モーメントの振動はエネルギーが熱に散逸されることで最終的に止まります。しかし、そのような散逸機構のない系では、振動は無限に続くはずです。

上の答えで期待される振る舞いを踏まえると、画面上にどのような磁性粒子の分布が見られると期待しますか?

答え

磁場の強い側への最大偏向(外部磁場と整列した状態から始まった粒子)から弱い側への最大偏向(外部磁場と反平行な状態から始まった粒子)まで、そしてその間のあらゆる偏向に対応するなめらかな分布が見られるでしょう。これらの極値の間のあらゆる初期向きに対応しています。

磁石を通過する粒子ビームが磁場方向に沿ってさまざまな程度に偏向される図。遠くの画面に当たるとき、粒子は一本の線を形成する。

量子力学は何を予測するでしょうか?​

おそらく最も奇妙な可能性は以下のものでしょう:電子の角運動量が量子化されているだけでなく、ある軸への射影も量子化されているとしたら?角運動量の大きさの量子化は興味深いですが、惑星の軌道が互いに交差しない固定した経路に落ち着き、特定の許容角運動量しか持たないという古典的な直感で議論しようとするかもしれません。しかし、もしその角運動量ベクトルが zz 軸上にしか向けられず、zz 軸に対して正確に平行か反平行しかなく、zz 成分にそれ以外の値を持つことができないとしたら?そして、別の方向で測定したとき、ベクトルは xx 方向に全体が向くか、xx 方向と反対を向くかのどちらかしかなく、その中間はないとしたら?それはあらゆる古典的な直感に反する奇妙なことでしょう。

理解度チェック​

磁場方向への角運動量の射影が量子化されるという最後のケースで、画面上にどのような粒子の分布が見られると期待しますか?装置の中心を完全に通過する粒子だけを考えるか、勾配が弱い中心からわずかにずれた粒子も含めるかは自由です。ただし明確に述べてください。

答え

装置の中心にある粒子は単一の不均一な磁場を経験し、磁気モーメントの向きが2つのうちの1つに測定されます。したがって、粒子は勾配と同じ方向に最大限に偏向されるか、勾配と反対方向に最大限に偏向されるかのどちらかであり、その中間はありません。もちろん、勾配が弱い両側では偏向が小さくなります。横方向に非常に大きくずれた位置では、粒子は完全に勾配の外にあり、偏向されない粒子の単一の領域だけが存在する可能性があります。

粒子ビームが上または下に偏向され、画面上の2つの点のいずれかに当たり、これら2つの最大値の間に粒子がない図

Qubitはこのテストにどのように役立つのでしょうか?​

ほとんどの量子コンピューターは「qubit」を使用します。これは古典的なビットの量子アナログです。より具体的には、古典的なビットの「オン」/「オフ」状態に類似した2準位系として設計されています。3準位系(「クトリット」と呼ばれる)や多準位系(「クーディット」と呼ばれる)を活用する量子コンピューティングのパラダイムも存在します。しかし、ほとんどの研究はQubitに集中しています。特に、IBM®の量子コンピューターは固定周波数トランズモンQubitと呼ばれるものを使用しています。これらは原子の軌道角運動量やスピン角運動量とはかなり異なります。しかし、電子のスピンと同様に、IBM®のQubitは光と相互作用し、測定を行うことができる量子力学的な系です。実際に、量子力学的スピンの状態と量子コンピューターの計算基底状態の間に類似が見られることがよくあります。例えば、「スピンアップ」状態が計算状態 0 に、「スピンダウン」が計算状態 1 に関連付けられていることがよく見られます:

∣↑⟩∼∣0⟩|\uparrow\rangle \sim |0\rangle ∣↓⟩∼∣1⟩|\downarrow \rangle \sim |1\rangle

これらの類似性を使って、IBM量子コンピューターにおける量子力学的な振る舞いを観測することができます。これは原子の軌道角運動量やスピン角運動量の量子力学的な振る舞いを模倣しています。これらの状態の線形結合を使って、任意の方向への角運動量に関する議論を拡張するための類似の観測を行います。

最初の実験:単一の測定​

この最初の実験と、このモジュール全体を通じて、「Qiskitパターン」として知られる量子コンピューティングのフレームワークを使用します。このフレームワークはワークフローを以下のステップに分割します:

  • ステップ1:古典的な入力を量子問題にマッピングする

  • ステップ2:量子実行に向けて問題を最適化する

  • ステップ3: IBM Quantumプリミティブを使って実行する

  • ステップ4:後処理と古典的分析

これらのステップに従いますが、常に明示的にラベル付けするわけではありません。

ステップ1:古典的な入力を量子問題にマッピングする​

ここでの古典的な入力は、Stern-Gerlach装置での測定前のスピンの向きです。測定前の量子状態の正確な性質についてはあまり心配しないでください。それはBellの定理に関する別のQiskit Classroomsモジュールのテーマです。

IBM量子コンピューターは zz 軸に沿って状態を測定することに注意してください。したがって、この最初の実験は zz 方向に磁場勾配があるStern-Gerlach実験と非常に似ています。後ほど、別の方向に沿って測定するようにシステムを変更する方法を見ていきます。

∣↑⟩|\uparrow\rangle と ∣↓⟩|\downarrow\rangle、つまり ∣0⟩|0\rangle と ∣1⟩|1\rangle の混合であるスピン状態のアナログを作ることから始めましょう。いくつかの初期値を提案しましたが、他の値やランダムな値を試してみてください。

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:量子実行に向けて問題を最適化する​

実際の量子コンピューターで実験を実行するには、IBM Quantum Compute Service をロードし、量子コンピューター(「Backend」)を選択する必要があります。以下では、利用可能な中で最も空いている量子コンピューターを選択します。

初回使用時に認証情報を保存するためのコードが以下にあります。ノートブックを共有する際に認証情報が誤って共有されないよう、環境に保存した後はノートブックからこの情報を削除してください。詳細については、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)
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: 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)
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 は前回と同じです。唯一の違いは、今回は自由パラメーター θ\theta と ϕ\phi を使って 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 を定義しましょう。∣0⟩|0\rangle と ∣1⟩|1\rangle の両方の状態を測定できる可能性を持たせたいので、デフォルトの ∣0⟩|0\rangle 状態から qubit の初期状態を回転させるものが必要です。この場合、H∣0⟩=12(∣0⟩+∣1⟩)H|0\rangle = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) であるアダマール Gate HH を使用します。デフォルトでは、これらの測定は両方とも zz 軸方向であることに注意してください。

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" は両方の測定で ∣0⟩|0\rangle 状態が得られたことを意味し、"01" は第1の測定で ∣1⟩|1\rangle、第2の測定で ∣0⟩|0\rangle が得られたことを意味します。量子ビットの大部分は、2回とも ∣0⟩|0\rangle と測定されるか、2回とも ∣1⟩|1\rangle と測定されるかのどちらかでした。量子ビットが一方の状態で測定された後に別の状態で測定されることは非常にまれであり、そのようなことが起きた少数のケース(約1%)はノイズによるものです。今回の場合、そのノイズは実際の量子システムの挙動に合わせてシミュレートされています。この連続した測定間で観測される相関は、スピン角運動量を持つ粒子のシュテルン=ゲルラッハ型の測定でも観測されます。粒子が「スピンアップ」として測定されると、その直後の測定でも再び「スピンアップ」が得られます(ノイズによる小さなばらつきを除けば)。

これは些細なことに思えるかもしれません。結局のところ、qubit がある状態で測定されたとして、すぐに再び測定すれば、なぜ同じ状態でないはずがあるでしょうか?しかし、この微妙な点にしっかりと着目すれば、この現象を記述するための数学的ツールを選ぶ助けになるかもしれません。

これまでの実験の分析​

これまでの実験からいくつかの観察をまとめてみましょう:

  • 量子力学的システムの測定は、「許容される値」のセットの中の1つしか生じません。qubit やスピン-1/2 粒子のような2準位系では、測定は2値の結果のいずれか一方しか生じません。
  • 2値系の状態をランダムに初期化すると(炉から出てくるスピン-1/2 粒子のように)、2値の測定結果のどちらも得られる可能性があります。
  • 一度測定が行われてシステムの状態がわかると、同じ物理的観測量を繰り返し測定してもその状態は変化しません!つまり、一度 0 状態が得られれば、再び測定しても 0 状態のままです(システム内の~0.1%から1%程度のわずかなノイズを除けば)。

まだ量子力学の確率的な性質や、状態が固有状態に「崩壊する」ことについて議論していないことに明示的に注意してください。上記の観察だけを使うと、zz 方向に2回測定しても同じ結果が得られることから、特定の量子力学的状態 ∣ψ⟩|\psi\rangle を定数倍を除いて変化させない数学的操作 OO(O∣ψ⟩=c∣ψ⟩O|\psi\rangle = c|\psi \rangle)を探したくなるかもしれません。最終的に、その探索はすべての挙動を記述することに失敗します。しかし、いくつかのことは記述できるので、もう少し追求してみましょう。

そのような演算は確かに存在します。行列演算は、あるベクトルには変化を与えますが、別のベクトル(固有ベクトル)には、定数倍を除いてベクトルを変化させません。例えば、行列 MM とベクトル ∣v⟩|v\rangle を考えてみましょう。

M=(1221)M= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}

および

∣v⟩=(11)|v\rangle = \begin{pmatrix} 1\\1 \end{pmatrix}

次のことに注意してください。

M∣v⟩=(1221)(11)=(1∗1+2∗12∗1+1∗1)=(33)=3∣v⟩.M|v\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\1 \end{pmatrix} = \begin{pmatrix} 1*1+2*1\\2*1+1*1 \end{pmatrix} = \begin{pmatrix} 3\\3 \end{pmatrix} = 3|v\rangle.

しかし、別のベクトル、例えば ∣v′⟩=(12)|v'\rangle = \begin{pmatrix} 1\\2\end{pmatrix} については、次のようになります。

M∣v′⟩=(1221)(12)=(1∗1+2∗22∗1+1∗2)=(54)≠c∣v′⟩.M|v'\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\2 \end{pmatrix} = \begin{pmatrix} 1*1+2*2\\2*1+1*2 \end{pmatrix} = \begin{pmatrix} 5\\4 \end{pmatrix} \neq c|v'\rangle.

粒子のスピンを行列で記述しようとし、測定後の粒子の状態を「状態ベクトル」と呼ばれるベクトルで記述しようとするかもしれません。そのような行列や状態ベクトルにどのような値を入れるべきかは全く自明ではありませんが、これまでの測定から状態にラベルを付けるために使用できる唯一の性質は、0または1を測定する確率(スピン1/2粒子の文脈では「スピンアップ」または「スピンダウン」)です。状態ベクトルの成分がこの確率と関連しているべきだと考えるべきでしょう(確率そのもの、あるいは「確率振幅」など。つまりその成分を2乗して確率を得る、といった具合です)。しかし現時点では、これらの行列の成分が厳密に実数であるべきか、複素数であるべきか、あるいは何であるべきかは定かではありません。安全のため、次の条件を満たすベクトルと行列の枠組みを構築してみましょう。

  • 行列演算子は、できる限り実験と結びついているべきです。例えば、スピン行列の固有値を実験的に観測されるスピン射影と関連付けることができます。
  • 状態ベクトルは、次のような形で確率と結びついているべきです。粒子が状態ベクトル ∣A⟩|A\rangle にある場合、その後の測定で粒子が状態 ∣B⟩|B\rangle にあることが判明する確率は PAB≡∣⟨A∣B⟩∣2P_{AB}\equiv |\langle A| B \rangle|^2 です。

これにより、最初の行列を構築する際に大きな自由度が得られます。例えば、素朴に次のように試すことができます。

∣0⟩∼∣↑⟩∼(10).|0\rangle \sim |\uparrow\rangle \sim \begin{pmatrix} 1 \\0 \end{pmatrix}.

ここで ∣0⟩∼∣↑⟩|0\rangle \sim |\uparrow\rangle とは、量子コンピューターとスピン1/2系には非常によく似ていて、互いにしばしば対応付けられる状態があるということを意味します。それらは異なる系を指すため、明らかに全く同じものではありません。しかし、これら2状態系を記述する代数は同じ規則に従う可能性があります(ネタバレ注意:実際にそうなのです!)。この無作為な選択には、すでに1つの良い特性があることに注意してください。次のことに注意してください。

P00=∣⟨0∣0⟩∣2=∣(10)(10)∣2=∣1∣2=1.P_{00} = |\langle 0| 0 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} 1 \\ 0\end{pmatrix}\vert ^2 = |1|^2 = 1.

つまり、粒子がすでに状態 ∣0⟩|0\rangle にある場合、その後の測定も ∣0⟩|0\rangle を得る確率は1です(ノイズの影響を除く)。これは素晴らしいことです。なぜなら、状態が0すなわち「スピンアップ」状態になると、その後の測定でもそこにとどまることをすでに見てきたからです。上記の確率は確かに100%であるべきです。

理解度チェック​

Why is

∣0⟩=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

例えば次のような選択肢よりも優れています。

∣0⟩=(20)?|0\rangle = \begin{pmatrix} 2 \\0 \end{pmatrix}?
答え

測定の確率を内積の2乗と関連付けようとする試みは、各ベクトルの大きさが1である必要があることを意味します。つまり、状態 ∣v⟩|v\rangle にあるものが状態 ∣v⟩|v\rangle にある確率は100%であるため、すべての ∣v⟩|v\rangle について ∣⟨v∣v⟩∣2=1|\langle v|v\rangle|^2 = 1 となります。これは「規格化条件」として知られています。

Why is

∣0⟩=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

例えば次のような選択肢よりも優れています。

∣0⟩=(01)?|0\rangle = \begin{pmatrix} 0 \\1 \end{pmatrix}?
答え

そうではありません。最初に ∣0⟩=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix} を選ぶ必要がある理由は特にありません。むしろこれは慣例です。しかし、いったんその選択をすると、その後の選択に一定の制約を課すことになります。以下を参照してください。

上記の実験で、最初に状態 ∣0⟩|0\rangle にあった量子ビットは、その後の測定でもその状態にとどまることがわかったことを思い出してください。∣1⟩|1\rangle についても同様です。これは、∣0⟩|0\rangle にある量子ビットが状態 ∣1⟩|1\rangle で測定される確率がゼロであることを意味します(ノイズの影響を除く)。内積と測定確率との間に必要とされるこの関係から、次のことがわかります。

P01=P10=0.P_{01} = P_{10}=0.

一般性を失うことなく、状態ベクトル ∣1⟩=(ab)|1\rangle = \begin{pmatrix} a \\ b \end{pmatrix} と書くことができます。すると次のように書けます。

P01=∣⟨0∣1⟩∣2=∣(10)(ab)∣2=∣a∣2=0.P_{01} = |\langle 0| 1 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} a \\ b\end{pmatrix}\vert ^2 = |a|^2 = 0.

P11=1P_{11} = 1 という要件、いわゆる「規格化条件」から、∣b∣2=1|b|^2=1 であることがわかります。これ自体は、ϕ∈R\phi \in \mathbb{R} に対して b=eiϕb=e^{i\phi} とすることしか制限しません。b=1b=1 を選ぶべき他の理由もありますが、それはこの入門の範囲を超えます。ここでは、b=1b=1 が許容される一つの解であることを示すにとどめます。

これまでの分析でかなり進展しました。状態ベクトルの形式を選ぶことで、ここで働いている物理現象について何かを記述する行列を構築することができます。特に、元のシュテルン=ゲルラッハの実験ではzz軸に沿ったスピン角運動量成分に基づく軌跡の分裂を測定していたため、まさにそれを記述する演算子SzS_zが欲しいところです。実験とのもう一つの重要なつながりは、偏向量、移動時間、既知の磁場強度から、スピンのzz成分の大きさを決定できるということです。これには実験装置の精度に関する多くの仮定が必要ですが、ここでは単に、スピン角運動量の測定されたz成分は±ℏ/2\pm \hbar/2であることを再確認するにとどめます。

そこで、これらの実験的に観測されたスピン成分に対応する固有値を持つ、実固有値(エルミート行列によって満たされる)を持つ行列を探すことになります。一般性を失うことなく、Sz=(s11s12s21s22)S_z = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}と書くことができ、次のことを要求できます。

Sz∣↑⟩=(s11s12s21s22)(10)=(s11s21)=!ℏ2(10)→s11=ℏ/2,s21=0S_z |\uparrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}1 \\0\end{pmatrix} = \begin{pmatrix} s_{11} \\ s_{21} \end{pmatrix} \overset{!}{=} \frac{\hbar}{2} \begin{pmatrix}1 \\0\end{pmatrix} \rightarrow s_{11} = \hbar/2,s_{21}=0 Sz∣↓⟩=(s11s12s21s22)(01)=(s12s22)=!−ℏ2(01)→s12=0,s22=−ℏ/2S_z |\downarrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}0 \\1\end{pmatrix} = \begin{pmatrix} s_{12} \\ s_{22} \end{pmatrix} \overset{!}{=} -\frac{\hbar}{2} \begin{pmatrix}0 \\1\end{pmatrix} \rightarrow s_{12} = 0, s_{22}=-\hbar/2

組み合わせて、全体の因子ℏ/2\hbar/2を取り出すと、次のようになります

Sz=ℏ2(100−1).S_z = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

これは、すべての量子力学の教科書に登場するよく知られたスピンz演算子です。ℏ/2\hbar/2を取り除いた形で見られることも多く、その場合は「パウリz」演算子と呼ばれ、通常σz\sigma_zと表記されます。

σz=(100−1).\sigma_z = \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

これは有用です。このパウリ演算子(および関連する行列)は、量子コンピューターにおけるトランスモン qubit の状態を含む、2準位または測定の2値の結果を伴う多くの物理系を記述できます。

他の演算子や関連する状態に移る前に、多くの人が間違いを犯す一つの事実に触れなければなりません。演算子の作用は測定と同じではありません。 ある意味では「そんなのは当然だ!一方は数学的計算の一環として紙の上で行われ、もう一方は物理系に対して実験室で行われる」と言うかもしれません。それは正しいですが、それ以上のことがあります。スピンの zz 成分を測定すると、系の初期状態に関わらず、必ず「スピンアップ」または「スピンダウン」の状態が得られます。これは量子コンピューティングの類比 ∣0⟩|0\rangle および ∣1⟩|1\rangle でも確認しました。何百ものランダムな向きに状態を初期化しても、測定は常に ∣0⟩|0\rangle または ∣1⟩|1\rangle のどちらかを返しました。これは測定が状態を固有状態に「崩壊させる」として知られています。これは行列を状態に適用するときには起こりません。以下の問いを試してこれを探ってみてください。

理解度の確認​

次のようなスピン状態の粒子から始めるとします

∣ψ⟩=(3/52/5).|\psi\rangle = \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}.

(a) この状態ベクトルにSzS_z演算子を作用させると何が得られますか? (b) この粒子のスピンのzz成分を1回測定すると何が得られますか? (c) この状態と同一の粒子を多数用意し、スピンのzz成分の測定を数千回行うと何が得られますか?

答え

(a) 次のようになります

Sz∣ψ⟩=ℏ2(100−1)(3/52/5)S_z |\psi\rangle = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}=ℏ2(3/5−2/5).= \frac{\hbar}{2} \begin{pmatrix}\sqrt{3/5} \\ -\sqrt{2/5}\end{pmatrix}.

それだけです。実験結果はありません。行列をベクトルに適用するだけで、少し異なるベクトルが得られ、そこには新たに「-」の符号が付き、係数ℏ/2\hbar/2があるためもはや大きさ1ではなくなっています。

(b) ∣↑⟩|\uparrow\rangleまたは∣↓⟩|\downarrow\rangleのいずれかが得られます。これは、zz軸へのスピンの射影がそれぞれℏ/2\hbar/2または−ℏ/2-\hbar/2であることを観測することに対応します。また、それぞれの結果の確率も決定できます。なぜなら

P↑ψ=∣⟨↑∣ψ⟩∣2=∣(10)(3/52/5)∣2=∣3/5∣2=35P_{\uparrow\psi}=|\langle \uparrow|\psi\rangle|^2 = \vert \begin{pmatrix}1 & 0\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{3/5}|^2 = \frac{3}{5}P↓ψ=∣⟨↓∣ψ⟩∣2=∣(01)(3/52/5)∣2=∣2/5∣2=25P_{\downarrow\psi}=|\langle \downarrow|\psi\rangle|^2 = \vert \begin{pmatrix}0 & 1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{2/5}|^2 = \frac{2}{5}

したがって、スピンアップ状態の方が20%可能性が高いものの、どちらの結果も起こり得て、この2つの状態のうちの1つだけが得られます。

(c) (b)で計算された測定確率によると、測定のおよそ60%はスピンアップの粒子を生じ、およそ40%はスピンダウンの粒子を生じます。

原子のスピンアップ状態とQubit状態のアナロジーを使って、前の質問の(b)と(c)の答えを検証してください。

∣↑⟩∼∣0⟩.|\uparrow\rangle\sim|0\rangle.

目的の初期状態を作成する量子 Circuit をコーディングし、実機ハードウェアまたはシミュレーターを使って、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.

第5実験:異なるオブザーバブルの測定​

これまではzz軸に沿った測定しか行っていません。シュテルン=ゲルラッハの実験では、例えばx軸に沿って測定したい場合、単に不均一磁場をxx軸に沿うように向け、スクリーン上のxx方向の偏向を探せばよいのです。しかし、IBMの量子コンピューターは1つの軸(zz)に沿った測定しか行えないように設計されています。xx軸に沿った状態を測定するには「基底の変換」を行う必要があります。これは、ブロッホ球上でxxに沿った状態をzzに、またはその逆に変換する操作を行う必要があることを意味します。これを実装する方法はいくつかありますが、望ましい方法はアダマール・ゲートです。

H=12(111−1)H=\frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}

理解度の確認​

H∣0⟩=∣+⟩xH|0\rangle = |+\rangle_x かつ H∣+⟩x=∣0⟩H|+\rangle_x = |0\rangle となることを示してください。

答え
H∣0⟩=12(111−1)(10)=12(11)=∣+⟩xH|0\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = |+\rangle_xH∣+⟩x=1(2)(111−1)12(11)=12(20)=(10)=∣0⟩H|+\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}2 \\ 0\end{pmatrix} = \begin{pmatrix}1 \\ 0\end{pmatrix} = |0\rangle

H∣1⟩=∣−⟩xH|1\rangle = |-\rangle_x かつ H∣−⟩x=∣1⟩H|-\rangle_x = |1\rangle となることを示してください。

答え
H∣1⟩=12(111−1)(01)=12(1−1)=∣−⟩xH|1\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}0 \\ 1\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = |-\rangle_xH∣−⟩x=1(2)(111−1)12(1−1)=12(02)=(01)=∣1⟩H|-\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}0 \\ 2\end{pmatrix} = \begin{pmatrix}0 \\ 1\end{pmatrix} = |1\rangle
# 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 of the previous code cell

この Circuit は系を回転させ、(zz 軸に沿った)測定が回転前の xx 軸方向の特性を教えてくれるようにします。量子コンピューターは状態を ∣0⟩|0\rangle(すなわち ∣↑⟩|\uparrow\rangle に対応)に初期化することがわかっています。∣↑⟩|\uparrow\rangle の状態にある粒子のスピンの xx 方向への射影を測定すると何が起こるか見てみましょう。ここではシミュレーターを使って示し、異なる初期化を持つ他の Circuit の統計を探索することを推奨します。

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())
{'1': 4977, '0': 5023}

これは、∣0⟩|0\rangle(すなわちスピンが ∣↑⟩|\uparrow\rangle の状態)に初期化された qubit に対して、+x+x または −x-x 方向への射影を測定する確率がほぼ50対50であることを示しています。ある意味でこれは自然なことです。zz 方向を向いているものは ±x\pm x に対して特に選好を持たないはずだからです。同様に、∣1⟩|1\rangle(すなわち ∣↓⟩|\downarrow\rangle)の状態から始めた場合も同じことが期待されます。確認してみましょう:

# 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 of the previous code cell

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'0': 4935, '1': 5065}

予想通り、±x\pm x 方向への射影を測定する確率が再び50対50となりました。zz 軸に沿った測定との類比から、+x+x 方向に確実に崩壊した粒子が、その後 −x-x 方向に測定される確率はゼロになるのではないかとさらに疑うことができます。確認してみましょう:

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 of the previous code cell

job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())
{'00': 504, '11': 520}

Output of the previous code cell

予想通り、射影が +x+x 方向であり、その後も再び +x+x 方向となる結果と、射影が最初に −x-x 方向であり、その後も再び −x-x 方向となる結果が得られました。射影が +x+x から −x-x あるいはその逆に切り替わるケースは見られません。これらの観測結果をまとめ、さらなる演算子の行列表現と状態ベクトルを導出することができます。

わかっていること:

  • +z+z または −z-z 方向に確定した射影を持つ状態は、+x+x 方向の射影が得られる確率が50%、−x-x 方向の射影が得られる確率が50%です。
  • +x+x 方向に確定した射影を持つ状態は、その後 −x-x 方向の射影が得られる確率がゼロであり、逆も同様です。

これらの結果を用いて、xx 方向に正の確定射影を持つ状態(∣+x⟩|+x\rangle と呼ぶ)と、xx 方向に負の確定射影を持つ状態(∣−x⟩|-x\rangle と呼ぶ)を構成することができます。これらの状態から、SzS_z について行ったのとまったく同じように、SxS_x に対応する行列を構成できます。これらは学習者への演習問題として残しておきます。同様に、yy 軸に沿った測定を行う実験を構成し、∣+y⟩|+y\rangle と ∣−y⟩|-y\rangle のベクトルを求め、最終的に SyS_y の表式を導出することができます。

これらのベクトルと行列をまとめると、次のようになります。

∣+x⟩=12(11) ∣−x⟩=12(1−1) Sx=ℏ2(0110)∣+y⟩=12(1i) ∣−y⟩=12(1−i) Sy=ℏ2(0−ii0)∣+z⟩=(10) ∣−z⟩=(01) Sz=ℏ2(1001)\begin{aligned} |+x\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} & \: & |-x\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} & \: &S_x &=& \frac{\hbar}{2} \begin{pmatrix} 0 & 1 \\ 1 & 0\end{pmatrix}\\ |+y\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} & \: & |-y\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -i\end{pmatrix} & \: &S_y &=& \frac{\hbar}{2} \begin{pmatrix} 0 & -i \\ i & 0\end{pmatrix}\\ |+z\rangle &= \begin{pmatrix}1 \\ 0\end{pmatrix} & \: &|-z\rangle &=& \begin{pmatrix}0 \\ 1\end{pmatrix} & \: &S_z &=& \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & 1\end{pmatrix}\\ \end{aligned}

問題​

インストラクターは、この簡単なアンケートにノートブックの使用方法を記入することで、一般的なカリキュラムへの配置に関するガイダンスと解答付きのノートブックのバージョンをリクエストできます。

重要概念​

  • スピン1/2粒子では、ある軸へのスピンの射影の測定は、「アップ」と「ダウン」と呼ばれることの多い2つの結果のうちの一方のみを得ます。

  • Qubit は ∣0⟩|0\rangle と ∣1⟩|1\rangle と呼ばれる2つの状態のうちの一方のみで測定できます。

  • 量子コンピューターの qubit を使って、スピン1/2粒子のシュテルン=ゲルラッハ実験をモデル化できます。

  • 同じ粒子・qubit の同じ物理的オブザーバブルを繰り返し測定すると、(系がノイズによって乱されない限り)同じ結果が得られます。

  • シュテルン=ゲルラッハ実験または量子コンピューターを用いた類比実験の結果から、量子力学的スピンを記述する状態ベクトルと行列演算子の体系を導出できます。

真偽問題​

  1. 真/偽 実験的観測から出発すると、∣↑⟩|\uparrow\rangle を表すベクトルとして唯一の正当な選択は (10)\begin{pmatrix}1 \\ 0\end{pmatrix} である。

  2. 真/偽 ∣↑⟩=(10)|\uparrow\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} のとき、∣↓⟩|\downarrow\rangle の唯一の選択は(大域位相を除いて)(01)\begin{pmatrix}0 \\ 1\end{pmatrix} である。

  3. 真/偽 ∣0⟩|0\rangle の状態にあると測定された粒子は、zz 軸に沿った後続の測定でも引き続き ∣0⟩|0\rangle の状態で見出される。

  4. 真/偽 ∣0⟩|0\rangle の状態にあると測定された粒子は、xx 軸に沿った後続の測定でも引き続き ∣0⟩|0\rangle の状態で見出される。

  5. 真/偽 ∣0⟩|0\rangle の状態にあると測定された粒子は、xx 軸に沿った後続の測定で常に ∣+⟩x|+\rangle_x の状態で見出される。

多肢選択問題​

  1. 最初に ∣↑⟩|\uparrow\rangle にある粒子が ∣+x⟩|+x\rangle の状態で測定される確率はどれですか?

    • a. 0%

    • b. 25%

    • c. 50%

    • d. 71%

    • e. 100%

  2. 最初に ∣↑⟩|\uparrow\rangle にある粒子が ∣↓⟩|\downarrow\rangle の状態で測定される確率はどれですか?

    • a. 0%

    • b. 25%

    • c. 50%

    • d. 71%

    • e. 100%

  3. スピン1/2粒子の状態 ∣↑⟩|\uparrow\rangle は、最も一般的にどの量子コンピューターの状態に対応しますか?

    • a. ∣+⟩|+\rangle

    • b. ∣−⟩|-\rangle

    • c. ∣0⟩|0\rangle

    • d. ∣1⟩|1\rangle

    • e. 上記のいずれでもない

ディスカッション問題​

  1. 3人の友人が量子測定と演算子について議論しています。友人Aは「zz 軸に沿った測定を行うことと、演算子 σz\sigma_z を作用させることは同じことだ」と言います。友人Bは「それらは異なる手続きだが、結果は同じだ」と言います。友人Cは「まったく異なる;ほとんどの状態に対して効果すら異なる」と言います。あなたはどの友人の意見に賛成しますか?その理由も述べてください。

自由記述問題​

  1. 実験的観測と提案された表記法:

P↑+x=∣(10)(ab)∣2=∣a∣2=12P_{\uparrow+x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} P↓+x=∣(01)(ab)∣2=∣b∣2=12P_{\downarrow+x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

を用いて、大域位相を除いて

∣+⟩x=12(1eiα)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ e^{i\alpha}\end{pmatrix}

標準的な結果を得るにはα=0\alpha = 0を選びます。

  1. 実験的観測と提案された表記法:

P↑−x=∣(10)(ab)∣2=∣a∣2=12P_{\uparrow-x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} P↓−x=∣(01)(ab)∣2=∣b∣2=12P_{\downarrow-x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

そしてチャレンジ問題3の結果を用いると

P+x−x=∣12(11)(cd)∣2=12∣c+d∣2=0P_{+x-x}=\vert \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1\end{pmatrix}\begin{pmatrix}c \\ d\end{pmatrix}\vert^2 = \frac{1}{2}|c+d|^2 =0

を用いて、大域位相を除いて

∣−⟩x=12(1−1)|-\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix}

謝辞​

[1] Tatoute 作 - 自作、CC BY-SA 4.0、https://commons.wikimedia.org/w/index.php?curid=34095239