Toeic codeを使って量子コンピューターの誤り訂正ができるということを以前紹介しました。
今回はその仕組みを組み込んで実際に計算を行うやり方を紹介します。
記号は https://qiita.com/hiro949/items/0a1520568f87511bbb6d に従います。
logical qubit
符号化したまま計算を行う際の1量子ビットはdefect pairというもので実現されます。
defect pair
Toric codeのハミルトニアンは
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$がある状態を
|D_1,D_2,\cdots\rangle
と書くことにします。
このような穴を作ることでその穴の周りに論理演算子を定義できます。上図のように格子に欠陥$A_1$を作るとその周りの$Z(\partial A_1)$は状態$|A_1\rangle$に対する論理演算子になります。
また欠陥が2つあるときその欠陥同士をつなぐ経路の$X$の経路も状態$|A_1A_2\rangle$の論理演算子となります。
欠陥を2つつくるとトーラスの穴が1個増えたことになります。同様に双対格子にdefect pairを作ることもできます。
ここでは元の格子のdefect pairを primal defect pairと呼び、それと区別して双対格子上のdefect pairをdual defect pairと呼ぶことにします。
defect pairの生成
元の格子で欠陥を作るときは該当する量子ビットでX測定を行います。
すると、そこのビット(格子点$s_1$とする)は
|\pm\rangle = \frac{1}{\sqrt{2}}(|0\rangle \pm |1\rangle)
のいずれかになるので現在のシステムの状態が属する状態空間はスタビライザー空間から
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$測定を行います。例えば次図のような場合を考えます。
そしてプラケット$A_b$の値を測定すると、$A_b$のプラケットに関してはその固有状態に変化するので$A_b$の欠陥は消えます。こうしてprimal defect pairを生成できました。
$A_a$と$A_c$を結ぶ経路を$c$とすると、操作によって現在の状態が属する状態空間は
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の位置を動かすこともできます。
双対格子では$Z$測定で欠陥を作ってスター$B_s$の測定で欠陥を消せば同様の操作ができます。
また、欠陥をつなぐ経路はホモロジーが同じであれば同じ演算子とみなすことができます。
Braiding
先ほどdefect pairは欠陥の位置を動かしてもホモロジーが同じであれば同じ演算子として機能すると述べましたが、動かし方によってはホモロジーが変化する場合があります。そのような操作をBraidingと呼びます。
Braidingを行うにはprimal defect pairとdual defect pairの両方が存在することが条件となります。このときに一方のpairの欠陥を他方のpairの欠陥の周りでぐるっと一周させます。
例えばprimal defect pairの欠陥$P$をdualdefect pairの欠陥$S$の周りで1周させると
となります。すると、これは次図とホモロジーが同じです。
これはdual defect pairの一方の欠陥に論理$X$演算子を作用させたものになります。
$P$と$S$の部分に注目すると
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$を基底として
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$演算子を欠陥周りに発生させることになります。この操作は
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を1組ずつ)を用いて量子テレポーテーションすることで構成することができます(次図)。
藤井啓祐:量子コンピューティング講義資料より引用
(図中のcontrol、targetはprimal defect pairです)。
万能量子計算
任意の多ビット演算は任意の1ビット回転とCNOTゲートを組み合わせて構成することができます。さらに1ビット回転はSolovay-Kitaevアルゴリズムより、$H,T$ゲートがあれば作ることができます。ここで
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$はシステムを構成するすべてのビットの一つ一つにアダマールゲートを作用させればよいです:
H = \bigotimes_{i=1}^{N}H_i
このとき各ビットでは
X_i = H_i Z_i H_i \\
Z_i = H_i X_i H_i
となるので、元の格子と双対格子が入れ替わることになります。つまり元の格子が$\bar{K}$、その装置格子が$K=\bar{\bar{K}}$です。これは格子の面を$90^\circ$回転させたものになっています。
Clare Horsman et al 2012 New J. Phys. 14 123011より引用
論理演算子やスタビライザー演算子もアダマールゲートによってこの再定義した格子のものに変換されます。そして、これは変換前のシステムを$90^\circ$回転させたものになっていて、そこには対応した演算子があります。つまり変換後の演算子は元の格子で表現可能です。したがってアダマール変換後の論理演算子も論理演算子であり、変換後のスタビライザー演算子もスタビライザー演算子です。
Tゲート
$T$はCNOTと$X$測定を組み合わせて作ることができます。このときゲートテレポーテーションという方法を使います:
- まず任意の状態$|\psi\rangle$と$A|+\rangle$(ただし$A=S,T$)の2ビットに対してCNOTゲートを作用させます。
- 次に1つ目のビットを測定し、その測定結果に応じて2つ目のビットを操作します(状態の符号を合わせる)。
これによって2つ目のビットの入力状態における$|+\rangle$の部分に1つ目のビットの状態を代入することができます。
上の図は$z=1$でZゲートを、下の図は$x=-$でXゲートを2つ目のビットに作用させます。2つ目のビットの状態はマジック状態蒸留という方法で近似的に作ることができます(近似なので誤差を含みます)。
誤り訂正
これで符号ビットで量子計算ができますが、Toric codeの特徴である誤り訂正はどうやるのか見てみます。
復習すると誤り訂正は
- プラケット/スターの測定をして符号反転を検知する。
- 反転したビットを推定して対応する操作を行う。
の2ステップで行います。
しかし、この操作を挟んでもメインの量子計算に影響が出ないようにしないといけません。訂正は必要に応じて適宜行えばよいのですが、問題はメインの計算に影響が出ない測定をどうやって行うかです。
シンドローム測定
ここでもゲートテレポーテーションを使います。もう一つ補助ビットを用意してそこに状態をコピーしてそれを測定します。これは次のような回路になります。
$A$の部分はプラケット演算子です。補助ビット$|+\rangle=H|0\rangle$を制御ビットとする操作になっています。ここでは制御スタビライザー演算子と呼ぶことにします。スターやプラケットは実際の量子ビットに対するX,Zゲートの組み合わせなので、制御スタビライザーもCNOTやCZゲートの組み合わせで作ることができます。これで1つ目の補助ビットは$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