生成随机量子态和算子

QuTiP 包含了一系列用于模拟、蒙特卡洛评估、定理评估和代码测试的随机状态、酉矩阵和信道生成器。 这些对象中的每一个都可以从几种不同的分布中进行采样。

例如,可以通过调用rand_herm函数来采样一个随机的厄米算子:

>>> rand_herm(5) 
Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True
Qobj data =
[[-0.25091976+0.j          0.        +0.j          0.        +0.j
  -0.21793701+0.47037633j -0.23212846-0.61607187j]
 [ 0.        +0.j         -0.88383278+0.j          0.836086  -0.23956218j
  -0.09464275+0.45370863j -0.15243356+0.65392096j]
 [ 0.        +0.j          0.836086  +0.23956218j  0.66488528+0.j
  -0.26290446+0.64984451j -0.52603038-0.07991553j]
 [-0.21793701-0.47037633j -0.09464275-0.45370863j -0.26290446-0.64984451j
  -0.13610996+0.j         -0.34240902-0.2879303j ]
 [-0.23212846+0.61607187j -0.15243356-0.65392096j -0.52603038+0.07991553j
  -0.34240902+0.2879303j   0.        +0.j        ]]

随机变量类型

采样函数

维度

状态向量 (ket)

rand_ket

\(N \times 1\)

厄米算子 (oper)

rand_herm

\(N \times N\)

密度算子 (oper)

rand_dm

\(N \times N\)

酉算子 (oper)

rand_unitary

\(N \times N\)

随机矩阵 (oper)

rand_stochastic

\(N \times N\)

CPTP 通道 (super)

rand_super, rand_super_bcsz

\((N \times N) \times (N \times N)\)

CPTP 映射(oper 列表)

rand_kraus_map

\(N \times N\) (N**2 个操作符)

在所有情况下,这些函数都可以使用单个参数\(dimensions\)调用,该参数可以是相关希尔伯特空间的大小或随机状态、酉或通道的维度。

>>> rand_super_bcsz(7).dims
[[[7], [7]], [[7], [7]]]
>>> rand_super_bcsz([[2, 3], [2, 3]]).dims
[[[2, 3], [2, 3]], [[2, 3], [2, 3]]]

QuTiP中的几个随机Qobj函数也支持额外的参数,即densitydistributionrand_dm, rand_herm, rand_unitaryrand_ket 可以通过distribution控制的多种方法创建。 rand_ket, rand_hermrand_unitary 函数可以返回量子对象,使得一部分元素完全等于零。 非零元素的比例通过density关键字参数传递。 相比之下,rand_super_bcsz将生成对象的秩作为参数,传递rank=1分别返回随机纯态或酉通道。 传递rank=None指定生成的对象对于给定维度应该是满秩的。 rand_dm可以根据所选的分布支持densityrank

例如,

>>> rand_dm(5, density=0.5, distribution="herm")
Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True
Qobj data =
[[ 0.298+0.j   ,  0.   +0.j   , -0.095+0.1j  ,  0.   +0.j   ,-0.105+0.122j],
 [ 0.   +0.j   ,  0.088+0.j   ,  0.   +0.j   , -0.018-0.001j, 0.   +0.j   ],
 [-0.095-0.1j  ,  0.   +0.j   ,  0.328+0.j   ,  0.   +0.j   ,-0.077-0.033j],
 [ 0.   +0.j   , -0.018+0.001j,  0.   +0.j   ,  0.084+0.j   , 0.   +0.j   ],
 [-0.105-0.122j,  0.   +0.j   , -0.077+0.033j,  0.   +0.j   , 0.201+0.j   ]]

>>> rand_dm_ginibre(5, rank=2)
Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True
Qobj data =
[[ 0.307+0.j   , -0.258+0.039j, -0.039+0.184j,  0.041-0.054j, 0.016+0.045j],
 [-0.258-0.039j,  0.239+0.j   ,  0.075-0.15j , -0.053+0.008j,-0.057-0.078j],
 [-0.039-0.184j,  0.075+0.15j ,  0.136+0.j   , -0.05 -0.052j,-0.028-0.058j],
 [ 0.041+0.054j, -0.053-0.008j, -0.05 +0.052j,  0.083+0.j   , 0.101-0.056j],
 [ 0.016-0.045j, -0.057+0.078j, -0.028+0.058j,  0.101+0.056j, 0.236+0.j   ]]

请参阅API文档:随机算符和状态以获取详细信息。

警告

当使用density关键字参数时,将密度设置得太低可能会导致没有足够的对角线元素来满足迹约束。

具有给定特征谱的随机对象

也可以生成具有给定特征谱的随机哈密顿量(rand_herm)和密度矩阵(rand_dm)。 这是通过将一个数组传递给eigenvalues参数并选择“eigen”分布来实现的。 例如,

>>> eigs = np.arange(5)

>>> H = rand_herm(5, density=0.5, eigenvalues=eigs, distribution="eigen")

>>> H 
Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True
Qobj data =
[[ 0.5  +0.j  ,  0.228+0.27j,  0.   +0.j  ,  0.   +0.j  ,-0.228-0.27j],
 [ 0.228-0.27j,  1.75 +0.j  ,  0.456+0.54j,  0.   +0.j  , 1.25 +0.j  ],
 [ 0.   +0.j  ,  0.456-0.54j,  3.   +0.j  ,  0.   +0.j  , 0.456-0.54j],
 [ 0.   +0.j  ,  0.   +0.j  ,  0.   +0.j  ,  3.   +0.j  , 0.   +0.j  ],
 [-0.228+0.27j,  1.25 +0.j  ,  0.456+0.54j,  0.   +0.j  , 1.75 +0.j  ]]


>>> H.eigenenergies() 
array([7.70647994e-17, 1.00000000e+00, 2.00000000e+00, 3.00000000e+00,
    4.00000000e+00])

为了生成具有给定光谱的随机对象,QuTiP 应用了一系列随机复数雅可比旋转。 这种技术需要许多步骤来构建所需的量子对象,因此仅适用于希尔伯特维度 \(\lesssim 1000\) 的对象。

复合随机对象

在许多情况下,人们感兴趣的是生成与使用tensor函数生成的复合系统相对应的随机量子对象。 指定量子对象的张量结构是通过为第一个参数传递一个列表来完成的。 生成的量子对象的大小将是列表中元素的乘积,生成的Qobj维度将是[dims, dims]

>>> rand_unitary([2, 2], density=0.5) 
Quantum object: dims = [[2, 2], [2, 2]], shape = (4, 4), type = oper, isherm = True
Qobj data =
[[ 0.887+0.061j,  0.   +0.j   ,  0.   +0.j   , -0.191-0.416j],
 [ 0.   +0.j   ,  0.604+0.116j, -0.32 -0.721j,  0.   +0.j   ],
 [ 0.   +0.j   ,  0.768+0.178j,  0.227+0.572j,  0.   +0.j   ],
 [ 0.412-0.2j  ,  0.   +0.j   ,  0.   +0.j   ,  0.724+0.516j]]

控制随机数生成器

Qutip 使用 numpy 随机数生成器来创建随机量子对象。 为了控制随机数,可以将一个 intnumpy.random.SeedSequencenumpy.random.Generator 作为种子传递给 seed 关键字参数:

>>> rng = np.random.default_rng(12345)
>>> rand_ket(2, seed=rng) 
Quantum object: dims=[[2], [1]], shape=(2, 1), type='ket'
Qobj data =
[[-0.697+0.618j],
 [-0.326-0.163j]]

内部矩阵格式

生成的随机量子对象的内部存储类型可以通过dtype关键字进行设置。

>>> rand_ket(2, dtype="dense").data
Dense(shape=(2, 1), fortran=True)

>>> rand_ket(2, dtype="CSR").data
CSR(shape=(2, 1), nnz=2)