QPanda3
Supported by OriginQ
载入中...
搜索中...
未找到
密度矩阵


上一章: 变分量子线路

下一章: 态矢量


简介

密度矩阵是量子力学中的一个重要概念,用于描述量子系统的状态,特别是在系统与环境发生相互作用的情况下。以下是密度矩阵在量子领域的详细介绍:

密度矩阵(又称密度算子)是一个具有迹为 1、平方迹小于或等于 1 的厄米矩阵。在量子力学中,密度矩阵用于表示系统处于多个量子态的概率叠加。量子系统的密度矩阵可以表示为 \( \rho=\sum_i p_i|\psi_i\rangle\langle\psi_i|\),其中 \(p_i\) 是系统处于状态 \(|\psi_i\rangle\) 的概率,满足 \(p_i \geq 0\) 且 \(\sum_i\) \(p_i=1 \),即归一化条件。

在 QPanda3 量子信息模块中

QPanda3 量子信息模块使用 DensityMatrix 类来抽象并模拟密度矩阵。

构造 DensityMatrix 对象

API文档链接

默认构造函数

默认构造一个仅包含一个量子比特且当前状态为全 0 的量子系统的密度矩阵。

在内部张量积操作中,量子比特索引值较大的作为左操作数。例如,对由 \(q[0]\)、 \(q[1]\) 和 \(q[2]\) 组成的量子系统执行张量积操作时,结果对应于 \(\left | q[2] \right \rangle \otimes \left | q[1] \right \rangle \otimes \left | q[0] \right \rangle \)。

执行结果如下所示:

[[1.+0.j 0.+0.j]
[0.+0.j 0.+0.j]]

指定量子比特总数

指定量子系统中的量子比特总数,并生成当前所有量子比特状态均为 0 的密度矩阵。

在内部张量积操作中,量子比特索引值较大的作为左操作数。例如,对由 \(q[0]\)、 \(q[1]\) 和 \(q[2]\) 组成的量子系统执行张量积操作时,结果对应于 \(\left | q[2] \right \rangle \otimes \left | q[1] \right \rangle \otimes \left | q[0] \right \rangle \)。

执行结果如下所示:

[[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]

复数数组作为构造函数入参

基于输入的二维复数数组构造密度矩阵。如果给定的二维复数数组不满足迹为 1 且正定的条件,则会抛出异常。如果数组中的元素数量不是 2 的幂,则会自动扩展至最接近的 2 的幂,并尽可能少地扩展元素数量。

在内部张量积操作中,量子比特索引值较大的作为左操作数。例如,对由 \(q[0]\)、 \(q[1]\) 和 \(q[2]\) 组成的量子系统执行张量积操作时,结果对应于 \(\left | q[2] \right \rangle \otimes \left | q[1] \right \rangle \otimes \left | q[0] \right \rangle \)。

执行结果如下所示:

[[ 0.18056413+0.j 0.12215589+0.06893592j -0.05337882-0.06077268j
-0.06164719-0.00112235j]
[ 0.12215589-0.06893592j 0.38670196+0.j -0.251278 -0.09109501j
0.11033526+0.04016816j]
[-0.05337882+0.06077268j -0.251278 +0.09109501j 0.26018725+0.j
-0.14253993+0.02027215j]
[-0.06164719+0.00112235j 0.11033526-0.04016816j -0.14253993-0.02027215j
0.17254666+0.j ]]

使用另一个DensityMatrix对象构造

基于已有的 DensityMatrix 对象构造新的 DensityMatrix 对象。

执行结果如下所示:

[[ 0.18056413+0.j 0.12215589+0.06893592j -0.05337882-0.06077268j
-0.06164719-0.00112235j]
[ 0.12215589-0.06893592j 0.38670196+0.j -0.251278 -0.09109501j
0.11033526+0.04016816j]
[-0.05337882+0.06077268j -0.251278 +0.09109501j 0.26018725+0.j
-0.14253993+0.02027215j]
[-0.06164719+0.00112235j 0.11033526-0.04016816j -0.14253993-0.02027215j
0.17254666+0.j ]]

构造态矢量对应的密度矩阵

基于已有的 StateVector 对象构造新的 DensityMatrix 对象。

执行结果如下所示:

dm: {
dm: [[0.00490196+0.j 0.00980392+0.j 0.01470588+0.j 0.01960784+0.j
0.0245098 +0.j 0.02941176+0.j 0.03431373+0.j 0.03921569+0.j]
[0.00980392+0.j 0.01960784+0.j 0.02941176+0.j 0.03921569+0.j
0.04901961+0.j 0.05882353+0.j 0.06862745+0.j 0.07843137+0.j]
[0.01470588+0.j 0.02941176+0.j 0.04411765+0.j 0.05882353+0.j
0.07352941+0.j 0.08823529+0.j 0.10294118+0.j 0.11764706+0.j]
[0.01960784+0.j 0.03921569+0.j 0.05882353+0.j 0.07843137+0.j
0.09803922+0.j 0.11764706+0.j 0.1372549 +0.j 0.15686275+0.j]
[0.0245098 +0.j 0.04901961+0.j 0.07352941+0.j 0.09803922+0.j
0.12254902+0.j 0.14705882+0.j 0.17156863+0.j 0.19607843+0.j]
[0.02941176+0.j 0.05882353+0.j 0.08823529+0.j 0.11764706+0.j
0.14705882+0.j 0.17647059+0.j 0.20588235+0.j 0.23529412+0.j]
[0.03431373+0.j 0.06862745+0.j 0.10294118+0.j 0.1372549 +0.j
0.17156863+0.j 0.20588235+0.j 0.24019608+0.j 0.2745098 +0.j]
[0.03921569+0.j 0.07843137+0.j 0.11764706+0.j 0.15686275+0.j
0.19607843+0.j 0.23529412+0.j 0.2745098 +0.j 0.31372549+0.j]]

获取内部数据

获取numpy.ndarray类型的内部数据

获取密度矩阵的内部数据,并以 numpy.ndarray 的形式返回。

DensityMatrix.ndarray的API文档链接

执行结果如下所示:

data: [[ 0.18056413+0.j 0.12215589+0.06893592j -0.05337882-0.06077268j
-0.06164719-0.00112235j]
[ 0.12215589-0.06893592j 0.38670196+0.j -0.251278 -0.09109501j
0.11033526+0.04016816j]
[-0.05337882+0.06077268j -0.251278 +0.09109501j 0.26018725+0.j
-0.14253993+0.02027215j]
[-0.06164719+0.00112235j 0.11033526-0.04016816j -0.14253993-0.02027215j
0.17254666+0.j ]]

获取矩阵元素

根据矩阵的行索引和列索引获取内部数据的某个元素。

DensityMatrix.dim的API文档链接 DensityMatrix.at的API文档链接

执行结果如下所示:

element in dm:
(0.18056413+0j)
(0.12215589+0.06893592j)
(-0.05337882-0.06077268j)
(-0.06164719-0.00112235j)
(0.12215589-0.06893592j)
(0.38670196+0j)
(-0.251278-0.09109501j)
(0.11033526+0.04016816j)
(-0.05337882+0.06077268j)
(-0.251278+0.09109501j)
(0.26018725+0j)
(-0.14253993+0.02027215j)
(-0.06164719+0.00112235j)
(0.11033526-0.04016816j)
(-0.14253993-0.02027215j)
(0.17254666+0j)

获取纯度

获取密度矩阵的纯度。

DensityMatrix.purity的API文档链接

执行结果如下所示:

dm: [[ 0.18056413+0.j 0.12215589+0.06893592j -0.05337882-0.06077268j
-0.06164719-0.00112235j]
[ 0.12215589-0.06893592j 0.38670196+0.j -0.251278 -0.09109501j
0.11033526+0.04016816j]
[-0.05337882+0.06077268j -0.251278 +0.09109501j 0.26018725+0.j
-0.14253993+0.02027215j]
[-0.06164719+0.00112235j 0.11033526-0.04016816j -0.14253993-0.02027215j
0.17254666+0.j ]]
purity: (0.5515582694688418+0j)

获取态矢量

获取对应的态矢量。

DensityMatrix.to_statevector的API文档链接

执行结果如下所示:

stv: [(1+0j), 0j, 0j, 0j, 0j, 0j, 0j, 0j]

使用量子线路演化

使用量子线路 QCircuit 对密度矩阵进行演化。

无更新演化

使用量子线路 QCircuit 对密度矩阵进行演化,但不会更新原始 DensityMatrix 对象的内部数据;演化结果将作为新的 DensityMatrix 对象返回。

DensityMatrix.evolve的API文档链接

执行结果如下所示:

dm2: [[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]

演化并更新

使用量子线路 QCircuit 对密度矩阵进行演化,并更新原始 DensityMatrix 对象的内部数据。

DensityMatrix.update_by_evolve的API文档链接

执行结果如下所示:

dm: [[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]

布尔函数

合法性验证

验证密度矩阵的内部数据是否合法。 这里的“合法”是指该矩阵是否满足半正定性,并且迹为 1 的要求。

DensityMatrix.is_valid的API文档链接

执行结果如下所示:

is_valid: True

判等

判断两个 DensityMatrix 对象的内部数据是否相同。

DensityMatrix.__eq__ 的API文档链接

执行结果如下所示:

dm==dm2: True