不確定性を探る
このQiskit in Classroomsモジュールでは、学生は以下のパッケージがインストールされた動作するPython環境を用意する必要があります:
qiskitv2.1.0以降qiskit-ibm-runtimev0.40.1以降qiskit-aerv0.17.0以降qiskit.visualizationnumpypylatexenc
上記パッケージのセットアップとインストールについては、Qiskitのインストールガイドをご覧ください。 実際の量子コンピューター上でジョブを実行するには、IBM Cloudアカウントのセットアップガイドの手順に従い、IBM Quantum®のアカウントを作成する必要があります。
このモジュールはテスト済みで、QPU時間を8分使用しました。これはあくまでも推定値です。実際の使用量は異なる場合があります。時間のかかる計算が2つあり、ヘッダーコメントでそのように明記されています。QPU時間が不足している学生はシミュレーターで実行できます。それらを除いた場合、モジュールが必要とするQPU時間は約30秒のみです。
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib 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でご覧ください。
はじめに
不確定性原理については、物理の授業以外でも耳にしたことがあるでしょう。不確定性についてよく知ら れた口語的な言い換えとして「何かを観測すると、それに影響を与えてしまう」というものがあります。それは確かに真実です。しかし不確定性をより物理的に表現すると、ある種の物理的観測量には非両立性(incompatibility)があり、それらを同時に任意の精度で知ることができないということです。多くの学生が最初に出会う非両立な変数のペアは と 、すなわち 軸と呼ばれる一つの軸に沿った位置と、その方向の線形運動量です。これらの変数に対する不確定性の制約は次のように書かれます: ここで は「 の不確定性」と呼ばれ、統計学における標準偏差と同じ定義を持ち、次のように定義できます: も同様に定義されます。 ここでは、この不確定性関係 を導出しません。古典的な波動の理解と整合していることを指摘するにとどめます。すなわち、真に完全な1つの周波数 と波長 を持つ波は、完全な正弦波として永遠に続きます。量子力学的には、ド・ブロイの仮説 によれば、これは運動量を完全に知ることに対応します。しかし波のような粒子がどこにい るか知るためには、それを記述する波が空間的に非常に鋭いピークを持つ形(例えば非常に幅の狭いガウス関数)にならなければなりません。そのような鋭いピークを持つ波動関数を含む任意の連続関数は、異なる波長を持つ正弦関数のフーリエ級数で表現できることは知られています。しかし波動関数がより鋭いピークになる(位置がより正確に知られる)につれて、フーリエ級数にはより多くの項が必要になります。つまりより多くの波長の混合(量子力学的には、より多くの運動量の値)が必要になります。
より簡潔に述べると:運動量が確定した状態(空間的に完全な正弦波)は位置が非常に不確定です。位置が確定した状態(ディラックのデルタ分布のような)は運動量が非常に不確定です。
このような非両立性を示す変数は他にもあります。例えば、粒子のスピンはある軸に沿った射影が確定していても、直交する軸への射影については何も分からない場合があります。例えば状態 (Qubitまたはスピン-1/2粒子の場合)は 軸に沿った射影が確定しています(Qubitの文脈では1、スピン-1/2粒子の文脈では )。しかしこの状態は、 軸への射影が確定した2つの状態の重ね合わせとして書くことができます: または同等に は への射影が確定しており、 も同様です。したがって、状態の 軸への射影を指定すると、 軸への射影は分かりません。また 軸への射影を指定すると、 への射影は分かりませ ん。スピンとQubitの文脈でこれを議論する際には細かな違いがありますが、一般的に言えば、パウリ行列の固有状態には面白い関係があり、それを探ることができます。 このレッスン全体を通して、これらの非両立な変数の不確定性に対する直感を実験的に確認し、IBM®量子コンピューター上で不確定性関係が成立することを検証します。
直感の簡単な確認
この最初の実験と以降のモジュール全体を通して、「Qiskitパターン」として知られる量子コンピューティングのフレームワークを使用します。これはワークフローを以下のステップに分解するものです:
- ステップ1:古典的な入力を量子問題にマッピングする
- ステップ2:量子実行のために問題を最適化する
- ステップ3:Qiskit RuntimeプリミティブでExecuteする
- ステップ4:後処理と古典的な解析
基本的にこれらのステップに従いますが、常に明示的にラベル付けするとは限りません。
まず、Runtimeプリミティブを含む必要なパッケージをいくつか読み込みましょう。また、利用可能な中で最も混雑していない量子コンピューターを選択します。
以下には、初回使用時に認証情報を保存するためのコードがあります。ノートブックを共有する際に認証情報が誤って共有されないよう、環境に保存した後はノートブックからこの情報を削除してください。詳細については、IBM Cloudアカウントのセットアップおよび信頼されていない環境でのサービスの初期化をご覧ください。
from numpy import pi
# 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')
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)
ibm_sherbrooke
レッスン中に学生が利用可能な量子コンピューティング時間を使い切った場合は、以下の行のコメントを解除して、上で選択した量子コンピューターのノイズ挙動を部分的に模倣するシミュレーターをセットアップするために使用できます。
# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel
# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)
noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})
演算子Zの固有状態は、別の演算子Xの固有状態ではないことを思い出してください。では今、 軸および 軸に沿った測定を行うことで、実験的にそれを観察しましょう。 に沿った測定には単に qc.measure() を使います。IBMの量子コンピューターは に沿って測定するように設計されているからです。しかし に沿って測定するには、実質的に 軸を測定する向きに移動させるように システムを回転させる必要があります。これはアダマールGateで実現されます。 に沿った測定にも同様のステップが必要です。必要なステップを便宜上ここにまとめます:
- に沿って測定する場合:
qc.measure() - に沿って測定する場合:
qc.h()の後にqc.measure() - に沿って測定する場合:
qc.sdg()、qc.h()、qc.sの後にqc.measure()
ステップ1:古典的な入力を量子問題にマッピングする
この場合、マッピングのステップは上述の測定と回転を量子Circuit(回路)で表現するだけです:
# Step 1: Map
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()
# Change basis so that measurements made on quantum computer which normally tell us about z, now tell us about x.
qc.h(qr)
# Add a second measurement
qc.measure(qr, cr[1])
qc.draw("mpl")