QuTiP includes a collection of random state generators for simulations, theorem evaluation, and code testing:
Function | Description |
---|---|
rand_ket | Random ket-vector |
rand_dm | Random density matrix |
rand_herm | Random Hermitian matrix |
rand_unitary | Random Unitary matrix |
See the API documentation: Random Operators and States for details.
In all cases, these functions can be called with a single parameter \(N\) that indicates a \(NxN\) matrix (rand_dm, rand_herm, rand_unitary), or a \(Nx1\) vector (rand_ket), should be generated. For example:
In [1]: rand_ket(5)
Out[1]:
Quantum object: dims = [[5], [1]], shape = [5, 1], type = ket
Qobj data =
[[-0.37899439-0.03246954j]
[-0.09389192-0.30281261j]
[-0.41147565-0.20947105j]
[-0.41769426-0.02916778j]
[-0.54640563+0.26024817j]]
or
In [2]: rand_herm(5)
Out[2]:
Quantum object: dims = [[5], [5]], shape = [5, 5], type = oper, isherm = True
Qobj data =
[[-0.29514824+0.j 0.00000000+0.j -0.27781445-0.15337652j
-0.35652395-0.05592461j 0.00000000+0.j ]
[ 0.00000000+0.j -0.55204452+0.j -0.22293747-0.12925792j
-0.09264731+0.20738712j -0.71881796+0.01202871j]
[-0.27781445+0.15337652j -0.22293747+0.12925792j 0.00000000+0.j
-0.84636559+0.30414702j -0.47088943-0.09313568j]
[-0.35652395+0.05592461j -0.09264731-0.20738712j -0.84636559-0.30414702j
-0.02792858+0.j -0.39742673-0.09375464j]
[ 0.00000000+0.j -0.71881796-0.01202871j -0.47088943+0.09313568j
-0.39742673+0.09375464j 0.00000000+0.j ]]
In this previous example, we see that the generated Hermitian operator contains a fraction of elements that are identically equal to zero. The number of nonzero elements is called the density and can be controlled by calling any of the random state/operator generators with a second argument between 0 and 1. By default, the density for the operators is 0.75 where as ket vectors are completely dense (1). For example:
In [3]: rand_dm(5, 0.5)
Out[3]:
Quantum object: dims = [[5], [5]], shape = [5, 5], type = oper, isherm = True
Qobj data =
[[ 0.04892987+0.j 0.00000000+0.j 0.00265679-0.0245355j
0.09885662-0.01638816j 0.00000000+0.j ]
[ 0.00000000+0.j 0.00000000+0.j 0.00000000+0.j
0.00000000+0.j 0.00000000+0.j ]
[ 0.00265679+0.0245355j 0.00000000+0.j 0.24585391+0.j
0.01358542+0.04868103j 0.21507082+0.04053822j]
[ 0.09885662+0.01638816j 0.00000000+0.j 0.01358542-0.04868103j
0.43862274+0.j 0.01799108+0.05080967j]
[ 0.00000000+0.j 0.00000000+0.j 0.21507082-0.04053822j
0.01799108-0.05080967j 0.26659348+0.j ]]
has roughly half nonzero elements, or equivalently a density of 0.5.
Warning
In the case of a density matrix, setting the density too low will result in not enough diagonal elements to satisfy \(Tr(\rho)=1\).
In many cases, one is interested in generating random quantum objects that correspond to composite systems generated using the qutip.tensor.tensor function. Specifying the tensor structure of a quantum object is done using the dims keyword argument in the same fashion as one would do for a qutip.Qobj object:
In [4]: rand_dm(4, 0.5, dims=[[2,2], [2,2]])
Out[4]:
Quantum object: dims = [[2, 2], [2, 2]], shape = [4, 4], type = oper, isherm = True
Qobj data =
[[ 0.30122934 0. 0. 0. ]
[ 0. 0. 0. 0. ]
[ 0. 0. 0.34938533 0. ]
[ 0. 0. 0. 0.34938533]]