メインコンテンツへスキップ

量子コイン — 重ね合わせと干渉についてのモジュール

この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®のアカウントを作成する必要があります。

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

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit 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でご覧ください。


はじめに

このモジュールでは、量子論の中心にある基本原理の一つである「重ね合わせ(superposition)」を探求します。私たちの日常的な経験では、物体は常に明確な特性を持っています。その位置、大きさ、形、色——物体に関するあらゆることは、私たち観測者がまだ測定していなくても、定まっていて確かなものです。しかし量子の世界では、必ずしもそうではありません。量子オブジェクトは、古典的に許容される複数の状態の「重ね合わせ」と呼ばれるものに存在できます。重ね合わせ状態が測定されると、それらの状態のうちの一つにランダムに「収縮」します。

ある意味では、重ね合わせ状態を測定することはコインを投げることに似ています。どちらに着地するかを事前に知る方法はありません。この根本的な不確定性は、アインシュタインでさえ受け入れがたかった量子力学の側面です。彼はこのランダム性について「神はサイコロを振らない」と言ったことで有名です。しかし、これから見ていくように、神は実際にサイコロを振り、コインも投げるのです。

私たちは古典的なコイン投げを重ね合わせ状態の測定への類推として考えます。そして、QiskitとIBM®の量子プロセッサー上のQubitを使って「量子コイン」で遊ぶことで、その類推の限界をすぐに発見するでしょう。

古典的なコイン

まず古典的なコインから始めましょう。コインを投げると、50 ~%の確率で表か裏のどちらかになります。原理的には、コインの正確な初期条件と投げる力・回転力がわかれば、どちらの面が出るかを計算できますが、実際にはコインがどちらに着地するかを事前に知ることはできません。そのためコイン投げは、結果が本質的にランダムな古典的確率状態の代表的な例として使われます。この50/50の確率を反映させて、着地前のコインの状態を次のように書けます。

S(coin)=12up+12downS(coin) = \frac{1}{2}|up\rangle + \frac{1}{2}|down\rangle

ここで、2つの項は投げた結果として起こりうる2つの結果を表し、その係数はそれぞれの結果の確率を表します。通常、「|\rangle」(「ket(ケット)」と呼ばれます)は量子状態を表すために使われますが、ここでは古典的な確率状態について述べていることに注意してください。古典情報と量子情報の表現方法の詳細については、「量子情報の基礎」コースのレッスン1:単一システムを参照してください。

コインを1000回投げて表と裏の回数を記録すると、次のようなグラフが得られます。

# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random

nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]

# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()

Output of the previous code cell

量子コイン

量子コンピューター上のQubitを使って、同様の確率状態を作ることができます。コイン投げと同様に、Qubitも0|0\rangle1|1\rangleの2つの状態で測定されます。状態0|0\rangleから始め、Hadamard Gateと呼ばれるものをQubitに適用することで、この確率的な「重ね合わせ」状態を作ります。これにより、Qubitは0|0\rangle1|1\rangleの等しい重ね合わせに置かれます。この重ね合わせ状態は、一見するとコインと同じように見えて振る舞うかもしれませんが、まもなくそれ以上のものがあることがわかります。このモジュールの目的は、重ね合わせが古典的なコイン投げと同じではないことを示すことです。

つまり、Qubitは0と1の等しい重ね合わせにあるため、測定すると0|0\rangleが測定される確率50%、1|1\rangleが測定される確率50%となります。この状態は、後で明らかになる理由から、古典的な確率的ケースとは少し異なる書き方をします。

ψ=120+121|\psi\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle

ここで、各状態を測定する確率は、上の古典的確率状態の場合とは異なり、もはや係数と等しくありません。代わりに、係数の二乗が確率を与えます。そして各係数は今や複素数、つまり実部と虚部の両方を持つことができます。

しかしこれらの違いにもかかわらず、この状態を測定した結果はコインを投げることと本質的に同じです。

from qiskit import QuantumCircuit

qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()

qcoin.draw("mpl")

Output of the previous code cell

つまり、Hadamard Gateを適用することはコインを投げることに相当します。そして、コインを1000回投げて表裏の統計を調べたのと同様に、Qiskitの「量子コイン」で同じことができます。SamplerというQiskit primitiveを使って、Circuitを何度も繰り返し実行し、結果として得られる状態の統計をサンプリングすることができます。

まず、Qiskit Runtimeサービスとprimitiveをロードし、次にCircuitを実行する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')

# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)

# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston

アカウントの利用可能時間が残っていない場合は、代わりにシミュレーターで実行することもできます。以下のセルのコードのコメントを外して実行してください。

## Use a local simulator

# from qiskit_aer import AerSimulator

## Generate a simulator that mimics the real quantum system

# backend_sim = AerSimulator.from_backend(backend)

## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)

# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin)
## Execute

# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()

counts = res[0].data.meas.get_counts()

# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output of the previous code cell

上記のCircuitを1000回サンプリングすると、統計的な揺らぎを除いて、古典的なコインのヒストグラムと基本的に同一のものが得られます。

量子コインの統計をサンプリングするだけでなく、Estimatorと呼ばれる別のQiskit primitiveを使って、状態の観測量期待値を測定することもできます。この期待値が何を意味するかを説明するために、古典的なコインを例として使いましょう。コインを使って賭けをするとします。コインを投げて「表」が出るたびに1ドル勝ち、「裏」が出るたびに1ドル負けるとします。1回の投げで得られる金額の期待値(観測量「お金」の期待値)を計算したい場合、次のように計算します。

E(money)=12(+1 dollar)+12(1 dollar)=0 dollarsE(money) = \frac{1}{2} (+ \text{1 dollar}) + \frac{1}{2} (- \text{1 dollar}) = \text{0 dollars}

1ドル勝つ確率と1ドル負ける確率が等しいため、期待値は0ドルです。

同様に、量子状態では観測量「Z」の期待値を計算できます。ZはPauli行列であり、状態0|0\rangle1|1\rangleにそれぞれ+1と-1の値を持ちます。

ψZψ=120Z0+121Z1=12(+1)+12(1)=0\langle \psi|Z|\psi \rangle = \frac{1}{2} \langle 0 | Z | 0 \rangle + \frac{1}{2} \langle 1 | Z | 1 \rangle = \frac{1}{2} (+1) + \frac{1}{2}(-1) = 0
from qiskit.quantum_info import Pauli

qcoin = QuantumCircuit(1)
qcoin.h(0)

# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

obs = Pauli("Z")

qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute

# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()

# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()

print(res[0].data.evs)
-0.014799284701239441

期待通り(笑)、期待値として0が得られました。これは、0と1を測定する確率が等しいことを確認するもう一つの方法であり、コイン投げのように振る舞うことを示しています。

この時点では、「量子コイン」は古典的なコインとまったく同じように見えます。しかし次のセクションでは、両者の根本的な違いを明らかにする実験を行います。

量子の本質が明らかに:3次元での実験

思考実験をしてみましょう。コインを空中に投げ、地面に落とす代わりに、コインが両手の間を通過するタイミングで手を叩いて、両手のひらの間にコインを挟みます。こうすると、コインは表が上か下かではなく、表が左か右かになります。

理解度チェック

以下の問いを読んで答えを考えてから、三角形をクリックして解答を表示してください。

表が左か表が右か、それぞれの結果の確率はどのくらいですか?

答え:

確率は依然として50-50です。コイン投げの結果をどの次元に沿って測定するかは、確率に影響を与えるべきではありません。

おそらく、表が左か右かになる確率はやはり50-50だとお答えいただけたと思います。コイン投げを測定する次元は、結果の確率に影響を与えるべきではありません。

では、量子コインではどのように違いが現れるでしょうか?確認してみましょう。

前回と同じように、Hadamard Gateを使って量子重ね合わせを作ることができます。量子コインで「表が左か右か」を測定するには、古典的なコインと同じことができます。つまり、異なる軸に沿って測定するのです。量子コンピューターでの標準的な測定は垂直軸(Z軸)に沿ったものであり、これは古典的なコインの通常の「表が上か下か」の測定に相当します。しかし、量子コインに「表が左か右か」を尋ねることもできます。言い換えれば、xx軸を向いている+|+\rangleまたは|-\rangleの状態にあるかどうかを確認できます。Samplerは測定基底Zでのみサンプリングしますが、Estimatorを使ってXの期待値を求めることができます。Xの値は、状態+|+\rangleに対して+1、|-\rangleに対して-1です。

理解度チェック

以下の問いを読んで答えを考えてから、三角形をクリックして解答を表示してください。

量子コインがこの場合に古典的なコインと同じように振る舞うとすれば、状態が+|+\rangle|-\rangleに測定される確率は50-50になります。その場合、Estimatorが返すXの期待値はいくつになると予想されますか?

答え:

+|+\rangle状態にXを適用すると値+1が得られ、|-\rangle状態に適用すると-1が得られます。したがって、50-50の分布であれば、期待値は0になるでしょう。

# Step 1: map problem

qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)

obs = Pauli("X")

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
obs_isa = obs.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
0.9985207100591716

この状態のXの期待値は1です。つまり、+|+\rangle|-\rangleを測定する確率は50-50ではありません

理解度チェック

以下の質問を読んで答えを考えてから、三角形をクリックして解答を確認してください。

この期待値は状態 ψ|\psi\rangle について何を示しているでしょうか?このX基底で +|+\rangle|-\rangle を測定する確率はそれぞれどのくらいですか?

答え:

期待値が +|+\rangle 状態におけるXの値と同じであるということは、X方向に沿って測定したとき、+|+\rangle 状態が測定される確率が100%であることを意味します。

これはどういうことでしょうか?私たちの量子コインは、ある次元では確率的なランダムな結果を示しながら、別の次元では完全に予測可能な結果を示せるようです。これはまるで、コインを投げても、両手で挟んでキャッチするたびに必ず表が右を向くことが保証されるようなものです。

量子位相

量子コインの重要な違いは、古典的なコインには存在しない別の性質を持っている点です。古典的な確率状態では、

S(coin)=c1up+c2downS(coin) = c_1|up\rangle + c_2|down\rangle

各係数は単なる実数の正の数で、特定の状態が測定される確率を表しています。量子状態では、

ψ=c10+c21|\psi\rangle = c_1 |0\rangle + c_2 |1\rangle

係数は複素数であり、実部と虚部を含んでいます。各係数 cic_i は複素平面上の2次元ベクトルとして表現でき、大きさ ci|c_i| と実軸からの角度 ϕi\phi_i を持ちます。

ci=cieiϕi.c_i = |c_i| e^{i \phi_i}.

複素平面上の円。量子状態は長さ1の矢印として表され、円上の任意の点を指すように回転できます。矢印の水平成分が実振幅、垂直成分が複素振幅です。

この ϕi\phi_i を「位相(phase)」と呼びます。位相は、量子状態の2つの項が干渉する様子、つまり波のように加算したり打ち消し合ったりする様子を教えてくれます。2つの波が同位相であれば、山と谷が揃うため、組み合わさることで2倍の高さの波が生じます。これを「建設的干渉」と呼びます。逆に位相がずれていると、一方の山が他方の谷と重なり合い、互いに打ち消し合って完全に消えてしまいます。これを「破壊的干渉」と呼びます。

波と同様に、量子状態も建設的または破壊的に重なり合うことができます。ただし、実際の物理空間における波の話ではないことが多いため、少し分かりにくいかもしれません。私たちのQubitの場合、干渉はQubitの抽象的な情報空間で起こります。また、干渉の仕方を決めるのは2つの波の相対位相、すなわち2つの係数の位相の差 Δϕ=ϕ2ϕ1\Delta \phi = \phi_2 - \phi_1 のみであることにも注意してください。そのため通常、状態全体に ϕ1-\phi_1グローバル位相を適用することで、c1c_1 を純粋に実数にし、相対位相をすべて c2c_2 に集約します。

量子コインにおいて位相がどのように干渉を引き起こすかを見るために、HadamardをGateを1回ではなく2回適用してみましょう。古典的には意味をなしません。Hadamardの適用がコインを投げることに相当するなら、すでに投げているコインをもう一度投げることはできないからです。しかし、量子コインに何が起こるかを見てみましょう。

qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()

qcoin_0.draw("mpl")

前のコードセルの出力

では、Sampler を使って結果の状態を測定する前に、各Gateによってこの Qubit がどのように変換されるかを考えてみましょう。いつものように 0|0\rangle から始まり、最初のHadamardが状態を重ね合わせに変換します。これはすでに見てきた通りです。

H0=120+121.H|0\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle.

この場合、両方の係数は完全に実数かつ正であり、位相は ϕ=0\phi=0 です。

次に、2番目のHadamardが重ね合わせ状態の各部分に個別に適用されます。HadamardがどのようにHadamardが 0|0\rangle 状態を変換するかはすでに知っています。では 1|1\rangle はどうなるでしょうか?

H1=120121H|1\rangle = \frac{1}{\sqrt{2}} |0\rangle - \frac{1}{\sqrt{2}} |1\rangle

これも0と1の等しい重ね合わせであり、コインを投げることに似ていますが、この状態の 1|1\rangle の前にある係数は ϕ=π\phi = \pi の位相を持ち、負の符号を与えています。

理解度チェック

以下の質問を読んで答えを考えてから、三角形をクリックして解答を確認してください。

2番目のHadamardを適用した後の状態を計算してください。つまり、H(120+121)H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle) を計算してください。HH は分配法則が成り立つので、各項に個別に適用できます。

答え:

H(120+121)=12H0+12H1=12[(0+1)+(01)]=0H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle) = \frac{1}{\sqrt{2}} H|0\rangle + \frac{1}{\sqrt{2}} H|1\rangle = \frac{1}{2} [(|0\rangle + |1\rangle) + (|0\rangle - |1\rangle)] = |0\rangle

では、Sampler で予測を確認してみましょう。

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_0)

## Execute

# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()

counts = res[0].data.meas.get_counts()

# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()

## Analyze
plot_histogram(counts)

前のコードセルの出力

2番目のHadamardが最初のHadamardを打ち消し、出発点である0の状態に戻りました!これは、HadamardGateが 0|0\rangle1|1\rangle の両状態を似た状態に変換するものの、位相が逆であることによります。2番目のHadamardの後、0|0\rangle の項は建設的に干渉する一方、1|1\rangle の項は破壊的に干渉して打ち消し合います。

さらに探っていきましょう。「PHASE」Gateを使って位相を変えることができます。では、Hadamardを適用して重ね合わせを作り、π\pi ラジアンの位相シフトを適用し、2番目のHadamardを適用してみましょう。

qcoin_pi = QuantumCircuit(1)
qcoin_pi.h(0)
qcoin_pi.p(np.pi, 0)
qcoin_pi.h(0)
qcoin_pi.measure_all()

qcoin_pi.draw("mpl")

前のコードセルの出力

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_pi)

## Execute

# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()

counts = res[0].data.meas.get_counts()

# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()

## Analyze
plot_histogram(counts)

前のコードセルの出力

今度は Qubit が0ではなく1の状態で測定されました。

このように、わずかないくつかのシンプルな実験からでも、位相がQuantum Circuitに与える大きな影響がすでに見て取れます。最初は微妙で気づきにくいかもしれません。最初の実験でHadamard Gateで量子コインを投げて結果を測定しただけでは、位相の影響は何も分かりませんでした。しかし深く掘り下げることで初めて、位相がいかに大きな違いをもたらすかを発見できました。位相は、同じQuantum GateがQubitにまったく正反対の効果をもたらすことさえあるのです。

自分で試してみましょう:

以下のコードセルを編集して、2番目のHadamardが 0|0\rangle1|1\rangle をそれぞれ25%と75%の確率で見つけるような重ね合わせ状態を生成するよう位相を変えてください。数学で答えを検証してください。

qcoin_phase = QuantumCircuit(1)
qcoin_phase.h(0)
# replace "x" below with a phase from 0 to 2*np.pi (this cell won't run if you leave x)
# qcoin_phase.rz(x, 0)
qcoin_phase.h(0)
qcoin_phase.measure_all()

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_phase)

## Execute

# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()

counts = res[0].data.meas.get_counts()

# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()

## Analyze
plot_histogram(counts)

前のコードセルの出力

NOT\sqrt{\text{NOT}} Gateを使った(より優れた)コインの類推

ここまで、コインを投げることが重ね合わせ状態を作ることとはかなり異なることを学んできました。重ね合わせに似た現象をより多く捉えられる、コインへのより良い類推はあるでしょうか?あります。

コインを使った別の思考実験をしましょう。テーブルの上に表を向けて置かれたコインを想像してください。裏向きにするには、単にひっくり返すだけです。これは「NOT」Gateの計算における等価物です。

2回適用するとNOT Gateと同等になる操作を構築したいとします。つまり「NOTの平方根」、すなわち NOT\sqrt{\text{NOT}} を求めたいのです。NOT Gateがコインにどのように物理的に実装されるかを考えることでこれができます。例えばx軸周りに180度回転させるだけです。そのため、x軸周りに90度回転させるだけで NOT\sqrt{\text{NOT}} Gateと同等になります。

NOT\sqrt{\text{NOT}} Gateを適用した後、コインが表向きか裏向きかを問いたいとします。どちらでもありません——垂直軸に対して端に立った状態です。ここで、コインの「測定」を再定義しましょう。まず、測定軸に沿ってコインを(手で押しつぶして平らにすることで)「収縮」させ、次に表か裏かを確認します。

端に立ったコインにこの「測定」を行うと、コインは同じ確率で表か裏に「収縮」します。コイン投げと同様に、原理的にはコインの初期条件と、コインを「収縮」させるために手が加える力の正確な条件に基づいてどちらに倒れるかを予測できます。しかし実際には、どちらの面が上になるかを予測するのは難しいため、本質的にランダムです。

実際にこのコインを3つの異なる軸、xxyyzz に沿って測定できます。コインの端が xx 軸と zz 軸方向を向いているため、その方向での測定にはコインを「収縮」させる必要があります。したがってこれらの軸では、表と裏が50:50の確率でランダムに測定されます。しかし yy 軸に沿っては、コインはすでに平らに横になっており、頭が -y 方向を向いています。これを「頭が前向き」と呼べます。

つまり、x と z の測定はランダムな結果をもたらすのに対し、y の測定は常に同じ結果をもたらします!前の節の「量子コイン投げ」実験を思い出すと、これは量子コインの動作に似ています。量子コインはz方向で0または1が50/50の確率で測定されましたが、X方向では常に +|+\rangle であり、|-\rangle になることはありませんでした。これは、静止してその端に立っているコインが、空中で激しく回転するコインよりも、Qubitの重ね合わせ状態を視覚化するのにより適した方法であることを示唆しています。

Qiskitを使って、「量子コイン」が NOT\sqrt{\text{NOT}} Gateを適用した時に古典的なコインと同じように振る舞うかどうかを見てみましょう。0|0\rangle から始まるQubitに NOT\sqrt{\text{NOT}} を適用し、Estimator を使って3つの観測量X、Y、Zの期待値を確認します。

qcoin_sx = QuantumCircuit(1)
qcoin_sx.sx(0)

qcoin_sx.draw("mpl")

前のコードセルの出力

obs1 = Pauli("X")
obs2 = Pauli("Y")
obs3 = Pauli("Z")

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_sx)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
job = estimator.run(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
# job = estimator_sim.run(pubs)
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
[[-0.01234492]
[-1.00388865]
[ 0.00740695]]

X、Y、Zの期待値はそれぞれ0、-1、0です。

理解度チェック

以下の質問を読んで答えを考えてから、三角形をクリックして解答を確認してください。

期待値から、3つの測定軸それぞれについて、量子コインが表向き/裏向き(あるいは左/右、前/後)に測定される確率はそれぞれどのくらいですか?

答え:

XとZに沿ってはどちらの状態も50/50の確率で測定され、Yに沿っては常に -y 方向に測定されます。

これは、古典的なコインに「NOT\sqrt{\text{NOT}}」の90度回転を適用した思考実験と同じ結果です。実際、今やコインとQubitの状態の間には正確な類推が存在します。Qubitの状態を、コインの表面に垂直なコインの頭の向きを指すベクトルとして視覚化できます。つまり、表向き(量子コインの 0|0\rangle 状態)は真上を向くベクトルに相当し、裏向き(1|1\rangle)は真下を向くベクトルに相当します。0|0\rangle1|1\rangle の等しい重ね合わせは水平方向を向きます。状態の位相が正確な水平方向を決定します——赤道に沿った向きは、複素平面上で係数 c2c_2 が向く方向と等しいです。

このノートブックで見てきたすべての Gateは、コイン/ベクトルの回転(または一連の回転)として視覚化できます。

  • NOT: x軸周りに180度

  • NOT\sqrt{\text{NOT}}: x軸周りに90度

  • PHASE: z軸周りに ϕ\phi の回転

  • Hadamard: これは少し複雑です。最初はコイン投げに例え、コインが空中で制御不能に回転すると表現しました。しかしHadamardは実際には、他のGateと同様に、コインの制御された決定論的な回転です。Hadamardはy軸周りに90度、次にx軸周りに180度回転させることで実行されます。

つまり、量子重ね合わせ状態や、Qubitに対して行う標準的な操作には、何もランダムなものはないのです。すべての操作は決定論的で可逆です。ランダム性が生じるのは、量子状態を測定することを決めた瞬間だけです。

ブロッホベクトルとしてのQubit状態

コインの「頭」の向きを指すこのベクトルは「ブロッホベクトル」として知られています。正式には、任意の(孤立した)Qubit状態は、半径1の球面上の座標 (r,θ,ϕ)(r, \theta, \phi) に位置するベクトルで表現できます。これらの座標で書くと、Qubit状態は次のようになります。

ψ=cosθ20+eiϕsinθ21|\psi\rangle = \cos{\frac{\theta}{2}} |0\rangle + e^{i \phi} \sin{\frac{\theta}{2}} |1\rangle

ブロッホ球の図。量子状態は三次元のベクトルです。あらゆる方向を指せるため、量子状態は極角 theta と phi を使って球面上の点を特定することで指定できます。

では Qiskit を使って、0|0\rangle 状態から始まる Qubit にさまざまな Gate を適用したとき、ブロッホベクトルがどのように変化するかを確認しましょう。

NOT

from qiskit.visualization import plot_bloch_multivector

qnot = QuantumCircuit(1)
qnot.x(0)

plot_bloch_multivector(qnot)

前のコードセルの出力

NOT\sqrt{\text{NOT}}

qsqrtnot = QuantumCircuit(1)
qsqrtnot.sx(0)

plot_bloch_multivector(qsqrtnot)

前のコードセルの出力

PHASE (ϕ=π\phi = \pi)

qphase = QuantumCircuit(1)
qphase.p(np.pi, 0)

plot_bloch_multivector(qphase)

前のコードセルの出力

Hadamard

qhadamard = QuantumCircuit(1)
qhadamard.h(0)

plot_bloch_multivector(qhadamard)

前のコードセルの出力

まとめ — 重ね合わせ状態とは実際には何なのか?

このモジュールの最初では、量子重ね合わせ状態の測定のランダム性をコイン投げに例えました。量子重ね合わせを生み出す「Hadamard Gate」をコインを投げる行為に例えました。しかし、一連の実験を通じて、古典的なコイン投げと量子重ね合わせの間には根本的な違いがあることを学びました。

重ね合わせ状態にある Qubit には、実際には何もランダムなものがないことを学びました。それは三次元空間で静止しているコインのようなものです。実際、3次元で回転できるコインは、Qubitの量子状態を視覚化する特定の方法——ブロッホベクトル——に非常に近い類推です。Quantum GateはこのコインやブロッホベクトルをGateを決定論的かつ可逆的に回転させます。Qubitを測定したときにだけ、ランダム性が生じます。この測定プロセスを、測定軸の方向にコインを押しつぶして平らにすることに例えました。

量子状態が重ね合わせにあるかどうかは、実際には見る人次第です。おそらくすでに学んだように、座標系——xxyyzz は任意の3つの直交方向を向けます——は自由に選べます。そのため、ある座標系では0と1の重ね合わせにある状態も、その状態が純粋に +z+z 方向を向くような新しい座標系——または等価的に新しい「測定基底」——を定義すれば、重ね合わせ状態ではなくなります。したがって、Qubitが重ね合わせにあると言う場合、「何の重ね合わせか?」という問いにも答える必要があります。

このモジュールを終えて、量子力学の神秘をすべて解き明かしたような印象を受けるかもしれません。結局、「最も奇妙な」とされる側面の一つであるQubitの重ね合わせ状態は、実際には三次元ベクトルと同じくらいシンプルなのだと。しかし、コインはあくまでも類推に過ぎず、ブロッホベクトルも測定結果の確率を計算するための視覚化ツールにすぎないことを忘れないでください。測定前に量子状態が実際に何をしているかを断言することはできません。なぜなら、それを確かめるには測定が必要だからです!

このジレンマ——量子状態の「真の」性質とは何か、そして量子もつれという量子現象がそれをどのように解明するのに役立つか——については、ベルの不等式モジュールで議論します。

設問

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

重要な概念

  • 重ね合わせ状態にあるQubitの測定結果はコインを投げるように確率的ですが、重ね合わせ状態そのものはコインを投げる行為とは本質的に異なる振る舞いをします。
  • 古典的な確率分布と重ね合わせの主な違いは、重ね合わせには位相コヒーレンスがあり、それによって建設的干渉または相殺的干渉が生じる点です。
  • 孤立した単一Qubitの状態は、「ブロッホ球」と呼ばれる球面上の点として可視化できます。0|0\rangle1|1\rangle 成分の相対的な振幅が極角 θ\theta を決定し、両成分間の相対位相が方位角 ϕ\phi を決定します。
  • 単一QubitのすべてのQuantum Gateは、この球面上のベクトルの回転として解釈できます。

正誤問題

  1. 正/誤:量子重ね合わせは、コインを投げるような古典物理学における確率的事象と基本的に同じである。

  2. 正/誤:孤立した単一Qubitの状態を表すブロッホベクトルの長さは常に 1 である。

  3. 正/誤:単一QubitのQuantum Gateはブロッホベクトルの長さを変えない。

多肢選択問題

  1. 状態 Ψ=130+eiπ/4231|\Psi\rangle = \sqrt{\frac{1}{3}}|0\rangle + e^{i \pi / 4} \sqrt{\frac{2}{3}}|1\rangle を表す正しいブロッホベクトルを選んでください:

4つのブロッホ球が示されています。選択肢aではベクトルがほぼ +x 方向を向いており、選択肢bでは +x と +y の中間でxy平面よりやや下、選択肢cでは +x と -y の間でxy平面よりやや上、選択肢dでは -x 方向を向いています。

  1. ブロッホ球が表すものをすべて選んでください:

    a. 振幅

    b. 他のQubitとのエンタングルメント

    c. 位相

    d. 色

    e. 測定結果の確率

考察問題

  1. Qubitの状態はブロッホ球上で可視化できるのに、コイン投げの確率分布はなぜ同様に可視化できないのでしょうか?

  2. 空中で回転するコインは量子重ね合わせ状態の最良の例えとは言えません。このアナロジーで捉えられていない重ね合わせのどのような側面があるでしょうか?

チャレンジ問題

  1. Qiskitを使用して、状態 0|0\rangle を状態 320+12ei5π61\frac{\sqrt{3}}{2}|0\rangle + \frac{1}{2}e^{i \frac{5\pi}{6}}|1\rangle に変換するCircuitを作成してください。