一个 3量子比特系统 中,计算第1个量子比特(qubit 1) 期望值的完整数学过程。假设这里是一个比较随意的测量矩阵,它既不是标准的泡利矩阵,也不是对角矩阵。
1. 问题设定
系统参数
-
总比特数:n = 3n=3
-
量子比特索引:0, 1, 2(从0开始计数)
-
目标比特:qubit 1
-
自由比特:qubit 0 和 qubit 2
态矢量
三量子比特系统的态矢量有 个分量:
其中 是计算基态,
的二进制表示对应 (qubit2, qubit1, qubit0)。
例如:
-
x=0x=0: |000⟩ = |q₂=0, q₁=0, q₀=0⟩
-
x=1x=1: |001⟩ = |q₂=0, q₁=0, q₀=1⟩
-
x=2x=2: |010⟩ = |q₂=0, q₁=1, q₀=0⟩
-
...
-
x=7x=7: |111⟩ = |q₂=1, q₁=1, q₀=1⟩
测量矩阵(随意但合理)
对于目标比特 qubit 1,测量矩阵是 的。我选一个既非厄米也非幺正的矩阵:
这是一个任意复数矩阵 (非厄米,因为 。
2. 数学推导过程
步骤1:理解可观测量在完整空间的形式
可观测量 在完整 3-qubit 空间是:
这里要注意顺序:通常 cuQuantum 的态矢量存储顺序是 qubit 0 是最低有效位(LSB)。所以完整系统的基态顺序是:
因此,当 qubit 1 是目标比特时,算符应为:
更准确地说,张量积顺序与比特位置有关。
实际计算期望值时,我们不需要显式构造 8×8 矩阵,而是用部分迹的方法。
步骤2:态矢量的重新索引
将 3-bit 索引 按二进制展开:
-
目标比特:
(qubit 1 的值)
-
自由比特:
(qubit 2 和 qubit 0 的组合)
态矢量分量可写为:
其中:
-
当
:qubit 1 为 0
-
当
:qubit 1 为 1
-
编码了 qubit 2 和 qubit 0 的状态
索引映射表:
| x(十进制) | 二进制 (b₂b₁b₀) | α (b₁) | γ (b₂b₀) | ψ 分量 |
|---|---|---|---|---|
| 0 | 000 | 0 | 0 (00) | ψ₀ = ψ₀₀ |
| 1 | 001 | 0 | 1 (01) | ψ₁ = ψ₀₁ |
| 2 | 010 | 1 | 0 (00) | ψ₂ = ψ₁₀ |
| 3 | 011 | 1 | 1 (01) | ψ₃ = ψ₁₁ |
| 4 | 100 | 0 | 2 (10) | ψ₄ = ψ₀₂ |
| 5 | 101 | 0 | 3 (11) | ψ₅ = ψ₀₃ |
| 6 | 110 | 1 | 2 (10) | ψ₆ = ψ₁₂ |
| 7 | 111 | 1 | 3 (11) | ψ₇ = ψ₁₃ |
这里 表示:目标比特值为
,自由比特组合为
时的振幅。
步骤3:计算约化密度矩阵(部分内积矩阵 S)
对于目标子系统(qubit 1),其约化密度矩阵的矩阵元为:
这是一个 2×2 矩阵 ,其中:
注意 :,所以
是厄米矩阵。
步骤4:展开每个 S 元素的具体计算
用原始 ψ 分量表示:
S₀₀ (α=0, β=0):
对应:
S₀₁ (α=0, β=1):
对应:
S₁₀ (α=1, β=0):
对应:
S₁₁ (α=1, β=1):
对应:
步骤5:计算期望值
期望值公式:
注意是 而不是
,因为:
展开计算:
代入我们的矩阵 :
所以:
步骤6:数值示例
假设一个具体的态矢量(归一化):
即所有分量均为 。
那么:
计算 S 矩阵:
期望值:
结果 :
3. 物理意义分析
(1) 为什么结果是复数?
因为矩阵 MM 不是厄米矩阵。在量子力学中,可观测量的期望值必须是实数,因为它是测量结果的统计平均值。如果我们得到的期望值是复数,说明:
-
要么我们的矩阵 MM 不是合法的可观测量
-
要么计算有误(但数学上我们确实可以计算任意矩阵的期望值)
实际上,我们可以将任意矩阵分解为厄米部分和反厄米部分:
其中:
那么:
-
是实数
-
是纯虚数
在我们的例子中:
计算得到 (实数),
(纯虚数)。
(2) 与张量积结构的一致性
我们的计算等价于:
由于单位算符 和
作用在 qubit 2 和 qubit 0 上,我们实际上是对这两个比特求偏迹 ,只剩下 qubit 1 的约化密度矩阵,然后计算
。
(3) 归一化检查
态矢量归一化要求:
这等价于:
在我们的数值例子中:0.5 + 0.5 = 1,正确。
4. cuQuantum 内部实现的关键点
在实际的 custatevecComputeExpectation 调用中:
API 调用
cpp
custatevecComputeExpectation(
handle,
sv, // ψ 向量(8个复数)
CUDA_C_64F, // 双精度复数
3, // nIndexBits = 3
&expect, // 输出期望值
CUDA_C_64F, // 期望值数据类型
NULL, // residualNorm
matrix, // 2×2 矩阵 M
CUDA_C_64F, // 矩阵数据类型
layout, // 矩阵布局(如行优先)
basisBits, // [1]
1, // nBasisBits = 1
computeType, // 计算精度
NULL, 0 // 无额外工作空间
);
GPU 内核执行步骤
-
分配线程:使用少量线程(因为计算量小)
-
并行计算 S 的四个元素:
-
线程0:计算 S₀₀ = ψ₀ψ₀ + ψ₁ ψ₁ + ψ₄ψ₄ + ψ₅ψ₅
-
线程1:计算 S₀₁ = ψ₀ψ₂ + ψ₁ ψ₃ + ψ₄ψ₆ + ψ₅ψ₇
-
线程2:计算 S₁₀ = ψ₂ψ₀ + ψ₃ ψ₁ + ψ₆ψ₄ + ψ₇ψ₅
-
线程3:计算 S₁₁ = ψ₂ψ₂ + ψ₃ ψ₃ + ψ₆ψ₆ + ψ₇ψ₇
-
-
同步线程,确保所有 S 元素计算完成
-
计算期望值:
cppexpect = M[0][0]*S[0][0] + M[0][1]*S[1][0] + M[1][0]*S[0][1] + M[1][1]*S[1][1] -
返回结果
内存访问模式
对于每个 S 元素的计算,需要访问的 ψ 分量:
-
S₀₀: 访问 ψ₀, ψ₁, ψ₄, ψ₅(这些是 qubit 1 = 0 的分量)
-
S₀₁: 访问 ψ₀, ψ₁, ψ₄, ψ₅(qubit1=0)和 ψ₂, ψ₃, ψ₆, ψ₇(qubit1=1)
注意 ψ 在内存中是连续存储的:ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅, ψ₆, ψ₇。
计算 S₀₀ 和 S₁₁ 时,访问是非连续的(每隔一个元素),这会影响 GPU 内存合并访问的效率。但对于这么小的问题,影响不大。
5. 推广到一般情况
对于 n 量子比特系统,计算单个目标比特的期望值:
-
确定目标比特位置 k
-
将索引 x 分解 为:
-
其中 α 是目标比特值(0或1)
-
a 是高位部分,b 是低位部分
-
-
定义自由索引 :
,有
种可能
-
计算:
-
期望值 :
总结
这个 3-qubit 单比特期望值计算的数学过程展示了:
-
索引分解:将全局索引分解为目标比特和自由比特部分
-
部分内积矩阵:通过对自由比特求和,得到目标子系统的 2×2 矩阵 S
-
矩阵收缩:用测量矩阵 M 与 S 收缩得到期望值
-
复数结果的意义:当 M 非厄米时,期望值可能是复数,其实部对应 M 的厄米部分的期望值,虚部对应反厄米部分
这个计算是 cuQuantum 中更复杂期望值计算的基础模块。对于多目标比特的情况,原理相同,只是 S 矩阵的维度从 2×2 变为 ,其中 m 是目标比特数。