Useful States and Operators

States

Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.

Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.

Below are convenience constructors for common types of states and operators, already implemented in this library.

Pauli Operators

Single qubit PauliOperator is implemented in [single_z] and [single_x].

julia> single_z(4,2)
+ _Z__

julia> single_x(4,3)
+ __X_

All identity operators use zero.

julia> zero(PauliOperator, 3)
+ ___

julia> zero(P"XYZXYZ")
+ ______

Random Pauli operators are implemented as well (with or without a random phase).

julia> using StableRNGs; rng = StableRNG(42);

julia> random_pauli(rng, 4)
+ ZYY_

julia> random_pauli(rng, 4; nophase=false)
- YZ_X

Stabilizer States

An all-identity stabilizer can be created with zero.

julia> zero(Stabilizer, 3)
+ ___
+ ___
+ ___

julia> zero(Stabilizer, 2, 3)
+ ___
+ ___

julia> zero(S"XIZ
              YZX")
+ ___
+ ___

Diagonal stabilizers in different bases are available as well, through one.

julia> one(Stabilizer, 3)
+ Z__
+ _Z_
+ __Z

julia> one(Stabilizer, 3; basis=:Y)
+ Y__
+ _Y_
+ __Y

julia> one(S"XX
             ZZ")
+ Z_
+ _Z

A random stabilizer (or destabilizers or Clifford operators) can be created as well. We use the algorithm described in (Bravyi and Maslov, 2021).

julia> random_stabilizer(rng, 2,5)
+ YZXZZ
- XZYYY

Mixed States

Similarly, one can create a diagonal mixed state.

julia> one(MixedDestabilizer, 2, 3)
𝒟ℯ𝓈𝓉𝒶𝒷
+ X__
+ _X_
𝒳ₗ━━━
+ __X
𝒮𝓉𝒶𝒷━
+ Z__
+ _Z_
𝒵ₗ━━━
+ __Z

Enumerating all Clifford Operations

The algorithm from (Koenig and Smolin, 2014) can be used to enumerate all Clifford operations on a given number of qubits through enumerate_cliffords. Or one can use random_clifford, random_stabilizer to directly sample from that set.

julia> length(enumerate_cliffords(1))
6

julia> length(enumerate_cliffords(2))
720

To also enumerate possible phases, you can use enumerate_phases.

julia> length(collect(enumerate_phases(tCNOT)))
16

julia> length(collect(enumerate_phases(enumerate_cliffords(2))))
11520

Common entangled states

Bell states and GHZ states have convenience constructors:

julia> bell()
+ XX
+ ZZ

julia> bell(2)
+ XX__
+ ZZ__
+ __XX
+ __ZZ

julia> ghz(4)
+ XXXX
+ ZZ__
+ _ZZ_
+ __ZZ