2. 三量子比特重复码的编码与症状提取电路实现
三量子比特重复码的编码与症状提取电路实现
三量子比特重复码把 1 个逻辑量子比特编码为 3 个物理量子比特,逻辑基态定义为 |0L⟩=|000⟩、|1L⟩=|111⟩。编码电路只需两个 CNOT 门:以数据比特 q0 为控制,分别作用于 q1、q2,即可把 α|0⟩+β|1⟩ 映射为 α|000⟩+β|111⟩。症状提取则通过两个辅助比特分别测量 Z0Z1 与 Z1Z2,得到 2 位症状,用于定位单比特 X 翻转错误。
编码电路的实现与无噪声验证
用 Qiskit 搭建编码电路时,先准备 q0 的任意叠加态,再用两个 CNOT 把信息复制到 q1、q2。无噪声下编码后的态应严格落在 {|000⟩,|111⟩} 张成的编码空间内,可用两个稳定子 Z0Z1、Z1Z2 的期望值均为 +1 来验证。
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit.quantum_info import Statevector, SparsePauliOp
def encode_circuit(theta=0.7):
qc = QuantumCircuit(3)
qc.ry(theta, 0) # 制备 α|0⟩+β|1⟩
qc.cx(0, 1) # CNOT(q0→q1)
qc.cx(0, 2) # CNOT(q0→q2)
return qc
qc = encode_circuit()
sv = Statevector(qc)
print("编码后态:", sv)
# 稳定子期望值验证
for label in ["ZZI", "IZZ"]:
op = SparsePauliOp(label)
print(label, "期望值 =", sv.expectation_value(op).real)
预期输出中两个稳定子期望值都等于 1.0(浮点误差内),说明编码态是 Z0Z1 与 Z1Z2 的共同 +1 本征态,即已进入编码空间。
症状提取电路与映射验证
症状提取用两个辅助比特 a0、a1:a0 依次受 q0、q1 控制做 CNOT 后测量,得到 s0 = Z0Z1 的本征值;a1 受 q1、q2 控制,得到 s1 = Z1Z2。为验证映射关系,在编码后人为注入单比特 X 错误,再运行症状提取,检查测量结果是否与上图映射表一致。
def syndrome_circuit(error_qubit=None):
qc = encode_circuit()
if error_qubit is not None:
qc.x(error_qubit) # 注入 X 翻转
qc.add_register(*[]) # 占位,保持结构清晰
qc_meas = QuantumCircuit(5, 2) # q0..q2 + a0,a1
qc_meas.compose(qc, qubits=[0,1,2], inplace=True)
# a0 测 Z0Z1
qc_meas.cx(0, 3); qc_meas.cx(1, 3)
# a1 测 Z1Z2
qc_meas.cx(1, 4); qc_meas.cx(2, 4)
qc_meas.measure([3, 4], [0, 1])
return qc_meas
sim = AerSimulator()
for err in [None, 0, 1, 2]:
circ = transpile(syndrome_circuit(err), sim)
counts = sim.run(circ, shots=1024).result().get_counts()
print("错误位置:", err, "症状计数:", counts)
无噪声、无错误时,症状应恒为 00;注入 q0 翻转后恒为 10(s0=1,s1=0);q1 翻转为 11;q2 翻转为 01。由于是确定性电路,每种情况 1024 次采样应只出现一个结果键,这正是无噪声一致性验证的判据。
症状比特的位序约定:测量结果字符串按 c1c0 从高到低排列,即
'10' 表示 s1=1、s0=0。若你的后端返回顺序不同,需在解码前统一位序,否则映射表会整体错位。症状提取电路本身必须保证辅助比特初态为 |0⟩ 且测量后不残留纠缠。若在含噪环境中复用辅助比特,需在测量后加复位或重新制备,否则下一次提取的症状会失真。