last_modified: 2026-01-21
※生成AIにより自動生成した記事です。自己責任でご覧ください。
序論:数式の複雑さから見る量子化学の手法
量子化学の歴史において、Hartree-Fock法(HF)の理論的枠組みは比較的初期に完成していましたが、計算機資源の制約から、実用的には拡張ヒュッケル法(EHT)や半経験的手法(SQM)が多用された時期がありました。
本稿では、あえてこの歴史的順序を無視し、**「プログラマーがゼロから分子軌道法計算機を実装すると考えた場合、どの段階でどの数式を追加しなければならないか」という計算複雑性の積み上げ(Hierarchy of Complexity)**の観点から、これら3つの手法の関係性を整理します。
- Level 1: EHT - 静的な行列対角化(線形代数)
- Level 2: SQM - 動的な場の導入(非線形・反復計算)
- Level 3: HF - 積分計算の完全実施(多重積分・ コスト)
Level 1. 拡張ヒュッケル法 (EHT)
「静的」な一回限りの計算
EHTの実装上の特徴は、**電子間の相互作用を無視(あるいは定数に埋め込み)**している点です。これにより、ハミルトニアン行列 は、電子がどこにいるか(電子密度)に依存せず、原子の座標だけで一意に決定されます。
数学的構造
解くべき方程式は、単純な一般化固有値問題です。
ここでの行列要素 の決定プロセスは極めて代数的かつ静的です。
- 入力: 座標、パラメータ 、
- 処理: 1回だけ行列 を作り、1回だけ対角化する。
- 複雑さ: 行列構築 、対角化 。ループ処理なし。
Level 2. 半経験的分子軌道法 (SQM: CNDO/INDO等)
「動的」な場の導入とSCFループ
厳密性を上げるための第一の壁は、**「電子は互いに反発し合っている」**という事実をどう取り込むかです。ある電子が感じるポテンシャルは、他の電子の分布(波動関数)に依存します。
つまり、「行列を作るために答え(係数 )が必要」で、「答えを知るために行列が必要」という**鶏と卵の関係(自己無撞着問題)**が生じます。ここでアルゴリズムは「直線的」なものから「循環的(ループ)」なものへと変貌します。
数学的構造:Roothaan-Hall方程式
方程式の形はEHTと似ていますが、行列 (フォック行列)が密度行列 の関数になります。
ここで密度行列 は係数 から作られます()。
実装上の追加コスト:二電子相互作用の近似
SQMでは、フォック行列の要素に「電子間反発」項が追加されますが、計算負荷を下げるために**大胆な近似(パラメータ化)**を行います。例えばCNDO法では以下のように簡略化されます。
- 入力: 座標、パラメータ、初期推測密度行列
- 処理: SCF(Self-Consistent Field)ループ。収束するまで対角化を繰り返す。
- 複雑さ: 反復回数 。ただし積分計算は定数参照で済むため高速。
Level 3. Hartree-Fock法 (Ab Initio HF)
「積分」の完全計算と計算爆発
SQMからHFの違いの説明ににおいて、方程式の形(Roothaan-Hall方程式)やSCFループの構造は変わりません。劇的に変化するのは、**フォック行列 の中身を作る「材料」**です。EHTやSQMではパラメータや簡易式で済ませていた相互作用項を、HFでは第一原理(Ab Initio)に基づき、物理定数と基底関数を用いて真面目に積分計算します。
数学的構造:フォック行列
HFにおける行列要素 は以下のようになります。
ここで登場する は二電子積分と呼ばれ、4つの基底関数の組み合わせ全てについて計算する必要があります。
実装上の追加コスト: の壁
- 入力: 座標、基底関数セット(パラメータなし)
- 処理: SCFループ。ただし毎ステップ(あるいは初回)に膨大な数の積分計算が必要。
- 複雑さ: 基底関数数を とすると、二電子積分の数は に比例して増大する。これがHF計算のボトルネックとなる。
アルゴリズム比較コード (Python Pseudo-code)
以下に、これら3つの手法の実装ロジックの違いを表現した擬似コードを示します。solve メソッドの構造変化に注目してください。
import numpy as np
from scipy.linalg import eigh
class MolecularOrbitalSolver:
def __init__(self, method='EHT'):
self.method = method
def solve(self, molecule):
"""
手法に応じた計算フローの分岐
"""
if self.method == 'EHT':
return self._solve_eht(molecule)
elif self.method == 'SQM':
return self._solve_scf(molecule, approx=True)
elif self.method == 'HF':
return self._solve_scf(molecule, approx=False)
# --- Level 1: EHT (Linear / One-shot) ---
def _solve_eht(self, mol):
# 1. 重なり行列 S の計算
S = self.calculate_overlap(mol)
# 2. ハミルトニアン H の構築 (パラメータとSのみ依存)
# H_ij = K * S_ij * (H_ii + H_jj) / 2
H = self.build_huckel_hamiltonian(mol, S)
# 3. 1回だけの対角化
energies, C = eigh(H, b=S)
return energies, C
# --- Level 2 & 3: SCF Framework (Iterative) ---
def _solve_scf(self, mol, approx=False):
# 1. 積分計算
S = self.calculate_overlap(mol)
H_core = self.calculate_core_hamiltonian(mol)
if not approx: # HFの場合
# [Level 3] O(N^4) の厳密な二電子積分計算
ERI = self.calculate_electron_repulsion_integrals(mol)
else: # SQMの場合
# [Level 2] パラメータ化された簡易積分
ERI = self.load_empirical_parameters(mol)
# 2. 密度行列 P の初期化 (Guess)
P = np.zeros_like(S)
converged = False
while not converged:
# 3. フォック行列 F の構築 (Pに依存 = 動的)
if approx:
# [Level 2] パラメータを用いた高速なF構築
F = self.build_fock_sqm(H_core, P, ERI)
else:
# [Level 3] 厳密積分を用いた重いF構築
# F = H_core + (Coulomb - Exchange terms)
F = self.build_fock_ab_initio(H_core, P, ERI)
# 4. 対角化
energies, C = eigh(F, b=S)
# 5. 新しい密度行列の計算
P_new = self.make_density_matrix(C, mol.num_electrons)
# 6. 収束判定
if np.allclose(P, P_new, atol=1e-6):
converged = True
P = P_new
return energies, C
結論
数式の複雑さという観点から見ると、分子軌道法の進化は以下のように要約できます。
EHT: が定数行列である(線形代数の問題)。
SQM: (実際は )が の関数となる(非線形最適化の問題)。ただし相互作用項は定数近似。
HF: 非線形問題に加え、相互作用項の算出に多重積分が必要となる(多重積分の数値的/解析的評価)。
このように、厳密性を追求する過程で、「反復計算の導入」と「二電子積分の厳密計算」という二つの大きな計算コストの壁が追加されていったことがわかります。しかし、HF法であっても「平均場近似」の壁は超えられておらず、多体問題の厳密解の算出(電子相関の考慮)には、さらに上位の手法(Post-HF法)が必要となります。
補足
- 結論のSQMの説明に関して: 一部例外としてEHTを使ったSQMもありますが、ここでは簡略化のためにこの説明とさせていただきます。