SqState.jl

Squeezed state solver for quantum optics
Author foldfelis
Popularity
2 Stars
Updated Last
2 Years Ago
Started In
January 2021

SqState

Squeezed state solver for quantum optics.

CI codecov GitHub release (latest by date) GitHub Release Date Website Code Style: Blue GitHub

State

Fock state

The following example shows how to construct Fock states.

julia> FockState(0)
(1.0 + 0.0im)|0⟩

julia> FockState(1)
(1.0 + 0.0im)|1⟩

julia> FockState(2)
(1.0 + 0.0im)|2

The alias are also acceptable.

julia> VacuumState()
(1.0 + 0.0im)|0⟩

julia> SinglePhotonState()
(1.0 + 0.0im)|1⟩

julia> NumberState(2)
(1.0 + 0.0im)|2

The Fock state can be also constructed by applying create operator to vacuum state, or by applying annihilate operator to FockState(n).

julia> state = VacuumState()
(1.0 + 0.0im)|0⟩

julia> create(state)
(1.0 + 0.0im)|1⟩

julia> create(create(state))
(1.4142135623730951 + 0.0im)|2⟩

julia> create(create(create(state)))
(2.4494897427831783 + 0.0im)|3
julia> state = FockState(5)
(1.0 + 0.0im)|5⟩

julia> annihilate(state)
(2.23606797749979 + 0.0im)|4⟩

julia> annihilate(annihilate(state))
(4.47213595499958 + 0.0im)|3⟩

julia> annihilate(annihilate(annihilate(state)))
(7.745966692414834 + 0.0im)|2

Or simply use createⁿ operator and annihilateⁿ operator.

julia> createⁿ(VacuumState(), 3)
(2.4494897427831783 + 0.0im)|3⟩

julia> annihilateⁿ(FockState(5), 3)
(7.745966692414834 + 0.0im)|2

State vector of Fock state

julia> vec(VacuumState())
35-element Vector{Complex}:
 1.0 + 0.0im
   0 + 0im
   0 + 0im
   0 + 0im0 + 0im
   0 + 0im

julia> vec(SinglePhotonState())
35-element Vector{Complex}:
   0 + 0im
 1.0 + 0.0im
   0 + 0im
   0 + 0im0 + 0im
   0 + 0im

   julia> vec(FockState(3))
35-element Vector{Complex}:
   0 + 0im
   0 + 0im
   0 + 0im
 1.0 + 0.0im0 + 0im
   0 + 0im
   0 + 0im

Density matrix of Fock state

julia> ρ(VacuumState())
35×35 Matrix{Complex}:
 1.0+0.0im  0+0im  0+0im  0+0im0+0im  0+0im  0+0im  0+0im  0+0im
   0+0im    0+0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
   0+0im    0+0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
   0+0im    0+0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
    ⋮                            ⋱   ⋮
   0+0im    0+0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
   0+0im    0+0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im

julia> ρ(SinglePhotonState())
35×35 Matrix{Complex}:
 0+0im    0+0im    0+0im  0+0im0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  1.0+0.0im  0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im    0+0im    0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im    0+0im    0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
  ⋮                              ⋱   ⋮
 0+0im    0+0im    0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im    0+0im    0+0im  0+0im     0+0im  0+0im  0+0im  0+0im  0+0im

julia> ρ(FockState(3))
35×35 Matrix{Complex}:
 0+0im  0+0im  0+0im    0+0im0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  0+0im  0+0im    0+0im       0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  0+0im  0+0im    0+0im       0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  0+0im  0+0im  1.0+0.0im     0+0im  0+0im  0+0im  0+0im  0+0im
  ⋮                              ⋱   ⋮
 0+0im  0+0im  0+0im    0+0im       0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  0+0im  0+0im    0+0im       0+0im  0+0im  0+0im  0+0im  0+0im
 0+0im  0+0im  0+0im    0+0im       0+0im  0+0im  0+0im  0+0im  0+0im

Coherent state

A coherent state is often construced by a displacement operator(with specific argument) working on a vacuum state.

julia> D = displacement(Arg(2, π/4));

julia> state_vector = D(VacuumState())
35-element Vector{ComplexF64}:
     0.1353352832366127 + 0.0im
    0.19139299302082188 - 0.19139299302082186im2.789607177562496e-10 - 2.7896071775624755e-10im
 5.1078452787717455e-25 - 1.3531582408319167e-10im

julia> ρ_coherent = state_vector * state_vector'
35×35 Matrix{ComplexF64}:
   0.0183156+0.0im            0.0259022+0.0259022im6.91272e-26+1.8313e-11im
   0.0259022-0.0259022im      0.0732626+0.0im             2.58985e-11+2.58985e-11im
 1.15029e-17-0.0518044im      0.0732626-0.0732626im        5.1797e-11-1.8402e-25im
            ⋮                                          ⋱
 1.53354e-10+5.44824e-25im  2.16876e-10+2.16876e-10im     3.40466e-35+1.53332e-19im
 3.77532e-11-3.77532e-11im  1.06782e-10+3.87741e-25im     3.77478e-20+3.77478e-20im
 6.91272e-26-1.8313e-11im   2.58985e-11-2.58985e-11im     1.83104e-20+0.0im

Or one can simply construct a coherent state as following.

julia> state = CoherentState(Arg(2, π/4))
D(2.0 exp[-0.7853981633974483im])|0⟩

julia> vec(state)
35-element Vector{ComplexF64}:
     0.1353352832366127 + 0.0im
    0.19139299302082188 - 0.19139299302082186im1.1331437922182883e-9 + 4.0257354506617855e-24im
  2.789607177562496e-10 - 2.7896071775624755e-10im
 5.1078452787717455e-25 - 1.3531582408319167e-10im

julia> ρ(state)
35×35 Matrix{ComplexF64}:
   0.0183156+0.0im            0.0259022+0.0259022im6.91272e-26+1.8313e-11im
   0.0259022-0.0259022im      0.0732626+0.0im             2.58985e-11+2.58985e-11im
 1.15029e-17-0.0518044im      0.0732626-0.0732626im        5.1797e-11-1.8402e-25im
            ⋮                                          ⋱
 1.53354e-10+5.44824e-25im  2.16876e-10+2.16876e-10im     3.40466e-35+1.53332e-19im
 3.77532e-11-3.77532e-11im  1.06782e-10+3.87741e-25im     3.77478e-20+3.77478e-20im
 6.91272e-26-1.8313e-11im   2.58985e-11-2.58985e-11im     1.83104e-20+0.0im

Plot state

Initial Wigner Function

The Wigner function is calculated by Moyal function in Fock basis. And due to the fact that the Moyal function is a generalization of the Wigner function. We can therefore imply that

W(x, p) = ∑ ρₘₙ Wₘₙ(x, p)

We can initialize Wigner function as following. (It takes a while~~)

julia> x_range = -10:0.1:10
-10.0:0.1:10.0

julia> p_range = -10:0.1:10
-10.0:0.1:10.0

julia> wf = WignerFunction(x_range, p_range);

Rander state

julia> w = wf(ρ(SinglePhotonState()));

Plot Surface of the state

julia> plot_wigner(wf, w, Surface, size=(640, 320))

Plot Contour of the state

julia> plot_wigner(wf, w, Contour, size=(640, 600))

Used By Packages

No packages found.