量子誤り訂正
量子誤り訂正とは、非常にもろく、壊れやすい「量子状態」を保護するための技術である。特に量子ビットの状態に対する誤り訂正の実現は、量子コンピュータを作るのに必須であり、その文脈で触れられることが多い。個人的には、様々な量子状態の「量子性」が保たれる時間を、外部からの操作によって (一定の条件さえ満たされればほとんど無制限に) 伸ばせるという事自体がとてもおもしろいと思う。
この記事では最も単純な符号である多数決符号を題材に、量子誤り訂正のエッセンスを説明したい。
基本的な量子ゲートを知っている、くらいのレベルを想定した説明をする。(古典誤り訂正の知識は求めない。)
多数決符号
多数決符号は、古典的な誤り訂正においても最も簡単な符号の一つである。説明のため、あるビット \(b \in \{0,1\}\) を誰かに送りたい、あるいは長い時間その情報を保持したいという状況を考えよう。このとき、例えば電磁波やコンデンサの電荷としてエンコードされた、一つの物理的なビット情報は、単位時間当たり \(p\) の確率で \(0\to 1\) あるいは \(1\to 0\) と反転してしまうとする。
このような状況下で情報を守るための最も簡単なアイデアが多数決符号である。多数決符号では、保持したい情報である \(0\) を、たくさんの物理ビットを使って \(00\cdots 0\) と表し、逆に \(1\) を \(11\cdots 1\) と表すと約束することにより、誤りの抑制を図る。どれかのビットに誤りが起きたとしても、\(0\) か \(1\) の多い方をもとの情報だと考えれば、元の情報を復元できるだろう。ビット反転エラーが独立に起こるとすれば、半分以上のビットが反転してしまう確率は非常に低いからである。
このとき、\(00\cdots 0\) や \(11\cdots 1\) で表される \(0\) や \(1\) という情報のことを
論理ビット と呼ぶ。逆に、論理ビットを構成している物理的な個々のビットのことを
物理ビットと呼ぶ。
「量子」誤り訂正符号に要求したいこと
多数決符号を量子ビットの保護へと拡張したい。簡単のため、ここからは 3 ビットだけを考えることにしよう。3ビットの多数決符号の論理ビット \(0_L\), \(1_L\) は、
\begin{align}
0_L &= (000) \\
1_L &= (111)
\end{align}
と表せる。これを素直に拡張するなら、物理的な量子ビットを 3 つ使って、1 つの
論理量子ビット \(\ket{0}_L\), \(\ket{1}_L\) を
\begin{align}
\ket{0}_L &:= \ket{000} \\
\ket{1}_L &:= \ket{111}
\end{align}
と定義すればよさそうな気がする。
このような論理量子ビットを使えば、古典的なビットの誤り訂正と同じように、「量子」誤り訂正もできるのだろうか?そのことをしっかり考えるために、「量子」誤り訂正に要求したいことを明確にしておきたい。普通量子状態の誤り訂正をしたい、といったときには、\(\ket{0}_L\) や \(\ket{1}_L\) に対する誤りを訂正し保持しておけるだけでは不十分で、より一般に
\begin{align}
\alpha \ket{0}_L + \beta \ket{1}_L
\end{align}
のような重ね合わせ状態をも保存しておけなければ意味がない。\(\ket{0}_L\) や \(\ket{1}_L\) を保存するだけで十分ならば、なにも量子ビットを使う必要はなくて、古典ビットを使えばよいのだから。
古典誤り訂正との違い
さて、上のように構成した \(\ket{0}_L\) と \(\ket{1}_L\) で、重ね合わせ状態も含めて誤り訂正を実行したい。古典ビットの場合には、物理ビットに含まれる \(0\) と \(1\) の数を数えて、多いほうが論理ビットの表す情報であると結論すればよかった。しかし量子ビットの場合には、もし \(0\) と \(1\) の数を数えようと物理量子ビットを測定してしまうと、物理量子ビットはすべて \(0\) か \(1\) に収束してしまう。もし元の状態が \(\alpha\ket{0}_L + \beta \ket{1}_L\) だったとしたら、もともとは誤りを訂正するために行っていた測定操作によって、\(\ket{000}=\ket{0}_L\) もしくは \(\ket{111}=\ket{1}_L\) へと状態を壊すことになる。もちろん、もし測定結果から \(\alpha, \beta\) を推定できるのなら元の状態を復元できるが、この測定結果から係数を推定することは不可能だろう。
したがって、古典的な多数決符号と同じ戦略 (ビットの数を数える手法) をとっていては、多数決符号をそのまま量子状態の誤り訂正に応用することはできない。
間接的に量子ビットの情報を知る
0, 1 の数を数えるという方針では誤り訂正を行えないことがわかったので、別の方法を考えなければいけない。実はうまく行く方法として、隣同士の物理ビットが同じか同じでないか (=ビット間のパリティ) を調べて、実効的に同じ情報を得る方法がある。
以下に隣同士のビット間のパリティを表にしてみた。\(\oplus\) は XOR で、ビットが同じ場合0を、違う場合1を返す演算である。
物理ビットの値 \((b_1b_2b_3)\) |
\(b_1\oplus b_2\) |
\(b_2\oplus b_3\) |
000 |
0 |
0 |
001 |
0 |
1 |
010 |
1 |
1 |
011 |
1 |
0 |
100 |
1 |
0 |
101 |
1 |
1 |
110 |
0 |
1 |
111 |
0 |
0 |
上記の表から、隣同士の物理ビットのパリティを調べると、000 と 111 のときにのみ、\(b_1, b_2\)間・\(b_2, b_3\)間両方のパリティが 0 となることがわかると思う。つまり、パリティを見るだけで誤りが起きたかどうかを検知できる。また、上記の表をよく見れば、パリティの値からどこにビット反転エラーが生じているかも判別できることがわかるはずだ。具体的には
\(b_1\oplus b_2\) |
\(b_2\oplus b_3\) |
誤りの発生したビット |
0 |
0 |
- |
0 |
1 |
\(b_3\) |
1 |
1 |
\(b_2\) |
1 |
0 |
\(b_1\) |
となる。
パリティの間接検出
パリティを検出しても多数決符号による訂正ができることがわかったが、パリティの計算を 3 つの物理量子ビットを直接測定してしまっては元の木阿弥だ。実は以下のように (\(\ket{0}\)に初期化した) 補助的な量子ビットを使って、パリティを間接的に検出すればこの問題を解決できる。
CNOTゲート は制御ビット (黒点がついているほう) が 1 である場合のみ、ターゲットビットを反転させるので、補助ビットの出力は図のように \(b_1, b_2\) の XOR になる。\(b_1, b_2\)・\(b_2, b_3\)のパリティを同時に検出したければ、次のような量子回路を使えば良い。
非常に重要なのは、この測定が論理量子状態を破壊しないという点である。論理量子状態
\begin{align}
\alpha\ket{0}_L + \beta \ket{1}_L = \alpha\ket{000}_{123} + \beta \ket{111}_{123}
\end{align}
をこの回路に入力してみよう。2つの補助ビットの添字をそれぞれ \(\ket{}_{p_{12}}, \ket{}_{p_{23}}\) と書くことにする。(\(p\)はパリティの頭文字。) すると回路の出力は、
\begin{align}
&\alpha\ket{000}_{123}\ket{0}_{p_{12}}\ket{0}_{p_{23}} + \beta \ket{111}_{123}\ket{0}_{p_{12}}\ket{0}_{p_{23}} \\
&= (\alpha\ket{000}_{123} + \beta \ket{111}_{123})\ket{0}_{p_{12}}\ket{0}_{p_{23}}
\end{align}
となり、この状態の補助量子ビットを測定しても、論理ビットの情報は破壊されないことがわかるだろう。
誤り検出の特性
最後に、上の回路に色々な入力状態を入れてみて、その特性を調べてみよう。
古典ではビット反転エラーくらいしかないので、原理的には多数決符号ですべてのエラーを訂正できるが、量子の場合、今回の 3 物理ビットを使った多数決符号では訂正できないエラーもあることがわかった。
まとめ
今回は多数決符号を例に、量子誤り訂正の構成方法について書いてみた。この例が伝える量子誤り訂正のエッセンスは次のような感じ。(だと思う。)
-
論理量子ビットの状態を壊さないように、補助量子ビットを用いた測定が必要となる。
- 半端に反転したようなエラーも、補助量子ビットの測定によって、反転している・いない世界のどちらかに収縮させることで、復元可能になる。(このような半端なエラーのことを、コヒーレントエラーと呼ぶ。)
- ビットの反転だけでなく、量子状態の係数の変化 (上の位相エラーのようなエラー) にも対応できるような誤り訂正手法が必要である。