ユニタリ行列とは?定義と性質を徹底解説

ユニタリ行列(unitary matrix)は、複素ベクトル空間における「長さと角度を保つ変換」に対応する行列です。実数の世界における直交行列の概念を複素数に拡張したものであり、量子コンピューティングや信号処理で非常に重要な役割を果たします。

本記事では、ユニタリ行列の定義から重要な性質、直交行列との関係まで丁寧に解説します。

本記事の内容

  • ユニタリ行列の定義
  • 直交行列との関係
  • ユニタリ行列の性質と証明
  • 量子コンピューティングとの関係
  • Pythonでの実装と検証

前提知識

この記事を読む前に、以下の概念を理解しておくと理解が深まります。

ユニタリ行列の定義

$n \times n$ の複素行列 $\bm{U}$ がユニタリ行列(unitary matrix)であるとは、

$$ \bm{U}^\dagger \bm{U} = \bm{U} \bm{U}^\dagger = \bm{I} $$

が成り立つことをいいます。ここで $\bm{U}^\dagger$ は随伴行列(共役転置)です。

言い換えると、$\bm{U}$ の逆行列がその随伴行列と等しいということです。

$$ \bm{U}^{-1} = \bm{U}^\dagger $$

直交行列との関係

実数の世界では、$\bm{Q}^\top \bm{Q} = \bm{I}$ を満たす行列を直交行列と呼びました。

行列の成分が全て実数の場合、$\bm{U}^\dagger = \bm{U}^\top$ なので、ユニタリ条件は直交条件と一致します。

$$ \text{直交行列} \subset \text{ユニタリ行列} $$

実数の場合 複素数の場合
行列の種類 直交行列 ユニタリ行列
条件 $\bm{Q}^\top \bm{Q} = \bm{I}$ $\bm{U}^\dagger \bm{U} = \bm{I}$
保存するもの 実内積 $\bm{x}^\top \bm{y}$ 複素内積 $\bm{x}^\dagger \bm{y}$

ユニタリ行列の性質

性質1: 内積の保存

ユニタリ変換は複素内積を保存します。$\bm{x}’ = \bm{U}\bm{x}$, $\bm{y}’ = \bm{U}\bm{y}$ のとき、

$$ \langle \bm{x}’, \bm{y}’ \rangle = (\bm{U}\bm{x})^\dagger (\bm{U}\bm{y}) = \bm{x}^\dagger \bm{U}^\dagger \bm{U} \bm{y} = \bm{x}^\dagger \bm{y} = \langle \bm{x}, \bm{y} \rangle $$

特に $\bm{x} = \bm{y}$ とすると、ノルムが保存されることがわかります。

$$ \|\bm{U}\bm{x}\| = \|\bm{x}\| $$

性質2: 固有値の絶対値が1

$\bm{U}\bm{v} = \lambda \bm{v}$($\bm{v} \neq \bm{0}$)のとき、ノルム保存性より、

$$ \|\bm{U}\bm{v}\| = |\lambda| \|\bm{v}\| = \|\bm{v}\| $$

$\|\bm{v}\| > 0$ なので $|\lambda| = 1$ です。したがって、固有値は複素平面上の単位円上に存在します。

$$ \lambda = e^{i\theta} \quad (\theta \in \mathbb{R}) $$

性質3: 行列式の絶対値が1

$\det(\bm{U}^\dagger \bm{U}) = \det(\bm{I}) = 1$ より、

$$ \overline{\det(\bm{U})} \cdot \det(\bm{U}) = |\det(\bm{U})|^2 = 1 $$

したがって $|\det(\bm{U})| = 1$ です。

性質4: ユニタリ行列の積はユニタリ

$\bm{U}_1, \bm{U}_2$ がユニタリ行列ならば、$\bm{U}_1 \bm{U}_2$ もユニタリ行列です。

$$ (\bm{U}_1 \bm{U}_2)^\dagger (\bm{U}_1 \bm{U}_2) = \bm{U}_2^\dagger \bm{U}_1^\dagger \bm{U}_1 \bm{U}_2 = \bm{U}_2^\dagger \bm{I} \bm{U}_2 = \bm{I} $$

性質5: 列ベクトルが正規直交基底をなす

$\bm{U}^\dagger \bm{U} = \bm{I}$ を列ベクトル $\bm{u}_1, \dots, \bm{u}_n$ で書くと、

$$ \bm{u}_i^\dagger \bm{u}_j = \delta_{ij} $$

つまり、列ベクトルは複素内積に関して正規直交系をなします。

具体例

2×2 ユニタリ行列

最も一般的な $2 \times 2$ ユニタリ行列は次の形で表されます。

$$ \bm{U} = \begin{pmatrix} e^{i\alpha}\cos\theta & -e^{i\beta}\sin\theta \\ e^{-i\beta}\sin\theta & e^{-i\alpha}\cos\theta \end{pmatrix} $$

特に $\alpha = \beta = 0$ のとき、実数の回転行列になります。

$$ \bm{R}(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} $$

離散フーリエ変換行列

$N$ 点の離散フーリエ変換(DFT)行列 $\bm{F}$ は、$\frac{1}{\sqrt{N}}$ で規格化するとユニタリ行列になります。

$$ F_{jk} = \frac{1}{\sqrt{N}} e^{-2\pi i jk/N}, \quad j, k = 0, 1, \dots, N-1 $$

Pythonでの実装

ユニタリ行列の性質を検証し、量子ゲートの例を可視化します。

import numpy as np
import matplotlib.pyplot as plt

def is_unitary(U, tol=1e-10):
    """行列がユニタリかどうかを判定"""
    n = U.shape[0]
    return np.allclose(U.conj().T @ U, np.eye(n), atol=tol)

# パウリ行列(量子コンピューティングの基本ゲート)
I = np.eye(2, dtype=complex)
X = np.array([[0, 1], [1, 0]], dtype=complex)     # NOT gate
Y = np.array([[0, -1j], [1j, 0]], dtype=complex)  # Y gate
Z = np.array([[1, 0], [0, -1]], dtype=complex)     # Z gate
H_gate = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2)  # Hadamard gate

gates = {'I': I, 'X (NOT)': X, 'Y': Y, 'Z': Z, 'H (Hadamard)': H_gate}

print("=== 量子ゲートのユニタリ性検証 ===")
for name, gate in gates.items():
    eigenvalues = np.linalg.eigvals(gate)
    print(f"{name}: unitary={is_unitary(gate)}, "
          f"|det|={abs(np.linalg.det(gate)):.4f}, "
          f"eigenvalues={np.round(eigenvalues, 4)}")

# DFT行列のユニタリ性検証
N = 8
j, k = np.meshgrid(np.arange(N), np.arange(N))
F = np.exp(-2j * np.pi * j * k / N) / np.sqrt(N)
print(f"\n{N}点DFT行列はユニタリ: {is_unitary(F)}")

# 可視化: ユニタリ行列の固有値(単位円上)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 左: 量子ゲートの固有値
ax = axes[0]
theta = np.linspace(0, 2*np.pi, 100)
ax.plot(np.cos(theta), np.sin(theta), 'k--', alpha=0.3, label='Unit Circle')

markers = ['o', 's', '^', 'D', 'v']
for (name, gate), marker in zip(gates.items(), markers):
    evals = np.linalg.eigvals(gate)
    ax.scatter(evals.real, evals.imag, s=100, marker=marker, label=name, zorder=5)

ax.set_xlabel('Real')
ax.set_ylabel('Imaginary')
ax.set_title('Eigenvalues on the Unit Circle')
ax.set_aspect('equal')
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)

# 右: DFT行列の絶対値パターン
ax = axes[1]
im = ax.imshow(np.abs(F), cmap='viridis', aspect='equal')
ax.set_xlabel('Column')
ax.set_ylabel('Row')
ax.set_title(f'{N}-point DFT Matrix $|F_{{jk}}|$')
plt.colorbar(im, ax=ax, fraction=0.046)

plt.tight_layout()
plt.show()

左のグラフで、全ての量子ゲートの固有値が単位円上に存在することが確認できます。

まとめ

本記事では、ユニタリ行列の定義と性質について解説しました。

  • ユニタリ行列は $\bm{U}^\dagger \bm{U} = \bm{I}$ を満たす行列であり、直交行列の複素数版である
  • ユニタリ変換は内積とノルムを保存する(「長さと角度を保つ変換」)
  • 固有値の絶対値は必ず1であり、複素平面の単位円上に存在する
  • 量子コンピューティングでは、全ての量子ゲートがユニタリ行列で表される
  • DFT行列もユニタリ行列であり、信号処理の基盤となっている