last_modified: 2026-01-23
注記:本稿は、前稿で扱った「プリミティブGTO」の線形結合として定義される「短縮GTO(Contracted Gaussian-Type Orbital, CGTO)」を対象とする。実際の量子化学計算においては、計算コスト削減と波動関数の物理的妥当性を両立させるため、このCGTOが標準的に用いられる。 注記2: 生成AIへの指示で自動生成し、検算をしておりますが、内容が誤っている可能性があります。ご了承ください。Gemini 3.0 Pro及びGPT-5.2の性能を確かめる目的も兼ねています。
1. 序論
単一のガウス関数(プリミティブGTO)は、原子核近傍のカスプ(尖り)や遠方の裾野の挙動を正確に記述することが困難である。この問題を解決するため、複数のプリミティブGTOを固定された係数で線形結合し、スレーター型軌道(STO)の形状に近似させたものが**短縮GTO(CGTO)**である。CGTO間の重なり積分は、積分の線形性を利用することで、構成要素であるプリミティブGTO間の積分の総和として計算される。本稿では、その数理的定式化と、STO-3G基底関数系を想定した実装を行う。
2. 数理的定式化
2.1 短縮GTOの定義
心AにあるCGTO は、 個の正規化されたプリミティブGTO の線形結合として定義される。ここで、各パラメータは以下の通りである。
d_{A,\mu}$: 短縮係数(Contraction Coefficient)。基底関数系(Basis Set)ごとに定義された固定値。
\alpha_\mu$: 軌道指数。
\phi_\mu$: 正規化されたプリミティブGTO(前稿式(1)参照)。
N_A^{cont}$: CGTO全体の正規化定数。
2.2 重なり積分の展開
中心AのCGTO と、中心BのCGTO (構成数 )の間の重なり積分 を考える。積分の線形性により、和と積分の順序を交換できるため、これはプリミティブ間重なり積分 の二重和に帰着する。ここで、項 は、前稿で導出したプリミティブGTO間の重なり積分公式(式(8))をそのまま適用できる。
2.3 CGTOの正規化
通常、基底関数パラメータとして与えられる係数 は、プリミティブGTO が正規化されていることを前提としているが、それらの和である 自体が正規化されているとは限らない。したがって、正規化定数 は以下の条件を満たすように決定される。これを展開すると、単中心()におけるプリミティブ間積分の和となる。したがって、多くの場合、計算化学コード内部では、あらかじめ と再定義した正規化済み係数を用いることで、計算実行時のコストを削減する。
3. Pythonによる実装
以下に、CGTOクラスを定義せず、配列操作として処理する数値計算コードを示す。例として、水素原子の最小基底系である STO-3G を用いる。
import numpy as np
def calculate_primitive_overlap(alpha: float, beta: float, R2: float) -> float:
"""
プリミティブGTO間の重なり積分 (内部利用関数)
Args:
alpha, beta: 軌道指数
R2: 核間距離の二乗 (R^2)
"""
# 式(4)の実装
p = alpha + beta
gamma = (alpha * beta) / p
prefactor = (2.0 * np.sqrt(alpha * beta) / p) ** 1.5
return prefactor * np.exp(-gamma * R2)
def normalize_contraction(exponents: list[float], coeffs: list[float]) -> float:
"""
短縮GTOの正規化定数 N_cont を計算する。
Args:
exponents: プリミティブの軌道指数リスト [alpha_1, alpha_2, ...]
coeffs: 短縮係数リスト [d_1, d_2, ...]
Returns:
float: 正規化定数 N_cont
"""
n_prim = len(exponents)
sum_overlap = 0.0
# 二重ループによる自己重なり積分の計算 (R=0)
for i in range(n_prim):
for j in range(n_prim):
s_prim = calculate_primitive_overlap(exponents[i], exponents[j], R2=0.0)
sum_overlap += coeffs[i] * coeffs[j] * s_prim
return 1.0 / np.sqrt(sum_overlap)
def calculate_contracted_overlap(
exps_A: list[float], coeffs_A: list[float],
exps_B: list[float], coeffs_B: list[float],
R: float
) -> float:
"""
2つの短縮GTO (CGTO) 間の重なり積分を計算する。
Args:
exps_A, coeffs_A: 中心Aの軌道指数と係数のリスト
exps_B, coeffs_B: 中心Bの軌道指数と係数のリスト
R: 核間距離 (Bohr)
Returns:
float: 重なり積分 S_AB
"""
# 1. 各CGTOの正規化定数を計算
# (実際のコードでは、これは初期化時に一度だけ行い、係数に繰り込むのが一般的)
norm_A = normalize_contraction(exps_A, coeffs_A)
norm_B = normalize_contraction(exps_B, coeffs_B)
# 正規化済み係数
norm_coeffs_A = [c * norm_A for c in coeffs_A]
norm_coeffs_B = [c * norm_B for c in coeffs_B]
R2 = R**2
S_total = 0.0
# 2. プリミティブごとの二重ループ (式(3))
for i, alpha in enumerate(exps_A):
da = norm_coeffs_A[i]
for j, beta in enumerate(exps_B):
db = norm_coeffs_B[j]
# プリミティブ間重なり
s_prim = calculate_primitive_overlap(alpha, beta, R2)
# 寄与を加算
S_total += da * db * s_prim
return S_total
# --- 検証: 水素分子 (H2) のSTO-3G計算 ---
if __name__ == "__main__":
# STO-3G Parameters for Hydrogen (Z=1)
# Source: Hehre, Stewart, Pople, J. Chem. Phys. 51, 2657 (1969)
# スケール因子 zeta = 1.24 はここでは考慮せず、標準的な原子単位でのパラメータを使用
# 標準的な H (STO-3G) の指数と係数
h_exponents = [3.42525, 0.623913, 0.168856]
h_coeffs = [0.154329, 0.535328, 0.444635]
# 核間距離 R = 1.4 Bohr (約 0.74 Angstrom, H2の平衡距離近傍)
R_dist = 1.4
# 重なり積分の計算
S_val = calculate_contracted_overlap(
h_exponents, h_coeffs, # Atom A
h_exponents, h_coeffs, # Atom B (同種原子)
R_dist
)
print("--- Contracted GTO (STO-3G) Overlap ---")
print(f"Basis: Hydrogen STO-3G (3 primitives)")
print(f"Distance: {R_dist} Bohr")
print(f"Overlap S: {S_val:.6f}")
# 比較: もし単一のSTO(zeta=1.0)だったら?
# S_sto = exp(-R) * (1 + R + R^2/3)
rho = 1.0 * R_dist # zeta=1.0 (minimal basis ideal) vs STO-3G zeta=1.24 optimized
# ここではSTO-3Gが近似しようとしている元のSTO (zeta=1.24) と比較
zeta_ideal = 1.24
rho_opt = zeta_ideal * R_dist
S_sto_ideal = np.exp(-rho_opt) * (1 + rho_opt + (rho_opt**2)/3.0)
print(f"Reference STO (zeta={zeta_ideal}): {S_sto_ideal:.6f}")
print(f"Difference: {abs(S_val - S_sto_ideal):.6f}")
3.1 コードの解説
正規化プロセス: 関数 normalize_contraction は重要である。文献値として提供される短縮係数 は、「プリミティブGTOが正規化されている」ことを前提としている場合と、「CGTO全体が正規化されるように既にスケーリングされている」場合がある。本実装では、前者の一般的なケース(例えばEMSL Basis Set Exchange形式)を想定し、明示的に自己重なり積分を計算して正規化を行っている。
二重ループ: calculate_contracted_overlap 内の二重ループが計算の核となる。計算量はプリミティブ数の積 に比例する。STO-3Gの場合は 回のプリミティブ積分評価が行われる。
効率化の視点: 実際の量子化学コードでは、外側のループで原子ペアを選定し、内側のループでシェル(s, p, d)ごとの縮約計算を行う。また、指数部分の alpha + beta や alpha * beta は事前にテーブル化されることが多い。
4. 結論
短縮GTO(CGTO)の重なり積分は、数学的にはプリミティブGTO積分の線形和に過ぎず、解析的な見通しは非常に良い。一方で、実装においては以下の点が重要となる。
正規化: 短縮係数の定義(正規化済みか否か)を確認し、適切に再正規化を行うこと。
計算コスト: 縮約数 が増えると計算コストは で増大するため、積分スクリーニング(値が無視できるほど小さい項の計算をスキップする技術)が重要となる。
本稿で示した実装は、Hartree-Fock法やDFT計算における重なり行列生成の最小単位となるものである。