2. 量子比特与狄拉克符号

上一节我们建立了“量子比特是二维复向量空间中的单位向量”这一基本认识。本节要把这个认识落到可读、可写、可计算的表示上:先用狄拉克符号把态写清楚,再用 Qiskit 的 Statevector 类把它变成程序里可以构造、可以查看、可以可视化的对象。学完本节,你应当能够看到一个形如 α|0⟩+β|1⟩ 的表达式就说出它的向量形式,也能在 Qiskit 中把任意单量子比特态构造出来并检查其概率分布。

一、态向量的两种写法

单量子比特的纯态写成列向量时是 [α, β]ᵀ,其中 α、β 为复数,且满足归一化条件 |α|²+|β|²=1。计算基的两个基向量分别是 |0⟩ 对应 [1, 0]ᵀ,|1⟩ 对应 [0, 1]ᵀ。任何单比特态都是这两个基向量的线性组合,系数就是概率幅。

狄拉克符号把这套写法压缩成“右矢”形式:|ψ⟩ = α|0⟩ + β|1⟩。这里 |·⟩ 称为 ket,表示一个列向量;与之配对的 ⟨·| 称为 bra,表示该向量的共轭转置,即行向量。bra 与 ket 相接 ⟨φ|ψ⟩ 得到内积(一个复数),ket 与 bra 相接 |ψ⟩⟨φ| 得到外积(一个矩阵)。这套记号的价值在于:它让“态”“内积”“算符作用”在书写上保持统一,而不必每次都展开成矩阵。

需要特别强调一个约定:α 和 β 是概率幅,不是概率。测量时得到 0 的概率是 |α|²,得到 1 的概率是 |β|²。概率幅带相位,而相位在干涉中起作用,这正是量子计算区别于经典概率计算的关键。此外,态向量整体乘以一个全局相位 e^{iγ} 不改变任何可观测结果,因此 |ψ⟩ 与 e^{iγ}|ψ⟩ 描述同一个物理态。

二、狄拉克符号的读写规则

读写时抓住几条规则即可避免出错。第一,ket 在左、bra 在右,⟨φ|ψ⟩ 与 ⟨ψ|φ⟩ 互为共轭复数,顺序不能随意交换。第二,基向量正交归一:⟨0|0⟩=⟨1|1⟩=1,⟨0|1⟩=⟨1|0⟩=0。第三,任意态与自身的内积 ⟨ψ|ψ⟩=1,这就是归一化条件在符号层面的表达。第四,算符 A 作用在 |ψ⟩ 上写作 A|ψ⟩,其共轭转置形式为 ⟨ψ|A†。

把具体态代入可以检验理解:设 |ψ⟩ = (1/√2)|0⟩ + (i/√2)|1⟩,则 α=1/√2,β=i/√2。计算 |α|²=1/2,|β|²=|i|²/2=1/2,和为 1,归一化成立。测量得到 0 和 1 的概率各为 50%,但 β 携带的 i 相位会在后续门操作与干涉中体现出来。若把该态写成列向量,就是 [1/√2, i/√2]ᵀ;其 bra 为行向量 [1/√2, -i/√2],注意虚部取共轭。

记忆口诀:ket 是列、bra 是行,相接是内积、反接是外积;概率看模方,相位看幅角。

三、用 Statevector 构造单量子比特态

Qiskit 的 Statevector 类可以直接用一个复数列表构造态向量,列表顺序对应计算基 |0⟩、|1⟩ 的下标顺序。下面构造前面那个带虚相位的例子,并查看它的基本属性:

import numpy as np
from qiskit.quantum_info import Statevector

psi = Statevector([1/np.sqrt(2), 1j/np.sqrt(2)])
print(psi)                 # 态向量本身
print(psi.dim)             # 维度:2
print(psi.probabilities()) # 概率分布:[0.5, 0.5]
print(psi.probabilities_dict())  # {'0': 0.5, '1': 0.5}

运行后 probabilities() 返回 [0.5, 0.5],与手算一致。probabilities_dict() 用比特串作键,更适合多比特场景。若想直接看概率幅,可以访问 psi.data,得到 [0.7071+0.j, 0.+0.7071j]。注意 Statevector 在构造时会检查归一化,若传入 [1, 1] 这类未归一化向量会抛出异常,这正好帮我们及早发现手算错误。

除了直接给向量,也可以先建一个单比特量子电路,施加门操作后再从电路提取态。例如对 |0⟩ 施加 Hadamard 门,得到 (|0⟩+|1⟩)/√2:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
psi_h = Statevector.from_instruction(qc)
print(psi_h.data)          # [0.7071+0.j, 0.7071+0.j]
print(psi_h.probabilities())  # [0.5, 0.5]

这里 from_instruction 会模拟电路并返回末态,适合验证“门作用后态变成什么”。两种构造方式各有用途:直接给向量适合表达已知解析态,从电路提取适合检查门序列的效果。

四、可视化与结果判读

单比特态最直观的可视化是布洛赫球。调用 psi.draw('bloch') 会返回一个布洛赫球图,态向量指向球面上某一点。对 |0⟩ 指向北极,|1⟩ 指向南极,(|0⟩+|1⟩)/√2 指向赤道上的 +x 方向。布洛赫球的坐标与概率幅的关系是:z 分量等于 |α|²−|β|²,x、y 分量由相对相位决定。因此看到球面上的位置,就能反推概率差与相位差。

若只想快速核对数值,psi.draw('latex') 或 psi.draw('text') 会以公式或文本形式输出态表达式,适合在终端里检查。实际调试时建议组合使用:先用 probabilities() 核对概率,再用布洛赫球核对相位方向,两者都符合预期才算构造正确。

单量子比特态:符号表示 → 向量 → Statevector → 可视化 狄拉克符号 |ψ⟩ = α|0⟩ + β|1⟩ |α|² + |β|² = 1 ket 为列向量,bra 为行向量 ⟨φ|ψ⟩ 内积,|ψ⟩⟨φ| 外积 全局相位 e^{iγ} 不改变物理态 态向量(计算基) |0⟩ = [1, 0]ᵀ |1⟩ = [0, 1]ᵀ |ψ⟩ = [α, β]ᵀ 示例:[1/√2, i/√2]ᵀ 概率:|α|²=0.5,|β|²=0.5 Qiskit Statevector Statevector([1/√2, 1j/√2]) .data → 概率幅 .probabilities() → [0.5,0.5] .draw('bloch') → 球面点 构造时自动检查归一化 布洛赫球:态向量在球面上的位置 |0⟩ 北极 |1⟩ 南极 +x +y z 分量 = |α|² − |β|² x、y 分量由相对相位决定 (|0⟩+|1⟩)/√2 → 赤道 +x 方向 (1/√2)|0⟩+(i/√2)|1⟩ → 赤道 +y 方向 判读顺序:先看 probabilities() 核对概率,再看球面位置核对相位

五、一个完整的核对流程

把上面的内容串成一次可复现的检查。假设我们要验证态 (1/√2)|0⟩ + (i/√2)|1⟩ 是否构造正确,可以按以下顺序操作:第一步,用 Statevector 构造并打印 data,确认两个分量的模都是 0.7071,第二个分量虚部为正;第二步,调用 probabilities(),确认返回 [0.5, 0.5];第三步,调用 draw('bloch'),确认向量落在赤道面上且偏向 +y 方向,而不是 +x 方向——如果落在 +x,说明相位写错了,很可能把 i 漏掉或写成了 −i;第四步,若结果来自电路,用 from_instruction 重新提取一次,排除电路写错的可能。

这个流程中,概率检查负责发现模长错误,布洛赫球检查负责发现相位错误,两者互补。很多初学者只核对概率,结果把 (|0⟩+|1⟩)/√2 和 (|0⟩−|1⟩)/√2 当成同一个态,实际上它们只差一个相对相位,在后续 Hadamard 门作用后会产生完全不同的结果。养成“概率 + 相位”双重核对的习惯,是后续学习量子门与干涉的基础。

常见错误:把 Statevector([1, 1]) 直接传入。该向量模长为 √2,不满足归一化,Qiskit 会报错。正确写法是先除以 √2,或使用 Statevector([1, 1]).normalize() 显式归一化。

小结本节要点:狄拉克符号是态向量的紧凑写法,ket 为列、bra 为行,内积与外积是两种基本组合;概率幅的模方给出测量概率,相位影响干涉;Qiskit 中用 Statevector 直接构造或从电路提取,用 data、probabilities()、draw('bloch') 分别核对幅、概率与相位。掌握这套读写与核对方法,就可以进入下一阶段的门操作学习了。