これは トポロジカル符号の実装実験 の記事です。
はじめに
前回までの記事では、表面符号(surface code)の実装実験を行いました。単純な構造をしているため実装が容易で、比較的高いエラー閾値を持つため、理論・実験の両面でよく研究されています。一方で、Sゲートなど特定のCliffordゲートについては誤り耐性のある実装に大きなコストがかかります。
これに対して、二次元カラー符号(2D color code)[参考1]は、全てのCliffordゲートをトランスバーサルに実装できるという利点を持つ符号です。この性質から、少ないコストで誤り耐性のある量子計算を行うことができると期待されています。
また、QuEra社による2025年の論文[参考2]では、中性原子量子コンピュータ上でカラー符号を用いた論理レベルの魔法状態蒸留が実機で実現され、非常に話題になりました。
ただ、カラー符号はデコードが難しいことや、シンドローム測定回路が深くなりやすいことから、結果として誤りが蓄積しやすいという問題があります。
本記事では、こうした背景を踏まえつつ、カラー符号の基本構造とSteane符号との関係を整理し、カラー符号を理解するための基礎を確認していきます。
カラー符号の概要
格子の定義
カラー符号は、次の条件を満たす格子上で定義されるトポロジカル量子誤り訂正符号です。
- 各頂点で三本の辺が交わる。
- 各面に三色(例えば red, green, blue)のうち一つを割り当てる。ただし、隣接する面は異なる色にする。
例えば、トーラス上(=周期境界条件を満たす)の代表的な格子として以下のものが挙げられます。

図1. 代表的な格子の例
○は物理量子ビットを表します。また、隣接する面が共有する辺には、面と異なる色を割り当てています。
ここで、「6.6.6」や「4.8.8」というのは、格子を構成する三色の図形の辺の数を表しています。
しかしながら、このようなトーラスを実際に構成することは現実的ではないので、実装には境界をもつ平面的な格子が用いられます。例えば、一論理ビットを符号化するための格子は下図のようになります。

図2. 一論理ビットのための符号距離$d$に対する格子
符号距離$d$は、格子の一辺の量子ビット数と同じになります。例えば、図の底辺に注目すると分かりやすいです。
スタビライザー
面演算子
スタビライザーの生成元は「面ごと」に定義されます。任意の面$f$に対して、その面すべての頂点(=物理量子ビット)に作用するパウリ演算子のテンソル積を考えます。
具体的には、次の二種類の生成元を定義します。
$$
g_f^X := \prod_{v \in f} X_v \tag{1}
$$
$$
g_f^Z := \prod_{v \in f} Z_v \tag{2}
$$
ここで、$v$は面$f$の頂点、$X_v, Z_v$は頂点$v$に作用するパウリ演算子です。
これらを「面演算子(face operator)」と呼びます。重要な点は、同じ面に対して$X$型と$Z$型の両方を定義することです。
スタビライザー符号として成立するためには、すべての生成元が互いに可換でなければなりません。同型の面演算子同士は自明に可換です。では、異なる型の面演算子ではどうでしょうか。上図に示した格子では、すべての面が偶数個の頂点を持つので、同じ面$f$に対する面演算子は常に可換です。また、異なる面$f, f'$に対しては、辺を共有しない面同士なら明らかに可換ですし、隣接する面の間で必ず一本の辺、すなわち二つの頂点を共有するので可換です。したがって、すべての生成元が可換であることが確認できました。
論理ビット数
以降では、図2に示すような境界をもつカラー符号格子について考えます。これらの格子では、面演算子はすべて独立です。ここで、頂点数を$V$、面数を$F$とすると、量子ビットの数は$V$個、スタビライザー生成元の数は$2F$個(各面に$X$型と$Z$型が一つずつ)です。スタビライザー符号では、符号化される論理量子ビット数$k$は
$$
k = n - r \tag{3}
$$
で与えられます。ここで$n$は物理量子ビット数、$r$は独立なスタビライザー生成元の数です。
ここでは、$n=V$、$r=2F$なので、
$$
k = V - 2F \tag{4}
$$
となります。図2の格子では、実際に数え上げてみると
$$
k = V - 2F = 1 \tag{5}
$$
となります。したがって、このカラー符号では一論理量子ビットを符号化できます。言い換えると、すべての面演算子でスタビライズされる状態は二次元の符号空間をなし、$|0_L\rangle,|1_L\rangle$の二つを論理基底状態として選ぶことができます。
論理演算子
論理パウリ演算子
前節で見たように、このカラー符号では、一論理量子ビットが符号化されます。したがって、この符号には一組の独立な論理演算子$X_L, Z_L$が存在します。論理演算子とは、すべてのスタビライザーと可換で、かつスタビライザー群には含まれないような演算子です。例えば、下図に示すように格子の境界に沿ったパウリ演算子のテンソル積は論理演算子になります。

図3. 論理演算子の例
灰色の境界線は、いずれの面演算子と辺を共有しないか、一辺だけを共有するため可換になります。また、境界線上にある物理ビットの数は必ず奇数個となり、それを面演算子の積として局所的に縮めることはできません。したがってこれはスタビライザー群には属さず、非自明な論理演算子となります。
図3では、論理演算子$X_L, Z_L$はそれぞれ、
$$
X_L = X^{\otimes 5}, Z_L = Z^{\otimes 5} \tag{6}
$$
と表されます。$XZ=-ZX$なので、
$$
X_LZ_L = - Z_LX_L \tag{7}
$$
が成り立ちます。この論理演算子の取り方は一つの例ですが、符号化された論理量子状態に対する基本的な論理演算子を定義することができました。
実はこの図から、トランスバーサルに論理演算子$X_L, Z_L$を実装できることが簡単に分かります。いま、赤い$X$型面演算子のテンソル積を
$$
g_R^X = \prod_{f \in R} g_f^X \tag{8}
$$
と書くことにします。ここで$R$は赤い面の集合です。さて、符号空間に属する任意の論理状態 $|\psi\rangle$ は、すべての$X$型面演算子に対して
$$
g_f^X |\psi\rangle = |\psi\rangle \tag{9}
$$
を満たします。したがってその積である$g_R^X$に対しても
$$
g_R^X |\psi\rangle = |\psi\rangle \tag{10}
$$
が成り立ちます。ここで、全物理量子ビットへのトランスバーサル操作$X^{\otimes n}$を考えます。これは
$$
X^{\otimes n} = X_L \ g_R^X \tag{11}
$$
と書けます。この作用を論理状態に施すと、
$$
X^{\otimes n} |\psi\rangle = X_L \ g_R^X |\psi\rangle = X_L |\psi\rangle \tag{12}
$$
となります。したがって、
$$
X^{\otimes n} |\psi\rangle = X_L |\psi\rangle \tag{13}
$$
が示されました。つまり、全物理量子ビットへのトランスバーサルな$X$操作は、符号空間上では論理演算子$X_L$と等価に作用します。同様の議論により、
$$
Z^{\otimes n} |\psi\rangle = Z_L |\psi\rangle \tag{14}
$$
も成り立ちます。このように、二次元カラー符号ではトランスバーサルなパウリ操作を論理パウリ演算子として定義できます。
論理アダマール、位相シフト演算子
表面符号では、アダマール演算子や位相シフト演算子を単純に全量子ビットへ作用させるだけでは、符号空間を保つことができません。実際に、表面符号のHゲート操作では新たな符号状態を定義することで、この問題を避けています。一方で、二次元カラー符号では、これらの論理演算子をトランスバーサルに実装できるという大きな利点があります。
アダマール演算子(H)
アダマール演算子は、次の関係式
$$
H X H = Z, \ H Z H = X \tag{15}
$$
が成り立ちます。$X_L = X^{\otimes n}, Z_L = Z^{\otimes n}$なので
$$
H^{\otimes n} X_L H^{\otimes n} = (H X H)^{\otimes n} = Z^{\otimes n} = Z_L \tag{16}
$$
同様にして、
$$
H^{\otimes n} Z_L H^{\otimes n} = X_L \tag{17}
$$
となります。したがって、全物理量子ビットへのトランスバーサルなアダマール演算子の作用は、論理アダマール演算子として定義できます。
位相シフト演算子(S)
位相シフト演算子は、次の関係式
$$
S X S^\dagger = Y, \ S Z S^\dagger = Z \tag{18}
$$
が成り立ちます。したがって、
$$
S^{\otimes n} X_L S^{\dagger \otimes n} = (S X S^\dagger)^{\otimes n} = Y^{\otimes n} \tag{19}
$$
$$
S^{\otimes n} Z_L S^{\dagger \otimes n} = (S Z S^\dagger)^{\otimes n} = Z^{\otimes n} \tag{20}
$$
となり、このまま$S_L = S^{\otimes n}$と定義していいように思います。が、そうは問屋が卸しません。なぜなら、単に論理演算子が正しく変換されるだけでは不十分で、符号空間を保つためにはスタビライザーも保たれる必要があるからです。面$f$の$X$型面演算子に対しては
$$
S^{\otimes v} g_f^X S^{\dagger \otimes n} = i^{v} g_f^X g_f^Z \tag{21}
$$
となります($v$は面$f$の頂点数)。$v$が4の倍数であれば $i^{v}=1$ となり、余分な位相が消えます。したがってスタビライザー群は保たれ、符号空間は不変になります。つまり、位相シフト演算子を簡単に実装するためには、すべての面の頂点数が4の倍数になるような格子を選べば良いです。この条件が満たされる格子として代表的なのが、図2の4.8.8格子です。
4.8.8格子では、符号距離$d$に対して必要な物理ビット数$n$は、
$$
n = \frac{1}{2} d^2 + d - \frac{1}{2} \tag{22}
$$
と表せます。ここで、$d$は奇数なので、4で割った余りは$d \equiv 1,3 \pmod{4}$のどちらかになります。それぞれの場合を順に見ていきます。
- $d \equiv 1 \pmod{4}$ の場合
このとき $n \equiv 1 \pmod{4}$ となり、
$$
S^{\otimes n} X_L S^{\dagger \otimes n} = i X_L Z_L = Y_L \tag{23}
$$
が成り立ちます。したがって、
$$
S_L := S^{\otimes n} \tag{24}
$$
と定義すれば、これは論理位相シフト演算子になります。
- $d \equiv 3 \pmod{4}$ の場合
このとき $n \equiv 3 \pmod{4}$ となり、
$$
S^{\otimes n} X_L S^{\dagger \otimes n} = - i X_L Z_L = - Y_L \tag{25}
$$
となります。
これは論理的に$S_L^\dagger$の作用に対応します。したがってこの場合は
$$
S_L := S^{\dagger \otimes n} \tag{26}
$$
と定義することで、正しい論理位相シフト演算子を得ることができます。
まとめておくと、4.8.8格子では、
S_L =
\left\{
\begin{array}{l}
S^{\otimes n} \quad \text{ if } d \equiv 1 \pmod{4} \\
S^{\dagger \otimes n} \quad \text{if } d \equiv 3 \pmod{4}
\tag{27}
\end{array}
\right.
と定義することで、トランスバーサルに論理位相シフト演算子を構成できます。
論理ゲートの実装
実は、符号距離$d=3$のカラー符号は、Steane符号と本質的に同じです。Steane符号による誤り訂正については、こちらの記事で解説しています。ここでは、簡単に任意の符号状態に対する論理演算が、トランスバーサルに実装できることを確認します。
実装
今回はQiskitのを用いて実装を行います。まずは論理状態への符号化を行います。
from qiskit import QuantumCircuit ,transpile
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram
n_shots = 10000 # シミュレーターでのサンプリング回数
backend_sim = AerSimulator() # シミュレーターの用意
circ = QuantumCircuit(7)
# 符号化
circ.h(0)
circ.h(1)
circ.h(2)
circ.cx(3, 4)
circ.cx(3, 5)
circ.cx(2, 3)
circ.cx(2, 4)
circ.cx(2, 6)
circ.cx(1, 3)
circ.cx(1, 5)
circ.cx(1, 6)
circ.cx(0, 4)
circ.cx(0, 5)
circ.cx(0, 6)
# エンコード回路を変数に保存
encoder = circ.to_instruction(label='encoder')
decoder = circ.inverse().to_instruction(label='decoder')
circ.draw("mpl")
この回路は、$q_3$に入力した任意の量子状態を符号化する回路になっています。また、ここではエラーは起こらないものとして、符号化の逆操作によって復号を行います。
はじめに、論理$X$演算について実装してみます。
circ = QuantumCircuit(7)
# データビットに量子状態を入力
circ.h(3)
# 符号化
circ.append(encoder.copy(), range(7))
# 論理X
for i in range(7):
circ.x(i)
# 復号
circ.append(decoder.copy(), range(7))
# Z基底測定
circ.measure_all()
確かに、論理$X$演算がトランスバーサルに実装できていることが分かりました。
次に、表面符号ではフォールトトレラントに実装できない論理$S$ゲートについて確認してみます。$S$ゲートは、一量子ビットに対して
$$
S |0\rangle = |0\rangle, S |1\rangle = e^{i\pi/2} |1\rangle
$$
という回転を与えるゲートです。ただ、位相については直接観測できないので、statevectorを利用して数値的に確認することとします。
from qiskit.quantum_info import Statevector
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
# 量子回路の作成
circ = QuantumCircuit(7)
circ.h(3)
circ.append(encoder.copy(), range(7))
for i in range(7):
circ.sdg(i)
circ.append(decoder.copy(), range(7))
# 量子状態の取得
state = Statevector.from_instruction(circ)
amps = np.abs(state.data)
phases = np.mod(np.angle(state.data), 2*np.pi)
# 非ゼロ成分のみ抽出
mask = amps > 1e-12
amps = amps[mask]
phases = phases[mask]
indices = np.nonzero(mask)[0]
# プロット
basis = [f"{i:0{circ.num_qubits}b}" for i in indices]
norm = plt.Normalize(0, 2*np.pi)
colors = cm.hsv(norm(phases))
fig, ax = plt.subplots(figsize=(10, 5))
ax.bar(basis, amps, color=colors)
ax.set(
ylim=(0, 1),
xlabel="Basis State",
ylabel="Amplitude",
title=r"$\bar{S} |1\rangle$"
)
cbar = fig.colorbar(cm.ScalarMappable(norm=norm, cmap="hsv"), ax=ax)
cbar.set_label("Phase")
cbar.set_ticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
cbar.set_ticklabels(['0', r'$\pi/2$', r'$\pi$', r'$3\pi/2$', r'$2\pi$'])
plt.show()
ここでは7量子ビットで符号化しているので、$S_L = S^{\dagger \otimes n}$となることに注意してください。あくまで数値的にですが、$|1\rangle$に対して位相が$e^{i\pi/2}$だけかかっていることが確認できました。
まとめ
今回、二次元カラー符号(2D color code)は、全てのCliffordゲートをトランスバーサルに実装できることを確認しました。
表面符号では複雑だったゲート操作が、カラー符号では全ての量子ビットに同じ操作をするだけで簡単に実装できてしまうため、非常に魅力的な符号であることが分かります。
動作確認では、よく知られているSteane符号($d=3$ のカラー符号に対応)を利用しました。Steane符号は比較的整理されており扱いやすいですが、符号距離の大きいカラー符号では、符号化回路の構成は必ずしも一意ではなく、効率的な回路の設計が一つの課題になります。また、実際のハードウェア実装では結合構造や誤り率との兼ね合いも重要になります。
本記事が、カラー符号の構造とその魅力を理解する第一歩になれば幸いです。


