2. 用 Qiskit 实现并验证贝尔态制备

贝尔态的目标形式与线路结构

贝尔态是两量子比特最大纠缠态,四个正交基之一为 |Φ⁺⟩ = (|00⟩ + |11⟩)/√2。本例只制备并验证这一个态。线路结构非常短:q0 先过 H 门产生 (|0⟩+|1⟩)/√2,再以 q0 为控制、q1 为目标施加 CNOT,使 |10⟩ 分支翻转为 |11⟩,从而得到两个振幅均为 1/√2 的 |00⟩ 与 |11⟩。

验证分两条独立路径:Statevector 路径直接读取理想模拟器的复振幅,检查非零分量位置与幅度;测量采样路径在两条比特上加 measure,用 shots 采样统计频率,检查是否只出现 00 与 11 且接近各半。两条路径互为交叉验证:前者确认态本身正确,后者确认测量行为与理论概率一致。

制备线路:H(q0) → CNOT(q0,q1) q0 q1 H M M 经典比特 c0 经典比特 c1 路径 A:Statevector 理想模拟 Statevector.from_instruction(qc) 读取复振幅向量,检查非零分量 期望:|00⟩ 与 |11⟩ 各约 0.7071 |01⟩、|10⟩ 幅度应接近 0 判据:幅度平方和 ≈ 1,相位一致 路径 B:测量采样统计 qasm 模拟器 + shots=1024 统计 counts 中 00 与 11 的频次 期望:各约 512 次,比例接近 1:1 01、10 计数应为 0(理想模拟) 判据:仅两态出现且频率均衡

用 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) 参数顺序是否写反。

若想观察真实硬件上的噪声影响,可把后端换成含噪声的模拟器或真实设备,此时 01/10 会出现少量计数,00 与 11 的比例也会偏离 1:1。这属于噪声效应,与线路逻辑错误要区分开:逻辑错误表现为系统性偏差(如某态恒为 0),噪声表现为随机散布。

两种验证方式的对照

对比项Statevector 路径测量采样路径
输入线路不含 measure含 measure_all
输出对象复振幅向量counts 字典
能验证什么态本身、相位、纠缠结构测量统计、概率分布
不能验证什么测量行为相位信息(测量后丢失)
判据非零分量位置与幅度仅两态出现且频率均衡

两条路径结合使用才能完整确认贝尔态制备正确:Statevector 确认振幅与相位,采样确认测量结果分布符合理论。单独看采样无法排除相位错误(例如把 H 换成 Z 后采样分布可能仍看似合理),单独看 Statevector 则无法确认测量映射是否正确。