
位相フリップ符号をQiskitで実装する|もう一つの誤りを訂正する
2026-08-22 ・ 実践
ビットフリップ符号はXエラー(ビット反転)を直せましたが、量子にはもう一種類、位相反転(Zエラー) があります。この記事ではそれを訂正する 位相フリップ符号 をQiskitで実装します。ポイントは「アダマール基底に移すと、位相反転がビット反転に化ける」こと。同じ理屈が使い回せます。
発想:基底を変えれば同じ問題
Zエラー(位相反転)は、アダマールで基底を変えると Xエラー(ビット反転)に変わります。だからビットフリップ符号を H で挟むだけで位相フリップ符号になります。
Hで挟んで同じ理屈に
H変換
位相→ビット反転へ
符号化
3個に広げる
訂正
多数決で戻す
準備
pip install qiskit qiskit-aer
① 符号化:Hで挟む
守りたいビットを3個に広げ、各ビットをアダマールでX基底へ移します。
from qiskit import QuantumCircuit
qc = QuantumCircuit(5, 2) # データ3 + シンドローム2
qc.x(0) # テスト用に |1⟩
qc.cx(0, 1); qc.cx(0, 2) # 3個に広げる
qc.h([0, 1, 2]) # X基底へ(ここが位相フリップ用)
qc.barrier()
② 位相反転エラーを注入
Zエラーを1個のビットに起こします。
qc.z(1) # q1 に位相反転エラー
qc.barrier()
③ 基底を戻してシンドローム測定
Hで元の基底に戻すと、Zエラーがビット反転として現れるので、ビットフリップ符号と同じパリティ測定で位置を特定できます。
qc.h([0, 1, 2]) # 基底を戻す(Zエラー→Xエラーとして見える)
qc.cx(0, 3); qc.cx(1, 3) # パリティ (q0,q1)
qc.cx(1, 4); qc.cx(2, 4) # パリティ (q1,q2)
qc.measure(3, 0); qc.measure(4, 1)
from qiskit_aer import AerSimulator
print(AerSimulator().run(qc, shots=1000).result().get_counts())
結果は {'11': 1000}。シンドローム11=q1が反転と正しく特定できました。ビットフリップ符号とまったく同じ読み方です。
両方直すのがショア符号
ビットフリップ符号(Xエラー用)と位相フリップ符号(Zエラー用)を入れ子に組み合わせると、両方のエラーを同時に直せる9量子ビットのショア符号になります。実機の表面符号もこの発想の延長です。
まとめ
- 位相反転(Zエラー)は量子だけに存在する誤り
- アダマールで基底を変えるとZエラーはXエラーに化ける
- だからビットフリップ符号をHで挟むだけで位相フリップ符号になる
- 両方を組み合わせると9量子ビットのショア符号
もう少し詳しく(背景と理論)
位相フリップ符号は、アダマール変換が X と Z を入れ替える(HXH=Z, HZH=X)という性質を使い、Z エラーの問題をビットフリップ符号の X エラーの問題へ写して解きます1。量子の誤りは連続的にも見えますが、任意の1量子ビット誤りは恒等・X・Y・Z のパウリ基底に展開でき、X と Z を訂正できれば Y=iXZ も自動的に扱えます——これが誤りの離散化という量子誤り訂正の基本定理です2。ビットフリップ(X用)と位相フリップ(Z用)を入れ子にすると、任意の単一誤りを訂正するショア符号になります。
次の一歩 🌸
Xエラー版はビットフリップ符号、誤り訂正の全体像は誤り訂正入門、基底を変えるゲートは量子ゲート入門へどうぞ。