Bloch ベクトルを眺めてみる (2)
目的
前回は sympy
を活用する。
準備
以下のように計算に必要なシンボル類を定義する。
import sympy
theta = sympy.Symbol('θ', real=True)
phi = sympy.Symbol('φ', real=True)
lam = sympy.Symbol('λ', real=True)
I = sympy.Matrix([
[1, 0],
[0, 1]
])
X = sympy.Matrix([
[0, 1],
[1, 0]
])
Y = sympy.Matrix([
[0, -1.j],
[1.j, 0]
])
Z = sympy.Matrix([
[1, 0],
[0, -1]
])
def Rx(t):
return sympy.cos(t/2)*I - 1.j*sympy.sin(t/2)*X
def Ry(t):
return sympy.cos(t/2)*I - 1.j*sympy.sin(t/2)*Y
def Rz(t):
return sympy.cos(t/2)*I - 1.j*sympy.sin(t/2)*Z
def density_matrix(state):
return state * sympy.conjugate(state.T)
Zero = sympy.Matrix([[1], [0]])
One = sympy.Matrix([[0], [1]])
前回のおさらい
sympy
が今回の計算の役に立つかを確認するために、前回の計算をさせてみよう。
まず、基本となる状態ベクトルを定義する:
state = sympy.cos(theta/2)*Zero + sympy.exp(1.j*phi)*sympy.sin(theta/2)*One
display(state)
\left[\begin{matrix}\cos{\left(\frac{θ}{2} \right)}\\e^{1.0 i φ} \sin{\left(\frac{θ}{2} \right)}\end{matrix}\right]
rho = density_matrix(state)
display(rho)
\left[\begin{matrix}\cos^{2}{\left(\frac{θ}{2} \right)} & e^{- 1.0 i φ} \sin{\left(\frac{θ}{2} \right)} \cos{\left(\frac{θ}{2} \right)}\\e^{1.0 i φ} \sin{\left(\frac{θ}{2} \right)} \cos{\left(\frac{θ}{2} \right)} & \sin^{2}{\left(\frac{θ}{2} \right)}\end{matrix}\right]
ここまではかなりそれっぽい結果になる。
rho_out = density_matrix(Rx(lam)@rho)
x = sympy.simplify((X@rho_out).trace())
y = sympy.simplify((Y@rho_out).trace())
z = sympy.simplify((Z@rho_out).trace())
display(x)
display(y)
display(z)
1.0 \sin{\left(θ \right)} \cos{\left(1.0 φ \right)}
- 0.5 i e^{1.0 i φ} \sin{\left(θ \right)} \cos{\left(λ \right)} - 1.0 \sin{\left(λ \right)} \cos{\left(θ \right)} + 0.5 i e^{- 1.0 i φ} \sin{\left(θ \right)} \cos{\left(λ \right)}
- 0.5 i e^{1.0 i φ} \sin{\left(θ \right)} \sin{\left(λ \right)} + 1.0 \cos{\left(θ \right)} \cos{\left(λ \right)} + 0.5 i e^{- 1.0 i φ} \sin{\left(θ \right)} \sin{\left(λ \right)}
となった。sympy.simplify
にも限界はあるだろうし、ここから先は手計算で更に整理しよう。
となる。(1) 式は前回の計算結果と一致している。かなり簡単に計算できることが分かった。
感触を確かめたので、
以下で使うので、状態ベクトル
R_Y の場合
rho_out = density_matrix(Ry(lam)@rho)
x = sympy.simplify((X@rho_out).trace())
y = sympy.simplify((Y@rho_out).trace())
z = sympy.simplify((Z@rho_out).trace())
display(x)
display(y)
display(z)
0.5 e^{1.0 i φ} \sin{\left(θ \right)} \cos{\left(λ \right)} + 1.0 \sin{\left(λ \right)} \cos{\left(θ \right)} + 0.5 e^{- 1.0 i φ} \sin{\left(θ \right)} \cos{\left(λ \right)}
1.0 \sin{\left(θ \right)} \sin{\left(1.0 φ \right)}
- 0.5 e^{1.0 i φ} \sin{\left(θ \right)} \sin{\left(λ \right)} + 1.0 \cos{\left(θ \right)} \cos{\left(λ \right)} - 0.5 e^{- 1.0 i φ} \sin{\left(θ \right)} \sin{\left(λ \right)}
となる。よって、
となっていることが分かる。つまり、ZX 平面内で角度
R_Z の場合
rho_out = density_matrix(Rz(lam)@rho)
x = sympy.simplify((X@rho_out).trace())
y = sympy.simplify((Y@rho_out).trace())
z = sympy.simplify((Z@rho_out).trace())
display(x)
display(y)
display(z)
1.0 \left(i e^{2.0 i φ} \sin{\left(λ \right)} + e^{2.0 i φ} \cos{\left(λ \right)} - i \sin{\left(λ \right)} + \cos{\left(λ \right)}\right) e^{- 1.0 i φ} \sin{\left(\frac{θ}{2} \right)} \cos{\left(\frac{θ}{2} \right)}
1.0 i \left(- i e^{2.0 i φ} \sin{\left(λ \right)} - e^{2.0 i φ} \cos{\left(λ \right)} - i \sin{\left(λ \right)} + \cos{\left(λ \right)}\right) e^{- 1.0 i φ} \sin{\left(\frac{θ}{2} \right)} \cos{\left(\frac{θ}{2} \right)}
1.0 \cos{\left(θ \right)}
となる。よって、
となっていることが分かる。つまり、XY 平面内で角度
まとめ
sympy
の力強さも確認できたし、これからは回転ゲートを適用する時に脳内で Bloch 球上の動きを的確に追跡できるようになった。
Discussion