Groverの増幅演算子における反転操作S0の符号の問題

# Groverのアルゴリズムと増幅演算子

量子ゲートコンピュータで用いられるGroverのアルゴリズムでは、入力量子状態に含まれる解状態の振幅を
増幅する演算子$Q$が定義されます。

しかしこの増幅演算子$Q$の定義が曲者で、文献や実装によって$Q$そのものだったり、$-Q$が用いられたりします。
今回はこの問題を扱いたいと思います。
結論から言いますと、
**「Groverアルゴリズムであればどっちでもいいが、QAEなどの応用例では、符号の定義の違いは問題となる」**
と言えます。

# 増幅演算子Q

## 構成
参考サイト(https://whyitsso.net/physics/quantum_mechanics/AA_AE_Grover.html)
がよくまとまっています。

$Q$は、次のように構成されます。
$Q = -S_{\psi}S_{f}$

ここで、
$S_{f} |\psi_{0} \rangle = |\psi_{0} \rangle $
$S_{f} |\psi_{1} \rangle = -|\psi_{1} \rangle $
は、解状態$|\psi_{1} \rangle $だけ符号反転させるゲートです。(オラクルと呼ばれます）

また、
$-S_{\psi} = 2|\psi \rangle \langle \psi | - I$
は、状態を初期状態（＝Groverアルゴリズムの入力状態）$| \psi \rangle$を軸として反転させるゲートです。
更にシンプルな書き方ができて、
$-S_{\psi} = -US_{0}U^{\dagger}$
$S_{0} = I - 2|000 \rangle \langle 000|$
$|\psi \rangle = U|000 \rangle$
となります。(3qubitの場合)
初期状態$| \psi \rangle$は自分が用意するものですから、それを作り出す操作$U$は既知です。
$U$から$U^{\dagger}$を作るのは簡単で、ゲートの順番を逆にすればよいです。
よって、反転操作$-S_{0}$を構築すれば$-S_{\psi} = U(-S_{0})U^{\dagger} $は作れます。

## 反転操作 - S0

$Q$を構成する要素である反転操作$-S_{0}$を、具体的にどういう基本ゲートで作るかを考えます。
実はこれが意外と難しいようなのです（？）
代わりに、$+S_{0}$は比較的かんたんに作ることが出来ます。

3qubitの場合、
$S_{0} = I - 2|000 \rangle \langle 000|$

です。$|000 \rangle \langle 000|$の行列表示$a_{ij}$を考えると、最も左上の成分$a_{00}=1$であり、ほかは全て$0$となっています。
ここから$S_{0}$の行列表示$b_{ij}$は、

- 最も左上の成分$b_{00}=-1$
- それ以外の対角成分は$b_{ii} = 1$
- それ以外の全成分は$b_{ij} = 0$

となります。よって、$S_{0} = X^{\otimes 3} (CCZ)X^{\otimes 3}$ となることがわかります。
$CCZ$は制御制御$Z$です。ふつうは制御NOT(CX)あるいは制御制御NOT(CCX)しか使えないので、
$Z = HXH$の関係を使ってCXで表現すれば実装できます。
実際、このような構成方法が多くの場合に見られます。

Blueqatチュートリアル
(https://github.com/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/116_grover_ja.ipynb), typoあり

Qiskitチュートリアル(の、example3)[^1]
(https://qiskit.org/textbook/ch-algorithms/grover.html)

QiskitのGroverアルゴリズムのライブラリ ; $S_{0}$とGlobal phase について記載があります。
(https://qiskit.org/documentation/stubs/qiskit.circuit.library.GroverOperator.html)

**しかしここで作ったのは$-S_{0}$ではなく$+S_{0}$です。**

# 反転操作が +S0 か -S0か　で何が違うか

## Groverのアルゴリズムの場合

**反転操作が $+S_{0}$ か $-S_{0}$か　で何が違うか、困ったことが起こるのか、考えてみます。**

それはつまり増幅演算子が$-Q$であるか$+Q$であるかということになります。
Groverのアルゴリズムの場合、増幅演算子$+Q$を掛けるたびに解状態の振幅が増幅されます。
$-Q$を掛けた場合、状態全体の符号が(掛けるたびに)反転します。
Groverのアルゴリズムでは振幅ではなく振幅の絶対値（確率）が高ければよいので、符号は問題になりません。
そもそも状態全体の符号というのはいわゆるグローバル位相ですので、これを検出するような測定は存在しません。


## QAEアルゴリズムの場合

次にQAE(Quantum Amplitude Estimation) の場合を考えてみます。
QAEについては当ブログ参照。(https://qiita.com/notori48/items/2082be87eea0985b01ba)

QAEでは、増幅演算子$Q$の固有値の位相に興味があります。これをQPEで推定するというのがQAEです。

増幅演算子$Q$の固有値の位相を$\theta$とします。3 qubit精度で推定する場合は
$\theta = 2\pi(j_{0}/2+j_{1}/4+j_{2}/8) = 2\pi(0.j_{0}j_{1}j_{2})$ となる2進小数表示$j_{0,1,2}$を推定します。
$j_{0}$が$0$であるか$1$であるかは位相に$\pi$の項があるかないかに相当しています。

では、増幅演算子が符号の違っている$-Q$だった時、推定結果に影響はあるでしょうか？
$-Q = e^{j\pi}Q$ であることに注意します。つまり$-Q$の固有値の位相は$\theta$から$\theta' = \theta+\pi$へ移っています。
よって推定結果は
$\theta' = 2\pi( (\lnot j_{0})/2+j_{1}/4+j_{2}/8) = 2\pi(0.(\lnot j_{0})j_{1}j_{2}) \neq \theta$
となります。
$\lnot $ は$0$と$1$を反転する操作です。
位相が$\pi$ずれるということは、$j_{0}$が$0$であるか$1$であるかをひっくり返すことと同じだからです。[^2]

ということで、
**QPEの場合（ひいてはQAEの場合）には増幅演算子が$+Q$なのか$-Q$なのかは結果に影響を与えます。[^3]**

$-Q$を使ってしまった場合には、$j_{0}$を測定後にひっくり返すか、
測定前の量子状態$|j_{0} \rangle$に$X$ゲートを置いてやることで符号の違いを吸収できるかと思います。
(試していませんけども）

**2021/02/25追記**

過去記事; [Qiskitで量子振幅推定(QAE)](https://qiita.com/notori48/items/5bf7e43aa2c4d70aed36)に
$+Q$の場合と$-Q$の場合を掲載しています。

- $+Q$の場合は$001, 110$
- $-Q$の場合は$101, 010$

となっています。
確かに$\pi$に対応する桁（左端の量子ビットです)が反転しています。

# 結論

- 「符号はグローバル位相なので気にしない」は危険かもしれない。
- 実装例を鵜呑みにはせずに、自分でひとつずつチェックすることが重要。

[^1]: なぜかexample 2 では正しく$-S_{0}$を構成しています。おそらく2qubit程度であれば$-S_{0}$を作るのは大変ではないのでしょう。
[^2]: $j_{0}$にだけ影響が出る理由は、ここだけ$Q$の作用する回数が奇数(1回)だからです。'-1'の因子が消えること無く制御ビットの相対位相に移っていきます（位相キックバック）。移った先はグローバル位相**ではなく**相対位相ですので、測定結果として区別されるわけです。
[^3]: 私の過去記事で実際にこの問題が起きています。https://qiita.com/notori48/items/5bf7e43aa2c4d70aed36