Skip to content

Commit af7f8e5

Browse files
committed
Add generalized pauli operators (aka clock and shift matrices)
1 parent 9abe42c commit af7f8e5

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

src/QuantumOpticsBase.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export Basis, GenericBasis, CompositeBasis, basis,
5555
PositionBasis, MomentumBasis, samplepoints, spacing, gaussianstate,
5656
position, momentum, potentialoperator, transform,
5757
#nlevel
58-
NLevelBasis, transition, nlevelstate,
58+
NLevelBasis, transition, nlevelstate, paulix, pauliz, pauliy,
5959
#manybody
6060
ManyBodyBasis, FermionBitstring, fermionstates, bosonstates,
6161
manybodyoperator, onebodyexpect,

src/nlevel.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,40 @@ function nlevelstate(::Type{T}, b::NLevelBasis, n::Integer) where T
3131
basisstate(T, b, n)
3232
end
3333
nlevelstate(b::NLevelBasis, n::Integer) = nlevelstate(ComplexF64, b, n)
34+
35+
"""
36+
paulix([T=ComplexF64,] b::NLevelBasis, pow=1)
37+
38+
Generalized Pauli X operator for the given N level system.
39+
Returns `X^pow`.
40+
"""
41+
function paulix(::Type{T}, b::NLevelBasis, pow=1) where T
42+
N = length(b)
43+
SparseOperator(b, spdiagm(pow => fill(one(T), N-pow),
44+
pow-N => fill(one(T), pow)))
45+
end
46+
paulix(b::NLevelBasis, pow=1) = paulix(ComplexF64, b, pow)
47+
48+
"""
49+
pauliz([T=ComplexF64,] b::NLevelBasis, pow=1)
50+
51+
Generalized Pauli Z operator for the given N level system.
52+
Returns `Z^pow`.
53+
"""
54+
function pauliz(::Type{T}, b::NLevelBasis, pow=1) where T
55+
N = length(b)
56+
ω = exp(2π*1im*pow/N)
57+
SparseOperator(b, spdiagm(0 => T[ω^n for n=1:N]))
58+
end
59+
pauliz(b::NLevelBasis, pow=1) = pauliz(ComplexF64, b, pow)
60+
61+
"""
62+
pauliy([T=ComplexF64,] b::NLevelBasis)
63+
64+
Pauli Y operator. Only defined for a two level system.
65+
"""
66+
function pauliy(::Type{T}, b::NLevelBasis) where T
67+
length(b) == 2 || throw(ArgumentError("pauliy only defined for two level system"))
68+
SparseOperator(b, spdiagm(-1 => T[-1im], 1 => T[1im]))
69+
end
70+
pauliy(b::NLevelBasis) = pauliy(ComplexF64,b)

test/test_nlevel.jl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ using LinearAlgebra
44

55
@testset "nlevel" begin
66

7+
D(op1::AbstractOperator, op2::AbstractOperator) = abs(tracedistance_nh(dense(op1), dense(op2)))
8+
79
N = 3
810
b = NLevelBasis(N)
911

@@ -26,4 +28,52 @@ b = NLevelBasis(N)
2628
@test norm(dagger(nlevelstate(b, 1))*nlevelstate(b, 2)) == 0.
2729
@test norm(dagger(nlevelstate(b, 1))*transition(b, 1, 2)*nlevelstate(b, 2)) == 1.
2830

31+
for N=[2, 3, 4, 5]
32+
b = NLevelBasis(N)
33+
I = identityoperator(b)
34+
Zero = SparseOperator(b)
35+
px = paulix(b)
36+
pz = pauliz(b)
37+
38+
@test 1e-14 > abs(tr(px))
39+
@test 1e-14 > abs(tr(pz))
40+
@test 1e-14 > D(px^N, I)
41+
@test 1e-14 > D(pz^N, I)
42+
for m=2:N
43+
@test 1e-14 > D(px^m, paulix(b,m))
44+
@test 1e-14 > D(pz^m, pauliz(b,m))
45+
end
46+
47+
for m=1:N,n=1:N
48+
@test 1e-14 > D(px^m * pz^n, exp(2π*1im*m*n/N) * pz^n * px^m)
49+
end
50+
end
51+
52+
53+
# Test special relations for qubit pauli
54+
b = NLevelBasis(2)
55+
I = identityoperator(b)
56+
Zero = SparseOperator(b)
57+
px = paulix(b)
58+
py = pauliy(b)
59+
pz = pauliz(b)
60+
61+
antikommutator(x, y) = x*y + y*x
62+
63+
@test 1e-14 > D(antikommutator(px, px), 2*I)
64+
@test 1e-14 > D(antikommutator(px, py), Zero)
65+
@test 1e-14 > D(antikommutator(px, pz), Zero)
66+
@test 1e-14 > D(antikommutator(py, px), Zero)
67+
@test 1e-14 > D(antikommutator(py, py), 2*I)
68+
@test 1e-14 > D(antikommutator(py, pz), Zero)
69+
@test 1e-14 > D(antikommutator(pz, px), Zero)
70+
@test 1e-14 > D(antikommutator(pz, py), Zero)
71+
@test 1e-14 > D(antikommutator(pz, pz), 2*I)
72+
73+
# Test if involutory for spin 1/2
74+
@test 1e-14 > D(px*px, I)
75+
@test 1e-14 > D(py*py, I)
76+
@test 1e-14 > D(pz*pz, I)
77+
@test 1e-14 > D(-1im*px*py*pz, I)
78+
2979
end # testset

0 commit comments

Comments
 (0)