2. 用 Qiskit 实现并验证贝尔态制备
贝尔态的目标形式与线路结构
贝尔态是两量子比特最大纠缠态,四个正交基之一为 |Φ⁺⟩ = (|00⟩ + |11⟩)/√2。本例只制备并验证这一个态。线路结构非常短:q0 先过 H 门产生 (|0⟩+|1⟩)/√2,再以 q0 为控制、q1 为目标施加 CNOT,使 |10⟩ 分支翻转为 |11⟩,从而得到两个振幅均为 1/√2 的 |00⟩ 与 |11⟩。
验证分两条独立路径:Statevector 路径直接读取理想模拟器的复振幅,检查非零分量位置与幅度;测量采样路径在两条比特上加 measure,用 shots 采样统计频率,检查是否只出现 00 与 11 且接近各半。两条路径互为交叉验证:前者确认态本身正确,后者确认测量行为与理论概率一致。
用 Qiskit 构建线路并读取 Statevector
下面代码自包含,可直接运行。先构建不含测量的线路用于 Statevector 验证,再复制一份加测量用于采样。注意 Statevector 必须作用于未测量的线路,否则会报错。
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
import numpy as np
# 1. 构建贝尔态线路(不含测量)
qc = QuantumCircuit(2)
qc.h(0) # q0 进入叠加态
qc.cx(0, 1) # 以 q0 控制翻转 q1
# 2. Statevector 验证
sv = Statevector.from_instruction(qc)
print("振幅向量:", np.round(sv.data, 4))
print("概率分布:", np.round(sv.probabilities_dict(), 4))
# 3. 断言式检查
expected = {('00'): 0.5, ('11'): 0.5}
probs = sv.probabilities_dict()
assert abs(probs.get('00', 0) - 0.5) < 1e-9
assert abs(probs.get('11', 0) - 0.5) < 1e-9
assert abs(probs.get('01', 0)) < 1e-9
assert abs(probs.get('10', 0)) < 1e-9
print("Statevector 验证通过:贝尔态 |Φ⁺⟩ 制备正确")
预期输出中振幅向量为 [0.7071, 0, 0, 0.7071],对应基序 |00⟩、|01⟩、|10⟩、|11⟩。若出现 |01⟩ 或 |10⟩ 非零,说明 CNOT 控制/目标接反或 H 门位置错误。
测量采样验证与理论概率对比
采样路径需要把测量加入线路。使用 qiskit-aer 的 AerSimulator 执行,shots 取 1024。由于是理想模拟器,01 与 10 的计数应为 0;00 与 11 的计数在 512 附近波动,这是有限采样的统计涨落,不是线路错误。
from qiskit import transpile
from qiskit_aer import AerSimulator
# 复制线路并加测量
qc_meas = qc.copy()
qc_meas.measure_all()
sim = AerSimulator()
tqc = transpile(qc_meas, sim)
result = sim.run(tqc, shots=1024).result()
counts = result.get_counts()
print("采样计数:", counts)
# 与理论概率对比
total = sum(counts.values())
for state in ['00', '11', '01', '10']:
freq = counts.get(state, 0) / total
print(f"{state}: 实测频率={freq:.4f}, 理论概率={0.5 if state in ('00','11') else 0.0}")
判读要点:00 与 11 的频率之和应等于 1(理想模拟下无其它态),两者各自偏离 0.5 的幅度通常在 ±0.03 以内(1024 shots 的典型涨落量级)。若 01 或 10 出现非零计数,优先检查 CNOT 的 cx(0,1) 参数顺序是否写反。
两种验证方式的对照
| 对比项 | Statevector 路径 | 测量采样路径 |
|---|---|---|
| 输入线路 | 不含 measure | 含 measure_all |
| 输出对象 | 复振幅向量 | counts 字典 |
| 能验证什么 | 态本身、相位、纠缠结构 | 测量统计、概率分布 |
| 不能验证什么 | 测量行为 | 相位信息(测量后丢失) |
| 判据 | 非零分量位置与幅度 | 仅两态出现且频率均衡 |
两条路径结合使用才能完整确认贝尔态制备正确:Statevector 确认振幅与相位,采样确认测量结果分布符合理论。单独看采样无法排除相位错误(例如把 H 换成 Z 后采样分布可能仍看似合理),单独看 Statevector 则无法确认测量映射是否正确。