科学しよう

量子計算のプログラミングの解説をメインに、データサイエンス・機械学習について勉強したことをご紹介します

MENU

物理量の期待値

前回の射影測定で状態がわかると物理量(演算子)の値がわかります。
また、一般に状態は重ね合わせのため、多数回測定したときには期待値が得られますのでその計算方法を紹介します。

量子力学では頻繁に登場する概念ですが、量子計算は状態を測定できればいいので物理量を意識することはほとんどありません。
ただ、VQEなど一部のアルゴリズムでは物理量(といっても \sigma_x, \sigma_y, \sigma_z)の期待値が必要になる場合ばありますので量子コンピュータを用いた場合の期待値計算もご紹介します。

対象とする読者

  • 量子プログラミングに興味を持ち始めたばかりのエンジニア
  • 量子計算に興味を持ち始めたばかりの高校生・大学生 など

対象でない読者

  • 量子情報処理の研究室ご出身の方
    など

※もちろん読んでいただける分には嬉しいですが、
特に前半部分は電子回路の授業で扱われていたり教科書にも載っている内容となりますので
いまさらと感じさせてしまうかもしれません。

前提とする知識

バージョン情報

目次

物理量の演算子

物理量

物理量とは可観測量(Observable)とも呼ばれ、量子力学で実際に何らかの値として測定されうる量のことです。
例えば下記があります。(太字はベクトル量です。)

  • 位置  \mathbf{x}
  • 速度  \mathbf{v} (もしくは運動量  \mathbf{p} )
  • 粒子数  n
  • 位相  \theta
  • エネルギー  H
  • スピン  \mathbf{\sigma}

量子計算で一番馴染みがありそうなのはエネルギーだと思います。
エネルギーの演算子 Hハミルトニアンで、エネルギー固有値がその状態が持つエネルギーで、その一番小さいエネルギーを持つ状態を | 0 \rangleとし、その1つ上のエネルギーを持つ状態を | 1 \rangleとしたのが超伝導量子ビットです。

下図は初期の超伝導磁束量子ビットでRabi振動(量子状態のマイクロ波制御)を観測した論文に掲載されている図です。
超伝導磁束量子ビットのエネルギーは超伝導リングを貫く磁束(磁場)で変化します(右図A)。
一番下の曲線が基底状態(量子計算でいうところの | 0 \rangle状態)のエネルギーの変化を、またその一つ上の曲線が第一励起状態( | 1 \rangle)のエネルギーの変化の理論計算値を示しています。
図Bは飛ばして図Cが基底状態に置いた超伝導量子ビットにある磁場(横軸)をかけたあと、様々な周波数のマイクロ波を照射した結果、吸収された周波数(縦軸)を示します。
図Cの実線が基底状態と第一励起状態のエネルギーの理論値の差で、点が測定された周波数です。
マイクロ波フォトンのエネルギーは h\nu ( hはPlank定数で、 \nuが周波数)で計算されるので、周波数を測定することでその状態における系のエネルギーを測定できたことに相当します。

f:id:sakumadaisuke32:20211012001717p:plain
図1. 超伝導磁束量子ビットのエネルギー測定

引用した論文はこちら arxiv.org

演算子の定義

物理量の概念や物理学における実体が以上で理解いただけたとして、数学上の物理量 \hat{A}の定義は一般に下記です。

\displaystyle{
\hat{A} = \sum_{i}{a_i | a_i \rangle \langle a_i |}
}

ここで | a_i \rangleは物理量 \hat{A}固有ベクトル(状態ベクトル)で a_iがその固有ベクトルに対応する固有値です。

量子計算では状態ベクトルは基本的に | 0 \rangle, | 1 \rangle (とその組み合わせ)しか用いません。
これはスピンが上( | 0 \rangle)を向いているか、下( | 1 \rangle)を向いているかに相当します。
パウリ行列 \hat{\sigma_z}固有ベクトルを量子計算で使う | 0 \rangle, | 1 \rangleに対応しており、下記のように表せます。

\displaystyle{
\hat{\sigma_z} = | 0 \rangle \langle 0 | - | 1 \rangle \langle 1 |
}

量子ビット | 0 \rangleなら「1」でZ軸上向き、そして | 1 \rangleなら「-1」でZ軸下向きを表します。

測定値に中間の値はなく、同一の状態 | \psi \rangle = \alpha | 0 \rangle + \beta | 1 \rangleとして生成した量子ビットを複数回測定した場合に、 \sigma_xの測定値は | \alpha |^2の確率で「1」となり | \beta |^2の確率で「-1」となります。
また後述しますが、この時の期待値は通常の統計における期待値と同様に±1にそれぞれの重みを乗じたものの和になります。

パウリ行列

代表的な物理量としてパウリ行列をブラケット記法でご紹介します。


\begin{aligned}
\sigma_z &=  | 0 \rangle \langle 0 | - | 1 \rangle \langle 1 | = 
\begin{pmatrix}
1 & 0 \\
0 & -1 \\
\end{pmatrix} (Z基底の場合) \\
\end{aligned}

\begin{aligned}
\sigma_x &= 
\begin{pmatrix}
0 & 1 \\
1 & 0 \\
\end{pmatrix} 
= | 0 \rangle \langle 1 | + | 1 \rangle \langle 0 | (Z基底の場合) \\
&= | + \rangle \langle + | - | - \rangle \langle - | (X基底の場合) \\
\end{aligned}

ここで | \pm \rangle = (1 / \sqrt{2})(| 0 \rangle \pm | 1 \rangle)


\begin{aligned}
\sigma_y &= 
\begin{pmatrix}
0 & i \\
-i & 0 \\
\end{pmatrix} 
= i | 0 \rangle \langle 1 | -i | 1 \rangle \langle 0 | (Z基底の場合) \\
&= | \frac{\pi}{2} \rangle \langle \frac{\pi}{2} | - | - \frac{\pi}{2} \rangle \langle - \frac{\pi}{2} | (Y基底の場合) \\
\end{aligned}

ここで | \pm \pi / 2 \rangle = (1 / \sqrt{2})(| 0 \rangle + e^{\pm i \pi / 2} | 1 \rangle)

それぞれのパウリ行列に対応する基底に変換すると、いずれについても \pm 1になるのが面白いところですね。
それぞれの軸について量子ビットがどちらを向いているかが確かに表されています。

余談ですが、物理学ではパウリ行列単独で物理量となることはなく、スピン( \hat{\bf{s}} = (1 / 2)\hat{\bf{\sigma}})が物理量となります。

物理量の期待値の計算方法

物理量 \hat{A}の期待値 \langle \hat{A} \rangleは任意の量子状態 | \psi \rangleを用いて

\displaystyle{
\langle \hat{A} \rangle = \langle \psi | \hat{A} | \psi \rangle
}

例えば、 \sigma_zについて、状態が | \psi \rangle = \alpha | 0 \rangle + \beta | 1 \rangleの場合における期待値 \langle \sigma_z \rangleは下記です。


\begin{aligned}
\langle \sigma_z \rangle &= ( \alpha^{*} \langle 0 | + \beta^{*} \langle 1 |) (| 0 \rangle \langle 0 | - | 1 \rangle \langle 1 |) (\alpha | 0 \rangle + \beta | 1 \rangle) \\
&= | \alpha | ^2 - | \beta | ^2
\end{aligned}

期待値計算の例題

単一の物理量

 \langle \sigma_x \rangle

  • 量子状態が | \psi \rangle = | 0 \rangleの場合

\begin{aligned}
\langle \sigma_x \rangle &= \langle 0 | (| + \rangle \langle + | - | - \rangle \langle - |) | 0 \rangle \\
&= \frac{1}{2} (\langle + | + \langle - |) (| + \rangle \langle + | - | - \rangle \langle - |) (| + \rangle + | - \rangle ) \\
&= 0
\end{aligned}

量子コンピュータ(IBMQ)上では測定の基底変換はできないので等価になるように状態を回転させます。

qr = QuantumRegister(1)
cr = ClassicalRegister(1)
circuit = QuantumCircuit(qr, cr)

circuit.h(qr)
circuit.barrier()

circuit.measure(qr, cr)

backend = provider.get_backend('ibmq_armonk')
job = execute(circuit, backend=backend, shots=8192)
job_monitor(job, interval = 2)

result = job.result()
count = result.get_counts()

plot_histogram(count)

f:id:sakumadaisuke32:20211011091603p:plain
図2.  | 0 \rangleをX基底で測定した結果 (左) 量子回路 (右) 測定結果
ヒストグラム上では | 0 \rangle, | 1 \rangleと表記されているが、 | + \rangle, | - \rangleの分布を観察しているのと等価である。

そして得られた分布から

num_sampling = sum([dist for dist in count.values()])
print(f'サンプリング数: {num_sampling}')
>> サンプリング数: 8192

observable = [1, -1]
exp_val = sum([(cnt / num_sampling) * val for cnt, val in zip(observable, count.values())])
print(f'期待値: {exp_val}')
>> 期待値: 0.01953125

となり、代数計算した場合とほぼ同じくゼロとなった。

  • 量子状態が | \psi \rangle = | \pm \rangleの場合

\begin{aligned}
\langle \sigma_x \rangle &= \langle \pm | (| + \rangle \langle + | - | - \rangle \langle - |) | \pm \rangle \\
&= \pm 1
\end{aligned}

量子コンピュータ(IBMQ)上では先ほどと同じ計算過程によって

qr = QuantumRegister(1)
cr = ClassicalRegister(1)
circuit = QuantumCircuit(qr, cr)

circuit.h(qr)
circuit.barrier()

circuit.h(qr)

circuit.measure(qr, cr)

backend = provider.get_backend('ibmq_armonk')
job = execute(circuit, backend=backend, shots=8192)
job_monitor(job, interval = 2)

result = job.result()
count = result.get_counts()

plot_histogram(count)

f:id:sakumadaisuke32:20211011092522p:plain
図3.  | + \rangle をX基底で測定した結果

num_sampling = sum([dist for dist in count.values()])
print(f'サンプリング数: {num_sampling}')
>> サンプリング数: 8192

observable = [1, -1]
exp_val = sum([(cnt / num_sampling) * val for cnt, val in zip(observable, count.values())])
print(f'期待値: {exp_val}')
>> 期待値: 0.818603515625

である。

物理量の積

量子ビットが2つの場合の \langle \sigma_{1z} \sigma_{2y} \rangle
(1つ目の量子ビット \sigma_zと2つ目の量子ビット \sigma_yの積の期待値)

全体の物理量は2状態かける2状態の総当たり(直積)となり、

  • 量子状態が | \psi \rangle = | 0 \frac{\pi}{2} \rangleの場合

\begin{aligned}
\langle \sigma_{1z} \sigma_{2y} \rangle &= \langle 0 \frac{\pi}{2} | (| 0 \frac{\pi}{2} \rangle \langle 0 \frac{\pi}{2} | + | 1 \frac{- \pi}{2} \rangle \langle 1 \frac{- \pi}{2}) | - | 0 \frac{- \pi}{2} \rangle \langle 0 \frac{ - \pi}{2} | - | 1 \frac{\pi}{2} \rangle \langle 1 \frac{\pi}{2} |) | 0 \frac{\pi}{2} \rangle \\
&= 1
\end{aligned}

で、量子コンピュータ(IBMQ)を用いた場合もこれまで通り下記です。

qr = QuantumRegister(2)
cr = ClassicalRegister(2)
circuit = QuantumCircuit(qr, cr)

circuit.h(qr[1])
circuit.rz(np.pi / 2, qr[1])
circuit.barrier()

circuit.rz(-np.pi / 2, qr[1])
circuit.h(qr[1])
circuit.barrier()

circuit.measure(qr, cr)

circuit.draw(output='mpl')

backend = provider.get_backend('ibmq_quito')
job = execute(circuit, backend=backend, shots=8192)
job_monitor(job, interval = 2)

result = job.result()
count = result.get_counts()

num_sampling = sum([dist for dist in count.values()])
print(f'サンプリング数: {num_sampling}')
>> サンプリング数: 8192

observable = [1, -1, -1, 1]
exp_val = sum([(cnt / num_sampling) * val for cnt, val in zip(observable, count.values())])
print(f'期待値: {exp_val}')
>> 期待値: 0.9560546875

f:id:sakumadaisuke32:20211011230631p:plain
図4.  | \psi \rangle = | 0 \frac{\pi}{2} \rangleをそれぞれZ基底とY基底で測定した結果

  • 量子状態が | \psi \rangle = \frac{1}{\sqrt{2}}(| 0 \frac{\pi}{2} \rangle + | 1 \frac{- \pi}{2} \rangleの場合

\begin{aligned}
\langle \sigma_{1z} \sigma_{2y} \rangle &= \frac{1}{2} (\langle 0 \frac{\pi}{2} | + \langle 1 \frac{- \pi}{2} | ) (| 0 \frac{\pi}{2} \rangle \langle 0 \frac{\pi}{2} | + | 1 \frac{- \pi}{2} \rangle \langle 1 \frac{- \pi}{2}) | - | 0 \frac{- \pi}{2} \rangle \langle 0 \frac{ - \pi}{2} | - | 1 \frac{\pi}{2} \rangle \langle 1 \frac{\pi}{2} |) (| 0 \frac{\pi}{2} \rangle + | 1 \frac{- \pi}{2} \rangle ) \\
&= 1
\end{aligned}

で、量子コンピュータ(IBMQ)を用いた場合もこれまで通り下記です。

qr = QuantumRegister(2)
cr = ClassicalRegister(2)
circuit = QuantumCircuit(qr, cr)

circuit.h(qr)
circuit.rz(np.pi / 2, qr[1])
circuit.cz(qr[0], qr[1])
circuit.barrier()

circuit.rz(-np.pi / 2, qr[1])
circuit.h(qr[1])
circuit.barrier()

circuit.measure(qr, cr)

circuit.draw(output='mpl')

backend = provider.get_backend('ibmq_quito')
job = execute(circuit, backend=backend, shots=8192)
job_monitor(job, interval = 2)

result = job.result()
count = result.get_counts()

plot_histogram(count)

num_sampling = sum([dist for dist in count.values()])
print(f'サンプリング数: {num_sampling}')
>> サンプリング数: 8192

observable = [1, -1, -1, 1]
exp_val = sum([(cnt / num_sampling) * val for cnt, val in zip(observable, count.values())])
print(f'期待値: {exp_val}')
>> 期待値: 0.74365234375

f:id:sakumadaisuke32:20211011234600p:plain
図5.  \frac{1}{\sqrt{2}}(| 0 \frac{\pi}{2} \rangle + | 1 \frac{- \pi}{2} \rangleを測定した結果

わかりにくいですが、この重ね合わせ状態はグラフの両端 (1 / \sqrt{2})(| 00 \rangle + | 11 \rangle )に対応します。

まとめ

  • 物理量とは可観測量(Observable)とも呼ばれ、何らかの値として測定されうる量のこと
  • 物理量の固有ベクトル(状態ベクトル)に対応する固有値が測定値になる
  • 期待値はそれぞれの測定値を測定された状態の確率を乗じて求まる


量子コンピューティング 基本アルゴリズムから量子機械学習まで [ 情報処理学会出版委員会 ]