手を上げるキュビットくんゆるふわ量子コンピュータ
すまし顔のキュビットくん

ショア符号(9量子ビット)をQiskitで実装|XもZも同時に訂正する

2026-08-31実践

#Qiskit#ショア符号#誤り訂正#Python#実践

ビットフリップ符号は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

  1. Shor, P. W. (1995). "Scheme for reducing decoherence in quantum computer memory." Phys. Rev. A, 52, R2493. 9量子ビット符号。

  2. しきい値定理(Aharonov–Ben-Or, Knill–Laflamme–Zurek ほか, 1990s後半):物理誤り率が閾値未満なら、符号を階層化して論理誤り率を任意に下げられる。フォールトトレラント量子計算の理論的根拠。

  3. Kitaev のトーリック符号に由来する表面符号は、最近接相互作用のみで実装でき閾値が約1%と高いため、超伝導方式などで採用が進む。論理1個あたり数百〜千物理量子ビットを要する。

🔥 この分野の最新トレンドをチェック →

あわせて読みたい