量子誤り訂正（Shor's Code／ショアの符号）

# この記事について
アドベントカレンダもついに17日目となりました！
これまでは、アルゴリズムを中心に扱っていきましたが、FTQCに向けては、
量子系の誤りを如何に訂正するか？も重要な論点となります。
そこで、17日目、18日目は量子誤り訂正を扱ってみたいと思います。
まずは、比較的簡単な、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

なお、本記事は、下記を再編集したもので、既読の方には重複の内容となります。

[マウスで量子誤り訂正（①ビットフリップ）](https://qiita.com/shnchr/items/1bb02f3572eb6854daca)
[マウスで量子誤り訂正(②フェーズフリップ)](https://qiita.com/shnchr/items/5fa468f1957cc9de4085)
[マウスで量子誤り訂正(③Shorの符号)](https://qiita.com/shnchr/items/8974a3072a0f1bbe4832)


```math
% basic braket 
\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{\ketbra}[2]{\left| #1 \right\rangle \left\langle #2 \right|}
\newcommand{\ketbraket}[3]{\left| #1 \right\rangle \left\langle #2 \middle| #3 \right\rangle}
% small-size
\newcommand{\bras}[1]{\left\langle {\scriptsize #1}  \right|}
\newcommand{\kets}[1]{\left| {\scriptsize #1}  \right\rangle}
\newcommand{\brackets}[2]{\left\langle {\scriptsize #1} \middle| {\scriptsize #2} \right\rangle}
\newcommand{\ketbras}[2]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \right|}
\newcommand{\ketbrakets}[3]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \middle| {\scriptsize #3} \right\rangle}
% Matrix
\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}}
```
# 説明のアウトライン
かなり長い記事となるので、先に説明のアウトラインを示します。

1. 最初に量子誤り訂正がなぜ困難なのか？について確認します。
1. 量子状態の誤りには、どんな種類があるのかを見ていきます。
1. ビットフリップの訂正回路を確認します
1. フェーズフリップの訂正回路を確認します
1. 最後に、ビット／フェーズフリップの訂正回路を組み合わせてShorのコードを組み立てます

# ①量子誤り訂正の難しさ
Nielsen & Chuang, Quantum Computation and Quantum Information[^QCQI] は、量子誤り訂正では、
下記３点が課題だと指摘しています。

* No cloning
* Errors are continuous
* Measurement destroys quantum information

一個ずつ見ていきましょう。

## No cloning
「量子状態は、コピー・複製ができない」という量子複製不能定理が存在します。
誤りを訂正したい対象がコピーできるのであれば、量子状態をコピーし処理してから突き合わせを行えばエラーが訂正できますが、コピーそのものが不可能という点が、誤り訂正を困難にします。

## Errors are continuous
ブロッホ球を想像いただくとわかりやすいですが、量子状態は連続的であるため、エラーも連続的で様々なパターン発生します。

|古典ビット|量子ビット|
|:--:|:--:|
|0か1なので、誤りのバリエーションも少ない|単位球上の様々な位置を取るので、<br>誤りのパターンも連続的で訂正が難|
|<img width=150 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/08dd9232-ea7b-995a-794b-f0304a98a44b.png"> <img width=143 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/8c69978c-6a0f-5ca6-d7f0-82eae7374761.png">|<img width=150 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/31e9699c-5224-a07d-fc7d-27291742b01b.gif><img width=150 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/f0007dff-9dfc-cad4-9073-f77a6ac2bad5.gif>|

## Measurement destroys quantum information
古典ビットにおける誤り訂正は、誤り対象対象データとパリティ等の誤り訂正符号を比較し、訂正を行います。これは、古典ビットにおいては誤り訂正データにいつでもアクセスできることが前提に成り立ちます。
一方、量子ビットの誤り訂正では、量子状態が測定により破壊される性質を持つため、量子状態を測定することなく（中身を知ることなく）誤りだけを、訂正する必要がある。

困難さ。伝わったでしょうか。

# ②古典ビットと量子ビットの「誤り方」
誤り訂正の議論に入る前に、量子ビットではどんな種類の「誤り」が発生するのかを確認しておきます

## 古典ビット
下記のように符号反転（ビットフリップ）による誤りが、古典ビットでの「誤り方」です。

* 本来0だったものが、ノイズにより1になってしまった（0→1）
* 本来1だったものが、ノイズにより0になってしまった（1→0）

## 量子ビット
量子ビットでは、符号反転（ビットフリップ）に加え、位相反転(フェーズフリップ)が発生します。
具体的には下記に示すよう、パウリの$X,Z$ゲート相当の反転（フリップ）を想定します。


||符号反転<br/>ビットフリップ|位相反転<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$相当のエラー|

# ③ ビットフリップエラーを訂正
まずは、符号が反転するビットフリップのエラー訂正から考えていきます。
Shorの誤り訂正符号は、下記のように複雑な形をしているのですが、これは、

* １量子ビット目の$\ket{\psi}$を、残りの8個の補助ビット$\ket{0}$を使って誤り訂正する回路です
* 誤りの種類として、上述のビットフリップ／フェーズフリップの両者を想定しています。
* 上記背景で、複雑な回路となっていますが、ビットフリップだけであれば３量子ビットで実現できます


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

まずは、ビットフリップの訂正回路を見ていきましょう。

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

* [ビットフリップ訂正回路](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>

上記、確認いただきたいのは、下記２点です。

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

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

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

|#|機能|回路|説明|
|:--:|:--:|:--:|:--:|
|1|エンコード|<img width=70 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/eafbd59a-d5e7-8941-ab56-dc1201e715cf.png>|誤り訂正対象に、補助ビットをかけ合わせます。<br/>下記のように、ノイズに強い状態をつくります。<br/>この点については、詳細後述します。<br/><br/>$(a\ket{0}+b\ket{1})\otimes\ket{00} → a\ket{000}+b\ket{111}$|
|2|デコード|<img width=70 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a83ae5a7-eb88-3f11-0da0-33bf52656086.png>|元の1ビット＋補助2ビットの状態に戻します。<br/>3量子ビットのいずれかにノイズが発生した場合<br/>デコード後の補助量子ビットに情報が保存されます<br/><br/>$a\ket{000}+b\ket{111} → (a\ket{0}+b\ket{1})\otimes\ket{00}$|
|3|誤り訂正|<img width=70 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/2890b76e-b879-8dde-6db6-194bd23dc68e.png>|補助量子ビットのパターンで、誤りが発生した<br/>量子ビットが特定できます。<br/>補助が11のときに保護対象のビットに<br/>パウリ$X$のノイズが乗っているので訂正します|

## 何をエンコード、デコードしているか
### エンコード回路
保護したい量子状態$\ket{\psi_{org}}$とした場合に、この$\ket{\psi_{org}}$は脆弱です。

```math
\ket{\psi_{org}} = a\ket{0} + b\ket{1}
```

例えば、1ビットのパウリ$X_1$の反転が発生すると下記のようにビットが反転してしまいます。

```math
X_1\ket{\psi_{org}} = a\ket{1} + b\ket{0} = b\ket{0} + a\ket{1}
```

と、$\ket{0}$と$\ket{1}$の確率振幅$a,b$が逆転してしまいました。
１量子ビット相当の情報（確率振幅$a,b$）を保全するための量子ビットとして、

* １量子ビットを用いて、１量子ビット相当の情報を扱うのは脆弱なので
* ３量子ビットを用いて、１量子ビット相当の情報を扱い、パウリ$X$への誤り耐性を高める

これがデコードです。
要は、**３本の矢ですね。１本だと折れるが、３本なら折れない。**
<img width=600 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/c2d6a48d-73db-ffd6-ecb0-2e1af8130ced.png>
１量子ビット相当の情報（つまり、上記の$a,b$）を、あえて３量子ビットの$\ket{000},\ket{111}$を使って表現するためにはどうすれば良いでしょうか？

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

そうです。
$\ket{\psi_{org}}$を上記エンコード回路で処理することにより、上記の３本の矢の状態を作ることができます。

```math
a\ket{000} + b\ket{100} \xrightarrow[]{CX12、13}a\ket{000} + b\ket{111} =\ket{\psi_{enc}}
```

この３本の矢の状態では、１ビットのビットフリップエラー（$X_1$)が発生すると、

```math
X_1\ket{\psi_{enc}} = a\ket{000} + b\ket{111} \xrightarrow[]{X_1}a\ket{\color{red}{1}00} + b\ket{\color{red}{0}11}
```

と、赤いビットがフリップしますが、残り２ビットで、誤りを訂正可能です。

### デコード回路
３本の矢状態の量子ビットにて、どのビットがエラーでフリップしたか？
誤りの場所を特定するのがデコード回路です。
エンコードされた量子状態$\ket{\psi_{enc}}$について、誤り訂正回路の1ビット目～3ビット目に、
パウリ$X$のエラーフリップが発生した状況を想定し、デコード回路を見ていきたいと思います。

エラー無しの状態をデコード回路($CX_{13,12}$)でデコードすると、下記のように、

* 保護したい量子状態$\ket{\psi_{org}}=a\ket{0} + b\ket{1}$と
* 補助ビット$\ket{00}$が取り出せます。

```math
a\ket{000} + b\ket{111}
\xrightarrow[]{CX13、12}a\ket{000} + b\ket{100}
\ 
= 
\ a\ket{0} + b\ket{1} \ \otimes \ \ket{00}
```

次に誤り訂正回路の各ビットにパウリ$X$のエラーが発生した状況を整理します。

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

保護対象の量子ビットでの、パウリ$X$エラーによるビットフリップの検知を検討します。
補助量子ビットに着目すると状態が$\ket{11}$のとき、1ビット目は$a\ket{1}+b\ket{0}$と、
ビットフリップした状態となっています。（上記#2）

つまり、誤り訂正では、

 * 補助量子ビットが、$\ket{11}$のときに（これを条件として）
 * パウリ$X$にて、ビットフリップを誤り訂正する

という操作が必要になります。２つの補助量子ビットを条件としてパウリ$X$ゲートを適用する。
そうです。誤りの訂正には、トフォリゲートを用います。

## 誤り訂正
上記の#2のときに、トフォリゲートにより誤り訂正で、どういった状態となるかを計算で確認しておきたいと思います。デコード後の状態から計算すると、

```math
\displaylines{
a\ket{\color{red}{1}} + b\ket{0} \ \otimes \ \ket{11}
\xrightarrow[]{CCX_{23→1}}
X(a\ket{\color{red}{1}} + b\ket{0}) \ \otimes \ \ket{11}
\\
=a\ket{0}+b\ket{1} \ \otimes \ \ket{11} 
\ \ 
= 
\ \ 
\color{red}{\ket{\psi_{org}}} \otimes \ket{11} 
}
```

となり、トフォリゲート適用で、保護対象ビットの元の状態$\ket{\psi_{org}}$を取り出すことができました。

# ④ フェーズフリップ訂正回路
次にフェーズフリップの訂正回路を見ていきます。
まずは、触っていただくのが良いと思います。下記リンクでシミュレータを起動できます。
下記は、フェーズフリップエラーを想定して、ノイズとして$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>

ビットフリップ訂正と同様に、

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

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

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

## ビットフリップ訂正との差分
ビットフリップ訂正回路との違いは、エンコード、デコード処理です。
比較すると下記の通りで、すべての量子ビットに対してエンコード／デコードともに
$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本の矢**の作り方が違うからです。
ビットフリップ訂正は、パウリ$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}}
```

## デコード回路
一応、ビットフリップと同様にデコードの過程と、誤り訂正の適用条件を確認しておきますが、エンコードされた状態の基底が変わるだけで、デコード後の状態や誤り訂正の適用条件も同様です。

|#|パウリ$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}$|


# ⑤ ビット、フェーズの両方の誤りに対応する
#### [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は良い題材だと思います。今後、他の誤り訂正符号も紹介したいと思います。

で、

**明日も量子誤り訂正**ですが、ちょっと**レベルアップしたStabilizer code(スタビライザ符号)**を扱います。
代数学と群論がでてきてしまうのですが、なるべくわかりやすく書いてみようと思いますので、ご興味ある方は明日チェックいただければと。

https://qiita.com/shnchr/items/ec30fb2533d3cf6eec57

https://en.wikipedia.org/wiki/Stabilizer_code


# おまけ
上記の誤り訂正回路が、冒頭の課題をどのように解消しているかを確認しておきます。
9bitコード見てもよいのですが、複雑なので、ビットフリップ訂正回路で見ていきます

### No cloning

保護対象$\ket{\psi}$をコピーすることはできません。
ですので、$\ket{\psi}$のパウリ$X$エラー耐性を高める目的で補助ビットを用います。
    
### Errors are continuous
実をいうと、180度回転以外の回転角度のエラーにも対応しています。
シミュレータで、ノイズとして、$X$だけでなく、$X^{\frac{1}{2}}$,$X^{\frac{1}{4}}$等を適用しても誤り訂正可能です

* [ノイズがX^(1/2)](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^%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,%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=700 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/db2ed2fe-5909-8d46-4b3e-49e5bf1c7c2e.gif>

* [ノイズがX^(1/4)](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^%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,%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=700 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/2b883510-98bf-4131-663e-feb9868d35c8.gif>

* [ノイズが時間変化](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^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,%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=700 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/ca69d9bc-c845-ca26-2b02-6aece13906e1.gif>

### Measurement destroys quantum information
3量子ビット全てを測定すると、量子状態は破壊されますが、
補助ビットのみ測定することで、量子状態を破壊しない誤り訂正が可能です。

# おまけのおまけ(ノイズX^1/2の計算）
下記の[ノイズがX^(1/2)](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^%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,%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}]})のパターンに関して、計算過程を下記に整理します。
 **計算方法は、ある勉強会で、お詳しい方に伺ったものです。ありがとうございます**

$X$は下記のように[アダマール基底で書き下す事ができます](https://qiita.com/shnchr/items/0a3114d8b7992b898d39#%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%81%A8)

```math
X = \ketbras{+}{+}-\ketbras{-}{-}
```

また、$X^{1/2}$を計算すると下記となります。
詳細は、[分数ゲート? の計算方法](https://qiita.com/shnchr/items/34afbf8d977d9340a81a#z%E5%9F%BA%E5%BA%95)をご確認ください。

```math
X^{\frac{1}{2}}=\frac{1 \pm i}{2}\ketbra{0}{0}+\frac{1 \mp i}{2}\ketbra{0}{1}+\frac{1 \mp i}{2}\ketbra{1}{0}+\frac{1 \pm i}{2}\ketbra{1}{1}
```

よって、

```math
\displaylines{
X^{\frac{1}{2}}\ket{0} = \frac{1 \pm i}{2}\ket{0} + \frac{1 \mp i}{2}\ket{1}
\\
X^{\frac{1}{2}}\ket{1} = \frac{1 \mp i}{2}\ket{0} + \frac{1 \pm i}{2}\ket{1}
}
```


ビットフリップ訂正回路を計算すると、

```math
\displaylines{
\ket{\psi_{org}} = a\ket{0} + b\ket{1}
\xrightarrow[]{CX12,13(Encode)}
a\ket{000}+b\ket{111}
\\
\xrightarrow[]{X^{\frac{1}{2}}(Noize)}
\frac{1}{2}\left[\ 
a(1 \pm i)\ket{000} + 
a(1 \mp i)\ket{100} +
b(1 \mp i)\ket{011} +
b(1 \pm i)\ket{111}
 \right]
\\
\xrightarrow[]{CX_{12, 13}(Decode)}
\frac{1}{2}\left[\ 
a(1 \pm i)\ket{000} + 
a(1 \mp i)\ket{111} +
b(1 \mp i)\ket{011} +
b(1 \pm i)\ket{100}
 \right]
\\
\xrightarrow[]{CCX_{23→1}(Collect)}
\frac{1}{2}\left[\ 
a(1 \pm i)\ket{000} + 
a(1 \mp i)\ket{011} +
b(1 \mp i)\ket{111} +
b(1 \pm i)\ket{100}
 \right]
}
```

上記式を整理すると、下記の通り誤り訂正により$\ket{\psi_{org}}$を取り出すことができました。

```math
(a\ket{0}+b\ket{1})(\frac{1 \pm i}{2}\ket{00}+\frac{1 \mp i}{2}\ket{11})
 = \ket{\psi_{org}} \otimes (\frac{1 \pm i}{2}\ket{00}+\frac{1 \mp i}{2}\ket{11})
```

[^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)


[^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)