0
0

JuliaでPauli行列のコンストラクタをつくる1

Last updated at Posted at 2024-07-30

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0