量子誤り訂正（Stabilizer code／スタビライザー符号）

## はじめに
アドベントカレンダーも18日目となり、初日はNo数式な世界でしたが、、

https://qiita.com/shnchr/items/92490509b2ae998f2f82

徐々に数式が増え数式だらけの世界となってきましたｗｗ
そして、本日も数式だらけの世界となってしまうのですが、なるべくわかりやすく書いてみたいと思いますので、お付き合いいただければと。

本日は、Shor's Codeに引き続き、Stabilizer Code（スタビライザ符号）です。
なお、若干理解の怪しいところもあるので何かあれば、コメントいただければと。

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

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

## Shor's Codeについて考える
昨日のShor's Codeでは、ビット／フェーズフリップに耐えられる9ビット符号化を考えました。

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

このShor's Codeの、論理的な基底$\ket{0_L},\ket{1_L}$の量子状態（符号語）について考えます。

### ビットフリップ訂正時の論理的基底
![bit_flip_correction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/fdf40b0d-c4bb-b21a-3eef-5608efa4e928.png)

ビットフリップの訂正は、

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

という状態において、守りたい情報$a,b$を保護する目的で、

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

と3ビットを使った基底のとり方により、$a,b$を保護する回路でした。
この回路における、論理的な基底は、

```math
\ket{0_L} = \ket{000}　\ket{1_L} = \ket{111}
```
と考えることができます。
つまり、この論理的な基底により$a,b$を守るという仕組みです。

```math
\ket{\psi_L} = a\ket{0_L} + b\ket{1_L}
```

### Shor's Codeにおける論理的な基底

![shor_code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/5b5cd44e-da87-e0ce-e915-e6f75e2670c8.png)

では、この9ビット符号化における、論理的な基底とはどういった状態となるでしょうか？
こんな、複雑な状態となります。

```math
\displaylines{
\ket{0_L} = \frac{(\ket{000}+\ket{111})(\ket{000}+\ket{111})(\ket{000}+\ket{111})}{2\sqrt{2}}
\\
\ket{1_L} = \frac{(\ket{000}-\ket{111})(\ket{000}-\ket{111})(\ket{000}-\ket{111})}{2\sqrt{2}}
}
```

3ビットでこんな複雑なので、この方式ではビット数が増大すると論理的な基底の符号語を、実際の物理的な状態として書き下すのは困難な状況となります。

## なにか良い方法はないか?
論理的な基底を、実際の量子状態として書き下すことなく、
その表現を生成するルールみたいなものを考えられれば、論理的な基底の符号語（物理状態）をより効率的に記述できるのではないか
この考え方が、スタビライザ形式であり、スタビライザ符号のアイディアとなります。

誤解を恐れずにいうと、超巨大な画像データを

* ラスタとして記述すると、膨大な物理的な状態を書き下す必要がある、が
* ベクタ(svg等)として記述、その画像や状態を構成するルールを記述すればよい

そんなイメージです。

## スタビライズってなに？
### 1ビット スタビライザ
状態が演算子により不変であることを、スタビライズ（安定化する）と表現します。
何のことかよくわからないので、具体例を見ていきましょう。
量子ゲートの演算にはパウリ行列を用いますが、パウリ行列と各基底は固有値・固有ベクトルの関係性にあります。

https://qiita.com/shnchr/items/751fcee0b4dcc158a838#%E3%83%91%E3%82%A6%E3%83%AA%E3%82%B2%E3%83%BC%E3%83%88%E9%81%A9%E7%94%A8%E3%81%A8%E8%A6%8B%E6%AF%94%E3%81%B9%E3%82%8B

詳細は上記をご確認頂きたいのですが、例えば$pauliZ$と$\ket{0},\ket{1}$はどういった関係にあったかというと、

```math
\displaylines{
Z\ket{0} = \color{red}{+1}\ket{0}
\\
Z\ket{1} = \color{red}{-1}\ket{1}
}
```

という関係にありますので、$pauliZ$については

* 固有ベクトルが$\ket{0}$で、固有値は$\color{red}{+1}$
* 固有ベクトルが$\ket{1}$で、固有値は$\color{red}{-1}$

となります。ここで、固有値が$\color{red}{+1}$のものに着目します。
すると、

```math
\displaylines{
Z\ket{0} = \ket{0}
\\
ZZ\ket{0} = \ket{0}
\\
ZZZ\ket{0} = \ket{0}
}
```

と言ったように、$\ket{0}$は何度$pauliZ$を適用しても、$\ket{0}$に落ち着く。
つまり、$\ket{0}$に安定化される（スタビライズされる）こととなります。
今までの議論を整理すると、

* パウリゲートは、固有値+1/-1となる固有ベクトルを持つ
* 固有値+1の方に着目すると、その演算子を何度適用しても同一の状態に安定化する

つまり、**固有値+1**ってのがポイントなことに気づきます。
加えて、

* $Z$に対して、固有値が+1となる固有ベクトルは$\ket{0}$
* $X$に対して、固有値が+1となる固有ベクトルは$\ket{+}$
* $Y$に対して、固有値が+1となる固有ベクトルは$\ket{i}$

といったように、
ゲート演算子と固有値を指定するとそれに対応する固有ベクトルを一意に指定可能です。

### 2ビット スタビライザ
今まで１ビットで議論していましたが、２ビットで議論することも可能です。
ゲート$Z_1Z_2$と、$\ket{00},\ket{11}$について見てみましょう。

こちらは自明ですね。

```math
Z_1Z_2\ket{00} = \ket{00}
```

こちらは、$-1$が打ち消しあって、結局$\ket{11}$に落ち着きます。

```math
Z_1Z_2\ket{11} = (-1\times-1)\ket{11} = \ket{11}
```

一方で、こちらは固有値-1を吐き出した状態となってしまい、演算子適用前後で状態が変わります。

```math
\displaylines{
Z_1Z_2\ket{01} = \color{red}{-1}\ket{01}
\\
Z_1Z_2\ket{10} = \color{red}{-1}\ket{10}
}
```

ここで気になるのが下記です。

> ゲート演算子と固有値を指定するとそれに対応する固有ベクトルを一意に指定可能です。

* ゲート（$Z_1Z_2$）
* 固有値（$+1$）

によって指定される量子状態は**一意**のはずなのに、$\ket{00},\ket{11}$と２つの状態をもつではないか？という点です。

```math
\displaylines{
Z_1Z_2\ket{00} = \ket{00}
\\
Z_1Z_2\ket{11} = \ket{11}
}
```

実を言うと、上記条件で**一意に指定される量子状態**とは

```math
\ket{\Psi} = a\ket{00} + b\ket{11}　　{a,b} \in \mathbb{C}
```

となります、つまり

* ゲート（$Z_1Z_2$）
* 固有値（$+1$）

が一意に指定する量子状態は、$\{\ket{00},\ket{11}\}$が張る**２次元部分空間**である。
と考えることができます。

以上、若干冗長になってしまいましたが、スタビライズってなに？という話でした。
この説明を聞いても誤り訂正とどう関係があるの？といった感じかと思うのですが、
詳細は後述させていただくのですが、今までの議論をまとめると、

```math
\mathcal{S}\ket{\Psi} = \ket{\Psi}
```

というように、

* 演算子$\mathcal{S}$に対して、**固有値+1**となる固有ベクトル$\ket{\Psi}$を演算すると状態が不変

ということを利用して、状態$\ket{\Psi}$を直接記述することなく、演算子$\mathcal{S}$にて状態を記述することができないか？というアイディアが重要となります。

## スタビライザ符号
説明が結構長くなるので、アウトラインを先に示します。

* ① 群とパウリ群について説明します
* ② 可換な部分群を説明し、スタビライザ群を考えます
* ③ スタビライザ形式（スタビライザ状態と生成元）を考えます
* ④ 3ビットのスタビライザ符号によるビットフリップを訂正します
* ⑤ 5ビットのスタビライザ符号による誤り訂正を考えます

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/568af20a-7e70-e8c2-e371-a5e3013e4449.png" width="800">

## ①群とパウリ群
### 群？
https://ja.wikipedia.org/wiki/%E7%BE%A4_(%E6%95%B0%E5%AD%A6)

この群です。
代数学等で演算の特性を考察・記述するに用いられる概念で、群となる条件は下記の通りです。

> 集合$G$が与えられ、二項演算$\mu:G× G\rightarrow G$ の組$(G,\mu)$が群となるためには
> 下記の条件を満たす必要があります。
>
> * 結合法則を満たす
> * 単位元が存在する
> * 逆元が存在する
> 
> そして、交換法則を満たし、可換なものをアーベル群（可換群）と呼びます

こちらですが、

> 集合$G$が与えられ、二項演算$\mu:G× G\rightarrow G$ の組$(G,\mu)$が群となるためには

の部分だけ補足しておきたいと思います。

#### 複素数と加法
* 演算$\mu$が、加法（＋）
* 集合$G$が、複素数全体（$\mathbb{C}$）

このときに、複素数上の加法（$\mathbb{C},＋$）の結果は、必ず複素数になるので（$\mathbb{C}+\mathbb{C} \rightarrow \mathbb{C}$）、複素数上の加法は演算に対して閉じており群を成します。つまり、**演算に対して演算結果がその集合の中に閉じており**、上記の他の条件も満たすものが群となります。 

#### 実数と加法
* 演算$\mu$が、加法（＋）
* 集合$G$が、実数全体（$\mathbb{R}$）

このときに、実数上の加法（$\mathbb{R},＋$）は、$\mathbb{R}+\mathbb{R} \rightarrow \mathbb{R}$ですので、実数上の加法も演算に閉じており群となります。 

#### 複素数と実数と部分群
複素数（$\mathbb{C}$）と実数（$\mathbb{R}$）は、$\mathbb{R} \subset \mathbb{C} $の関係性で複素数の部分集合が実数ですが、実数で切り出しても加法については閉じているので、（$\mathbb{R},＋$）は（$\mathbb{C},＋$）の部分群となります。

### パウリ群
パウリ行列の演算子は、積に対して閉じており群を成します。

```math
\mathcal{P_n} = \{\pm1,\pm i\} \times \{I,X,Y,Z\}^{\otimes n}
```

これは何を言っているのでしょうか？例を見てみましょう。
下記はパウリゲートの積[^1]をまとめていますが、

[^1]: 詳細は、https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97#%E3%83%91%E3%82%A6%E3%83%AA%E8%A1%8C%E5%88%97%E3%81%AE%E7%A9%8D を参照

* パウリゲートの積は、${I,X,Y,Z}$のいずれかとなります
* 一方で一部の演算は、$\{\pm1,\pm i\}$が付与されます（位相が吐き出されます）

つまりパウリゲート同士の積は、$\{\pm1,\pm i\}$が付与されるもののパウリゲートに閉じており群を成します。

||$I$|$X$|$Y$|$Z$|
|:---:|:---:|:---:|:---:|:---:|
|$I$|$I$|$X$|$Y$|$Z$|
|$X$|$X$|$I$|$\color{red}{i}Z$|$\color{red}{-i}Y$|
|$Y$|$Y$|$\color{red}{-i}Z$|$I$|$\color{red}{i}X$|
|$Z$|$Z$|$\color{red}{i}Y$|$\color{red}{-i}X$|$I$|

なお、単位元・逆元等が気になる方はこちらを参照いただければと。

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

## ②可換な部分群とスタビライザ群
### 可換
> そして、交換法則を満たし、可換なものをアーベル群（可換群）と呼びます

これですね。
アーベル群とか可換群とか言うとちょっと難しく聞こえますが、
要は、**交換法則**（交**換**が**可**能）を満たすか？ですね。
じゃあ、そもそもパウリ演算子は可換なのでしょうか？
答えはNOです。

ちょっと確認しておきましょう。
可換であれば、$XZ=ZX$となります。

```math
X = \mtrx{0}{1}{1}{0}　　Z = \mtrx{1}{0}{0}{-1}
```

ですので、

```math
\displaylines{
XZ = \mtrx{0}{1}{1}{0}\mtrx{1}{0}{0}{-1} = \mtrx{0}{-1}{1}{0}
\\
ZX = \mtrx{1}{0}{0}{-1}\mtrx{0}{1}{1}{0} = \mtrx{0}{1}{-1}{0}
}
```

なので、

```math
XZ = \color{red}{-}ZX \tag{1}
```

となり、交換法則は成り立ちません。
まぁ、感覚として、行列の演算だから交換法則はそんなに簡単に成り立ちませんよね。
なお、この式$(1)$はあとで使うのでよく覚えておいてください。

### 可換になるようにパウリ群から選び出す

```math
\mathcal{P_n} = \{\pm1,\pm i\} \times \{I,X,Y,Z\}^{\otimes n}
```

と書きましたが、$n=1$で考えると

```math
\mathcal{P_1}  = \{ \pm I, \pm iI, \pm X, \pm iX, \pm Y, \pm iY, \pm Z, \pm iZ \} 
```

で$n=2$になると、

```math
\mathcal{P_2} = \mathcal{P_1} \otimes \mathcal{P_1}    
```

ですので、この直積となります。この$\mathcal{P_2}$は、$II,IX,IY,IZ,XI...ZZ$まで様々含むわけですが、
この中から部分集合をうまく選び出すことにより、**可換な部分群**が作れないかを考えてみます。

### うまく選ぶと
こんな感じで、部分集合を選んでみるとどうでしょう？

```math
\mathcal{S_2} = \{I_1I_2 ,　X_1X_2 ,　Z_1Z_2 ,　-Y_1Y_2\}
```

* $n=1$のパウリ群が可換でないのは自明ですが
* $n=2$のパウリ群から、うまい選び方で部分集合（部分群$\\mathcal{S_2} \subset \mathcal{P_2}$）を作るとどうでしょう？

この部分群$\\mathcal{S_2}$は、可換でしょうか？
ちょっと確認してましょう。

```math
(X_1X_2)(Z_1Z_2) = X_1Z_1X_2Z_2
```
ここで、先程の$(1)$を使います。

```math
X_1Z_1X_2Z_2 = \color{red}{-}(Z_1X_1) \times \color{red}{-}(Z_2X_2) 　\because XZ = \color{red}{-}ZX 
```

そして式を整理すると

```math
\color{red}{-}(Z_1X_1) \times \color{red}{-}(Z_2X_2)= (Z_1Z_2)(X_1X_2) 
```

となるので、なんと、
**パウリ群からうまいこと選べばその部分集合で、可換な部分群**
を作ることができるんです。

```math
\therefore (X_1X_2)(Z_1Z_2) = (Z_1Z_2)(X_1X_2) 
```

### やっとここまで来た、スタビライザ群
やっとここまで来ました、スタビライザ群の登場です。

* パウリ群の **「可換な部分群」**かつ、**「$-I$」を除外**したものを**スタビライザ群**と呼びます。

では、先程から見ている、
パウリ群の**可換な部分群**($\\mathcal{S_2} \subset \mathcal{P_2}$)は、**スタビライザ群**の条件を満たしているのかを確認しましょう。

```math
\mathcal{S_2} = \{I_1I_2 ,　X_1X_2 ,　Z_1Z_2 ,　-Y_1Y_2\}
```


* １つ目の条件は満たしていますね。パウリ群の可換な部分群ですし
* ２つ目の条件も「$-I$」を含まない部分群なので満たしていいそうです。

よって、このパウリ群の可換な部分群$\\mathcal{S_2}$は、なんと、**スタビライザ群**だったのです。



## ③スタビライザ形式（生成元とスタビライザ状態）
**スタビライザ群**を導入することができたので、生成元とスタビライザ状態を考えていきます。
いろいろな言葉が導入され、頭が混乱し始めた頃だと思いますので、この後に今までのまとめをやりますので、もう少し我慢をｗ

### 生成元
スタビライザ群$\mathcal{S_2}$は、その群をなす要素を列挙すると下記の通りですが、

```math
\mathcal{S_2} = \{I_1I_2 ,　\color{red}{X_1X_2} ,　\color{blue}{Z_1Z_2} ,　-Y_1Y_2\}
```

実を言うと、

```math
\displaylines{
I_1,I_2 = (\color{red}{X_1X_2} )(\color{red}{X_1X_2} )　\because I = XX
\\
-Y_1Y_2 = (\color{red}{X_1X_2} )(\color{blue}{Z_1Z_2})　\because Y = iXZ
}
```

という様に、$I_1I_2,-Y_1Y_2$については、$\color{red}{X_1X_2}と\color{blue}{Z_1Z_2}$の積で表現できます
つまり、冗長に書き下すとこんな感じです。

```math
\mathcal{S_2} = \{(X_1X_2)(X_1X_2) ,　X_1X_2 ,　Z_1Z_2 ,　(X_1X_2)(Z_1Z_2)\}
```

つまり、$(X_1X_2)(Z_1Z_2)$という2つの要素（元）だけで、$\mathcal{S_2}$のすべての要素（元）を生成できる。
で、この要素（元）には名前がついており、**生成元**と呼ばれます。
生成元は、群の要素をすべて列挙せずとも、群を表現できるのが便利です。

```math
\mathcal{S_2} = \{I_1I_2 ,　X_1X_2 ,　Z_1Z_2 ,　-Y_1Y_2\} = \left\langle \{ X_1X_2,Z_1Z_2 \}\right\rangle
```

### スタビライザ形式とスタビライザ状態
スタビライザ形式とは、

> "あるスタビライザ群Sの要素となる演算子の固有値が＋１である状態として" 状態を指定する方法
> 指定された量子状態はスタビライザ状態、演算子はスタビライザと呼ばれる

一つづつ、言葉の意味を解釈していきましょう。
先程から使っているスタビライザ群$\mathcal{S_2}$は、今、生成元によりこんな表現ができます。

```math
\mathcal{S_2} =  \left\langle \{ X_1X_2,Z_1Z_2 \}\right\rangle
```

> あるスタビライザ群Sの要素となる演算子

つまり、上記で言えば、$X_1X_2,Z_1Z_2$などですね

> 演算子の固有値が＋１である状態

この演算を適用したときに固有値が＋１となる状態$\ket{\psi}$とはどんな状態でしょうか？
実を言うと、ベル状態にこの演算子を適用すると、固有値が＋１となります。

```math
\ket{\psi} = \frac{\ket{00}+\ket{11}}{\sqrt{2}}
```

このベル状態に、演算子を適用してみると、固有値が＋１となります。

```math
\displaylines{
X_1X_2\ket{\psi} = \frac{\ket{11}+\ket{00}}{\sqrt{2}} = \color{red}{+1}\ket{\psi}
\\
Z_1Z_2\ket{\psi} = \frac{\ket{00}+(-1\times-1)\ket{11}}{\sqrt{2}} = \color{red}{+1}\ket{\psi}
}
```

つまり冒頭にみた、スタビライズされた状態を作り出すことができます。

```math
\displaylines{
(X_1X_2)\ket{\psi} = \ket{\psi}
\\
(Z_1Z_2)\ket{\psi} = \ket{\psi}
\\
(X_1X_2)(X_1X_2)\ket{\psi} = \ket{\psi}
\\
(Z_1Z_2)(Z_1Z_2)\ket{\psi} = \ket{\psi}
\\
(X_1X_2)(X_1X_2)(Z_1Z_2)(Z_1Z_2)\ket{\psi} = \ket{\psi}
}
```

で、最後に、

> 量子状態はスタビライザ状態、演算子はスタビライザと呼ばれる

つまり、スタビライザ群の

* 演算子に対して固有値＋１になる状態$\ket{\psi}$（上記ではベル状態）を、**スタビライザ状態**
* その状態にスタビライズする演算子（$X_1X_2,Z_1Z_2$）を、**スタビライザ(演算子)**

と呼びます。そして、
この**スタビライザ状態と、スタビライザ（演算子）**を用いて状態を指定する方法を
**スタビライザ形式**と呼びます。

## ①～③を振り返る
①：群とパウリ群を説明しました。パウリ演算が群に閉じることを確認しました。

```math
\mathcal{P_n} = \{\pm1,\pm i\} \times \{I,X,Y,Z\}^{\otimes n}
```

②：パウリ群からうまい具合に部分集合を抜き出すことにより**可換な部分群**を$-I$を
　 含まないように構成することで、**スタビライザ群**を構成しました。

```math
\mathcal{S_2} = \{I_1I_2 ,　X_1X_2 ,　Z_1Z_2 ,　-Y_1Y_2\}
```

③：スタビライザ群の元が生成できる、**生成元**を考えました。
　　最後に、**スタビライザ演算子**に対して、**固有値＋１をとるスタビライザ状態**を考え
　　スタビライザ形式による量子状態の表現に触れました。

```math
\mathcal{S_2} =  \left\langle \{ X_1X_2,Z_1Z_2 \}\right\rangle
```


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/568af20a-7e70-e8c2-e371-a5e3013e4449.png" width="800">

## ④3ビットスタビライザ符号でビットフリップ訂正する
長かったですね。。でも、いよいよ、スタビライザ符号を扱っていきます。
まずは、ビットフリップ訂正です。
今までは、2ビットのスタビライザ群を利用していましたが、符号語と符号距離の関係で3ビット以上のスタビライザ群が必要なので、ここで、**3ビットスタビライザ群**$\mathcal{S_3} \subset \mathcal{P_3}$を考えます。

### 3ビットスタビライザ群

まずは、3ビットのパウリ群を考えるので、

```math
\mathcal{P_3} = \{\pm1,\pm i\} \times \{I,X,Y,Z\}^{\otimes 3}
```

書き下すとこんな感じ

```math
\mathcal{P_3}  = \{\pm III,\pm IIX,\pm IIY,\pm IIZ,\pm IXX,\pm IXY....\pm iZZZ\} 
```

ですので、**可換な部分群かつ$-I$を含まない**ように、スタビライザ群$\mathcal{S_3}$を構成すると

```math
\mathcal{S_3} = \{I_1I_2I_3,　Z_1Z_2I_3,　I_1Z_2Z_3,　Z_1I_2Z_3\}
```

となり、この群の生成元は、

```math
\mathcal{S_3} = \left\langle\{G\} \right\rangle = \left\langle\{Z_1Z_2I_3,　I_1Z_2Z_3\} \right\rangle
```

となり、固有値＋１となる、このスタビライザ演算子に対応するスタビライザ状態は

```math
\ket{000} 　\ket{111}
```

となります。計算して確認してみると

```math
Z_1Z_2I_3\ket{000} = \ket{000}　I_1Z_2Z_3\ket{000} = \ket{000}
```

となり、

```math
\displaylines{
Z_1Z_2I_3\ket{111} = (-1\times-1)\ket{111} = \ket{111}
\\
I_1Z_2Z_3\ket{111} = (-1\times-1)\ket{111} = \ket{111}
}
```

とスタビライズされます。

### 実を言うと、重ね合わせもスタビライズされる
スタビライザ状態として、重ね合わせを考えてみます。

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

という、重ね合わせ($GHZ状態$)を考えると、上記のスタビライザ演算子の計算結果は

```math
\displaylines{
Z_1Z_2I_3\ket{\psi} = aZ_1Z_2I_3\ket{000} + bZ_1Z_2I_3\ket{111} = \ket{\psi}
\\
I_1Z_2Z_3\ket{\psi} = aI_1Z_2Z_3\ket{000} + bI_1Z_2Z_3\ket{111} = \ket{\psi}
}
```

となり、スタビライズされています。
実を言うと３ビットスタビライザ群は$2^3$次元のヒルベルト空間をもちますが、
この空間を2個の演算子の固有値をつかって分割するのですが、固有値は$\pm1$ですので、
トータルで$2^{3-2}$次元空間を使うことができるので、生成元である$(\ket{000},\ket{111} )$で
張られる2次元空間がスタビライザ状態となり、スタビライザ演算子によりスタビライズされます。

### いよいよスタビライザ符号
$\ket{000},\ket{111}$で張られる2次元空間がスタビライズされる背景で、符号化の符号語は、

```math
\ket{0_L} :=\ket{000}　　\ket{1_L} :=\ket{111}　　
```

とします。そして、エラーの発生状況は、スタビライザ群の生成元を検査演算子として
作用させ測定を行うことで、どのビットにおいてビットフリップが発生したかを判断することができます。

### ビットフリップさせてみる
$a\ket{000}+b\ket{111}$で扱ってもいいのですが、簡単のために、
$\ket{0_L}と\ket{1_L}$が、それぞれビットフリップしてしまった状態を考えます。

|元の状態|$X_1$フリップ|$X_2$フリップ|$X_3$フリップ|フリップ無し|
|:---:|:---:|:---:|:---:|:---:|
|$\ket{000}$|$\ket{100}$|$\ket{010}$|$\ket{001}$|$\ket{000}$|
|$\ket{111}$|$\ket{011}$|$\ket{101}$|$\ket{110}$|$\ket{111}$|

### 生成元（検査演算子）を用いたシンドローム測定
符号語に用いたスタビライザ状態に対応する、スタビライザ群の生成元をもちいることで、
どの量子ビットにエラーが発生したかを特定することができ、その検査のための測定を、シンドローム測定といいます。
では、実際に、生成元（検査演算子）を用いたシンドローム測定を見てみましょう。
今、利用しているスタビライザ群の生成元は、

```math
\mathcal{S_3} = \left\langle\{G\} \right\rangle = \left\langle\{Z_1Z_2I_3,　I_1Z_2Z_3\} \right\rangle
```

ですので、上記のビットフリップが発生た状態に対してシンドローム測定をした結果を整理します。

|元の状態とシンドローム測定|$X_1$フリップ|$X_2$フリップ|$X_3$フリップ|フリップ無し|
|:---:|:---:|:---:|:---:|:---:|
|$\ket{0_L} = \ket{000}$|$\ket{100}$|$\ket{010}$|$\ket{001}$|$\ket{000}$|
|$\ket{1_L} = \ket{111}$|$\ket{011}$|$\ket{101}$|$\ket{110}$|$\ket{111}$|
|$Z_1Z_2I_3\ket{0_L}$|$\color{red}{-1}$|$\color{red}{-1}$|$+1$|$+1$|
|$I_1Z_2Z_3\ket{0_L}$|$+1$|$\color{red}{-1}$|$\color{red}{-1}$|$+1$|
|$Z_1Z_2I_3\ket{1_L}$|$\color{red}{-1}$|$\color{red}{-1}$|$+1$|$+1$|
|$I_1Z_2Z_3\ket{1_L}$|$+1$|$\color{red}{-1}$|$\color{red}{-1}$|$+1$|

上記を見てみると、生成元（検査演算子）を適用し、測定した結果が

* 共に$+1$のときはエラーは発生していません
* いずれかに$\color{red}{-1}$があるときは、ビットフリップが発生しています。
* 下記のような見方をしてあげると、どのビットでフリップが発生したかが特定できます。

||$Z_2Z_3が+1$|$Z_2Z_3が\color{red}{－1}$|
|---:|---|---|
|$Z_1Z_2が+1$|フリップなし|$X_3$フリップ|
|$Z_1Z_2が\color{red}{－1}$|$X_1$フリップ|$X_2$フリップ|

## ⑤ 5ビットのスタビライザ符号による誤り訂正
3ビットコードでは、検査演算子が$Z$のみで構成されており、フェーズ(位相)フリップは検出できませんでした。
よって、$X,Z$を組み合わせた検査演算子（スタビライザ群の生成元）を持つスタビライザ符号を考えます。

結論だけ示してしまうと、スタビライザ演算子を下記の様に定義することで、実現可能です。

```math
\displaylines{
S_1 = ZXXZI
\\
S_2 = IZXXZ
\\
S_3 = ZIZXX
\\
S_4 = XZIZX
}
```

## まとめ
Shorの符号につづいて、スタビライザ符号について扱ってみました。
スタビライザ符号は、下記のプロセスでスタビライザ形式でスタビライズされる量子状態の部分空間内に符号語を埋込み、検査演算子としてスタビライザ群の生成元を用いて、エラーを検出しました。
Shorの符号と比較すると、ビット／フェーズフリップに対応する符号を9ビット→5ビットと効率的に実現できます。
また、符号語の物理状態を意識することなく、符号が記述できるので、量子ビットが増えたとしても扱いやすいという点もメリットです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/568af20a-7e70-e8c2-e371-a5e3013e4449.png" width="800">

FTQCに向けては、表面符号、クリフォード演算子、魔法状態蒸留、しきい値定理と話を進めていけばよいのですが、その話は、ガッツが湧いたらｗ　また、いつか書きたいと思います。
なお、著者の理解が足りていない部分もあるかと思いますので、なにかあればコメントいただけますと幸いです。

## 参考
* [スタビライザーによる量子状態の記述](https://whyitsso.net/physics/quantum_mechanics/stabilizer.html)
* [量子コンピューティング ~基本アルゴリズムから量子機械学習まで~](https://www.ohmsha.co.jp/book/9784274226212/)
* [大阪大学　藤井研究室　量子コンピューティング2020　大学院授業](https://quantphys.org/wp/qinfp/classwork/)
* [慶應義塾大学スピントロニクス研究センター 量子コンピュータ授業](http://www.appi.keio.ac.jp/Itoh_group/spintronics/)