4. Qiskit 线路可视化与结果解读

线路图与直方图:从“画出来”到“读得懂”

本节的任务是给出一条已经写好的线路,用 circuit.draw() 输出可读的线路图,用 plot_histogram() 输出测量统计直方图,然后依据这两份图判断门序列与统计结果是否符合预期。可视化不是装饰,它是核对“我写的线路”和“我以为的线路”是否一致的第一道检查。

先构造一条用于判读的示例线路:3 个量子比特,先对 q0 施加 H 制造叠加,再用 q0 控制 q1 做 CX 形成纠缠,随后对 q2 施加 X 翻转,最后对 q1 施加一个受控于 q2 的 CX,全部测量。这条线路的门序列有明确的预期:q2 恒为 1,q0 与 q1 在测量后应呈现相关分布。

from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram

qc = QuantumCircuit(3, 3)
qc.h(0)          # q0 叠加
qc.cx(0, 1)      # q0 控制 q1,形成纠缠
qc.x(2)          # q2 翻转到 |1>
qc.cx(2, 1)      # q2 控制 q1,再翻转 q1
qc.measure([0, 1, 2], [0, 1, 2])

print(qc.draw(output="text"))   # 文本线路图,便于逐列核对

draw(output="text") 输出的是按时间列排列的门序列,每一列代表一个时刻,纵向是量子比特线。判读时按列从左到右读:第 1 列只有 q0 上的 H;第 2 列是 q0→q1 的 CX;第 3 列是 q2 上的 X;第 4 列是 q2→q1 的 CX;最后一列是三条测量线。如果某一列出现了意料之外的门,或者控制位与被控位方向反了,线路图会立刻暴露出来——这正是它比直接看代码更可靠的地方。若需要更直观的图形,可改用 qc.draw(output="mpl") 得到带颜色的门框图,但文本图在终端和日志中更稳定。

线路门序列(按时间列从左到右) q0 q1 q2 H X M M M ① ② ③ ④ ⑤ 测量统计(预期分布) ≈50% 011 ≈50% 101 其余 ≈0

上图把两件事放在一起对照:上半部分是门序列的列结构,下半部分是该线路在理想情况下应出现的测量分布。判读直方图时,先看有哪些比特串出现,再看它们的相对高度。本例中 q2 被 X 翻到 |1>,且后续 CX 以 q2 为控制位,因此 q2 的测量结果恒为 1;q0 处于叠加态,q1 被 q0 与 q2 两次翻转,最终只有 011 和 101 两种结果,各占约一半,其余比特串应接近 0。若直方图里出现了 001 或 111 这类 q2 为 0 的串,说明 X 门位置或控制方向有问题;若只出现单一比特串,说明 H 门缺失或叠加被破坏。

实际执行时用 Aer 模拟器采样,并把统计结果与预期对照:

sim = AerSimulator()
tqc = transpile(qc, sim)
result = sim.run(tqc, shots=4096).result()
counts = result.get_counts()

print(counts)
# 预期形如 {'011': ~2048, '101': ~2048},允许统计涨落
fig = plot_histogram(counts)
fig.savefig("hist.png")   # 保存直方图,便于与线路图并排归档

判读时把握三条准则。第一,比特串顺序:Qiskit 的计数键按 qn-1…q0 排列,最右位是 q0,读图前先确认顺序,否则会把 011 误读成 q0=0、q1=1、q2=1 之外的组合。第二,只允许预期比特串出现:本例只允许 011 与 101,出现其他键即为门序列错误。第三,比例而非绝对值:4096 次采样下两串各约 2048,偏差在统计涨落范围内属正常;若明显偏向一侧,应检查 H 门是否作用在正确的比特上。

把 qc.draw(output="text") 的输出和 counts 一起贴进实验记录,形成“线路图—直方图—预期分布”三件套。后续修改线路时,先比对线路图的门列是否变化,再比对直方图的键集合是否仍落在预期内,能快速定位是“写错了门”还是“只是统计涨落”。
不要用 plot_histogram 的默认排序直接下结论。默认按计数降序排列,若某个错误比特串偶然计数偏高会排到前面,容易误判。判读时应先列出全部键,再逐一核对是否属于预期集合,而不是只看最左边那根柱子。