文献情報
- タイトル:Degenerate Quantum LDPC Codes With Good Finite Length Performance
 - 著者:Pavel Panteleev and Gleb Kalachev
 - 書誌情報(DOI):https://doi.org/10.22331/q-2021-11-22-585
 - 出版年:2021年11月
 
概要
量子コンピュータは、従来のコンピュータでは計算が困難な一部の問題を効率よく解けることが期待されています。具体的には、物性に関する計算や素因数分解を効率よく行うアルゴリズムが知られています。
しかし、これらの量子コンピュータで効率よく実行できると期待されているアルゴリズムは、大量の量子ビットと大量の量子ゲートを必要とします。このような大規模な量子アルゴリズムを実行すると、量子ビットに生じるノイズを無視することができません。量子ビットが多ければ多いほどエラーが起こる確率は高まり、量子ゲートが多ければ多いほどエラーは蓄積します。
このような量子エラーに対処するために、量子誤り訂正の理論が構築されてきました。量子誤り訂正理論では、量子誤り訂正符号と呼ばれる符号を用いて量子ビットの情報を保護します。量子誤り訂正符号を用いてエラーを訂正するためには、エラーの情報を間接的に読み出し、その情報からエラーを推定する必要があります。この処理をデコードと呼び、デコードを行うプログラムをデコーダと呼びます。
この記事では、qLDPC符号と呼ばれる量子誤り訂正符号において高性能なデコーダとして知られているBP+OSDデコーダについて解説します。全体の内容は3つの記事から構成されていて、それぞれ次のような内容を扱います。
- 量子誤り訂正符号の基礎(#1)
 - BPデコーディング(#2)
 - OSDとBPの連携(#3)
 
今回の記事では、量子誤り訂正符号の基礎について、BP+OSDデコーダの理解に必要な部分を重点的に解説します。はじめに、量子誤り訂正符号のモチベーションと基本的なアイデアについて紹介し、スタビライザ符号と呼ばれる量子誤り訂正符号のクラスを解説します。スタビライザ符号はすべての記事を通して中心的な役割を果たす重要な概念です。続いて、スタビライザ符号を扱いやすい形で表現するパリティチェック行列を導入します。最後に、BP+OSDデコーダでデコードできるCSS符号と呼ばれる符号クラスを紹介します。
量子誤り訂正符号のモチベーション
量子ビットはノイズにさらされやすく、どれだけ正確に状態を準備してもそのまま放置していればすぐに状態が変わってしまいます。具体例を見るために、まずは量子ビットの状態を記述する方法を確認します。ある量子ビットの状態 $\ket \psi$は一般に、
$$ 
\begin{align}\ket{\psi} = \alpha \ket0+\beta\ket 1\quad (\alpha,\beta\in \mathbb C,|\alpha|^2+|\beta|^2=1)\end{align} 
$$
と記述されます。ここで $\ket 0,\ket 1$は直交するベクトルで、
$$ 
\begin{align}\ket0=\begin{pmatrix}1\\0\end{pmatrix},\quad \ket1=\begin{pmatrix}0\\1\end{pmatrix}\end{align} 
$$
と表せます。量子ビットの状態 $\ket{\psi}$に対してノイズが加わると、例えば
$$ 
\begin{align}\alpha\ket0+\beta\ket1\to\beta\ket0+\alpha\ket1\end{align} 
$$
のように、ベクトルの係数部分がひっくり返ってしまうことがあります。このようなエラーを「ビット反転エラー」といいます。このようなエラーは自然と、しかも頻繁に起こってしまいます。ですから、どうにかしてエラーを検出して、それを打ち消すような訂正操作をする必要があります。
基本的なアイデア
はじめにざっくりとしたアイデアを紹介します。エラーを検出して訂正するための基本戦略は量⼦ビットをより⼤きな空間に埋め込んで冗⻑性をもたせることです。量子ビットの埋め込みは次のような手順になります。
- 埋め込む状態を準備する
 - エンコーダを用いてその状態を大きな空間に埋め込み、大きな空間上で量子計算を実行する
 - デコーダを用いて計算後の状態を復元することで正しい状態を得る。デコーダの内部では、スタビライザと呼ばれる物理量に付いて測定を行い、得られた測定値からエラーの検出と推定を行う
 
この手順を図示すると次のようなイメージになります。

本来であれば大きな空間に埋め込んだまま量子計算をする方法などを考える必要がありますが、ここでは簡単のために量子計算は考えずに量子状態を保存することだけを考えます1。さらに簡単のために、ノイズはエンコードされた状態にしか生じないものとします2。
アイデアを実現する方法
ここからは「冗長性をもたせる」というアイデアを実現する方法を具体的に見ていきます。まずは量子ビットの埋め込みについて考えます。 $k$量子ビットの状態をそれより大きな $n$量子ビットの状態で表現します。このとき、 $k$量子ビットの状態 $\ket{\psi}$に対応する $n$量子ビットの状態 $\ket{\psi_L}$を論理状態とよび、論理状態からなる空間を符号空間と呼びます。つまり、何らかの対応規則から $\ket{\psi} \in \mathbb C^{2^k}$と $\ket{\psi_L}\in \mathbb C^{2^n}$について
$$
\begin{align}\mathcal E: \ket{\psi} \mapsto \ket{\psi_L}\end{align} 
$$
という写像 $\mathcal E$が得られ、その写像の像として符号空間 $T$が
$$ 
\begin{align}T := \mathrm{Im}(\mathcal E)\end{align} 
$$
によって定まります。符号空間は $n$量子ビット空間の部分空間になっていて、 $k$量子ビットの情報を埋め込める大きさを持っています。
エラーの有無を判定する演算子:スタビライザ
続いて、エラーの有無を判別するためにスタビライザと呼ばれる物理量を導入します。スタビライザを使うことで符号を指定できるだけでなく、エラーの情報を取り出す事ができます。古典誤り訂正符号をご存知の方は、パリティの対応物だと思うとイメージしやすいと思います。スタビライザをまとめたものは、線形符号のパリティチェック行列に対応していて、シンドローム値を得ることができます。(パリティチェック行列については次の項で説明します。)
スタビライザを定義するために、パウリ演算子を定義します。ここで定義するパウリ演算子は物理で一般に使われるパウリ演算子の定義とやや異なるので注意してください。パウリ演算子の定義のためにまずはパウリ群を定義します。パウリ群とは、
$$
\begin{align}I=\begin{pmatrix}1&0\\0&1\end{pmatrix},\;X=\begin{pmatrix}0&1\\1&0\end{pmatrix},\;Y=\begin{pmatrix}0&-i\\i&0\end{pmatrix},\;Z=\begin{pmatrix}1&0\\0&-1\end{pmatrix}\end{align} $$
の4つの演算子のテンソル積で生成される群のことです。つまり、 $n$量子ビット系でのパウリ群 $P_n$は
$$ 
\begin{align}\{I,X,Y,Z\}^{\otimes n}\end{align} 
$$
で生成される群となります。このようにして定義されるパウリ群について、その要素をパウリ演算子と呼びます。この定義では、
$$
\begin{align}iZ,\; -iX\otimes Z\otimes I\otimes Y\end{align} 
$$
などもパウリ演算子になります。一般にパウリ群の要素はテンソル積に分解可能なので、パウリ群 $P_n$を
$$
\begin{align}P_n= \{\pm 1,\pm i\}\times \{I,X,Y,Z\} ^{\otimes n}\end{align} 
$$
のように記述する事もできます。 $n=2$の場合を明示的に書くと
$$
\begin{multline}\{\pm 1,\pm i\}\times\{I\otimes I,I\otimes X,I\otimes Y,I\otimes Z,X\otimes I,X\otimes X,X\otimes Y,X\otimes Z, \\Y\otimes I,Y\otimes X, Y\otimes Y,Y\otimes Z,Z\otimes I,Z\otimes X,Z\otimes Y,Z\otimes Z\}\end{multline} 
$$
のようになります。係数として $\{\pm1, \pm i\}$のいずれかが付いていることに注意してください。
パウリ群$P_n$を用いて、符号空間 $T \subseteq (\mathbb C^2)^{\otimes n}$に対する集合$S(T)$を
$$
\begin{align}S(T) = \{M \in P_n \mid \forall \ket{\psi_L}\in T,\; M\ket{\psi_L} =\ket{\psi_L}\}\end{align} 
$$
と定義します。この集合の要素のことをスタビライザと呼びます。ここで $S(T)$は群になっていて、$S(T)$をスタビライザ群と呼びます。つまり、スタビライザとは符号空間を $+1$固有空間として持つような演算子のことです。「符号空間」という空間を指定するために演算子を持ち出して、その演算子の固有空間として空間を指定しようというアイデアです。
スタビライザには固有値が $\pm 1$しかないという性質があります。このことを簡単に示します。まず、スタビライザ $M\in S(T)$はパウリ群 $P_n$に含まれているので、固有値は $\pm i, \pm 1$のいずれかです。ここで、 $M$が固有値 $\pm i$を持っていたとします。このとき、$M$を $\{\pm 1,\pm i\}\times \{I,X,Y,Z\} ^{\otimes n}$のように分解したときの係数部分は $\pm i$のいずれかになります。よって、$M^2 = -I$となり、 $-I\in S(T)$ということになります。ですが、 $-I$は
$$
\begin{align}\forall \ket{\psi}, \; -I\ket{\psi}=-\ket{\psi}\end{align} 
$$
なのでスタビライザの定義を満たしません。矛盾が生じたので、 $M$が固有値 $\pm i$を持っているという仮定は誤りだったことがわかります。したがって、 $M$の固有値は $\pm 1$になります。
スタビライザ符号と呼ばれる特定の符号では、状態がスタビライザの+1固有状態になっているかどうかを調べることでその状態が論理状態であるかどうかを判定できます。スタビライザの定義から、
$$
\begin{align}\ket{\psi} \in T \Leftrightarrow \forall M\in S(T), \quad M\ket{\psi}=\ket{\psi}\end{align} 
$$
が成り立つので、すべてのスタビライザについて $+1$固有状態になっていれば論理状態であるということになります。
スタビライザは物理量と考えることができます。なぜなら、単位行列以外のパウリ演算子は係数が+1なら固有値は $\pm 1$の2つしかないという性質があることから固有値が実数値で、固有ベクトルは直交するからです。さらに、与えられた状態についてスタビライザを測定すると測定値は $\pm1$のいずれかになります。なので、すべてのスタビライザについて測定値が $+1$なら論理状態であり正しい状態、 1つでも測定値が$-1$であるスタビライザがあればエラーが生じた間違った状態であるということがわかります。スタビライザ $M$の測定は量子回路で書くと次の図2のようになります。

測定結果は補助量子ビットのZ測定で得られます。また、測定後の状態は測定結果が $m$であるとき、
$$
\begin{align}\left(\frac{I+(-1)^mM}2\right)\ket{\psi}\end{align} 
$$
となります。ここで、 $(I+M)/2$と $(I-M)/2$はそれぞれ $M$の $+1$固有空間と $-1$固有空間への射影演算子になっています。つまり、測定によってスタビライザ $M$の $+1$固有空間か $-1$固有空間のいずれかに射影されます。測定後の状態がすべてのスタビライザについて $+1$固有状態であるとき、この状態は論理状態であると判定できます。このようにして、スタビライザについての測定を行うことで論理状態であるかどうかを判定できます。
スタビライザについての測定を行うことでエラーの有無を判定できることがわかりました。しかし、スタビライザは群を成しているため、 $S(T)$の要素は大量にあります。従って、そのすべてについて測定を行うことは現実的ではありません。そこで、 $S(T)$を生成する生成元についてのみ測定を行います。生成元とは、演算子の集合 $\{M_1,…,M_r\}$で 群$S(T)$を生成するものの中で要素数が最小のものをいいます。線形代数で言うところの基底のような存在です。従って、エラーの有無を判定するためには、 $S(T)$全体を使う代わりに生成元 $\{M_1,…,M_r\}$について、
$$
\begin{align}M_i \ket{\psi} = \ket{\psi}\end{align} 
$$
であるかどうかを確認すれば十分です。
エラーの有無の判定には $\{M_1,…,M_r\}$ の測定値だけが必要です。測定結果を扱いやすいように測定値 $\{-1, +1\}$ から古典ビット列 $\{0, 1\}$ に変換します。 k 量子ビットの状態 \ket{\psi} について、 $\{M_1,…,M_r\}$ を測定した結果を $(m_1,…,m_r)$ として、
$$
\begin{align}m_i = (-1)^{s_i}\end{align} 
$$
で得られる古典ビット列 $s=(s_1,…,s_r)$のことをシンドローム値と呼びます。ここまでの議論から、すべての $i$について $m_i=+1$であれば論理状態なので、シンドローム値が
$$
\begin{align}s=(0,0,…,0)\end{align} 
$$
であれば論理状態であるということになります。シンドローム値を用いてエラーの有無を判定できることがわかりました。実は、このシンドローム値が様々な情報を持っていて、デコーダを考える上で中心的な役割を担います。
シンドローム値からエラーの情報を取り出す
ここまではエラーの有無だけを考えていましたが、シンドローム値を用いることでどのようなエラーが起こったかを推定することができます。ここでは簡単のために、起こり得るエラーをパウリ演算子を用いた次のような形式のエラーに限定します
$$
\begin{align}\ket{\psi_L}\to P\ket{\psi_L}\quad (P\in P_n)\end{align} 
$$
ここで $\ket{\psi_L}$は論理状態です。このようなエラーのことをパウリエラーと呼びます。実は、パウリエラーに対して訂正できれば各量子ビットに独立にかかるエラーがある程度の精度で訂正できることが知られています3。
エラーが起こることでシンドローム値がどのように変化するかを見ていきます。いま、パウリ演算子の顕著な性質として、任意のパウリ演算子 $P,Q$について
$$
\begin{align}PQ=\begin{cases}QP\\-QP\end{cases}\end{align} 
$$
のいずれかが成り立ちます。つまり、パウリ演算子をかける順番を入れ替えると、符号がそのままの場合と入れ替わる場合があるということです。この性質と、スタビライザがパウリ演算子であることから、0か1の値を取る $b_i$が存在して
$$
\begin{align}P\ket{\psi_L}=PM_i\ket{\psi_L}=(-1)^{b_i}M_iP\ket{\psi_L}\end{align} 
$$
が成り立ちます。この式はエラーが起きた状態 $P\ket{\psi_L}$の $M_i$の固有値が $(-1)^{b_i}$であることを意味していて、 $M_i$についての測定を行うと $b_i$が得られるということになります。このことから、 $\{M_1,…,M_r\}$を測定することで得られるシンドローム値 $s =(s_1,…,s_r)$は
$$
\begin{align}s=(b_1,b_2,…,b_r)\end{align} 
$$
になることがわかります。 $b_i$はエラー $P$によって定まる値だったので、シンドローム値はエラーについての情報を持っているということがわかります。
シンドローム値からエラーを推定する:デコード
量子ビットに発生したエラーの情報を、シンドローム値によって表すことが可能になりました。このことから、シンドローム値を用いてエラーが推定できそうだということがわかります。本来であれば、もう少し詳細な議論を行うことでシンドローム値とエラーの関係を明確にするべきですが、ここではそれを省略してシンドローム値からエラーをベイズ推定で推定する事を考えます。シンドローム値 $s$からエラー $E$を推定することは、結果から原因を推定することに対応しているので、事後確率 $\mathrm{Pr}(E \mid s)$を求めて、
$$
\begin{align}E^* = \arg \max_{E\in P_n} \mathrm{Pr}(E \mid s)\end{align} 
$$
とすることで推定エラー $E^*$を求めます(このような推定法は事後確率最大化 (MAP) 推定と呼ばれます)。このように、シンドローム値からエラーを推定する処理のことをデコードと呼び、その処理を実行するプログラムのことをデコーダと呼びます。この推定のためには事後確率を求める必要があるので、得られたシンドローム値を用いてエラーについての事前分布を更新する必要がありますが、その処理を効率良く行う方法は、次の記事で説明します。
デコーダを用いてエラーを推定したら、その結果に基づいてエラーを打ち消す操作を実行します。ここではパウリ演算子がエラーとして生じる事を考えているため、
$$
\begin{align}\forall P\in P_n, \quad PP=e^{i\theta}I\quad(\theta=0,\pi)\end{align} 
$$
が成り立ちます。グローバル位相は無視できるので、推定エラー をそのまま量子ゲートとして実行することでエラーを打ち消すことができます。このようにエラーを打ち消す操作のことをリカバリ操作と呼び、リカバリ操作のために打つゲートをリカバリゲートと呼びます。
量子誤り訂正の手順まとめ
ここまでの手順をまとめると、量子誤り訂正の全体の操作は
- スタビライザを測定してシンドローム値を得る(シンドローム測定)
 - デコーダを用いてシンドローム値からエラーを推定する
 - エラーを打ち消すような操作をする(リカバリ操作)
 
となります。量子誤り訂正の性能向上のためにはそれぞれのステップについて性能を向上させていく必要があります。これらのステップの中でも、1と3は量子コンピュータの実機の性能向上が重要になりますが、2はデコーダのアルゴリズムを改善することで性能向上が期待できます。また、デコーダのアルゴリズムは古典コンピュータで実行される古典アルゴリズムなのでこれまでも多くの研究がなされています。
パリティチェック行列
最後にスタビライザとシンドローム値の関係を記述しやすくするパリティチェック行列というものを導入します。パリティチェック行列とは行列の各行がスタビライザに対応している行列で、すべての成分が0か1である行列のことです。パリティチェック行列はスタビライザから作れるので、スタビライザ符号の情報をパリティチェック行列に埋め込むことができます。スタビライザは群の要素であり演算子なので扱いにくいこともありますが、パリティチェック行列は成分が0か1の行列なので扱いやすくとても便利です。特に、アルゴリズムの中でスタビライザを使うときに便利になります。
パリティチェック行列を定義するために「バイナリ-シンプレクティック表現」と呼ばれる概念を導入し、さらに「シンプレクティック形式」と呼ばれる演算を定義することでパリティチェック行列とシンドローム値の関係を説明します。
スタビライザに対応するビット列を考えるためにバイナリ-シンプレクティック表現という概念を導入します。まず、パウリ行列は一般に
$$
\begin{align}P = i^lX^aZ^b\quad (a,b \in \mathbb Z_2, \;l\in\mathbb Z_4)\end{align} 
$$
と分解する事ができます。ここで、 $\mathbb Z_n =\mathbb Z/n\mathbb Z$です。よって、位相を表す $i^l$を無視すれば
$$
\begin{align}P \mapsto (a|b)\end{align} 
$$
という対応を考えることができます。ここで、括弧の中にある縦棒は、この組が $\mathbb Z_2\times \mathbb Z_2$の元であることを意味しています。これをテンソル積の場合にも拡張して、 $P_i \mapsto (a_i|b_i)$と置くと、
$$
\begin{align}P_1\otimes P_2\otimes \cdots \otimes P_n\mapsto (a_1a_2\cdots a_n|b_1b_2\cdots b_n)\end{align} 
$$
という対応ができます。例えば、
$$
\begin{align}X\otimes Z\otimes I\otimes Y\mapsto (1001|0101)\end{align} 
$$
となります。このような対応をバイナリ-シンプレクティック表現と呼びます。長いのでここからはBS表現と呼ぶことにします(この呼び方は一般的ではありません)4。
BS表現を用いることで、スタビライザからパリティチェック行列へ変換することができます。具体例で見ていきます。次の5つの演算子がスタビライザ生成元であるとします。
$$
\begin{align}
\begin{split}
M_1&=ZXXZI \\
M_2&=IZXXZ\\
M_3&=ZIZXX\\
M_4&=XZIZX
\end{split}
\end{align} 
$$
このとき、それぞれに対応するBS表現は
$$
\begin{align}
\begin{split}
M_1&\to (01100|10010)\\
M_2&\to(00110|01001)\\
M_3&\to(00011|10100)\\
M_4&\to(10001|01010)
\end{split}
\end{align} 
$$
となります。これを列成分に持つような行列 $H$を
$$
\begin{align}
H:=\left(
\begin{array}{c|c} 
01100 & 10010\\ 
00110&01001\\ 
00011&10100\\
10001&01010 
\end{array}
\right)
\end{align} 
$$
と定めます。このようにして得られる行列 $H$をパリティチェック行列と呼びます。パリティチェック行列からスタビライザ生成元を復元できることから、パリティチェック行列が与えられればスタビライザ符号を指定できることがわかります。つまり、パリティチェック行列はスタビライザ符号についての情報をビット列で表現したものと捉えることができます。
さらに、パリティチェック行列にはエラーとシンドローム値の関係を表すことができるという重要な性質があります。そのための準備として、BS表現における演算を定義します。2つのパウリ演算子 $P,Q \in P_n$に対応するBS表現
$$ 
\begin{align}
P &\to v_P =(x_P|z_P)\in \mathbb Z_2^n\times \mathbb Z_2^n \\ 
Q &\to v_Q = (x_Q|z_Q)\in \mathbb Z_2^n\times \mathbb Z_2^n 
\end{align} 
$$
を考えます。こうして得られる2つのベクトル $v_P,v_Q$について
$$ 
\begin{align}v_P \odot v_Q = x_P z_Q^{\top} \oplus x_Q z_P^{\top} \in \mathbb Z_2\end{align} 
$$
で定義される演算のことをシンプレクティック形式と呼びます。ここで、右辺にある和は $\mathbb Z_2$における和であり、排他的論理和(XOR)です。
シンプレクティック形式を用いることで、エラーとシンドローム値の関係を記述することができるようになります。パウリエラー $E \in P_n$に対してBS表現による対応
$$ 
\begin{align}E \to v_E\in \mathbb Z_2^n\times \mathbb Z_2^n\end{align} 
$$
によってバイナリベクトル $v_E$を定めます。さらに、スタビライザの生成元を
$$ 
\begin{align}M_i\to v_{M_i} \in \mathbb Z_2^n \times \mathbb Z_2^n\quad(1\le i\le r)\end{align} 
$$
と対応させます。このとき、エラー $E$の $M_i$に関するシンドローム値 $s_i$は
$$
\begin{align}M_iE=(-1)^{s_i}EM_i\end{align} 
$$
で定まり、この $s_i$とシンプレクティック形式の間には
$$
\begin{align}s_i = v_{M_i} \odot v_E\end{align} 
$$
が成り立ちます。証明はやや手順が多いですが、定義を順に追っていくことで示すことができます。
シンプレクティック形式とシンドローム値の関係が明らかになったので、ついにパリティチェック行列とシンドローム値の関係を示すことができます。パリティチェック行列は、スタビライザの生成元を $M_i$、そのBS表現を $v_{M_i}$とすると
$$
\begin{align}H=\begin{pmatrix}v_{M_1}\\ \vdots \\ v_{M_r}\end{pmatrix}\end{align} 
$$
となるような行列のことでした。先程の話から、エラー $E$の $M_i$に関するシンドローム値 $s_i$は $s_i = v_{M_i} \odot v_E$をみたします。これらのことから、シンプレクティック形式を積と見立てて行列 $H$とベクトル $v_E$の積を取ることで
$$
\begin{align}Hv_E=\begin{pmatrix}v_{M_1} \odot v_E \\ \vdots \\ v_{M_r} \odot v_E\end{pmatrix} =\begin{pmatrix} s_1 \\ \vdots \\ s_r \end{pmatrix}\end{align} 
$$
が成り立ちます。まとめると、シンプレクティック形式を導入することで、パリティチェック行列 $H$はスタビライザ生成元の情報を持つだけでなく、シンドローム値を直接求めることもできるということです。
CSS符号
パリティチェック行列が単純になる特別な符号でCalderbank-Shor-Steane (CSS) 符号と呼ばれるものがあります。CSS符号は、パリティチェック行列を$X$エラーを監視するものと $Z$エラーを監視するものに分離できるような符号です。具体的にはパリティチェック行列が
$$
\begin{align}H=\left(\begin{array}{c|c}H_X&O\\O&H_Z\end{array}\right)\end{align} 
$$
という形になります。
この符号を用いると、 $Z$エラーについて$H_X$、 $X$について$H_Z$というようにエラーの種類ごとにパリティチェック行列を使うことができ、さらに$H_X,H_Z$は古典誤り訂正符号のパリティチェック行列と同じ形をしています。つまり、エラーの種類が $X$エラーと $Z$エラーの2種類で、しかもそれらを独立に扱うことができます。そのため、古典誤り訂正符号についての知見を活かすことができます。次の項から見ていくデコーダのアルゴリズムも古典誤り訂正符号に対して使われているものを流用したものになっています。
まとめ
最後まで読んでいただきありがとうございます。この記事では、量子誤り訂正符号の基礎的な知識を駆け足で紹介しました。特に重要なのが、スタビライザ符号とパリティチェック行列です。スタビライザ符号は古典の線形符号に対応するような量子誤り訂正符号で、扱いやすくエラーの情報を簡単に取得できます。パリティチェック行列は、スタビライザを表現する方法のひとつで、スタビライザ符号の情報をコンパクトに扱いやすい形で表現する事ができます。
量子誤り訂正符号についてより深く知りたい方には、教科書として文献[1]をおすすめします。この記事の大部分の内容は文献[1]を参考にしています。
次回は、この記事で具体的に説明できなかったデコードの手順、つまりシンドローム値からエラーを推定するアルゴリズムについて詳しく見ていきます。次回の記事でもパリティチェック行列がとても重要になります。
- このように量子状態を保存することを目的に量子誤り訂正を行うことを量子メモリ (quantum memory)と呼ぶことがあります。符号化した状態で量子計算を行うことを誤り耐性量子計算 (fault tolerant quantum computation)と呼び、一般に量子メモリよりもさらに難しい技術です。誤り耐性量子計算を行う方法は多く提案されており、読みやすい論文として[2]やがあります。 ↩︎
 - 現実ではエンコード・デコードの過程でもノイズが発生してエラーが生じてしまうことがあります。このようなエラーに対応するために、さまざまな手法存在しますが、テクニカルで今回の話にはあまり関係ないので省略します。興味のある方は例えば文献[1]の12章13章を参照してください。 ↩︎
 - 詳しくは文献[1]のTheorem 2.4とCorollary 2.5を参照してください。さらに一般に、エラーがCPTP写像である場合に興味がある人は文献[1]のTheorem 2.6を参照してください ↩︎
 - 位相は無視していることに注意してください。BS表現はパウリ演算子の位相成分を無視した商群 $P_n/\{I,-I,iI,-iI\}$から $\mathbb Z_2^n\times \mathbb Z_2^n$への同型です ↩︎
 
参考文献
[1] Daniel Gottesman. Surviving as a Quantum Computer in a Classical World(2024) PDF
[2] Panos Aliferis, Daniel Gottesman, John Preskill. “Quantum accuracy threshold for concatenated distance-3 codes”, Quantum Info. Comput. 6, 2(2006), arXiv:quant-ph/0504218 DOI
[3] Austin G. Fowler, Craig Gidney. “Low overhead quantum computation using lattice surgery”(2018), arXiv:1808.06709
本記事の担当者
東京科学大学 情報理工学院 数理・計算科学系 学士課程