1. 2量子ビットと SU(4)
-
2 量子ビットの状態は 4 次元複素ベクトル空間の正規化ベクトル:
|\Psi\rangle = a|00\rangle + b|01\rangle + c|10\rangle + d|11\rangle,\quad |a|^2+|b|^2+|c|^2+|d|^2=1. -
確率を保存する 4×4 の操作は ユニタリ行列。
-
グローバル位相を除いた 2量子ビット操作の本体は SU(4)(4×4 ユニタリで行列式 1)。
2. なぜ SU(4) なのか?
-
一般の 4×4 ユニタリは U(4) に属する。
-
ところが
U(4) \cong U(1)\times SU(4) と分解でき、 U(1) 部分(グローバル位相) は観測に影響しない。
-
よって、物理的に本質なのは SU(4)。
→ 任意の 2量子ビット操作は「(グローバル位相)×(SU(4) 要素)」とみなせる。
3. 具体例:基本構成とゲート
(a) su(4) の生成子(15 個)
-
2量子ビットのリー代数 su(4) は トレース 0 のエルミート行列 15 個で張られる:
\{\ \sigma_i\otimes I,\ I\otimes \sigma_i,\ \sigma_i\otimes\sigma_j\ \mid\ i,j\in\{x,y,z\}\ \} (3 + 3 + 9 = 15)
(b) ローカル操作(各ビットの SU(2))
-
例:片方だけ回す
R_x^{(A)}(\theta)=e^{-i\frac{\theta}{2}\,(\sigma_x\otimes I)},\quad R_z^{(B)}(\phi)=e^{-i\frac{\phi}{2}\,(I\otimes \sigma_z)}. これは SU(2)⊗SU(2) に相当(非エンタングリング)。
(c) 非ローカル(エンタングリング)操作
-
代表例(いずれも SU(4) の要素、またはグローバル位相を掛ければ SU(4) に入る):
-
iSWAP
\mathrm{iSWAP}=\exp\!\Big(+i\frac{\pi}{4}\,(\sigma_x\!\otimes\!\sigma_x+\sigma_y\!\otimes\!\sigma_y)\Big) 行列表現は
基底で\{|00\rangle,|01\rangle,|10\rangle,|11\rangle\}
以外の\mathrm{diag}(1,0,0,1) が|01\rangle\!\leftrightarrow\!|10\rangle で入れ替わる。i -
CZ
\mathrm{CZ}=\mathrm{diag}(1,1,1,-1) なので U(4) だが、グローバル位相\det(\mathrm{CZ})=-1 を掛ければ SU(4) 代表にできる。e^{i\pi/4} -
CNOT
これも 。やはり位相補正で SU(4) に移せる(物理的には同等)。\det=-1
-
重要:任意の
は U\in SU(4)
「ローカル SU(2) 操作」と少数のエンタングリングゲート(CNOT など)で合成できる
(KAK/カルタン分解:
)。 U=(U_1\!\otimes\!U_2)\,e^{-i(\,c_1 X\otimes X+c_2 Y\otimes Y+c_3 Z\otimes Z\,)/2}\,(U_3\!\otimes\!U_4)
4. 幾何的な見方と 1 量子ビットとの違い
- 1量子ビットの純粋状態は Bloch 球(
) だが、2量子ビットの純粋状態空間はS^2 (より複雑)で、 エンタングルメント という新たな自由度が現れる。\mathbb{CP}^3 - ローカル SU(2)⊗SU(2) は「各ビットの向き(Bloch 球上の回転)」を変えるだけ。
一方、 の指数は 2ビット間の相関(エンタングルメント) を生成する。\sigma_i\!\otimes\!\sigma_j
5. まとめ
- 2量子ビット演算 = SU(4)(グローバル位相除く)。
- su(4) の生成子は
。\{\sigma_i\otimes I,\ I\otimes\sigma_i,\ \sigma_i\otimes\sigma_j\} - 任意の
は ローカル SU(2) と 1–数個のエンタングリング操作で合成可能。SU(4) - CNOT/CZ/iSWAP は非ローカル部分の具体例(CNOT/CZ は位相補正で SU(4) 代表へ)。
Python で少し確認
import numpy as np
from numpy.linalg import det
from scipy.linalg import expm, norm
# Pauli & kron
I = np.eye(2, dtype=complex)
X = np.array([[0,1],[1,0]], complex)
Y = np.array([[0,-1j],[1j,0]], complex)
Z = np.array([[1,0],[0,-1]], complex)
k = np.kron
# --- su(4) の生成子(トレース0のエルミートを15個)
generators = (
[k(X,I), k(Y,I), k(Z,I)] +
[k(I,X), k(I,Y), k(I,Z)] +
[k(X,X), k(X,Y), k(X,Z),
k(Y,X), k(Y,Y), k(Y,Z),
k(Z,X), k(Z,Y), k(Z,Z)]
)
# ざっと確認(全部 trace=0)
assert all(abs(np.trace(G)) < 1e-12 for G in generators)
# --- ローカル回転は tensor product に分解できる
def Rx(theta): return expm(-1j*theta/2 * X)
def Rz(theta): return expm(-1j*theta/2 * Z)
theta = np.pi/3
U_local_theory = k(Rx(theta), Rz(theta))
U_local_su4 = expm(-1j*(theta/2)*(k(X,I))) @ expm(-1j*(theta/2)*(k(I,Z)))
print("local match:", np.allclose(U_local_theory, U_local_su4, atol=1e-12))
# --- 代表的なエンタングリング(iSWAP)
iSWAP = expm(+1j*(np.pi/4)*(k(X,X) + k(Y,Y))) # 物理の符号規約によって -1j にもなり得ます
iSWAP_ref = np.array([[1,0,0,0],
[0,0,1j,0],
[0,1j,0,0],
[0,0,0,1]], complex)
print("iSWAP equals reference:", np.allclose(iSWAP, iSWAP_ref, atol=1e-12))
print("det(iSWAP) =", det(iSWAP)) # -> 1 → SU(4)
# --- CNOT は det = -1(U(4))。位相補正で SU(4) 代表へ
CNOT = np.array([[1,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,1,0]], complex)
print("det(CNOT) =", det(CNOT)) # -> -1
def to_su4(U):
# 4x4 行列の det を 1 に合わせる全体位相(U(1))を除去
phi = -np.angle(det(U)) / 4.0
return np.exp(1j*phi) * U
CNOT_su = to_su4(CNOT)
print("det(CNOT_su) =", det(CNOT_su)) # -> 1(SU(4) 代表)
local match: True
iSWAP equals reference: True
det(iSWAP) = (1+0j)
det(CNOT) = (-1+0j)
det(CNOT_su) = (1+2.7755575615628914e-16j)
ポイント
- ローカル回転は
/\exp(-i\frac{\theta}{2}\sigma\otimes I) の形に落ちます。\exp(-i\frac{\phi}{2}I\otimes\sigma) - エンタングリングは
の指数型。\exp(-i\frac{\theta}{2}\sigma_i\otimes\sigma_j) - CNOT/CZ は
ですが、グローバル位相の調整で SU(4) 代表にできます(物理的には同一視)。\det=-1