Pauli行列とは
特殊ユニタリ群$SU(2)$のリー代数$\mathfrak{sl}(2)$の生成子となる行列です。
カタカナだとパウリ行列です。
量子力学だとスピン角運動量のところで出てきたり、エルミートなハミルトニアンを記述しようと試みるとよく出てくるかと思います。
(2024/8/26 追記)
続きの記事を作成しました。
コンストラクタを定義
実装してみます。
Base.@kwdef struct PauliMatrices <:AbstractFloat
I = [1. 0.; 0. 1.]
x = [0. 1.; 1. 0.]
y = [0. -im; im 0.]
z = [1. 0.; 0. -1.]
Matrix = Array([I,x,y,z])
end # struct PauliMatrices
Base.getindex(L::PauliMatrices, ind::Integer) = L.Matrix[ind+1]
Base.getindex(L::PauliMatrices, inds::UnitRange) = L.Matrix[inds.+1]
(ちなみに、Base.getindex(L::PauliMatrices, inds::UnitRange) = L.Matrix[inds.+1]
のコマンドは、パウリ行列をスライスで取り出す操作のためなので、省略していただいても実用上問題ありません。)
使用方法
次のように、Pauli行列にしたいインスタンスを用意して、PauliMatrices
を入れてあげます。
σ = PauliMatrices()
すると、次のようにindexで呼ぶことができるようになります。
julia> σ[1]
2×2 Matrix{ComplexF64}:
0.0+0.0im 1.0+0.0im
1.0+0.0im 0.0+0.0im
julia> σ[0]
2×2 Matrix{ComplexF64}:
1.0+0.0im 0.0+0.0im
0.0+0.0im 1.0+0.0im
julia> σ[2]
2×2 Matrix{ComplexF64}:
0.0+0.0im 0.0-1.0im
0.0+1.0im 0.0+0.0im
あるいはコンストラクタの中にx,y,z,I
を定義しているので、そちらで呼び出すことも可能です。
julia> σ.y
2×2 Matrix{ComplexF64}:
0.0+0.0im 0.0-1.0im
0.0+1.0im 0.0+0.0im
オマケ
個人的に、スピン3重項超伝導体を扱う際に、次のようなdベクトルとPauli行列との内積を計算する機会が多いです。
$$
\boldsymbol{d}\cdot\boldsymbol{\sigma} = \sum_{\mu \in x,y,z} d_{\mu}\sigma_{\mu}
$$
なので、こちらの内積計算も定義しておくことにします。
using LinearAlgebra
LinearAlgebra.dot(V::Vector,σ::PauliMatrices) = (
reduce(+,(V[i]*σ[i] for i in 1:3))
)
具体的には次のように使えます。
julia> d = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> dot(d,σ)
2×2 Matrix{ComplexF64}:
3.0+0.0im 1.0-2.0im
1.0+2.0im -3.0+0.0im
julia> d⋅σ
2×2 Matrix{ComplexF64}:
3.0+0.0im 1.0-2.0im
1.0+2.0im -3.0+0.0im