# 多比特与张量积 · 两个 qubit 的状态空间

> 多个 qubit 的状态，用张量积拼成一个 2ⁿ 维的向量。这一章讲清张量积怎么算、n 个 qubit 为什么装下 2ⁿ 个振幅，以及 Qiskit 那个让无数人读错状态的 qubit 排序（小端序）——用代码一次说清。

- 作者：David（道雾轩）
- 专栏：写给程序员的量子计算（https://daiw.org/manual/quantum-computing.md）
- 最后更新：2026-07-14
- 原文：https://daiw.org/manual/quantum-computing/multi-qubit
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 多比特与张量积 · 两个 qubit 的状态空间

单个 qubit 的把戏再花哨，也谈不上「算力」。真正的量子计算要多个 qubit 协同。这一章讲清：多个 qubit 的状态怎么表示，以及一个害人无数的实操陷阱——Qiskit 的 qubit 排序。

## 张量积：把 qubit 拼起来

两个 qubit 的联合状态，用**张量积（tensor product，记号 $\otimes$）** 把各自的状态「拼」起来。四个基础态：

$$
\ket{00},\ \ket{01},\ \ket{10},\ \ket{11}
$$

比如两个都是 $\ket{0}$ 的 qubit，联合态是 $\ket{0}\otimes\ket{0} = \ket{00}$。张量积具体怎么算？把左边向量的每个分量，乘上整个右边向量：

$$
\ket{0}\otimes\ket{0} = \begin{bmatrix}1\\0\end{bmatrix}\otimes\begin{bmatrix}1\\0\end{bmatrix} = \begin{bmatrix}1\cdot\begin{bmatrix}1\\0\end{bmatrix}\\[4pt] 0\cdot\begin{bmatrix}1\\0\end{bmatrix}\end{bmatrix} = \begin{bmatrix}1\\0\\0\\0\end{bmatrix}
$$

所以两个 qubit 的状态是一个 **4 维**向量，四个分量正是 $\ket{00},\ket{01},\ket{10},\ket{11}$ 的振幅。推广开：

$$
n \text{ 个 qubit } \Rightarrow 2^n \text{ 维状态向量}
$$

这正是[前面](https://daiw.org/manual/quantum-computing/qubit)说的「$2^n$ 个振幅」的由来——多 qubit 系统的状态空间，随 qubit 数**指数膨胀**。

## 一个「各自独立」的例子

给两个 qubit 各做各的：qubit 0 过 H（叠加），qubit 1 过 X（翻成 1），打印联合状态：

```python
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector

qc = QuantumCircuit(2)
qc.h(0)      # qubit 0 → 叠加
qc.x(1)      # qubit 1 → |1⟩
print(Statevector(qc).draw('latex_source'))
```

它的联合态是各自状态的张量积 $\ket{1}_{q_1}\otimes\ket{+}_{q_0} = \tfrac{1}{\sqrt2}(\ket{10} + \ket{11})$。像这样**能拆成「各 qubit 状态的张量积」的状态，叫可分离态(product state)**——两个 qubit 各过各的、互不牵扯。**不是所有多比特态都能这么拆**，拆不开的那种，就是下一章的主角：纠缠。

## 陷阱：Qiskit 的 qubit 排序是「反」的

这是新手最常栽的坑，务必说清：

<Callout type="warn">
  **Qiskit 用「小端序」：qubit 0 是最低位，写在二进制串的最右边。** 也就是说，一个状态标成 $\ket{q_2 q_1 q_0}$——**qubit 0 在最右**，和你从左往右数的直觉相反。

  举个会让你怀疑人生的例子：一个 2-qubit 线路，只对 **qubit 0** 施加 X：

  ```python
  qc = QuantumCircuit(2)
  qc.x(0)                       # 只翻转 qubit 0
  print(Statevector(qc))
  # Statevector([0, 1, 0, 0])   → 是 |01⟩,不是 |10⟩!
  ```

  翻转的是 qubit 0，得到的状态串却是 `01`（因为 q0 在右边、变成了 1，q1 在左边、还是 0）。**测量结果 `get_counts()` 的比特串同理，也是右边对应 qubit 0。** 无数人在这里把状态读反、以为程序错了。记死这条：**Qiskit 里，比特串最右边那位 = qubit 0。**
</Callout>

## 门作用在其中一个 qubit 上

一个单比特门只作用在某个 qubit 上时，数学上是它和其余 qubit 的**单位矩阵**做张量积。比如对 2-qubit 系统的 qubit 0 施加 $H$，整体作用的其实是 $I \otimes H$（$q_1$ 不动、$q_0$ 过 H）。你写 `qc.h(0)` 时，Qiskit 自动帮你把它扩展成正确维度的大矩阵——**你只管说「对哪个 qubit 做什么」，张量积的脏活框架包了。**

<Callout type="info">
  这也顺带解释了量子计算「指数状态、多项式操作」的妙处：状态空间是 $2^n$ 维（指数大），但你施加的门大多只碰一两个 qubit，**写起来是常数级的操作**（`qc.h(0)`、`qc.cx(0,1)`），框架用张量积把它作用到整个 $2^n$ 维空间上。**你用少量的门，就搅动了指数大的状态**——这正是量子并行性的形式来源（但别忘了[测量](https://daiw.org/manual/quantum-computing/measurement)那关：你最终只能采样出一个结果）。
</Callout>

## 小结与下一章

多个 qubit 的状态用张量积拼成 $2^n$ 维向量；能拆成各 qubit 张量积的叫可分离态。实操上牢记 Qiskit 的**小端序**：比特串最右 = qubit 0，否则状态和结果全读反。单比特门作用在某 qubit 上，等价于和其余 qubit 的单位阵做张量积，框架自动处理。

铺垫到位了。下一章进入量子计算最令人着迷、也最被误解的现象——**纠缠**：我们用一个 CNOT 门，造出一个**拆不开**的两 qubit 态（Bell 态），测一个就能瞬间确定另一个。👉 [纠缠：用 CNOT 造一个 Bell 态](https://daiw.org/manual/quantum-computing/entanglement)。

## 参考文献

- [1] Qiskit 官方文档.「Bit-ordering in Qiskit.」https://docs.quantum.ibm.com/guides/bit-ordering —— 小端序的官方说明。
- [2] Nielsen & Chuang.《Quantum Computation and Quantum Information》， §1.2 —— 张量积与多比特态。
- [3] Michael Nielsen.「Quantum Computing for the Very Curious.」https://quantum.country —— 多 qubit 状态直觉。
