表面符号と戯れる【量子コンピューター Advent Calendar 2023 23 日目】

Dec. 23, 2023, 3:28 a.m. edited Jan. 8, 2024, 5:10 a.m.

#量子情報  #量子力学 

$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

量子コンピューター Advent Calendar 2023 23 日目の記事です。

量子コンピュータにはエラーが生じます。それは従来のノートPCのような古典コンピュータでも同じであり、古典エラー訂正として様々なエラーの訂正方法が知られています(参考

同じように量子計算でも量子エラー訂正の手法があります。これはエラーの起きやすい物理的に実体のある物理量子ビットを複数用いて、 1 つの論理量子ビットを実現するという方法です。その中でもいくつか手法が存在し、そのうち最も有望なものの 1 つであると考えられ研究が進んでいる表面符号を今回は紹介します。

表面符号は何がすごい?

こちらの図をご覧ください:


(出典: [A. Fowler et al., 2012] Fig. 4上)

これは横軸が物理量子ビットのエラー率 \(p\)、縦軸が表面符号によって実現される論理量子ビットのエラー率 \(P_L\) を表しています。そしてプロットされているグラフを見ると、例えば符号距離 \(d\) (あとで説明します) が 7 のとき、物理量子ビットのエラー率が \(p=0.001\) なら論理量子ビットのエラー率は \(P_L=0.00001\) にまで抑えられることが示されています。さらに、その抑えられ方は符号距離 \(d\) が大きくなるにつれて指数関数的に大きくなるという良い性質まで持っています。

表面符号を見てみる

論理量子ビット 1 つを表すのに複数の物理量子ビットを用いるのが量子誤り訂正のやり方ですが、表面符号では実際にそれらの物理量子ビットをどのように並べるのかを以下に示します:

このように、物理量子ビットを格子状に並べるのが表面符号の特徴です。また、物理量子ビットはその役割に応じて大きく 2 種類に分けられます。 1 つはデータ量子ビット(図の大きい丸)と呼ばれ、ほとんど測定されず、ある種の状態を格納する役割を与えられた量子ビットです。もう 1 つは補助量子ビット(図の小さい丸)と呼ばれ、何度も測定され、エラー検出に使われる役割を与えられた量子ビットです。さらに、補助ビットはその場所に応じてさらに 2 つに分けられ、図の格子の頂点に位置するものは \(X\) スタビライザーの補助ビット、面に位置するものは \(Z\) スタビライザーの補助ビットとなります(スタビライザーについてはあとで出てきます)。

そして、先ほど出てきた符号距離 \(d\) とは 1 辺に沿って並んだデータ量子ビットの個数と一致します。今回の記事では正方格子しか扱わないので縦で数えても横で数えても構いませんが、上図の例では 5 つ縦に並んでいるので \(d=5\) となります。

表面符号は何をする?

表面符号においてキーとなる概念は、スタビライザーです。それぞれのデータ量子ビットにエラーが起きても、その近くの補助ビットを測定することでエラーを検知し、修正できるようにします。もう少し具体的には、次の補助ビットを考えます。格子の頂点に存在するので \(X\) スタビライザーの補助ビットです:

ここですべてのデータ量子ビット(この \(a,b,c,d\) 以外も含む)からなる量子状態を \(\ket{\Psi}\) としたとき、

$$X_a X_b X_c X_d \ket{\Psi}=\ket{\Psi}$$

が常に成り立つようにします(\(X_a\) はデータ量子ビット \(a\) に作用する \(X\) ゲート)。つまり、量子状態をある演算子(ここでは \(X_a X_b X_c X_d\))のもとで固有値 1 をとるような状態に限定するということです。こういう状態をスタビライザー状態といいます(より正確な話の参考ページ)。 \(\bar{X}_i=X_a X_b X_c X_d\) のように置いて、これをすべての \(X\) スタビライザーの補助ビットについて行うと、全体の状態を指定する演算子の組は

$$\langle \bar{X}_0,\bar{X}_1,\dots\rangle$$

と表されます。同様に、

のような格子の面に存在する \(Z\) スタビライザーの補助ビットについても

$$Z_a Z_b Z_c Z_d \ket{\Psi}=\ket{\Psi}$$

が常に成り立つようにします。 \(\bar{Z}_i=Z_a Z_b Z_c Z_d\) として、先ほどの \(X\) と合わせてすべての \(Z\) スタビライザーの補助ビットについて行うと、全体の状態を指定する演算子の組は

$$\langle \bar{X}_0,\bar{X}_1,\dots,\bar{Z}_0,\bar{Z}_1,\dots\rangle$$

となります。

さて、ここで符号距離が \(d\) のときデータ量子ビットの数は \(d^2+(d-1)^2\) 個。一方、 \(\bar{X}_i\) の数すなわち \(X\) スタビライザーの補助ビットの数は \(d(d-1)\) 個。 \(\bar{Z}_i\) の数も\(d(d-1)\) 個。すると、その差は

$$d^2+(d-1)^2-2d(d-1)=1$$

と 1 つ分の量子ビットの自由度が存在するとわかる。つまり、その自由度で論理量子ビット 1 つを表せるということになります。

どうやってスタビライザー状態に常にしておくの?

前節ではスタビライザー状態にしておくと言ったものの、それをどのような量子回路で実現するかはまだ記述していなかったのでこの節で行います(エラーの扱いについては次節で行います)。

まず、格子の頂点に存在する補助量子ビット(\(X\) スタビライザーの補助ビット)について考えます。

上図のように \(X\) スタビライザーの補助ビットとその周りに存在するデータ量子ビット \(a,b,c,d\) について、常に実行され続ける量子回路を示します:

同様に \(Z\) スタビライザーの補助ビット

について常に実行され続ける量子回路を示します:

この回路により常にデータ量子ビットの状態は \(\bar{X}_i\), \(\bar{Z}_i\) の固有状態に射影されるので、常にスタビライザー状態であり続けるということになります。(もう少し詳しい説明:表面符号で各サイクルで使われる回路は何を表しているのか【量子計算】

表面符号を採用する量子コンピュータではこの回路を常に動かし続け、その頻度は 1 サイクルにつきおよそ 10 µsec. というペースになります。

エラーが起きたらどうなる?

上図の赤い箇所のデータ量子ビットで実際に位相反転エラーが起きたとします。つまり、勝手にそのデータ量子ビットだけに \(Z\) ゲートがかかってしまったということです。すると、その隣の \(X\) スタビライザー補助ビットにおけるスタビライザー測定により、 \(-1\) という結果が返ってきます。なぜなら、全体のデータ量子ビットのもともとの状態を \(\ket{\Psi}\) と置き、赤い箇所のデータ量子ビットを \(a\) とすると、エラーが起きた状態は

$$Z_a \ket{\Psi}$$

となります。そこに \(X_a X_b X_c=\bar{X}_i\) が掛かると

$$X_a X_b X_c (Z_a \ket{\Psi})=-Z_a X_a X_b X_c \ket{\Psi} = -(Z_a \ket{\Psi})$$

となり、固有値が \(-1\) とわかります(\(X_a Z_a=-Z_a X_a\) という性質を利用した)。スタビライザー状態の特徴として、この固有値が測定結果に現れるので、この補助ビットの測定結果からエラーが起きたことを検出できるということになります。さらに、今回はこの補助ビットしかエラーを検出しないので、実際のエラー箇所は \(a\) であるということもわかります。

では、次にもう少し複雑な例として、以下のように位相反転エラーが起きた場合を考えます:

ここでエラーを検知するのは図の \(A, B\) の補助ビットのみです。他の補助ビットは偶数個(0個を含む)のエラーと隣接しているため検出することはありません。なぜなら、仮に 2 個のエラーと隣接していても

$$X_a X_b X_c X_d (Z_a Z_b \ket{\Psi})=Z_a Z_b X_a X_b X_c X_d \ket{\Psi} = Z_a Z_b \ket{\Psi}$$

のように \(-1\) の固有値は得られないためです。すると、実際にエラーが起きたのは下図の赤線なのか青線なのか、はたまた緑線のようなものなのか区別がつきません。

しかし、多くの場合に問題はないのです。その理由は最後の測定方法からわかります(次節)。

さあ最後の論理測定

最後の論理測定といっても途中で論理状態に対する論理ゲートの説明をしていないじゃないかと突っ込まれそうですが、そのあたりは良質なページがあるのでそちらに解説を譲ります。

それではここでは何をするかというと、最後の論理測定の話です。

まず、格子を横切るようにデータ量子ビットを測定していくと、その結果の積は論理 \(Z\) 測定の結果となります。例えばどこでも良いので、上図における一番上の行のデータ量子ビットをすべて \(Z\) 測定すると、その演算子は \(Z_0 Z_1 Z_2 Z_3 Z_4\) となります。これはなんとすべてのスタビライザー演算子と可換なものになります。確認すべきは \(Z\) と交換しない \(X\) から構成されるスタビライザー演算子ですが、同じデータ量子ビットに関わる \(\bar{X}_0=X_0 X_1 X_5\) は

$$(X_0 X_1 X_5)(Z_0 Z_1 Z_2 Z_3 Z_4)=(-Z_0 X_0)(-Z_1 X_1)Z_2 Z_3 Z_4 X_5=(Z_0 Z_1 Z_2 Z_3 Z_4)(X_0 X_1 X_5)$$

より交換し、同じように \(\bar{X}_1=X_1 X_2 X_6\), \(\bar{X}_2=X_2 X_3 X_7\), \(\bar{X}_3=X_3 X_4 X_8\) も交換します。つまり、これはスタビライザーに影響されない論理演算子であり、その測定結果の積は論理量子ビットの測定結果ということになります(測定結果は \(+1,-1\) のどちらかを考えている)。

しかし、実際には前節で見たようにエラーが起こります。実は検知したエラーは、そこに対して打ち消すようなゲートを実際にかけるようなことはしません。そうするとその過程でさらにエラーが起きうるからです。となると、そのエラー検知情報はこの測定で吸収することになります。

この節では \(Z\) 測定を考えているので、前節とは異なりビット反転エラーを考えます。つまり、どこかのデータ量子ビットが勝手に \(X\) ゲートがかかったというエラーです。まずは最もシンプルに下図のエラーを考えます:

これは 0 番のデータ量子ビットしかビット反転していないので、その真下の \(Z\) スタビライザー補助ビットが検知でき、そこにしかエラーは起きえない(正確には嘘でその下すべてのデータ量子ビットがエラーになっている場合もありえるがここでは考えない)ので推定した箇所もそこになります。すると、最後の論理 \(Z\) 測定 \(Z_0 Z_1 Z_2 Z_3 Z_4\) にも同じ 0 番が含まれているので、その測定結果に \(-1\) を掛けてやれば正しい結果となります。

次に、下図のように少し複雑なエラーパターンを考えます:

ここで実際に起きたエラーを赤、推定したエラーを青とすると、推定結果が間違ってしまっています。どちらも同じ補助ビットのスタビライザー測定結果を得られるので、こうなるのは仕方ありません。それでも最終的な結果には問題なく、推定結果は今回の論理演算子と無関係な 7 番なので論理測定結果には何も掛けません。そして、実際に起きたのは 2, 3 番と偶数個なので掛け算で打ち消しあって結果には影響しません。このように、実際に起きたエラーと推定したエラーがループを構成していれば、それは何も問題を及ぼさないのです。これも表面符号の良い特徴の一つです。

それでは、どのようなときに問題となるのでしょうか。それは次のエラーパターンを見てください:

thumbnail

推定したエラーには 3 番が含まれており、そしてそれは 1 つだけつまり奇数なので実際の論理測定結果に \(-1\) を掛けることになります。しかし、実際にはそこには何もエラーは起きておらず、結果として誤った論理測定結果となってしまいます。このように、表面符号を縦に横切るようなビット反転エラー(論理 \(X\) 測定する場合なら横に横切る位相反転エラー)が発生すると誤った、訂正不可能な論理測定結果となってしまいます。これを論理エラーといいます。

このような論理エラーは符号距離 \(d\) が短いほど起きやすく、逆に符号距離 \(d\) が大きければ冒頭に示されたグラフのように起きづらくなります。

まとめ

こうして表面符号を理解することができました。今回は最も単純にデータ量子ビットにのみエラーの起きる場合(符号容量ノイズという)を考えましたが、実際には補助ビットにも、はたまた各サイクルの途中でも起きえます。すると、どこでエラーが発生したのかを推測するのも少し難しい問題となってきます。したがって、この分野では物理量子ビットのエラーをなるべく抑えつつ数を増やしていくハード面と、エラー発生箇所の推定やなるべくハードへの負担を減らすようなコンパイル方法を探すソフト面、その双方の研究がまだまだ必要となります。こうした道の先に量子コンピュータの実現があると期待しています。