# 対称性と群論

分子対称性は単なる帳簿整理の便宜ではありません — Fock 行列を組み立てる*前に* SCF 固有値問題を
**ブロック対角化**できるという数学的保証であり、サイズ $n$ の対角化をいくつものずっと小さな対角化に
分割し、副産物として各分子軌道に(裸のインデックスではなく)`A1`・`B2` のようなラベルを与えます。本章は
その機構 — 群論的射影子、対称適応線形結合(SALC)基底、そしてそれが重なり直交化とどう相互作用するか —
を導出します。これが [SCF の章の `symmetry=` オプション](../20-guide/scf.md) が呼ぶものであり、
`.design/24qc.scf-salc.md` に基づいています。

## 点群と AO への対称操作

剛体分子の**点群** $G$ は、原子核の骨格をそれ自身へ写す有限個の固有/非固有回転の集合です。各元
$g\in G$ は直交行列 $R(g)$ で 3 次元空間に作用し、この同じ $g$ が原子中心を置換します:$A\mapsto gA$。
SCF で $G$ を使うには、$g$ が空間の 1 点にどう作用するかだけでなく、縮約 Gauss 型 AO にどう作用するかを
知る必要があります。

AO は原子 $A$ を中心とする動径 Gauss 関数と角度部分の積です:

$$
\chi_{A,l,k,m}(\mathbf r) = N_{l,k}\, p_{lm}(\mathbf r - \mathbf R_A)\, e^{-\alpha_k|\mathbf r-\mathbf
R_A|^2},
$$

ここで $l$ は角運動量、$k$ は縮約/原始関数インデックス、$m$ は角度関数インデックス(球面調和関数なら
$m=-l,\dots,l$、Cartesian なら単項式インデックス)です。$R(g)$ は空間の剛体回転なので、動径 Gauss 関数を
それ自身へ写し(回転不変)、像中心 $gA$ 上の同じ $l$ の角度関数どうしだけを混ぜます:

$$
\hat U(g)\,\chi_{A,l,k,m} = \sum_{m'} T^{(l)}_{m'm}(g)\,\chi_{gA,l,k,m'}.
$$

$T^{(l)}(g)$ は $g$ の角運動量 $l$ への制限を表す**表現行列**です — $l=1$(Cartesian の $x,y,z$)では
点群行列 $R(g)$ そのもの $3\times3$ 行列であり、より高次の $l$ では単項式 $x^ay^bz^c$($a+b+c=l$)への
$R(g)$ の作用の $l$ 次対称冪表現として、あるいは球面調和関数では Cartesian-to-spherical 変換 $C_l$
(コードの他所で Cartesian AO を spherical AO に変換するのと同じ変換)経由で得られます:

$$
T^{\mathrm{sph},l}(g) = C_l\,T^{\mathrm{cart},l}(g)\,C_l^{+},
$$

$C_l^+$ は Moore–Penrose 一般逆です。完全な**AO action 行列** $U_g$ は、これらの殻ローカルなブロックを
AO オフセットの位置に組み立てたものです:

$$
(U_g)_{\,o(gA,l,k)+m',\ o(A,l,k)+m} = T^{(l)}_{m'm}(g).
$$

$U_g$ は置換×回転行列であり — 殻レベルでは疎で、本番コードでは決して密に構築されません — 実装が数値的に
必ず検証すべき 2 つの定義的性質を持ちます:$T^{(l)}(g)T^{(l)}(h)\approx T^{(l)}(gh)$(表現の準同型性)と
$T^{(l)}(E)\approx I$(恒等元)です。重なり行列や Fock 行列のようなスカラー 1 電子演算子は、分子ハミル
トニアンの構成上あらゆる群元の下で対称なので、$U_gSU_g^{\mathsf T}=S$ かつ $U_gFU_g^{\mathsf T}=F$ が
*厳密な* Fock 行列について成り立ちます — 計算された $F$ で観測されるずれは、物理ではなくスクリーニング
/direct 積分評価の数値ノイズであり、これが下記の Fock 対称化ステップの動機です。

## 対称射影子と指標理論

qc-rs は本番の対称性経路で**Abel 群**を対象にします($C_1,C_s,C_i,C_2,C_{2v},C_{2h},D_2,D_{2h}$、
および軸特定の変種)— どの既約表現も 1 次元で、すべての指標は $\pm1$ であり、これが射影子の構成とその
数値検証を単純かつ堅牢にします。(`qc-mol` のテーブルは実際にはラベリング/検出用に $C_{3v}$ や $T_d$ の
ような非 Abel 群を含む 65 の点群を網羅していますが、本番の**Fock ブロック化** SCF 経路は、要求された群が
非 Abel であるか、原子マッピング/射影子検査が失敗した場合に $C_1$ にフォールバックします — 下記の失敗
時ポリシー表を参照。)

Abel 群では、既約表現 $\Gamma$ への射影子は $U_g$ を指標 $\chi_\Gamma(g)$ で重み付けした群平均です:

$$
P_\Gamma = \frac{1}{|G|}\sum_{g\in G}\chi_\Gamma(g)\,U_g,
$$

$|G|$ は対称操作の数です。(一般の非 Abel の式には既約表現次元因子 $d_\Gamma$ が入り、
$P_\Gamma=\tfrac{d_\Gamma}{|G|}\sum_g\chi_\Gamma(g)^*U_g$ となりますが、$d_\Gamma=1$ で上式に帰着し
ます。)正しく構成された射影子集合は、qc-rs のテストスイートが直接検査する 3 つの群論的恒等式を
満たします:

$$
P_\Gamma^2 \approx P_\Gamma \quad\text{(冪等)}, \qquad
P_\Gamma P_\Lambda \approx 0\ (\Gamma\ne\Lambda) \quad\text{(直交)}, \qquad
\sum_\Gamma P_\Gamma \approx I \quad\text{(完全性)}.
$$

完全性は破れうります — 幾何が要求された対称軸に厳密に乗っていない(原子マッピングの許容誤差は bohr
で $10^{-4}$〜$10^{-3}$)、あるいは基底自体が対称完全でない場合です。その場合 qc-rs の既定ポリシー
(`symmetry="auto"`)は静かに $C_1$ へフォールバックします;明示的な `symmetry=True` は同じ失敗を
エラーとして扱います。

## SALC 基底の構築

$P_\Gamma$ は AO 空間の部分空間への射影子であり、まだその基底ではありません。それを対角化すると、

$$
P_\Gamma = V_\Gamma\, n_\Gamma\, V_\Gamma^{\mathsf T},
$$

固有値がカットオフ $\tau_{\text{salc}}$(既定 $10^{-8}$)を超える列を保持することで、その既約表現の
**対称適応線形結合(SALC)**基底が得られます:

$$
Q_\Gamma = V_\Gamma[:,\, i \mid n_i > \tau_{\text{salc}}].
$$

すべての既約表現の SALC 列を横に並べれば、AO 基底からブロックラベル付き SAO 基底への完全な変換
$Q = [\,Q_{\Gamma_1}\ Q_{\Gamma_2}\ \cdots\,]$ が得られ、AO 基底のどんな演算子もそこではブロック
対角になります:$A^{\mathrm{SAO}} = Q^{\mathsf T}A^{\mathrm{AO}}Q$。(別の構成法 — 射影された試行
ベクトル $P_\Gamma e_i$ への rank-revealing QR/SVD — は、やや複雑な実装と引き換えにより直接的な
ランク判定を与えます;qc-rs の v1 は単純さのため上記の射影子固有分解法を使います。)

:::{prf:algorithm} SALC ブロック化 SCF 固有値問題
:label: alg-salc-block-ja

**入力:** AO 重なり $S$、AO Fock $F$、既約表現 $\{\Gamma\}$ を持つ点群 $G$、カットオフ $\tau_{\text{salc}}$。
**出力:** 既約表現ごとの軌道係数・エネルギー、そして各 MO の既約表現ラベル。

1. 各既約表現 $\Gamma$ について射影子 $P_\Gamma=\tfrac1{|G|}\sum_g\chi_\Gamma(g)U_g$ を作り対角化する;
   固有値 $>\tau_{\text{salc}}$ の固有ベクトルを $Q_\Gamma$ として保持する。
2. $P_\Gamma^2\approx P_\Gamma$、$P_\Gamma P_\Lambda\approx0$、$\sum_\Gamma P_\Gamma\approx I$ を検証する;
   失敗すれば $C_1$ にフォールバック(`symmetry="auto"`)するか例外を送出(`symmetry=True`)する。
3. 各既約表現ブロックについて:$S_\Gamma=Q_\Gamma^{\mathsf T}SQ_\Gamma$ を作り、
   $S_\Gamma=U_\Gamma s_\Gamma U_\Gamma^{\mathsf T}$ と対角化し、直交化カットオフ(既定 $10^{-8}$)未満の
   固有値を落として非冗長な正規直交変換
   $X_\Gamma = s_{\Gamma,\mathrm{nr}}^{-1/2}U_{\Gamma,\mathrm{nr}}^{\mathsf T}Q_\Gamma^{\mathsf T}$ を得る。
4. ブロック Fock $F_\Gamma' = X_\Gamma F X_\Gamma^{\mathsf T}$ を作り独立に対角化する:
   $F_\Gamma'C_\Gamma' = C_\Gamma'\varepsilon_\Gamma$。
5. 各ブロックの MO を AO 基底へ逆変換し、$C_\Gamma^{\mathrm{AO}} = C_\Gamma'^{\mathsf T}X_\Gamma$、その
   ブロックの全軌道を既約表現 $\Gamma$ でラベル付けする。
6. Aufbau/占有ステップのため全ブロックの軌道を併合し、ブロックをまたいで軌道エネルギー順に並べる。
:::

ステップ 3 は [線形代数の基礎](variational-lcao-basis.md) の非冗長重なり直交化そのものを、AO 空間
全体に 1 回ではなく各対称ブロックの*内側で*適用したものです — 対称ブロック化と非冗長性処理は競合せず
組み合わさります。各既約表現の部分空間は重なりについて閉じている($U_gSU_g^{\mathsf T}=S$ が
$S_\Gamma$ と $S_\Lambda$ を混ぜないことを保証する)からです。自明な $C_1$ の場合 $Q=I$ となり、これは
通常の非冗長直交化に厳密に帰着します — `symmetry=False` と、恒等元しか対称性を持たない分子での
symmetry 有効実行は、ビット単位で一致しなければならず、実際に一致します。

```{mermaid}
flowchart LR
    AO["AO 基底"] -->|"既約表現ごとに射影<br/>P_Gamma"| SALC["SALC ブロック Q_Gamma"]
    SALC -->|"S_Gamma = Q^T S Q<br/>ブロック対角化"| ORTH["正規直交ブロック X_Gamma"]
    ORTH -->|"F'_Gamma = X F X^T"| DIAG["各ブロックを<br/>独立に対角化"]
    DIAG -->|"逆変換 + ラベル付け"| MO["既約表現ラベル付き MO"]
```

検証済み例 — 水 $C_{2v}$、STO-3G(全 7 AO):

```python
import qc
water = "O 0 0 0.117; H 0 0.757 -0.469; H 0 -0.757 -0.469"
m = qc.chk.new(atom=water, ao="sto-3g", unit="angstrom").set_sym("C2v")
m.symmetry_block_dims()
# {'A1': 4, 'A2': 0, 'B1': 1, 'B2': 2}     -- 合計 7、AO 数と一致

m = m.scf(ref="r", symmetry=True).run()
m.scf.energy, m.scf.converged, m.scf.state_irrep
# (-74.9629466565387, True, 'A1')
m.current_mo_irreps[:5]
# ['A1', 'A1', 'B2', 'A1', 'B1']    -- 5 個の占有 MO、正準 Mulliken ラベル
```

ブロック次元($4+0+1+2=7$)は AO 数にちょうど一致します — 射影子完全性の恒等式
$\sum_\Gamma P_\Gamma\approx I$ が具体的な形をとったものです — そして全対称な $A_1$ 既約表現が支配的
なのは、酸素の $2s$/$2p_z$ と両水素の $1s$ の組み合わせが、$C_2$ 回転と両方の鏡映面の下で対称だから
です。

## Fock 対称化

入力密度が厳密に対称適応されていても、計算された AO Fock 行列はスクリーニング/direct 積分評価に由来
する小さなオフブロックの数値ノイズを持ちえます — 厳密な演算子はあらゆる $U_g$ と可換ですが、浮動小数
点評価は自動的に機械精度でそうなるわけではありません。qc-rs の既定 `symmetrize_fock=true` は、各 Fock
組み立て後に**スカラー**(全対称)AO 演算子を群平均することでこれを除去します:

$$
\mathcal S[A] = \frac{1}{|G|}\sum_{g\in G}U_g A U_g^{\mathsf T}.
$$

それ自体が非自明な既約表現 $\Lambda$ として変換する演算子(双極子成分、外場摂動 — 線形応答理論に
関係し、基底状態 SCF ループには関係しない)については、類似の指標重み付き平均が

$$
\mathcal S_\Lambda[A] = \frac{1}{|G|}\sum_{g\in G}\chi_\Lambda(g)\,U_g A U_g^{\mathsf T}.
$$

基底状態 SCF の Fock 行列は常に全対称($\Lambda=A_1/A_g$)なので、`symmetrize_fock` は $\mathcal
S[\cdot]$ しか必要としません;$\Lambda\ne A_1$ の形は、対称選択された応答性質のための将来の機構です。

## MO 既約表現の付与、縮退、そしてリスタート

{prf:ref}`alg-salc-block-ja` が各既約表現ブロックを*独立に*対角化するので、得られるすべての MO は
どのブロックがそれを生成したかから直接、曖昧さのない既約表現ラベルを持ちます — 後付けの解析は不要
です。これは他の一部のコードが全空間対角化の後に取って付けるラベリング方式とは異なります。このラベル
はチェックポイントの `current_mo.irreps` に残り、`mychk.current_mo_irreps` と
`mychk.scf.state_irrep`(多電子状態自体の全体既約表現;閉殻行列式では単一/部分占有軌道の既約表現の積が
単に $A_1$/$A_g$ になる)がそれを公開します。

このラベルは不変ではありません — *軌道がどう生成されたかについてのメタデータ*であり、いくつかの
ことがそれを無効にします:

| 状況 | 後の `irreps` |
|---|---|
| 新規 SALC ブロック対角化 | `Some([...])`、MO ごとに 1 ラベル |
| 1 つの既約表現ブロック内に閉じた回転 | ラベル保持 |
| 既約表現をまたいで MO を混ぜる局在化(Boys, Pipek–Mezey, IBO) | `None` — 局在化軌道は単一の既約表現を持たない |
| `guess("read", irreps="ignore")` | 取り込み時に `None`、破棄 |
| 点群/AO レイアウトが不一致な `guess("read", irreps="preserve")` | 静かな破棄ではなくエラー |
| `guess("read", irreps="auto")` | 点群と SALC レイアウトハッシュが一致すれば保持、さもなくば破棄 |
| `spin_break="mix"`/`"afm"`(意図的に対称性を破る UHF) | 破棄 — まさに既約表現の純粋な解から離れることが目的 |

単純な閉殻分子を超えるとさらに 2 つの微妙な点が重要になります。第一に、**異なる既約表現の近縮退軌道**
は、ブロック対角ソルバーによって実際に混ざることはありません — 異なるブロック由来の 2 つの軌道が
ほぼ同じ軌道エネルギーに来ても(より低い対称性の Abel 部分群に落とした線形/高対称フラグメントの近縮退
$\pi$ 軌道でよくある)、各々は自分のブロックとラベルに留まり;Aufbau 占有のために両者を織り交ぜるのは
*マージしてエネルギー順に並べる*ステップ({prf:ref}`alg-salc-block-ja` のステップ 6)だけです。第二に、
**非 Abel 群は真に多次元の既約表現**($E$, $T$, …)を持ち、そのパートナー関数はラベル 1 つでは区別
できません;qc-rs の `IrrepLabel` メタデータは既にこの場合のためのオプションのパートナーインデックスを
持っていますが、本番の Fock ブロック化経路はまだ多次元射影子を利用しておらず — 非 Abel の要求は今日
$C_1$ 経路にフォールバックします(下表参照)— 真の対称性が例えば $C_{3v}$ や $T_d$ である分子は、
対称性を無効にするか Abel 部分群に落として走らせます。

## 失敗時のポリシー

対称性の検出と適応は、純粋に数値的な理由(幾何が軸に厳密に乗っていない、浮動小数点の原子マッピング
不一致)でも、構造的な理由(非 Abel 群の要求)でも失敗しえます。qc-rs のポリシーは `symmetry="auto"`
(静かで安全なフォールバック)と明示的な `symmetry=True`(ユーザーが対称性を明確に求めた以上、静かな
フォールバックが幾何のバグを隠しかねないため、大きく失敗させる)を区別します:

| 失敗 | `symmetry="auto"` | `symmetry=True` |
|---|---|---|
| 点群テーブルに使える指標データがない | $C_1$ にフォールバック | エラー |
| symop の下での原子マッピングが失敗 | $C_1$ にフォールバック | エラー |
| 射影子の冪等性検査が失敗 | $C_1$ にフォールバック | エラー |
| SALC ランク合計が $n_{\text{ao}}$ と不一致 | $C_1$ にフォールバック | エラー |
| 重なりブロックに負の固有値 | エラー | エラー |
| 非冗長性カットオフで全ブロックが消滅 | エラー | エラー |

(重なりの負固有値やブロック全消滅は、対称性自体とは無関係な数値的/基底の線形従属性の失敗であり —
両ポリシーでエラーになり、[線形代数の基礎の章](variational-lcao-basis.md) が対称化しない場合について
述べる失敗と同じです。)

:::{exercise}
:label: ex-symmetry-theory-ja

1. 上の水の $C_{2v}$ STO-3G 実行はブロック次元 $\{A_1{:}4,\ A_2{:}0,\ B_1{:}1,\ B_2{:}2\}$ を与えます。
   水は 7 個の AO を持ちます(O:$1s,2s,2p_x,2p_y,2p_z$;各 H:$1s$)。$A_2$ が $R_z$(両方の鏡映面の
   下で反対称な、$C_2$ 軸まわりの回転)として変換すること、そしてこの幾何では列挙した価電子 AO の
   どれもそのようには変換しないことを使って、なぜ $A_2$ ブロックが空になるのか一文で説明しなさい。
2. なぜ `symmetrize_fock` は基底状態 SCF ループに対して全対称平均 $\mathcal S[\cdot]$ だけを必要とし、
   既約表現重み付きの $\mathcal S_\Lambda[\cdot]$ を決して必要としないのですか。
3. あるユーザーがアンモニアに `symmetry="C3v"` を要求し、`symmetry="auto"` の下で静かに $C_1$ に
   フォールバックし、正しいエネルギーは得られるものの既約表現ラベルは得られませんでした。これが
   起こる qc-rs 固有の(一般化学的でない)理由は何で、`symmetry=True` なら代わりに何が起きたで
   しょうか。
:::

:::{solution} ex-symmetry-theory-ja
:class: dropdown

1. 水のどの AO(標準的な $yz$ 分子面配向における原子中心の s・p 関数)も $C_2$ 軸まわりの回転のようには
   変換しません — s 関数は常に全対称であり、各 p 関数は $x$・$y$・$z$ のように(すなわち標準
   $C_{2v}$ 指標表で $B_1$・$B_2$・$A_1$ のように)変換し、どれも $A_2$ ではありません。射影子
   $P_{A_2}$ は、この角運動量レベルで何らかの AO 結合が既に $A_2$ 性を持っている場合にのみ*射影する
   先*を持つので、そうした結合が存在しないこの基底では $P_{A_2}$ のランクは 0 です。
2. 基底状態の電子ハミルトニアン(したがって厳密な SCF Fock 演算子)は構成上あらゆる点群操作の下で
   不変です — 分子自身の対称性を超えた特別な方向を持ちません — なので常に全対称既約表現 $A_1$/$A_g$
   です。既約表現重み付き平均 $\mathcal S_\Lambda[\cdot]$ が必要なのは、個々の双極子成分や外部摂動場
   のような*全対称でない*演算子だけであり、これらは SCF エネルギーループ自体ではなく線形応答/物性
   計算で現れます。
3. qc-rs の本番 SALC/Fock ブロック化機構は**Abel**点群のみを対象とします($C_1, C_s, C_i, C_2, C_{2v},
   C_{2h}, D_2, D_{2h}$);$C_{3v}$ は現在の 1 次元指標の射影子構成では正しくブロック化できない、
   真に 2 次元の既約表現($E$)を持つので、失敗時ポリシー表の「点群テーブルに使える指標データが
   ない」/構造的不一致の行が適用され、`"auto"` は $C_1$ にフォールバックします — エネルギーは依然
   厳密です($C_1$ SCF は常に正しく、単にブロック化・ラベル付けされていないだけ)、失われるのは
   高速化とラベルだけです。`symmetry=True` は、静かに $C_1$ に落ちる代わりにエラーを送出し、非 Abel
   群の制約を事後ではなく即座に表面化させたでしょう。
:::

ここでの射影子とブロックの機構は、後の 2 つの章が直接その上に築くものでもあります:
[密度フィッティング/RI](density-fitting-ri.md) と post-HF の章は対称性を直交する軸として扱い(RI は
決して対称性を仮定しません)、将来の CASSCF アクティブスペース選択や TD-DFT の対称禁制遷移解析
(`.design/24qc.scf-salc.md` に将来課題として記されている)は、まさにこの既約表現ラベル付き MO 基底を
再利用することになります。
