上一章: 密度矩阵
下一章: Kraus
简介
态矢量是量子力学中的核心概念,用于抽象地表示量子系统的量子态。以下是对量子领域中态矢量的详细介绍:
定义与数学空间
定义
量子态由希尔伯特空间中的向量表示,也称为状态向量空间或状态空间,这些向量称为状态向量或态矢量。
数学空间
状态向量存在于内积空间中。内积空间是带有额外内积结构的向量空间。状态向量满足所有向量空间的公理,并允许进行内积运算。
性质与特征
单位向量
状态向量的范数为 1,因此是单位向量。 线性组合:每个内积空间都有一个单范数正交基,态矢量是所有单范数正交基向量的线性组合。
状态的叠加原理
态矢量满足线性性质,这对应于量子力学中的状态叠加原理。也就是说,如果两个量子态分别由态矢量 \(\mathcal{ \psi } _1\) 和 \(\mathcal{ \psi } _2\) 表示,则它们的叠加态可以由这两个态矢量的线性组合表示。
概率分布
状态向量可以被视为概率分布,描述了量子系统所有可能的测量结果。对于每次测量,获得不同结果的概率是确定的,并且这些结果的概率分布取决于系统的态矢量。
在 QPanda3 量子信息模块中
QPanda3 在量子信息模块中使用 StateVector 类来抽象和模拟态矢量。
构造 StateVector 对象
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 \)
Python
stv = StateVector()
print(stv)
输出
指定量子比特总数
指定量子系统中量子比特的总数,并生成一个StateVector对象,其中每个量子比特的当前状态为 0。
对于内部张量积操作,较大值的量子比特索引作为左操作数。例如,当对由 \(q[0]\)、 \(q[1]\) 和 \(q[2]\) 组成的量子系统执行张量积操作时,结果为 \(\left | q[2] \right \rangle \otimes \left | q[1] \right \rangle \otimes \left | q[0] \right \rangle \)。
Python
stv = StateVector(3)
print(stv)
输出
[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
复数数组作为构造函数的入参
根据给定的复数数组构造一个StateVector对象。如果给定的复数数组不满足归一化约束,它将被自动归一化。如果给定的复数数组的元素数量不是 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 \)。
Python
import numpy as np
stv = StateVector([1+1.j,2+2.j,3+3.j,4+4.j,5+5.j,6+6.j,7+7.j,8+8.j])
print(stv)
stv = StateVector(np.array([1+1.j,2+2.j,3+3.j,4+4.j,5+5.j,6+6.j,7+7.j,8+8.j]))
print(stv)
输出
[0.04950738+0.04950738j 0.09901475+0.09901475j 0.14852213+0.14852213j
0.19802951+0.19802951j 0.24753689+0.24753689j 0.29704426+0.29704426j
0.34655164+0.34655164j 0.39605902+0.39605902j]
[0.04950738+0.04950738j 0.09901475+0.09901475j 0.14852213+0.14852213j
0.19802951+0.19802951j 0.24753689+0.24753689j 0.29704426+0.29704426j
0.34655164+0.34655164j 0.39605902+0.39605902j]
通过Python字典构造
根据输入的Python字典构造一个StateVector对象。
字典的键是自然数,表示量子态的索引;字典的值是对应的振幅。如果不满足归一化约束,将自动进行归一化处理。如果给定字典元素的键的最大值不是 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 \)。
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
print(stv)
输出
[0. +0.j 0.13867505+0.13867505j 0. +0.j
0.41602515+0.41602515j 0.5547002 +0.5547002j 0. +0.j
0. +0.j 0. +0.j ]
获取内部数据
获取 numpy.ndarray形式的内部数据
以 numpy.ndarray 的形式获取所有内部数据。
StateVector.ndarray的API文档链接
Python
import numpy as np
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
data = stv.ndarray()
print("data:",data)
输出
data: [0. +0.j 0.13867505+0.13867505j 0. +0.j
0.41602515+0.41602515j 0.5547002 +0.5547002j 0. +0.j
1. +0.j 0. +0.j ]
获取单个元素
通过索引获取某个状态对应的值。
StateVector.dim的API文档链接
StateVector.at的API文档链接
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
print("element in stv:")
for i in range(stv.dim()):
print(stv.at(i))
输出
element in stv:
0j
(0.1386750490563073+0.1386750490563073j)
0j
(0.41602514716892186+0.41602514716892186j)
(0.5547001962252291+0.5547001962252291j)
0j
0j
0j
使用量子线路进行演化
无更新演化
使用量子线路 QCircuit 对量子态进行演化,而不更新原始 StateVector 对象的内部数据,结果将作为新的 StateVector 对象返回。
StateVector.evolve的API文档链接
Python
stv = StateVector(3)
cir = QCircuit()
cir << X(0)<<SWAP(1,2)<<CP(1,0,3.14)
stv2 = stv.evolve(cir)
print("stv2:",stv2)
输出:
stv2: [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
演化并更新
使用量子线路 QCircuit 对量子态进行演化,并更新原始 StateVector 对象的内部数据。
StateVector.update_by_evolve的API文档链接
Python
stv = StateVector(3)
cir = QCircuit()
cir << X(0)<<SWAP(1,2)<<CP(1,0,3.14)
stv2 = stv.update_by_evolve(cir)
print("stv2:",stv2)
输出:
stv2: [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
密度矩阵
获取对应的密度矩阵表示。
StateVector.get_density_matrix的API文档链接
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
dm = stv.get_density_matrix()
print("dm:",dm)
输出:
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 0.03846154+0.j 0. +0.j 0.11538462+0.j
0.15384615+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.11538462+0.j 0. +0.j 0.34615385+0.j
0.46153846+0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0.15384615+0.j 0. +0.j 0.46153846+0.j
0.61538462+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]]
纯度
获取对应的纯度值。
StateVector.purity的API文档链接
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
purity = stv.purity()
print("purity:",purity)
输出:
布尔函数
合法性检查
判断内部数据是否合法。
StateVector.is_valid的API文档链接
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
res = stv.is_valid()
print("res:",res)
输出:
判等
判断两个状态向量的内部数据在默认容差范围内是否相等。
API文档链接
Python
stv = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
stv2 = StateVector({1:1+1.j,3:3+3.j,4:4+4.j})
res = stv==stv2
print("res:",res)
输出: