マウスで量子誤り訂正(②フェーズフリップ)

# この記事について
[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)は、①のビットフリップ訂正回路をあつかいました。
今回は、これを拡張し、フェーズフリップ（位相反転）の訂正回路を議論したいと思います。

* ①：[マウスで量子誤り訂正（①ビットフリップ）](https://qiita.com/shnchr/items/bb83dba29df85df5d006)
* ②：マウスで量子誤り訂正（②フェーズフリップ）(**本記事**)
* ③：[マウスで量子誤り訂正（③Shorの誤り訂正符号）](https://qiita.com/shnchr/items/499ad0e4318b2e07a6a6)
 
量子回路シミュレータの[Quirk](https://algassert.com/quirk#circuit={%22cols%22:[]})と数式の両方を使って進めて、最終的には、上記③で下記のShor Code[^shor]が理解できるように進めていきたいと思います。


* Shor's 9-bit Quantum Error Collection Code[^shor]
<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/f58ca6f0-d507-f345-c20e-12a96b7868b9.png>

また、他の量子コンピュータ関係の他の記事は、下記で紹介しています。

https://qiita.com/shnchr/items/41fa7fd1284d74007a7c


```math
\newcommand{\bra}[1]{\left\langle #1 \right|}
\newcommand{\ket}[1]{\left| #1 \right\rangle}
\newcommand{\bracket}[2]{\left\langle #1 \middle| #2 \right\rangle}
\newcommand{\tate}[2]{\begin{bmatrix} #1 \\ #2 \end{bmatrix}}
\newcommand{\yoko}[2]{\begin{bmatrix} #1 & #2 \end{bmatrix}}
\newcommand{\mtrx}[4]{\begin{bmatrix} #1 & #2 \\ #3 & #4 \end{bmatrix}}
```

# 量子ビットの「誤り方」
前回のおさらいです。[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)は、ビットフリップ（符号反転）の誤り訂正を扱いました。
今回は、フェーズフリップ（位相反転）の誤り訂正を扱っていきます。

||ビットフリップ（符号反転）|フェーズフリップ（位相反転）<br/>今回はこちら|
|:--:|:--:|:--:|
|説明|古典ビットと同様の0,1の逆転です|古典には無い位相の逆転です<br/>水平方向に反転します|
|イメージ|<img width=250 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/31e9699c-5224-a07d-fc7d-27291742b01b.gif>|<img width=250 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/f0007dff-9dfc-cad4-9073-f77a6ac2bad5.gif>|
|「誤り方」|$\ket{0}→\ket{1}$<br/>$\ket{1}→\ket{0}$|$\ket{+}→\ket{-}$<br/>$\ket{-}→\ket{+}$
|パウリゲート<br/>でいうと|$pauli \ X$相当のエラー|$pauli \ Z$相当のエラー|

# フェーズフリップ訂正回路
まずは、触っていただくのが良いと思います。下記リンクでシミュレータを起動できます。
下記は、フェーズフリップエラーを想定して、ノイズとして$Z$ゲートを適用しています。

* [フェーズフリップ訂正回路](https://algassert.com/quirk#circuit={%22cols%22:[[%22X^t%22,%22X^t%22],[%22Z^t%22,%22Z^t%22],[%22~j89n%22,%22~j89n%22],[%22Bloch%22,%22Bloch%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22Z%22],[1,%22~uluo%22,%22~7kaa%22,%22~klkc%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A2%22,%22X%22],[1,1,%22Measure%22,%22Measure%22],[1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[%22~j89n%22,%22~bjvs%22],[%22Bloch%22,%22Bloch%22]],%22gates%22:[{%22id%22:%22~j89n%22,%22name%22:%22%E5%85%83%E7%8A%B6%E6%85%8B%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~bjvs%22,%22name%22:%22%E8%A8%82%E6%AD%A3%E5%BE%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~ei1c%22,%22name%22:%22%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~uluo%22,%22name%22:%22%E3%83%8E%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~7kaa%22,%22name%22:%22%E3%82%A4%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~klkc%22,%22name%22:%22%E3%82%BA%22,%22matrix%22:%22{{1,0},{0,1}}%22}]})

<img width=800 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/6c3fd937-3598-073b-9866-3eb7246ca7c1.gif>

[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)と同様に、

* 誤り訂正が無い１量子ビット目は影響が出ます（ブロッホ球が反転します）
* 一方、誤り訂正がされた２量子ビット目は、誤り訂正されノイズ影響が無く処理できます

では、回路を細かく見ていきます。まず、量子ビットの使い方ですが、

* 1ビット目は、誤り訂正のは関係無い、説明用の量子ビットです。
* 2ビット目が、誤り訂正対象です。このビットを守るために誤り訂正回路を作ります。
* 3,4ビット目は、誤り訂正を実装するための、補助量子ビットです。

## ビットフリップ訂正との差分
[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)扱った、ビットフリップ訂正回路との違いは、エンコード、デコード処理です。
比較すると下記の通りで、すべての量子ビットに対してエンコード／デコードともに
$H$（アダマール）を掛けている点が違いです。

||エンコード|デコード|
|:--:|:--:|:--:|
|フェーズフリップ<br/>訂正|<img width=150 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/03485a43-f276-2db4-ca8c-a776fd4d2f35.png>|<img width=150 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/16dbb96f-2843-1eb5-2ed2-fc8c93dad20e.png>|
|ビットフリップ<br/>訂正|<img width=100 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/eafbd59a-d5e7-8941-ab56-dc1201e715cf.png>|<img width=100 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a83ae5a7-eb88-3f11-0da0-33bf52656086.png>|

## なぜ、Hを掛けるのか？
それは、**3本の矢**の作り方が違うからです。
[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)扱った、ビットフリップ訂正回路を思い出しましょう。
ビットフリップ訂正は、パウリ$X$エラー（$\ket{0}→\ket{1}$とその逆）に強いエンコードを考えました。

```math
\ket{\psi_{enc}} = a\ket{000} + b\ket{111}
```

$\ket{0}$が１本よりは、３本のほうが誤りにも強いだろうという考え方です。
では、フェーズフリップのパウリ$Z$エラー（$\ket{+}→\ket{-}$とその逆）訂正に向け

* どういったエンコードにすれば良いでしょうか？言い方をかえると、、
* 守りたい確率振幅（$a,b$）はどういった状態ベクトルに持たせるべきでしょうか？

パウリ$Z$エラー（$\ket{+}→\ket{-}$とその逆）に耐えるためには、
下記のようにアダマール基底を用いたエンコードが必要です。

```math
\ket{\psi_{enc}} = a\ket{{\scriptsize +++}}
\  
+
\ 
b\ket{{\scriptsize ---}} 
```

つまり、エンコード後の状態が上記の様なアダマール基底を用いたエンコードとなるように、$H$を適用するのがフェーズフリップ訂正回路です。
保護対象の量子ビットの状態を$\ket{\psi}$とすると、下記のようにエンコード回路を用いてアダマール基底を用いたエンコード状態を作ることができます。

```math
\ket{\psi} \otimes \ket{00}
\xrightarrow[]{CX_{12、13}}
a\ket{000} + b\ket{111}
\xrightarrow[]{H_{123}}
a\ket{{\scriptsize +++}}
\  
+
\ 
b\ket{{\scriptsize ---}}
= \ket{\psi_{enc}}
```

## デコード回路
一応、[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)と同様にデコードの過程と、誤り訂正の適用条件を確認しておきますが、エンコードされた状態の基底が変わるだけで、デコード後の状態や誤り訂正の適用条件も同様です。

|#|パウリ$Z$エラーが<br/>発生したビット|エラー発生後<br>デコード前の状態|デコード後の状態<br/>（$H_{123}CX_{13,12}$後）|補助ビットの状態|
|:--:|:--:|:--:|:--:|:--:|
|1|エラー無し<br/>※上記の式|$a\ket{{\scriptsize +++}} + b\ket{{\scriptsize ---}}$|$a\ket{0} + b\ket{1} \ \otimes \ \ket{00}$|$\ket{00}$|
|2|１ビット目<br/>(**保護対象**)|$a\ket{{\scriptsize \color{red}{-}++}} + b\ket{{\scriptsize \color{red}{+}--}}$|$a\ket{\color{red}{1}} + b\ket{0} \ \otimes \ \ket{11}$|$\ket{\color{red}{11}}$|
|3|２ビット目<br/>(補助①)|$a\ket{{\scriptsize +\color{red}{-}+}} + b\ket{{\scriptsize -\color{red}{+}-}}$|$a\ket{0} + b\ket{1} \ \otimes \ \ket{10}$|$\ket{10}$|
|4|３ビット目<br/>(補助②)|$a\ket{{\scriptsize ++\color{red}{-}}} + b\ket{{\scriptsize --\color{red}{+}}}$|$a\ket{0} + b\ket{1} \ \otimes \ \ket{01}$|$\ket{01}$|

# まとめ
[前回](https://qiita.com/shnchr/items/bb83dba29df85df5d006)に引き続き、誤り訂正回路を扱いました。
フェーズフリップの訂正回路は、

 * フェーズフリップがどの様な誤りなのか？
 * その誤りにはどういったエンコードが強いのか？

を検討することで、
比較的簡単にフェーズフリップ訂正回路にたどり着くことができたかと思います。

最後に、前回と同様に、フェーズフリップ（パウリ$Z$）に関して、
ノイズが$Z^{\frac{1}{2}}(=S)$や$Z^{\frac{1}{4}}(=T)$、$Z$軸回転で時間変化するパターン
においても正しく誤り訂正ができることを確認しておこうと思います。

[ノイズがS](https://algassert.com/quirk#circuit={%22cols%22:[[%22X^t%22,%22X^t%22],[%22Z^t%22,%22Z^t%22],[%22~j89n%22,%22~j89n%22],[%22Bloch%22,%22Bloch%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22Z^%C2%BD%22],[1,%22~uluo%22,%22~7kaa%22,%22~klkc%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A2%22,%22X%22],[1,1,%22Measure%22,%22Measure%22],[1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[%22~j89n%22,%22~bjvs%22],[%22Bloch%22,%22Bloch%22]],%22gates%22:[{%22id%22:%22~j89n%22,%22name%22:%22%E5%85%83%E7%8A%B6%E6%85%8B%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~bjvs%22,%22name%22:%22%E8%A8%82%E6%AD%A3%E5%BE%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~ei1c%22,%22name%22:%22%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~uluo%22,%22name%22:%22%E3%83%8E%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~7kaa%22,%22name%22:%22%E3%82%A4%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~klkc%22,%22name%22:%22%E3%82%BA%22,%22matrix%22:%22{{1,0},{0,1}}%22}]})

![S.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/8dbf06e6-ca0d-f771-27c8-4027ba1a20df.gif)


[ノイズがT](https://algassert.com/quirk#circuit={%22cols%22:[[%22X^t%22,%22X^t%22],[%22Z^t%22,%22Z^t%22],[%22~j89n%22,%22~j89n%22],[%22Bloch%22,%22Bloch%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22Z^%C2%BC%22],[1,%22~uluo%22,%22~7kaa%22,%22~klkc%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A2%22,%22X%22],[1,1,%22Measure%22,%22Measure%22],[1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[%22~j89n%22,%22~bjvs%22],[%22Bloch%22,%22Bloch%22]],%22gates%22:[{%22id%22:%22~j89n%22,%22name%22:%22%E5%85%83%E7%8A%B6%E6%85%8B%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~bjvs%22,%22name%22:%22%E8%A8%82%E6%AD%A3%E5%BE%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~ei1c%22,%22name%22:%22%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~uluo%22,%22name%22:%22%E3%83%8E%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~7kaa%22,%22name%22:%22%E3%82%A4%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~klkc%22,%22name%22:%22%E3%82%BA%22,%22matrix%22:%22{{1,0},{0,1}}%22}]})

![T.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/667d831d-379f-1abf-94fc-5c4926900c95.gif)


[ノイズがZ軸回転で時間変化](https://algassert.com/quirk#circuit={%22cols%22:[[%22X^t%22,%22X^t%22],[%22Z^t%22,%22Z^t%22],[%22~j89n%22,%22~j89n%22],[%22Bloch%22,%22Bloch%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22Z^t%22],[1,%22~uluo%22,%22~7kaa%22,%22~klkc%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22H%22,%22H%22,%22H%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A2%22,%22X%22],[1,1,%22Measure%22,%22Measure%22],[1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[%22~j89n%22,%22~bjvs%22],[%22Bloch%22,%22Bloch%22]],%22gates%22:[{%22id%22:%22~j89n%22,%22name%22:%22%E5%85%83%E7%8A%B6%E6%85%8B%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~bjvs%22,%22name%22:%22%E8%A8%82%E6%AD%A3%E5%BE%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~ei1c%22,%22name%22:%22%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~uluo%22,%22name%22:%22%E3%83%8E%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~7kaa%22,%22name%22:%22%E3%82%A4%22,%22matrix%22:%22{{1,0},{0,1}}%22},{%22id%22:%22~klkc%22,%22name%22:%22%E3%82%BA%22,%22matrix%22:%22{{1,0},{0,1}}%22}]})

![Zt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/9b982e52-d4c5-c3b9-146b-c7b5f282793d.gif)

# 次回は、
[マウスで量子誤り訂正（③Shorの誤り訂正符号）](https://qiita.com/shnchr/items/499ad0e4318b2e07a6a6)で、ビット、フェーズの両方のフリップに対応できるShorの符号を扱います。


[^shor]: https://en.wikipedia.org/wiki/Quantum_error_correction#The_Shor_code より引用