マウスで量子誤り訂正(③Shorの符号)

# この記事について
下記①②にて、ビットフリップとフェーズフリップの訂正回路を確認しました。
本稿では、これらを組み合わせて、Shorの誤り訂正符号を確認していきましょう。

* ①：[マウスで量子誤り訂正（①ビットフリップ）](https://qiita.com/shnchr/items/bb83dba29df85df5d006)
* ②：[マウスで量子誤り訂正（②フェーズフリップ）](https://qiita.com/shnchr/items/c65f56e7b93c4e984cba)
* ③：マウスで量子誤り訂正（③Shorの誤り訂正符号）(**本記事**)
 
今回も、量子回路シミュレータの[Quirk](https://algassert.com/quirk#circuit={%22cols%22:[]})と数式の両方を使って進めます。

* 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}}
```

## ビットフリップとフェーズフリップの訂正
まずは、ビットフリップとフェーズフリップの訂正回路を復習しておきます。

#### [ビットフリップ訂正回路@Quirk](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,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,%22X%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,%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/67f3aae5-cafc-b916-f0f6-a4b9919dc18b.gif>

#### [フェーズフリップ訂正回路@Quirk](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>

## エンコードの違い
こちらも復習で、ビットフリップ訂正・フェーズフリップ訂正のエンコードは下記の通りでした。

```math
\displaylines{
\ket{\psi_{Benc}} = a\ket{000} + b\ket{111}
\\
\ket{\psi_{Penc}} = a\ket{{\tiny +++}}+b\ket{{\tiny ---}} 
}
```

ビットはパウリ$X$エラー、フェーズはパウリ$Z$エラーに対処するために、それぞれ計算基底とアダマール基底を用いて量子状態をエンコードする。
そして、フェーズはパウリ$Z$エラーに対応するアダマール基底を用いたエンコードのため、$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>|

## ビット、フェーズの両方の誤りに対応する
#### [Shorの量子誤り訂正回路@Quirk](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,1,1,%22X%22],[1,%22%E2%80%A2%22,1,1,1,1,1,%22X%22],[1,%22H%22,1,1,%22H%22,1,1,%22H%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%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,%22~uluo%22,%22~7kaa%22,%22~klkc%22,%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,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,1,1,1,1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,1,1,1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[1,1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[1,%22%E2%80%A2%22,1,%22X%22],[1,%22%E2%80%A2%22,%22X%22],[1,%22X%22,%22%E2%80%A2%22,%22%E2%80%A2%22],[1,%22H%22,1,1,%22H%22,1,1,%22H%22],[1,%22%E2%80%A2%22,1,1,1,1,1,%22X%22],[1,%22%E2%80%A2%22,1,1,%22X%22],[1,1,1,1,%22Measure%22,1,1,%22Measure%22],[1,%22X%22,1,1,%22%E2%80%A2%22,1,1,%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}]})

上記の２回路を組み合わせたのがShorの量子誤り訂正回路です。
ビットフリップ、フェーズフリップの両方の誤りに対し、エラー訂正が可能です。
構成を見ていくと、

* まず、エンコードに$H$が係るフェーズフリップ訂正のエンコードを行います。
* フェーズフリップ訂正は３量子ビットで行いますが、この３つのビットそれぞれにビットフリップ訂正のエンコード、デコード、訂正を行います。
* そして、ビットフリップの訂正終了後に、最後にフェーズフリップのデコード、訂正を行います。

![shor1000_ppt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/5d278eaf-5d05-2857-5600-29b174c81dce.gif)

* 上記見ていただくとわかるのですが、
    * パウリ$X$エラー、パウリ$Z$エラーどちらが発生しても誤り訂正が行えます
    * そして、１量子系の任意角度(パウリ$XZ$)エラーを訂正を行うことができます（※次節で後述）
    * まさに、Nielsen & Chuang[^QCQI]が指摘する「Errors are continuous」に対処しています

## 任意のエラーに対応できるか？
補足として、上記の※を扱っておきます。
任意のエラーとは、ブロッホ球を想像していただくとわかりやすいのですが、元の状態$\ket{\psi_{org}}$に対して、X軸回転、Z軸回転、Y軸回転と任意軸の任意角度の回転が発生することを意味します。
この１量子系に対する任意角度の回転によるノイズ$\varepsilon_1$は、パウリゲートを用いると下記のように表現できます。
（下記４つのパウリゲートにて任意角度の回転が実現できるため。）

```math
\varepsilon_1 = e_0I + e_1X_1 + e_2Z_1 + e_3X_1Z_1
\ \ \ \ \  
e_n \in \mathbb{C}
```

上記式は、ノイズ$\varepsilon_1$が状態$\ket{\psi_{org}}$に発生すると、$\varepsilon_1\ket{\psi_{org}}$となり、ノイズ発生後の状態が、$I,X,Z,XZ$の重ね合わせ状態として表現されます。
この重ね合わせ状態は、測定により$I,X,Z,XZ$のいずれかに収縮し、これらのパウリ操作で訂正が可能された離散化されたエラー状態に収縮します。
つまり、パウリ$X$とパウリ$Z$に対するエラー訂正ができれば任意の$\varepsilon_1$に対する誤り訂正が可能となり、これを実現するのがShorの誤り訂正符号となります。

# まとめ
Shorの9-bit Quantum Error Collection Codeを扱いました。

* 1量子ビットの量子状態（つまり確率振幅$a,b$）を保護するために、補助量子ビット8ビットを用いてビットフリップ、フェーズフリップに耐性を持つ誤り訂正回路を構成しました。
* 量子ビットは、コピーできない、観測で破壊されるという背景から、補助量子ビットはフリップに対する耐性を増すための３本の矢として活用し、誤り耐性を実現しました。
* Stabilizer符号等のより効率性が高い符号も存在しますが、量子誤り訂正のアウトラインを理解する意味では、Shor's Codeは良い題材だと思います。今後、他の誤り訂正符号も紹介したいと思います。

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

[^QCQI]: [Nielsen & Chuang,Quantum Computation and Quantum Information, p.427](https://www.cambridge.org/core/books/quantum-computation-and-quantum-information/01E10196D0A682A6AEFFEA52D53BE9AE)