Documentation
Basics
PauliStrings.Operator — MethodOperator(N::Int)Initialize an empty operator on N qubits
Base.length — MethodBase.length(o::Operator)Number of pauli strings in an operator
Example
julia> A = Operator(4)
julia> A += "X111"
julia> A += "XYZ1"
julia> A += 2, "Y", 4
julia> length(A)
3PauliStrings.eye — Methodeye(N::Int)Identity operator on N qubits
Base.:+ — MethodBase.:+(o::Operator, args::Tuple{Number, Vararg{Any}})
Base.:+(o::Operator, args::Tuple{Vararg{Any}})
Base.:+(o::Operator, term::Tuple{Number, String})
Base.:+(o::Operator, term::String)Main functions to contruct spin operators. Identical signatures are available for -.
Examples
k-local terms can be added by adding a tuple to the operator. The first element of the tuple is an optional coeficient. The other element are couples (symbol,site) where symbol can be "X", "Y", "Z", "Sx", "Sy", "Sz", "S+", "S-" and site is an integer specifying the site on wich the symbol is acting.
A = Operator(4)
A += 2, "X",1,"X",2
A += 3, "Y",1,"X",2
A += "X",3,"X",4
A += 4,"Z",3
A += 5.2,"X",1,"Y",2,"Z",3julia> A
(4.0 + 0.0im) 11Z1
(3.0 - 0.0im) YX11
(1.0 + 0.0im) 11XX
(2.0 + 0.0im) XX11
(5.2 - 0.0im) XYZ1Full strings can also be added:
A = Operator(4)
A += 2, "1XXY"
A += 2im, "11Z1"julia> A
(0.0 + 2.0im) 11Z1
(2.0 - 0.0im) 1XXYBase.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Base.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Base.:+(o::Operator, args::Tuple{Number, Vararg{Any}})
Base.:+(o::Operator, args::Tuple{Vararg{Any}})
Base.:+(o::Operator, term::Tuple{Number, String})
Base.:+(o::Operator, term::String)Main functions to contruct spin operators. Identical signatures are available for -.
Examples
k-local terms can be added by adding a tuple to the operator. The first element of the tuple is an optional coeficient. The other element are couples (symbol,site) where symbol can be "X", "Y", "Z", "Sx", "Sy", "Sz", "S+", "S-" and site is an integer specifying the site on wich the symbol is acting.
A = Operator(4)
A += 2, "X",1,"X",2
A += 3, "Y",1,"X",2
A += "X",3,"X",4
A += 4,"Z",3
A += 5.2,"X",1,"Y",2,"Z",3julia> A
(4.0 + 0.0im) 11Z1
(3.0 - 0.0im) YX11
(1.0 + 0.0im) 11XX
(2.0 + 0.0im) XX11
(5.2 - 0.0im) XYZ1Full strings can also be added:
A = Operator(4)
A += 2, "1XXY"
A += 2im, "11Z1"julia> A
(0.0 + 2.0im) 11Z1
(2.0 - 0.0im) 1XXYBase.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Operations
PauliStrings.add — Methodadd(o1::Operator, o2::Operator)
Base.:+(o1::Operator, o2::Operator)
Base.:+(o::Operator, a::Number)
Base.:+(a::Number, o::Operator)Add two operators together or add a number to an operator
Example
A = Operator(4)
A += "XYZ1"
A += 1, "Y", 4
B = Operator(4)
B += 2, "Y", 2, "Y", 4
B += 1, "Z", 3julia> A
(1.0 - 0.0im) 111Y
(1.0 - 0.0im) XYZ1
julia> B
(1.0 + 0.0im) 11Z1
(2.0 - 0.0im) 1Y1Y
julia> A+B
(1.0 + 0.0im) 11Z1
(2.0 - 0.0im) 1Y1Y
(1.0 - 0.0im) 111Y
(1.0 - 0.0im) XYZ1
julia> A+5
(1.0 - 0.0im) 111Y
(1.0 - 0.0im) XYZ1
(5.0 + 0.0im) 1111Base.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Base.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Base.:+ — Method+(x, y...)Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).
Examples
julia> 1 + 20 + 4
25
julia> +(1, 20, 4)
25Base.:* — MethodBase.:*(o1::Operator, o2::Operator)
Base.:*(o::Operator, a::Number)
Base.:*(a::Number, o::Operator)Multiply two operators together or an operator with a number
Example
A = Operator(4)
A += "XYZ1"
A += 1, "Y", 4
B = Operator(4)
B += 2, "Y", 2, "Y", 4
B += 1, "Z", 3julia> A
(1.0 - 0.0im) 111Y
(1.0 - 0.0im) XYZ1
julia> B
(1.0 + 0.0im) 11Z1
(2.0 - 0.0im) 1Y1Y
julia> A*B
(2.0 - 0.0im) X1ZY
(1.0 - 0.0im) 11ZY
(2.0 - 0.0im) 1Y11
(1.0 - 0.0im) XY11
julia> A*5
(5.0 - 0.0im) 111Y
(5.0 - 0.0im) XYZ1Base.:* — Method*(x, y...)Multiplication operator. x*y*z*... calls this function with all arguments, i.e. *(x, y, z, ...).
Examples
julia> 2 * 7 * 8
112
julia> *(2, 7, 8)
112Base.:* — Method*(x, y...)Multiplication operator. x*y*z*... calls this function with all arguments, i.e. *(x, y, z, ...).
Examples
julia> 2 * 7 * 8
112
julia> *(2, 7, 8)
112Base.:- — MethodBase.:-(o::Operator)
Base.:-(o1::Operator, o2::Operator)
Base.:-(o::Operator, a::Real)
Base.:-(a::Real, o::Operator)Subtraction between operators and numbers
Base.:- — Method-(x, y)Subtraction operator.
Examples
julia> 2 - 3
-1
julia> -(2, 4.5)
-2.5Base.:- — Method-(x, y)Subtraction operator.
Examples
julia> 2 - 3
-1
julia> -(2, 4.5)
-2.5Base.:- — Method-(x, y)Subtraction operator.
Examples
julia> 2 - 3
-1
julia> -(2, 4.5)
-2.5PauliStrings.com — Methodcom(o1::Operator, o2::Operator; epsilon::Real=0, maxlength::Int=1000)Commutator of two operators
Example
julia> A = Operator(4)
julia> A += "X111"
julia> B = Operator(4)
julia> B += "Z111"
julia> B += "XYZ1"
julia> com(A,B)
(0.0 - 2.0im) Y111PauliStrings.trace — Methodtrace(o::Operator)Trace of an operator
Example
julia> A = Operator(4)
julia> A += 2,"1111"
julia> A += 3,"XYZ1"
julia> trace(A)
32.0 + 0.0imPauliStrings.opnorm — Methodopnorm(o::Operator)Frobenius norm
Example
julia> A = Operator(4)
julia> A += 2,"X",2
julia> A += 1,"Z",1,"Z",3
julia> opnorm(A)
8.94427190999916PauliStrings.dagger — Methoddagger(o::Operator)Conjugate transpose
Example
A = Operator(3)
A += 1im,"X",2
A += 1,"Z",1,"Z",3julia> A
(1.0 + 0.0im) Z1Z
(0.0 + 1.0im) 1X1
julia> dagger(A)
(1.0 - 0.0im) Z1Z
(0.0 - 1.0im) 1X1PauliStrings.ptrace — Methodptrace(o::Operator, keep::Vector{Int})Partial trace.
keep is list of qubits indices to keep starting at 1 note that this still returns an operator of size N and doesnt permute the qubits this only gets rid of Pauli strings that have no support on keep and add their coeficient*2^N to the identity string
Example
A = Operator(5)
A += "XY1XZ"
A += "XY11Z"julia> ptrace(A, [3,4])
(1.0 - 0.0im) XY1XZ
(8.0 - 0.0im) 11111
julia> ptrace(A, [1,5])
(1.0 - 0.0im) XY1XZ
(1.0 - 0.0im) XY11ZRandom operators
PauliStrings.rand_local1 — Methodrand_local2(N::Int)Random 1-local operator
PauliStrings.rand_local2 — Methodrand_local2(N::Int)Random 2-local operator
Truncation and noise
Base.truncate — Methodtruncate(o::Operator, N::Int; keepnorm::Bool = false)Remove all terms of length > N. Keep all terms of length <= N. i.e remove all M-local terms with M>N
Example
A = Operator(4)
A += "X",1,"X",2
A += "Z",1,"Z",2,"Z",4julia> A
(1.0 + 0.0im) ZZ1Z
(1.0 + 0.0im) XX11
julia> ps.truncate(A,2)
(1.0 + 0.0im) XX11PauliStrings.trim — Methodtrim(o::Operator, N::Int; keepnorm::Bool = false, keep::Operator=Operator(N))Keep the first N terms with largest coeficients.
keepnorm is set to true to keep the norm of o.
keep is an operator that specify a set of strings that cannot be removed
Example
A = Operator(4)
A += 1,"XXXX"
A += 2,"XX11"
A += 3,"XX1X"
A += 4,"ZZXX"
B = Operator(4)
B += 1,"XX11"
B += 1,"XX1X"julia> trim(A,2)
(4.0 + 0.0im) ZZXX
(3.0 + 0.0im) XX1X
julia> trim(A,2;keep=B)
(4.0 + 0.0im) ZZXX
(3.0 + 0.0im) XX1X
(2.0 + 0.0im) XX11PauliStrings.prune — Method prune(o::Operator, alpha::Real; keepnorm::Bool = false)Keep terms with probability 1-exp(-alpha*abs(c)) where c is the weight of the term
PauliStrings.cutoff — Methodcutoff(o::Operator, epsilon::Real; keepnorm::Bool = false)Remove all terms with weight < epsilon
Example
A = Operator(4)
A += 1,"XXXX"
A += 2,"XX11"
A += 3,"XX1X"
A += 4,"ZZXX"julia> cutoff(A, 2.5)
(3.0 + 0.0im) XX1X
(4.0 + 0.0im) ZZXXPauliStrings.add_noise — Methodadd_noise(o::Operator, g::Real)Add depolarizing noise that make the long string decays. g is the noise amplitude.
Example
A = add_noise(A, 0.1)Reference
Algorithms
PauliStrings.lanczos — Methodlanczos(H::Operator, O::Operator, steps::Int, nterms::Int; keepnorm=true, maxlength=1000, localop=false)Computer the first steps lanczos coeficients for Hamiltonian H and initial operator O
At every step, the operator is trimed with PauliStrings.trim and only nterms are kept.
If H and O are 1D-translation-invariant, it is possible to provide a single local term of O and set localop=true
Using maxlength speeds up the commutator by only keeping terms of length <= maxlength
PauliStrings.rk4 — Methodrk4(H::Operator, O::Operator, dt::Real; hbar::Real=1, heisenberg=false, M=2^20, keep::Operator=Operator(N))Single step of Runge–Kutta-4 with time independant Hamiltonian. Returns O(t+dt). Set heisenberg=true for evolving an observable in the heisenberg picture. If heisenberg=false then it is assumed that O is a density matrix.
PauliStrings.rk4 — Methodrk4(H::Function, O::Operator, dt::Real, t::Real; hbar::Real=1, heisenberg=false)Single step of Runge–Kutta-4 with time dependant Hamiltonian. H is a function that takes a number (time) and returns an operator.
Tools
PauliStrings.compress — Methodcompress(o::Operator)Accumulate repeated terms and remove terms with a coeficient smaller than 1e-20
PauliStrings.op_to_strings — Methodop_to_strings(o::Operator)takes an operator, return (coefs, strings) where coefs is a list of numbers and strings is a list of pauli string coefs[i] multiply strings[i]
PauliStrings.shift_left — Methodshift_left(O::Operator)Shift evey string left so they start on site 1. This usefull for using translation symmetry in 1D systems
Example
A = Operator(4)
A += "XYZ1"
A += "11X1"
A += "1XZY"
A += "ZZ11"julia> shift_left(A)
(1.0 - 0.0im) XZY1
(1.0 + 0.0im) X111
(1.0 - 0.0im) XYZ1
(1.0 + 0.0im) ZZ11Index
PauliStrings.OperatorBase.:*Base.:*Base.:*Base.:+Base.:+Base.:+Base.:+Base.:+Base.:+Base.:+Base.:-Base.:-Base.:-Base.:-Base.lengthBase.truncatePauliStrings.addPauliStrings.add_noisePauliStrings.comPauliStrings.compressPauliStrings.cutoffPauliStrings.daggerPauliStrings.eyePauliStrings.lanczosPauliStrings.op_to_stringsPauliStrings.opnormPauliStrings.prunePauliStrings.ptracePauliStrings.rand_local1PauliStrings.rand_local2PauliStrings.rk4PauliStrings.rk4PauliStrings.shift_leftPauliStrings.tracePauliStrings.trim