VQE/QAOAの期待値測定の部分を学ぶ

なんでか知らんけど、ここらへんの詳細って誰も説明しないんですよねぇ。
ノウハウなのか面倒だからなのか知らんけど。

量子コンピュータの基本的なゲートは、一応は知っている読者を想定しています。

[BlueqatのSlack](https://blueqat.slack.com)で聞かれたので、この際だからまとめます。(誰でも入れます。招待リンクは[こちら](https://join.slack.com/t/blueqat/shared_invite/enQtNzc3NjgxNjA5OTA2LTNmNjg0YzAzNGUxYmYwNDIxNWFlZGVkODI0MTE2NDMwM2I3OTRjNGExZjMxZWFmZDI3ZTRlNDU3NTcwZDUyOTk))

# 期待値測定? なんだっけそれ?
VQEの大雑把な流れは[以前書いた記事](https://qiita.com/gyu-don/items/363c56245be11475a9ad)を参照してほしいのですが、VQEの問題設定について軽くおさらいします。

## 問題設定

> ハミルトニアンと呼ばれる行列$\hat H$が与えられます。この行列に対し、ノルム1のベクトルであって、$\boldsymbol{X}\cdot \hat H \boldsymbol{X}$ (ただし$\cdot$は内積)が最小になるような$\boldsymbol{X}$を探したとき、$\boldsymbol{X}\cdot \hat H \boldsymbol{X}$の値はいくらか、という問題をVQE/QAOAによって解くことができます。

といったものでした。

以前の記事では量子力学っぽい記述はあえて避けたのですが、

- $\boldsymbol{X}$は量子力学では$|\Psi>$と書かれることが多いです。
- $\boldsymbol{X}\cdot \hat H \boldsymbol{X}$は$<\Psi|\hat H|\Psi>$と書かれることが多いです。

記号の意味は、

- $\hat H|\Psi>$は、$\hat H$(行列)と$|\Psi>$ (縦ベクトル)の掛け算
- $<\Psi|$は$|\Psi>$のエルミート共役(実ベクトルでいうと転置)
- $<\Psi|\hat H|\Psi>$は、$<\Psi|$と$\hat H|\Psi>$の掛け算
    - 横ベクトルと縦ベクトルの掛け算なので、具体的には、$|\Psi>$と$\hat H|\Psi>$の内積

です。

量子力学では、ハミルトニアン$\hat H$はエネルギーを求める演算子で、$<\Psi|\hat H|\Psi>$は、量子状態$|\Psi>$のエネルギーの期待値を求める計算に相当します。

## この記事で学びたいこと

この記事では、

- $\hat H$が与えられている
- 量子状態$|\Psi>$を作る量子回路が与えられている

ときに、どうやったら期待値$<\Psi|\hat H|\Psi>$が求まるのかを学びます。

なお、VQE/QAOAでは、$|\Psi>$はAnsatzと呼ばれ、パラメータを振って$|\Psi(\theta)>$のように書かれることもあります。


## 測定したらどうなるの?

量子コンピュータでの測定は、通常は「Z基底での測定」と呼べるものしかできません。
これは、

$|\Psi> = \alpha |0> + \beta |1> (|\alpha|^2 + |\beta|^2 = 1)$

と書き表せるとき、

- $|\alpha|^2$の確率で測定結果0を得る
- $|\beta|^2$の確率で測定結果1を得る

というものです。
VQEでは、測定によって期待値を得ますので、これは非常に重要です。

## ハミルトニアンはパウリ行列の線型結合で表せる

ハミルトニアン$\hat H$は、パウリ行列の直積と、線型結合で書けます。

量子化学でよく用いるものは、第二量子化をして、Jordan-Wigner変換やBravyi-Kitaev変換によって、この形式が得られますし、
QAOAで用いるイジングモデルのハミルトニアンは、$\sigma_z$をパウリのZ行列で置くと、この形式が得られます。

## ハミルトニアンや、パウリ行列の直積は線形

つまり、

$\hat H = a\hat H_1 + b\hat H_2$と書ける場合、

```math
\begin{eqnarray}
<\Psi|\hat H|\Psi> &=& <\Psi|a\hat H_1 + b\hat H_2|\Psi> \\
&=& a<\Psi|\hat H_1|\Psi> + b<\Psi|\hat H_2|\Psi>
\end{eqnarray}
```

のように、ばらばらに分けることができます。

これだけ分かっていれば、とりあえず十分でしょう。簡単な例からはじめて、少しずつ一般的にしていきます。

# ハミルトニアンがパウリのZ行列の場合

$|\Psi> = \alpha |0> + \beta |1>(|\alpha|^2 + |\beta|^2 = 1)$として、$<\Psi|Z|\Psi>$を求める方法を考えます。

まず、

```math
\begin{eqnarray}
|0>&=&\begin{pmatrix}1\\0\end{pmatrix}\\
|1>&=&\begin{pmatrix}0\\1\end{pmatrix}\\
Z&=&\begin{pmatrix}1&0\\0&-1\end{pmatrix}
\end{eqnarray}
```

でしたので、
$Z |\Psi> = \alpha |0> - \beta |1>$
となり、

```math
\begin{eqnarray}
<\Psi|Z|\Psi>&=&(<0|\alpha^* + <1|\beta^*)( \alpha |0> - \beta |1>)\\
&=&\alpha^*\alpha<0|0> + \alpha^*\beta<0|1> - \beta^*\alpha <1|0> - \beta^*\beta<1|1>\\
&=&\alpha^*\alpha - \beta^*\beta \\
&=&|\alpha|^2 - |\beta|^2
\end{eqnarray}
```

となります。 $\<n|m> = \delta_{n,m}$となることを使いました。また、${}^*$は、複素共役を表します。

先ほど、測定をすると

- $|\alpha|^2$の確率で測定結果0を得る
- $|\beta|^2$の確率で測定結果1を得る

と書いたことを思い出して下さい。
つまり、何度か測定をして、

- $|0>$が得られた数を$N_0$
- $|1>$が得られた数を$N_1$
- トータルの測定回数を$N = N_0 + N_1$

とすると、

$<\Psi|Z|\Psi> = N_0/N - N_1/N = (N_0 - N_1)/N$

となります。
よって、$|\Psi>$を測定して、回数を測ることで、期待値の計算ができました。

# ハミルトニアンがZ行列の定数倍のとき

$\hat H = 1.2Z$のような場合、より一般的には、$\hat H = kZ$の場合、
線形性より$<\Psi|kZ|\Psi> = k<\Psi|Z|\Psi>$が成り立つので、単に、Zのときの結果をk倍すればいいだけだと分かります。

# ハミルトニアンがX行列の場合

量子ゲート計算の基本で、
X = HZH
というものがあります。(Hはアダマールゲートです。ハミルトニアンではないので気をつけて下さい)

これを使うと
$<\Psi|X|\Psi> = <\Psi|HZH|\Psi>$

なので、
$|\Psi'> = H|\Psi>$
と置くと、これは
$<\Psi'|Z|\Psi'>$の計算をしていることになります。

つまり、$|\Psi>$にアダマールゲートをかけてから、Z行列のときと同じ計算をすればいいことが分かります。

# ハミルトニアンがY行列の場合
Y = RX(-π/2) Z RX(π/2)
となります。RX(π/2)のエルミート共役はRX(-π/2)なので、これは
Y = RX(π/2)† Z RX(π/2)
になります。

なので、
$|\Psi'> = RX(\pi/2)|\Psi>$と置くと、$<\Psi|Y|\Psi> = <\Psi|RX(π/2)^\dagger\ Z\ RX(π/2)|\Psi> = <\Psi'|Z|\Psi'>$
となります。

つまり、$|\Psi>$にRXゲートをかけてから、Z行列のときと同じ計算をすればいいことが分かります。

# |Ψ>が2量子ビットで、ハミルトニアンがZZのとき

$\hat H = Z_0 Z_1$のとき、

$\hat H|00> = |00>$
$\hat H|01> = -|01>$
$\hat H|10> = -|10>$
$\hat H|11> = |11>$

となり、

- 測定された状態のうち、1の数が偶数だと1を
- 測定された状態のうち、1の数が奇数だと-1を

返す演算子と見ることができます。

実際、

$|\Psi> = a_{00}|00> + a_{01}|01> + a_{10}|10> + a_{11}|11>$

(ただし$\sum_{i,j\in\\{0,1\\}} |a_{ij}|^2 = 1$)

とおくと、測定結果は

|確率|得られる状態|
|:--:|:--:|
|$\mid a_{00}\mid^2$ | ｜00>|
|$\mid a_{01}\mid^2$ | -｜01>|
|$\mid a_{10}\mid^2$ | -｜10>|
|$\mid a_{11}\mid^2$ | ｜11>|

期待値は
$<\Psi|Z_0 Z_1|\Psi> = |a_{00}|^2 - |a_{01}|^2 - |a_{10}|^2 + |a_{11}|^2$
が得られます。

つまり、

- 測定結果のうち、1の数が偶数だったものを$N_0$
- 測定結果のうち、1の数が奇数だったものを$N_1$
- トータルの測定回数を$N = N_0 + N_1$

とおくと、期待値は$(N_0 - N_1)/N$で計算できます。

# より量子ビット数が多い場合
実は、2量子ビットのときと同じように、何量子ビットあっても

- 測定結果のうち、1の数が偶数だったものを$N_0$
- 測定結果のうち、1の数が奇数だったものを$N_1$
- トータルの測定回数を$N = N_0 + N_1$

とおいて、期待値を$(N_0 - N_1)/N$で計算できます。

Z行列が$Z_1 Z_3 Z_7 Z_8$のように、歯抜けになっていても計算できます。
Z行列があるところだけ測定して、奇数の数を数えたらOKです。
(Z行列がないところも測定して構いませんが、奇数の数を数える際に、Z行列がないところは無視する必要があります)

# ハミルトニアンがXZZYXXのようなものの場合
Xがある部分にアダマールゲートを、Yがある部分にRX(π/2)ゲートをかけたらいいです。
この場合、ゲートをかけて
$H_0 RY(\pi/2)_3 H_4 H_5|\Psi>$
を作ってから、ZZZZZZのときの手順で期待値を求めることができます。

# ハミルトニアンがX + Zの場合
また1量子ビットに戻って、
$\hat H = X_0 + Z_0$
の場合を考えます。

一気に$X_0 + Z_0$の期待値は求まらないので、$X_0$の期待値と$Z_0$の期待値をそれぞれ求めて、後で足します。
つまり、
$<\Psi|X_0 + Z_0|\Psi> = <\Psi|X_0|\Psi> + <\Psi|Z_0|\Psi>$
のように求めます。

# ハミルトニアンがパウリ行列の直積の線型結合のとき
ここまで理解したら、最も一般的なケースでも、期待値を求めることができます。

例えば
$\hat H = 1.2 X_0 Z_2 + 2.5 Z_3 X_4 Y_2 - 3.4 Z_2 X_3$
の場合、

- $<\Psi|X_0 Z_2|\Psi>$ を求めて、1.2倍した値
- $<\Psi|Z_3 X_4 Y_2|\Psi>$ を求めて、2.5倍した値
- $<\Psi|Z_2 X_3|\Psi>$ を求めて、-3.4倍した値

の和が、$<\Psi|\hat H|\Psi>$の期待値になります。

# まとめ
この記事では、期待値測定について学びました。
簡単なハミルトニアンから初めて、徐々に複雑なハミルトニアンを考えることで、理解が進んだのではないでしょうか。

## Blueqatの宣伝
それでも難しい、という方は、ぜひとも、私が開発に関わっている量子コンピュータライブラリの[Blueqat](https://github.com/Blueqat/Blueqat)を使ってみてください。
このへんの複雑な計算はライブラリで面倒を見て、ユーザは書きたい部分だけを書くことができます。

QAOAの計算の場合、[チュートリアル](https://github.com/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/022_algo_qaoa.ipynb)にあるとおり、


```py
from blueqat import vqe
from blueqat.pauli import qubo_bit as q

H = q(0)*q(1)
```

のように、解きたいハミルトニアンを定義して
(量子アニーリングによく使われる、QUBOでハミルトニアンを定義できるようにしています)

```py
step = 2

result = vqe.Vqe(vqe.QaoaAnsatz(H, step)).run()
print(result.most_common(12))
```

のように、ほとんど何もしなくても自動で問題を解いてくれます。