
ショア符号(9量子ビット)をQiskitで実装|XもZも同時に訂正する
2026-08-31 ・ 実践
ビットフリップ符号はXエラー、位相フリップ符号はZエラーだけを直せました。両方を同時に訂正するのが、9量子ビットの ショア符号 です。ビットフリップと位相フリップを入れ子にした美しい構造を、Qiskitで実装して回復を確認します。
構造:入れ子の二段構え
ショア符号は「位相フリップ符号(外側)× ビットフリップ符号(内側)」の入れ子です。1個の論理量子ビットを 9個の物理量子ビット で守ります。
9量子ビットで1個を守る
位相保護
3ブロックに分ける
ビット保護
各ブロック3個ずつ
X も Z も
両方訂正できる
準備
pip install qiskit qiskit-aer
① 符号化+エラー注入+回復
エンコード → わざとエラー → デコード+多数決訂正、を1つの関数に。
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
def shor(error_gate=None, error_qubit=None, init="0"):
qc = QuantumCircuit(9, 1)
if init == "1":
qc.x(0) # 守りたい状態 |1⟩
# --- 符号化(位相保護→ビット保護)---
qc.cx(0, 3); qc.cx(0, 6)
qc.h(0); qc.h(3); qc.h(6)
qc.cx(0, 1); qc.cx(0, 2)
qc.cx(3, 4); qc.cx(3, 5)
qc.cx(6, 7); qc.cx(6, 8)
qc.barrier()
# --- エラー注入(X か Z を1個)---
if error_gate == "x": qc.x(error_qubit)
if error_gate == "z": qc.z(error_qubit)
qc.barrier()
# --- デコード+多数決訂正 ---
qc.cx(0, 1); qc.cx(0, 2); qc.ccx(2, 1, 0)
qc.cx(3, 4); qc.cx(3, 5); qc.ccx(5, 4, 3)
qc.cx(6, 7); qc.cx(6, 8); qc.ccx(8, 7, 6)
qc.h(0); qc.h(3); qc.h(6)
qc.cx(0, 3); qc.cx(0, 6); qc.ccx(6, 3, 0)
qc.measure(0, 0)
return AerSimulator().run(qc, shots=500).result().get_counts()
print("エラー無し |0⟩ :", shor(None, None, "0"))
print("Xエラー q4 |0⟩ :", shor("x", 4, "0"))
print("Zエラー q0 |0⟩ :", shor("z", 0, "0"))
print("Xエラー q7 |1⟩ :", shor("x", 7, "1"))
print("Zエラー q3 |1⟩ :", shor("z", 3, "1"))
結果はすべて元の状態に完全回復します:
エラー無し |0⟩ : {'0': 500}
Xエラー q4 |0⟩ : {'0': 500}
Zエラー q0 |0⟩ : {'0': 500}
Xエラー q7 |1⟩ : {'1': 500}
Zエラー q3 |1⟩ : {'1': 500}
X(ビット反転)でもZ(位相反転)でも、どのビットに起きても元通り。両方のエラーを同時に訂正できることがコードで確認できました。
なぜ両方直せる?
外側の位相保護がZエラーを、内側のビット保護がXエラーを担当します。Yエラー(X と Z が同時)も「XとZの合成」として両方の仕組みが同時に対処。1量子ビットに起きるどんなエラーも、単一なら直せます。
9個で『1個』を守る現実
9物理量子ビットでやっと1論理量子ビット、しかも「単一エラーまで」。複数同時エラーには無力です。実機ではさらに効率の良い表面符号が主流ですが、「多数で1個を守る」発想の原点がこのショア符号です。
まとめ
- ショア符号は9量子ビットで1論理量子ビットを守る
- 位相フリップ符号×ビットフリップ符号の入れ子構造
- X・Z・Yどのエラーでも、単一なら完全訂正できる
- 表面符号など実用符号の発想の原点
もう少し詳しく(背景と理論)
ショア符号は Shor (1995) が示した最初の量子誤り訂正符号で1、9物理量子ビットで1論理量子ビットを守り、任意の単一量子ビット誤り(X・Z・Y、さらに連続的なノイズ)を訂正します。これは量子誤り訂正が原理的に可能だと示した歴史的成果で、続く CSS 符号やスタビライザー符号の理論、そしてしきい値定理(誤り率が一定閾値以下なら誤り訂正で任意に精度を上げられる)へと繋がりました2。ただし9対1という冗長度は大きく、複数同時誤りには無力です。実機では、2次元格子上で局所的な測定だけで動き、比較的高い誤り閾値(約1%)を持つ表面符号が主流になっています3。
次の一歩 🌸
内側のビットフリップ符号、外側の位相フリップ符号、誤り訂正の全体像は誤り訂正入門へどうぞ。
Footnotes
-
Shor, P. W. (1995). "Scheme for reducing decoherence in quantum computer memory." Phys. Rev. A, 52, R2493. 9量子ビット符号。 ↩
-
しきい値定理(Aharonov–Ben-Or, Knill–Laflamme–Zurek ほか, 1990s後半):物理誤り率が閾値未満なら、符号を階層化して論理誤り率を任意に下げられる。フォールトトレラント量子計算の理論的根拠。 ↩
-
Kitaev のトーリック符号に由来する表面符号は、最近接相互作用のみで実装でき閾値が約1%と高いため、超伝導方式などで採用が進む。論理1個あたり数百〜千物理量子ビットを要する。 ↩