Qiskit中制备ψ=1/√2(|011⟩−|100⟩)状态出错的问题排查
问题根源:Qiskit的比特顺序(小端序)
你的问题完全是因为Qiskit采用小端序的态标签规则,和你计算时默认的大端序不匹配,既不是计算错误也不是噪声问题。
比特顺序的核心差异
- 你手动计算时,把qubit 0当成了态标签的最高位(最左侧),比如
|011⟩代表q0=0、q1=1、q2=1; - 但Qiskit里,qubit 0是态标签的最低位(最右侧),态标签格式为
|q2 q1 q0⟩——也就是说,你理解的|011⟩对应Qiskit里的|110⟩,你要的|100⟩对应Qiskit里的|001⟩。
按Qiskit规则重新计算你的电路
初始化态是|000⟩(Qiskit:q2=0、q1=0、q0=0):
- 对q0加H门:
H|000⟩ = (|000⟩ + |001⟩)/√2(Qiskit里|001⟩是q0=1,其余为0) - 对q1加X门:
X(|000⟩ + |001⟩)/√2 = (|010⟩ + |011⟩)/√2 - q0控q1的CNOT:
- q0=0时,q1不变,保留
|010⟩; - q0=1时,翻转q1,
|011⟩变成|001⟩;
结果:(|010⟩ + |001⟩)/√2
- q0=0时,q1不变,保留
- q1控q2的CNOT:
- q1=1时,翻转q2,
|010⟩变成|110⟩; - q1=0时,q2不变,保留
|001⟩;
结果:(|110⟩ + |001⟩)/√2
- q1=1时,翻转q2,
- 对q0加Z门:
- Z门只对q0=1的态取反,
|001⟩变成-|001⟩;
最终态:(|110⟩ - |001⟩)/√2
- Z门只对q0=1的态取反,
这个态和你测量到的(|001⟩ - |110⟩)/√2仅差一个全局相位,量子力学里全局相位无法观测,所以两者是等价的——也就是说,你的电路其实已经正确生成了你要的态,只是态标签的顺序和你预期的相反。
匹配预期显示的方案
如果想让测量结果的标签和你手动计算的一致,可以:
- 测量后反转比特顺序:比如把得到的结果字符串反转,
"001"变成"100","110"变成"011"; - 或者重新设计电路时,把你原本的“高位qubit”对应到Qiskit的高编号qubit(比如把你计算里的q0换成Qiskit的q2)。
验证态矢量的代码
你可以直接打印态矢量确认:
from qiskit.quantum_info import Statevector qc = QuantumCircuit(3) qc.h(0) qc.x(1) qc.cx(0,1) qc.cx(1,2) qc.z(0) state = Statevector(qc) print(state)
输出会明确显示|110⟩的振幅是1/√2,|001⟩的振幅是-1/√2,和你要的态(比特反转后)完全一致。
内容的提问来源于stack exchange,提问作者SARA_1729
相关产品推荐
相关产品推荐

