実数の世界では対称行列が重要な役割を果たしますが、複素数を成分に持つ行列を扱う場合、対称行列に代わって登場するのがエルミート行列です。そして、エルミート行列の定義には随伴行列(共役転置)の概念が必要です。
これらの概念は、量子力学、信号処理、機械学習のカーネル法など、複素数が関わる多くの分野で基礎となります。
本記事の内容
- 随伴行列(共役転置)の定義
- エルミート行列の定義と性質
- 固有値が実数であることの証明
- Pythonでの実装と検証
随伴行列とは
複素共役と転置の復習
複素数 $z = a + bi$($a, b \in \mathbb{R}$, $i$ は虚数単位)の複素共役は、
$$ \bar{z} = a – bi $$
です。行列 $\bm{A}$ の各成分の複素共役を取った行列を $\bar{\bm{A}}$ と書きます。
随伴行列の定義
行列 $\bm{A}$ の随伴行列(adjoint matrix)$\bm{A}^\dagger$ は、複素共役を取ってから転置する操作で定義されます。
$$ \bm{A}^\dagger = \bar{\bm{A}}^\top $$
すなわち、$(\bm{A}^\dagger)_{ij} = \overline{a_{ji}}$ です。
記法として $\bm{A}^*$ や $\bm{A}^H$ と書くこともあります。
具体例
$$ \bm{A} = \begin{pmatrix} 1 + i & 2 \\ 3i & 4 – 2i \end{pmatrix} $$
のとき、
$$ \bm{A}^\dagger = \begin{pmatrix} 1 – i & -3i \\ 2 & 4 + 2i \end{pmatrix} $$
随伴行列の性質
- $(\bm{A}^\dagger)^\dagger = \bm{A}$
- $(\bm{A} + \bm{B})^\dagger = \bm{A}^\dagger + \bm{B}^\dagger$
- $(c\bm{A})^\dagger = \bar{c} \bm{A}^\dagger$($c$ は複素数)
- $(\bm{A}\bm{B})^\dagger = \bm{B}^\dagger \bm{A}^\dagger$
性質4は転置の公式 $(\bm{A}\bm{B})^\top = \bm{B}^\top \bm{A}^\top$ の複素版です。
エルミート行列とは
定義
正方行列 $\bm{A}$ がエルミート行列(Hermitian matrix)であるとは、
$$ \bm{A}^\dagger = \bm{A} $$
すなわち $\overline{a_{ji}} = a_{ij}$ が全ての $i, j$ で成り立つことをいいます。
成分で書くと、対角成分は $\overline{a_{ii}} = a_{ii}$ なので実数でなければなりません。非対角成分は $a_{ij}$ と $a_{ji}$ が互いに複素共役の関係にあります。
具体例
$$ \bm{H} = \begin{pmatrix} 3 & 2 + i \\ 2 – i & 5 \end{pmatrix} $$
確認すると、$\bm{H}^\dagger = \begin{pmatrix} 3 & 2 + i \\ 2 – i & 5 \end{pmatrix} = \bm{H}$ なのでエルミート行列です。
実対称行列との関係
行列の成分が全て実数の場合、複素共役は何もしないので $\bm{A}^\dagger = \bm{A}^\top$ となります。したがって、エルミート行列の実数版が対称行列です。
$$ \text{対称行列} \subset \text{エルミート行列} $$
エルミート行列の性質
固有値が実数であることの証明
エルミート行列の最も重要な性質は、全ての固有値が実数であることです。これを証明します。
$\bm{A}$ をエルミート行列とし、$\bm{A}\bm{v} = \lambda \bm{v}$($\bm{v} \neq \bm{0}$)とします。
両辺の左から $\bm{v}^\dagger$ を掛けると、
$$ \bm{v}^\dagger \bm{A} \bm{v} = \lambda \bm{v}^\dagger \bm{v} $$
一方、両辺の随伴を取ると($\bm{A}^\dagger = \bm{A}$ を使って)、
$$ (\bm{A}\bm{v})^\dagger = \bm{v}^\dagger \bm{A}^\dagger = \bm{v}^\dagger \bm{A} $$
$$ (\lambda \bm{v})^\dagger = \bar{\lambda} \bm{v}^\dagger $$
したがって、
$$ \bm{v}^\dagger \bm{A} \bm{v} = \bar{\lambda} \bm{v}^\dagger \bm{v} $$
2つの結果を比較すると、
$$ \lambda \bm{v}^\dagger \bm{v} = \bar{\lambda} \bm{v}^\dagger \bm{v} $$
$\bm{v}^\dagger \bm{v} = \|\bm{v}\|^2 > 0$ なので、$\lambda = \bar{\lambda}$ つまり $\lambda$ は実数です。
異なる固有値に属する固有ベクトルは直交する
$\bm{A}\bm{v}_1 = \lambda_1 \bm{v}_1$, $\bm{A}\bm{v}_2 = \lambda_2 \bm{v}_2$($\lambda_1 \neq \lambda_2$)のとき、
$$ \bm{v}_2^\dagger \bm{A} \bm{v}_1 = \lambda_1 \bm{v}_2^\dagger \bm{v}_1 $$
一方、$\bm{A}^\dagger = \bm{A}$ より、
$$ \bm{v}_2^\dagger \bm{A} \bm{v}_1 = (\bm{A}\bm{v}_2)^\dagger \bm{v}_1 = \bar{\lambda}_2 \bm{v}_2^\dagger \bm{v}_1 = \lambda_2 \bm{v}_2^\dagger \bm{v}_1 $$
($\lambda_2$ は実数なので $\bar{\lambda}_2 = \lambda_2$)
したがって $(\lambda_1 – \lambda_2) \bm{v}_2^\dagger \bm{v}_1 = 0$ であり、$\lambda_1 \neq \lambda_2$ より $\bm{v}_2^\dagger \bm{v}_1 = 0$ です。
スペクトル定理
エルミート行列 $\bm{A}$ は、ユニタリ行列 $\bm{U}$ を用いて対角化できます。
$$ \bm{A} = \bm{U} \bm{\Lambda} \bm{U}^\dagger $$
ここで、$\bm{\Lambda}$ は実数の固有値を対角成分に持つ対角行列です。
Pythonでの実装
エルミート行列の性質をPythonで検証します。
import numpy as np
import matplotlib.pyplot as plt
# エルミート行列の構成
H = np.array([[3, 2+1j, 1-2j],
[2-1j, 5, 3j],
[1+2j, -3j, 4]])
print("行列 H:")
print(H)
print(f"\nH == H^dagger ? {np.allclose(H, H.conj().T)}")
# 固有値分解
eigenvalues, eigenvectors = np.linalg.eigh(H)
print(f"\n固有値: {eigenvalues}")
print(f"全ての固有値が実数か: {np.all(np.isreal(eigenvalues))}")
# 固有ベクトルの直交性の検証
U = eigenvectors
print(f"\nU^H @ U (単位行列になるはず):")
print(np.round(U.conj().T @ U, 10))
# スペクトル分解の検証: H = U Lambda U^H
Lambda = np.diag(eigenvalues)
H_reconstructed = U @ Lambda @ U.conj().T
print(f"\nH と U Lambda U^H の差のノルム: {np.linalg.norm(H - H_reconstructed):.2e}")
# 可視化: ランダムなエルミート行列の固有値分布
np.random.seed(42)
n = 100
eigenvalue_list = []
for _ in range(1000):
# ランダムなエルミート行列の生成
A = np.random.randn(n, n) + 1j * np.random.randn(n, n)
H_random = (A + A.conj().T) / 2 # エルミート化
evals = np.linalg.eigvalsh(H_random)
eigenvalue_list.extend(evals)
fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(eigenvalue_list, bins=100, density=True, alpha=0.7, color='steelblue')
ax.set_xlabel('Eigenvalue')
ax.set_ylabel('Density')
ax.set_title(f'Eigenvalue Distribution of Random Hermitian Matrices ({n}x{n})')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このコードでは、エルミート行列の固有値が実数であること、固有ベクトルが直交すること、スペクトル分解が成り立つことを数値的に検証しています。
まとめ
本記事では、随伴行列とエルミート行列について解説しました。
- 随伴行列 $\bm{A}^\dagger$ は複素共役転置で定義され、転置の複素数版にあたる
- エルミート行列は $\bm{A}^\dagger = \bm{A}$ を満たす行列であり、実対称行列の一般化である
- エルミート行列の固有値は全て実数であり、異なる固有値の固有ベクトルは直交する
- スペクトル定理により、エルミート行列はユニタリ行列で対角化できる
エルミート行列の理解は、ユニタリ行列や量子力学のオブザーバブルの概念を学ぶ上での前提となります。