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

ビットフリップ符号を実装する|誤り訂正をQiskitで体感する

2026-08-13実践

#Qiskit#誤り訂正#ビットフリップ符号#Python#実践

誤り訂正入門で「多数の物理量子ビットで1個の論理量子ビットを守る」と説明しました。この記事はその最小の実装。3個の物理量子ビットで1個を守る「ビットフリップ符号」をQiskitで組み、わざとエラーを起こして直すところまでやります。誤り訂正の心臓部が、手を動かすとよくわかります。

アイデア: 3個にコピーして多数決

古典の通信でも使う発想です。1ビットを送る代わりに3回送り、受け取った側が多数決を取れば、途中で1個ビットが化けても正しく復元できます。量子版もこれに似ています。

ビットフリップ符号の流れ

📋

符号化

1個を3個に広げる

💥

エラー発生

1個がX反転

🔍

シンドローム測定

どこが化けたか特定

🔧

訂正

その1個を戻す

⚠️

量子ならではの制約

量子では状態を勝手にコピーできません(複製不可定理)。だから「値をコピー」ではなく、CNOTでもつれさせて広げるのがミソ。しかも中身を測ると壊れるので、「情報を壊さずにエラー位置だけを知る」工夫(シンドローム測定)が必要になります。

準備

pip install qiskit qiskit-aer

① 符号化: 1個を3個に広げる

守りたい量子ビットq0を、q1・q2とCNOTでもつれさせます。これで α|0⟩+β|1⟩α|000⟩+β|111⟩ に広がります。

from qiskit import QuantumCircuit

# データ3 + シンドローム用の補助2 = 5量子ビット、古典ビットは測定用
qc = QuantumCircuit(5, 2)

# (任意の状態を作りたければここでq0にゲートをかける。今回は|1⟩で試す)
qc.x(0)

# 符号化: q0 を q1,q2 へ広げる
qc.cx(0, 1)
qc.cx(0, 2)
qc.barrier()

② わざとエラーを起こす

1番目の量子ビット(q1)にXエラー(ビット反転)を注入します。実機なら自然に起きるノイズを、ここでは手で起こします。

qc.x(1)          # q1 にビット反転エラー
qc.barrier()

③ シンドローム測定: どこが化けたかだけを知る

データを直接測ると状態が壊れます。そこで補助量子ビット(q3, q4)にパリティ情報だけを集めて、そちらを測ります。

  • q3 = q0とq1が一致しているか(CNOT2回)
  • q4 = q1とq2が一致しているか
# q3 に (q0,q1) のパリティ
qc.cx(0, 3)
qc.cx(1, 3)
# q4 に (q1,q2) のパリティ
qc.cx(1, 4)
qc.cx(2, 4)
qc.barrier()

qc.measure(3, 0)   # シンドロームビット0
qc.measure(4, 1)   # シンドロームビット1

シンドロームの読み方は次の通り。データ本体は測っていないのがポイントです。

q4 q3意味
00エラーなし
01q0が反転
11q1が反転
10q2が反転

④ 実行してエラー位置を確認

from qiskit_aer import AerSimulator

result = AerSimulator().run(qc, shots=1000).result()
print(result.get_counts())

結果は {'11': 1000}(Qiskit表記で q4 q3 = 1 1)。表の通り**「q1が反転した」と正しく特定**できました。データの中身(α, β)を一切覗かずに、エラーの場所だけを突き止められたわけです。

🌱

訂正はこの後

位置がわかれば、あとは該当ビットにもう一度Xをかければ元通り。実機ではこの判定と訂正を高速に自動で回します。今回のようにq1が犯人なら qc.x(1) を足せば復元完了です。エラー注入の行を qc.x(2) に変えて、シンドロームが 10 に変わることも確かめてみてください。

これは"半分"の誤り訂正

ビットフリップ符号はX(ビット反転)エラーしか直せません。量子にはもう一種類、位相反転(Zエラー) があります。両方に対応するには、ビットフリップ符号と位相フリップ符号を組み合わせた9量子ビットのショア符号や、実機で主流の表面符号へと発展します。「1個の論理量子ビットに数百〜千個の物理量子ビット」という話の入口が、これで体感できたはずです。

まとめ

  • ビットフリップ符号=3個に広げて多数決で1個を守る最小の誤り訂正
  • 量子はコピーできないのでCNOTでもつれさせて符号化する
  • シンドローム測定で「中身を壊さずエラー位置だけ」を知る
  • Xエラー専用。Zエラーも直すにはショア符号・表面符号へ

もう少し詳しく(背景と理論)

3量子ビットのビットフリップ符号は、量子誤り訂正の最小例です。古典の反復符号(多数決)に似ていますが、量子では複製不可定理のため状態をコピーできないので、CNOTで「もつれさせて広げる」点が本質的に異なります1。もう一つの鍵はシンドローム測定——データを直接測ると状態が壊れるため、補助量子ビットにパリティ(安定化演算子 Z₀Z₁, Z₁Z₂ の固有値)だけを写して測る、というスタビライザー形式の考え方です2。この符号は X(ビット反転)専用で、Z(位相反転)は直せません。両方に対応するには位相フリップ符号と組み合わせたショア符号が必要です3

次の一歩 🌸

誤り訂正の全体像は誤り訂正入門、そもそも量子ビットがなぜ弱いかは量子ビット超入門へどうぞ。

Footnotes

  1. Wootters & Zurek (1982)。未知状態は複製できないため、古典的な「同じビットを3回コピー」はできない。代わりに CNOT で α|000⟩+β|111⟩ という「広げた」状態を作る。

  2. Gottesman (1997) のスタビライザー形式。符号空間は安定化演算子(ここでは Z₀Z₁, Z₁Z₂)の +1 固有空間として定義され、シンドロームはこれらの測定値。データの論理情報を壊さずに誤り位置を知れる。

  3. Shor (1995) の9量子ビット符号は、ビットフリップ符号と位相フリップ符号を入れ子にして X・Z(および Y)を訂正する最初の量子誤り訂正符号。

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

あわせて読みたい