Toric codeを使った謝り耐性量子計算

Toeic codeを使って量子コンピューターの誤り訂正ができるということを以前紹介しました。

https://qiita.com/hiro949/items/0a1520568f87511bbb6d

今回はその仕組みを組み込んで実際に計算を行うやり方を紹介します。
記号は https://qiita.com/hiro949/items/0a1520568f87511bbb6d に従います。

## logical qubit

符号化したまま計算を行う際の１量子ビットはdefect pairというもので実現されます。

## defect pair

Toric codeのハミルトニアンは

```math
H_{TC} = -J_e \sum_{vertex} B_s - J_m \sum_{plaquettes}A_p \\
B_s = \prod_{i \in star(s)} X_i \\
A_p = \prod_{i \in boundary(p)} Z_i
```

でした($A$,$B$が逆になってしまっていますがご容赦ください)。この計算には符号化したビットを作る必要となります。これにはシステムの状態がより高次のトーラスである必要があります。つまり"穴の空いた"状態にしてやります。
"穴"(=非連続な領域)とは何かというとそこの量子ビットでスタビライザー$A_s$または$B_p$が固有状態になっていないということです。逆に"穴が空いていない"(=連続な領域)とはその点においてスタビライザーの固有状態になっているということです。
元の穴の空いていない状態はスタビライザー状態$|\Psi_s\rangle \in V_s$ですが、これに対して欠陥$D_1,D_2,\cdots$がある状態を

```math
|D_1,D_2,\cdots\rangle
```

と書くことにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/da0d959d-4fb7-7810-93d9-c9d11bbe5a47.png)
藤井啓祐：量子コンピューティング講義資料より引用

このような穴を作ることでその穴の周りに論理演算子を定義できます。上図のように格子に欠陥$A_1$を作るとその周りの$Z(\partial A_1)$は状態$|A_1\rangle$に対する論理演算子になります。
また欠陥が２つあるときその欠陥同士をつなぐ経路の$X$の経路も状態$|A_1A_2\rangle$の論理演算子となります。
欠陥を２つつくるとトーラスの穴が１個増えたことになります。同様に双対格子にdefect pairを作ることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/14573851-3453-21cf-8b13-9f4251d8d87d.png)
藤井啓祐：量子コンピューティング講義資料より引用

ここでは元の格子のdefect pairを primal defect pairと呼び、それと区別して双対格子上のdefect pairをdual defect pairと呼ぶことにします。

## defect pairの生成

元の格子で欠陥を作るときは該当する量子ビットでX測定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/07ced14a-d025-9d86-7320-9efe72a29b17.png)
藤井啓祐：量子コンピューティング講義資料より引用

すると、そこのビット(格子点$s_1$とする)は

```math
|\pm\rangle = \frac{1}{\sqrt{2}}(|0\rangle \pm |1\rangle)
```

のいずれかになるので現在のシステムの状態が属する状態空間はスタビライザー空間から

```math
V_s = W( \{ A_p=1,B_s=1\mid s,p\in K-A_a \cup A_b \}) \rightarrow W( \{ a_s=1,b_p=1\mid s,p\in K-A_a \cup A_b \} ; \sigma_x(s_1)=\pm 1)
```

へと変化します。次に隣のビット$s_2$に対してもX$測定を行います。例えば次図のような場合を考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/9ebfe9ea-1913-e106-aad1-fc293edb5b5b.png)
藤井啓祐：量子コンピューティング講義資料より引用

そしてプラケット$A_b$の値を測定すると、$A_b$のプラケットに関してはその固有状態に変化するので$A_b$の欠陥は消えます。こうしてprimal defect pairを生成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/507a6f3d-8f1c-b750-56ca-f7ae084d6318.png)
藤井啓祐：量子コンピューティング講義資料より引用

$A_a$と$A_c$を結ぶ経路を$c$とすると、操作によって現在の状態が属する状態空間は

```math
W( \{ a_s=1,b_p=1\mid s,p\in K-A_a \cup A_b \cup A_c \} ; \sigma_x(s_1)=\pm 1, \sigma_x(s_2)=\pm 1) \rightarrow
W( \{ a_s=1,b_p=1\mid s,p\in K-A_a \cup A_c \} ; X(c)=\pm 1)
```

と変化したことになります。またこの操作を繰り返してdefectの位置を動かすこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/1f42d1cb-ba73-89d4-ace7-4b75375ad179.png)
藤井啓祐：量子コンピューティング講義資料より引用

双対格子では$Z$測定で欠陥を作ってスター$B_s$の測定で欠陥を消せば同様の操作ができます。

また、欠陥をつなぐ経路はホモロジーが同じであれば同じ演算子とみなすことができます。

# Braiding
先ほどdefect pairは欠陥の位置を動かしてもホモロジーが同じであれば同じ演算子として機能すると述べましたが、動かし方によってはホモロジーが変化する場合があります。そのような操作をBraidingと呼びます。
Braidingを行うにはprimal defect pairとdual defect pairの両方が存在することが条件となります。このときに一方のpairの欠陥を他方のpairの欠陥の周りでぐるっと一周させます。
例えばprimal defect pairの欠陥$P$をdualdefect pairの欠陥$S$の周りで1周させると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/d6f38334-0e4e-a665-1b33-6c97b95a2ae9.png)
藤井啓祐：量子コンピューティング講義資料より引用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/4383ec5a-f24f-799a-9bd6-0418766efc00.png)
藤井啓祐：量子コンピューティング講義資料より引用

となります。すると、これは次図とホモロジーが同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/5d110332-0b90-2321-6005-ef4bdd8a0080.png)
藤井啓祐：量子コンピューティング講義資料より引用

これはdual defect pairの一方の欠陥に論理$X$演算子を作用させたものになります。
$P$と$S$の部分に注目すると

```math
B:L^P_X \otimes I^S \rightarrow L^P_X \otimes L^S_X
```

と変化したことになります。ここで$L^P_X$はprimal defect pairをつなぐ経路の論理$X$演算子、$
L^S_X$はBraidingで発生した論理$X$演算子で欠陥$S$をぐるっと囲む経路の演算子です。よってこのBraidingは$|L^P_X = \pm 1, L^S_Z = 0,1 \rangle$を基底として

```math
B = \left(\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0
\end{array} \right)
```

と書けます。これはCNOTゲートになっています。

もちろん逆にdual defect pairの欠陥$S$をprimal defect pairの欠陥$P$の周りでBraidingすることもできます。すると論理$Z$演算子を欠陥周りに発生させることになります。この操作は

```math
B' = \left(\begin{array}{cccc}
0 & 1 & 0 & 0 \\
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{array} \right)
```

となり、こちらもCNOTゲートです。ただしコントロールビットと操作ビットが入れ替わっています。

## CNOTゲート
今紹介したBraidingはprimal defect pairとdual defect pairの間でのみCNOTゲートとして働きます。しかし、一般にはprimal defect pair同士やdual defect pair同士のCNOTゲートが必要となります。
例えばprimal defect pair同士のCNOTゲートは2つの補助ビット(primal defect pairとdual defect pairを１組ずつ)を用いて量子テレポーテーションすることで構成することができます(次図)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/582f02d5-2d51-1ab6-4562-d5ad85da05a1.png)
藤井啓祐：量子コンピューティング講義資料より引用
(図中のcontrol、targetはprimal defect pairです)。

# 万能量子計算
任意の多ビット演算は任意の１ビット回転とCNOTゲートを組み合わせて構成することができます。さらに1ビット回転はSolovay-Kitaevアルゴリズムより、$H,T$ゲートがあれば作ることができます。ここで


```math
H = \frac{1}{\sqrt{2}}\left(\begin{array}{cc}
1 & 1 \\
1 & -1
\end{array}\right) \\

T = \left(\begin{array}{cc}
1 & 0 \\
0 & e^{i\frac{\pi}{4}}
\end{array}\right)

```
です。

## アダマールゲート
アダマールゲート$H$はシステムを構成するすべてのビットの一つ一つにアダマールゲートを作用させればよいです：

```math
H = \bigotimes_{i=1}^{N}H_i
```

このとき各ビットでは

```math
X_i = H_i Z_i H_i \\
Z_i = H_i X_i H_i  
```

となるので、元の格子と双対格子が入れ替わることになります。つまり元の格子が$\bar{K}$、その装置格子が$K=\bar{\bar{K}}$です。これは格子の面を$90^\circ$回転させたものになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/8b2f1fd0-11ff-9a47-1bc7-5528bf2f548b.png)
Clare Horsman et al 2012 New J. Phys. 14 123011より引用


論理演算子やスタビライザー演算子もアダマールゲートによってこの再定義した格子のものに変換されます。そして、これは変換前のシステムを$90^\circ$回転させたものになっていて、そこには対応した演算子があります。つまり変換後の演算子は元の格子で表現可能です。したがってアダマール変換後の論理演算子も論理演算子であり、変換後のスタビライザー演算子もスタビライザー演算子です。

## Tゲート
$T$はCNOTと$X$測定を組み合わせて作ることができます。このときゲートテレポーテーションという方法を使います：

- まず任意の状態$|\psi\rangle$と$A|+\rangle$(ただし$A=S,T$)の２ビットに対してCNOTゲートを作用させます。
- 次に１つ目のビットを測定し、その測定結果に応じて２つ目のビットを操作します(状態の符号を合わせる)。

これによって２つ目のビットの入力状態における$|+\rangle$の部分に１つ目のビットの状態を代入することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/cba1b762-c9a4-fb14-578c-a105a9c9ad23.png)
藤井啓祐：量子コンピューティング講義資料より引用

上の図は$z=1$でZゲートを、下の図は$x=-$でXゲートを２つ目のビットに作用させます。２つ目のビットの状態はマジック状態蒸留という方法で近似的に作ることができます(近似なので誤差を含みます)。

# 誤り訂正

これで符号ビットで量子計算ができますが、Toric codeの特徴である誤り訂正はどうやるのか見てみます。
復習すると誤り訂正は

- プラケット/スターの測定をして符号反転を検知する。
- 反転したビットを推定して対応する操作を行う。

の２ステップで行います。

https://qiita.com/hiro949/items/0a1520568f87511bbb6d

しかし、この操作を挟んでもメインの量子計算に影響が出ないようにしないといけません。訂正は必要に応じて適宜行えばよいのですが、問題はメインの計算に影響が出ない測定をどうやって行うかです。

## シンドローム測定
ここでもゲートテレポーテーションを使います。もう一つ補助ビットを用意してそこに状態をコピーしてそれを測定します。これは次のような回路になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/8e32ef03-875d-e851-6e12-34afa8b78e1a.png)
藤井啓祐：量子コンピューティング講義資料より引用

$A$の部分はプラケット演算子です。補助ビット$|+\rangle=H|0\rangle$を制御ビットとする操作になっています。ここでは制御スタビライザー演算子と呼ぶことにします。スターやプラケットは実際の量子ビットに対するX,Zゲートの組み合わせなので、制御スタビライザーもCNOTやCZゲートの組み合わせで作ることができます。これで１つ目の補助ビットは$A|\psi\rangle$になります。符号ビット$|\pm_L\rangle$の符号変化はX測定(=アダマールゲートを作用させてZ測定をする)でビット$0,1$として観測できるので、図の回路によって間接的にエラーを測定できます。
ちなみにエラーが起こっていなければスタビライザー状態を使っているので、$A$を作用させても変化はありません。
スターについても同様に測定できます。

# コメント
- 説明がまとまっておらず分かりにくくなっている箇所もありますので、ちょっとずつ加筆訂正していきます。
- ほとんど藤井啓祐先生の講義の写しのようになってしまいましたが、ご容赦ください...

# 参考
- https://quantphys.org/wp/qinfp/classwork/classwork-years/#section01
- https://arxiv.org/ftp/arxiv/papers/1208/1208.0928.pdf
- https://arxiv.org/pdf/0904.2771.pdf
- http://theory.fi.infn.it/SFTschool/SFT_2014/LectureNotes/Burrello_Lecture_1(ToricCode).pdf
- file:///C:/Users/hiro1/AppData/Local/Temp/MicrosoftEdgeDownloads/0d578c22-497b-4bf8-8f57-2a585b586cf3/Mark_thesis_V0617_R1.pdf
- https://iopscience.iop.org/article/10.1088/1367-2630/14/12/123011/pdf