Tutorial
Quickstart
Add the QBase.jl Package:
julia> using Pkg; Pkg.add("QBase")Import the QBase module
using QBaseAlgebra with Bras and Kets
See the Bras and Kets section for details.
Create a Ket
ψ = Ket([1,0])2-element Ket{Int64}:
 1
 0Create a Bra by taking the adjoint.
ψ'1×2 Bra{Int64}:
 1  0Inner product between Bra and Ket
ψ'ψ1Outer product between Ket and Bra
ψ*ψ'2×2 Matrix{Int64}:
 1  0
 0  0Quantum States
See States section for details.
Constructing States
ρ_0 = State( [1 0;0 0] )2×2 State{Int64}:
 1  0
 0  0ρ_1 = State( [0 0;0 1] )2×2 State{Int64}:
 0  0
 0  1Create Product States
kron( ρ_0, ρ_1 )4×4 State{Int64}:
 0  0  0  0
 0  1  0  0
 0  0  0  0
 0  0  0  0Create a Bloch Qubit State
bloch_qubit_state( π/3, 7π/6 )2×2 State{ComplexF64}:
   0.75+0.0im       -0.375+0.216506im
 -0.375-0.216506im    0.25+0.0imCreate a State from a Ket
pure_state(ψ)2×2 State{Int64}:
 1  0
 0  0Create a Mixed State
mixed_state( [0.6, 0.4], [ρ_0, ρ_1] )2×2 State{Float64}:
 0.6  0.0
 0.0  0.4Evolution of Quantum States
See Evolution section for details.
Pauli Constants
[σI, σx, σy, σz]4-element Vector{Unitary}:
 [1 0; 0 1]
 [0 1; 1 0]
 [0 + 0im 0 - 1im; 0 + 1im 0 + 0im]
 [1 0; 0 -1]Unitary Evolution
evolve(σx, ρ_0)2×2 State{Int64}:
 0  0
 0  1evolve(σx, ψ)2-element Ket{Int64}:
 0
 1Channel Evolution
depolarizing_channel(ρ_0, 0.5)2×2 State{Float64}:
 0.75  0.0
 0.0   0.25Measurement of Quantum States
See Measurements section for details.
Constructing POVM Measurements
# measurement in z-basis
Π_Z = POVM([ [1 0;0 0], [0 0;0 1] ])2-element POVM{Int64}
Π[1] : 2×2 POVMel{Int64}:
 1  0
 0  0
Π[2] : 2×2 POVMel{Int64}:
 0  0
 0  1# measurement in  x-basis
Π_X = POVM([ [0.5 0.5;0.5 0.5], [0.5 -0.5;-0.5 0.5] ])2-element POVM{Float64}
Π[1] : 2×2 POVMel{Float64}:
 0.5  0.5
 0.5  0.5
Π[2] : 2×2 POVMel{Float64}:
  0.5  -0.5
 -0.5   0.5Measurement Probabilities
Outcome Probabilities are obtained with the measure method.
measure( Π_Z, ρ_0 )2-element Probabilities{Int64}:
 1
 0measure( Π_X, ρ_0 )2-element Probabilities{Float64}:
 0.5
 0.5measure( Π_Z, [ρ_0, ρ_1] )2×2 Conditionals{Int64}:
 1  0
 0  1Quantum Information
See the Information Theory section for a complete list of methods.
Von Neumann Entropy of Bell state
# maximally entangled bipartite qubit state
ρ_bell = bell_states()[1]
von_neumann_entropy( ρ_bell )3.2034265038149176e-16# maximally mixed two-qubit state
ρ_bell_mix = mixed_state( [1,1,1,1]/4, bell_states() )
von_neumann_entropy( ρ_bell_mix )2.0Advanced Examples
Absolute Tolerance
In some cases, it may be desirable to relax or tighten the tolerated numerical error. This example demonstrates  how to pass the atol parameter to the State constructor. This parameter can be used for any type defined in this project. The absolute tolerance should be used with caution as it may delegitimize computed results.
ϵ = 1e-5    # introducing a small error
# state creation fails due to non-hermiticity
try
    State([1 ϵ;-ϵ 0])
catch err
    println( err )
endDomainError([1.0 1.0e-5; -1.0e-5 0.0], "Density matrix `ρ` is not hermitian.")# the atol parameter overrides the non-hermiticity failure
State([1 ϵ;-ϵ 0], atol=1e-4)2×2 State{Float64}:
  1.0     1.0e-5
 -1.0e-5  0.0Random States
# Create a 5x5 random unitary
U_rand = random_unitary( 5 )5×5 Unitary{ComplexF64}:
  0.413635-0.369018im    0.273568-0.67956im    …    0.257068+0.0450523im
  0.165528+0.38666im    0.0991758-0.210902im       -0.276638-0.0293374im
 -0.272689-0.137399im    0.314998+0.0405367im      0.0151134+0.0256582im
 -0.272175+0.101341im   -0.147227-0.0481443im        0.27775+0.873617im
   0.57571+0.0824464im  -0.459871+0.269633im      -0.0779082+0.0847905im# evolve the |0> Ket
ψ_rand = U_rand * Ket( [1, 0, 0, 0, 0] )5-element Ket{ComplexF64}:
    0.413635021883039 - 0.3690176425647414im
  0.16552760879873218 + 0.38665957280785834im
  -0.2726892180596612 - 0.1373991980570071im
 -0.27217515091613725 + 0.10134056418968022im
    0.575710394434449 + 0.08244636662779628im# create a pure state from the random ket
ρ_rand = pure_state(ψ_rand)5×5 State{ComplexF64}:
   0.307268+0.0im        -0.0742162-0.221019im   …    0.20771-0.24655im
 -0.0742162+0.221019im     0.176905+0.0im            0.127175+0.208957im
 -0.0620911-0.15746im    -0.0982643+0.0826945im     -0.168318-0.0566199im
  -0.149978-0.0585194im  -0.0058682+0.122014im      -0.148339+0.0807827im
    0.20771+0.24655im      0.127175-0.208957im        0.33824+0.0imNoisy Quantum Channel
Computing measurement probabilities in a noiseless channel:
# create bipartite Bell states
ρ_bell_states = bell_states()
# create a measurement in the same Bell basis
Π_bell_basis = POVM( ρ_bell_states )
# compute the ideal measurement probabilities
measure( Π_bell_basis, ρ_bell_states )4×4 Conditionals{Float64}:
 1.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0
 0.0  0.0  1.0  0.0
 0.0  0.0  0.0  1.0Computing measurement probabilities with a noisy channel:
# create a depolarizing channel which mixes in 50% white noise
𝒩(ρ) = depolarizing_channel(ρ, 0.5)
# Add noise to quantum states
ρ_noisy_bell_states = 𝒩.(ρ_bell_states)
# compute the noisy measurement probabilities
measure( Π_bell_basis, ρ_noisy_bell_states  )4×4 Conditionals{Float64}:
 0.625  0.125  0.125  0.125
 0.125  0.625  0.125  0.125
 0.125  0.125  0.625  0.125
 0.125  0.125  0.125  0.625Reduced Density States
The reduced density matrix of a Bell state is a maximally mixed state.
# bipartite entangled qutrit states
ρ = generalized_bell_states( 3 )[1]
# tracing out the first qutrit subsystem
# creates a reduced density matrix State
partial_trace(ρ, [3,3], 1)3×3 State{ComplexF64}:
 0.333333+0.0im       0.0+0.0im       0.0+0.0im
      0.0+0.0im  0.333333+0.0im       0.0+0.0im
      0.0+0.0im       0.0+0.0im  0.333333+0.0im