Home
2019 words
10 minutes
短縮GTO(Contracted GTO)間重なり積分の数理と実装"

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 ΨA\Psi_A は、KAK_A 個の正規化されたプリミティブGTO ϕμ\phi_\mu の線形結合として定義される。ΨA(r)=NAcontμ=1KAdA,μϕμ(r;αμ,RA)(1)\Psi_A(\mathbf{r}) = N_A^{cont} \sum_{\mu=1}^{K_A} d_{A,\mu} \phi_\mu(\mathbf{r}; \alpha_\mu, \mathbf{R}_A) \quad (1)ここで、各パラメータは以下の通りである。

d_{A,\mu}$: 短縮係数(Contraction Coefficient)。基底関数系(Basis Set)ごとに定義された固定値。

\alpha_\mu$: 軌道指数。

\phi_\mu$: 正規化されたプリミティブGTO(前稿式(1)参照)。

N_A^{cont}$: CGTO全体の正規化定数。

2.2 重なり積分の展開#

中心AのCGTO ΨA\Psi_A と、中心BのCGTO ΨB\Psi_B(構成数 KBK_B)の間の重なり積分 SABS_{AB} を考える。SAB=ΨAΨB=(NAcontμ=1KAdA,μϕμA)(NBcontν=1KBdB,νϕνB)dr(2)S_{AB} = \langle \Psi_A | \Psi_B \rangle = \int \left( N_A^{cont} \sum_{\mu=1}^{K_A} d_{A,\mu} \phi_\mu^A \right) \left( N_B^{cont} \sum_{\nu=1}^{K_B} d_{B,\nu} \phi_\nu^B \right) d\mathbf{r} \quad (2)積分の線形性により、和と積分の順序を交換できるため、これはプリミティブ間重なり積分 SμνS_{\mu\nu} の二重和に帰着する。SAB=NAcontNBcontμ=1KAν=1KBdA,μdB,νϕμAϕνB(3)S_{AB} = N_A^{cont} N_B^{cont} \sum_{\mu=1}^{K_A} \sum_{\nu=1}^{K_B} d_{A,\mu} d_{B,\nu} \langle \phi_\mu^A | \phi_\nu^B \rangle \quad (3)ここで、項 ϕμAϕνB\langle \phi_\mu^A | \phi_\nu^B \rangle は、前稿で導出したプリミティブGTO間の重なり積分公式(式(8))をそのまま適用できる。ϕμAϕνB=(2αμβναμ+βν)3/2exp(αμβναμ+βνR2)(4)\langle \phi_\mu^A | \phi_\nu^B \rangle = \left( \frac{2\sqrt{\alpha_\mu \beta_\nu}}{\alpha_\mu + \beta_\nu} \right)^{3/2} \exp\left( - \frac{\alpha_\mu \beta_\nu}{\alpha_\mu + \beta_\nu} R^2 \right) \quad (4)

2.3 CGTOの正規化#

通常、基底関数パラメータとして与えられる係数 dμd_{\mu} は、プリミティブGTO ϕμ\phi_\mu が正規化されていることを前提としているが、それらの和である ΨA\Psi_A 自体が正規化されているとは限らない。したがって、正規化定数 NAcontN_A^{cont} は以下の条件を満たすように決定される。ΨAΨA=1(5)\langle \Psi_A | \Psi_A \rangle = 1 \quad (5)これを展開すると、単中心(R=0R=0)におけるプリミティブ間積分の和となる。(NAcont)2μ=1KAλ=1KAdA,μdA,λϕμAϕλAR=0=1(6)(N_A^{cont})^2 \sum_{\mu=1}^{K_A} \sum_{\lambda=1}^{K_A} d_{A,\mu} d_{A,\lambda} \langle \phi_\mu^A | \phi_\lambda^A \rangle_{R=0} = 1 \quad (6)したがって、NAcont=(μ=1KAλ=1KAdA,μdA,λ(2αμαλαμ+αλ)3/2)1/2(7)N_A^{cont} = \left( \sum_{\mu=1}^{K_A} \sum_{\lambda=1}^{K_A} d_{A,\mu} d_{A,\lambda} \left( \frac{2\sqrt{\alpha_\mu \alpha_\lambda}}{\alpha_\mu + \alpha_\lambda} \right)^{3/2} \right)^{-1/2} \quad (7)多くの場合、計算化学コード内部では、あらかじめ DA,μ=NAcontdA,μD_{A,\mu} = N_A^{cont} d_{A,\mu} と再定義した正規化済み係数を用いることで、計算実行時のコストを削減する。

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 は重要である。文献値として提供される短縮係数 dμd_\mu は、「プリミティブGTOが正規化されている」ことを前提としている場合と、「CGTO全体が正規化されるように既にスケーリングされている」場合がある。本実装では、前者の一般的なケース(例えばEMSL Basis Set Exchange形式)を想定し、明示的に自己重なり積分を計算して正規化を行っている。

二重ループ: calculate_contracted_overlap 内の二重ループが計算の核となる。計算量はプリミティブ数の積 KA×KBK_A \times K_B に比例する。STO-3Gの場合は 3×3=93 \times 3 = 9 回のプリミティブ積分評価が行われる。

効率化の視点: 実際の量子化学コードでは、外側のループで原子ペアを選定し、内側のループでシェル(s, p, d)ごとの縮約計算を行う。また、指数部分の alpha + beta や alpha * beta は事前にテーブル化されることが多い。

4. 結論#

短縮GTO(CGTO)の重なり積分は、数学的にはプリミティブGTO積分の線形和に過ぎず、解析的な見通しは非常に良い。一方で、実装においては以下の点が重要となる。

正規化: 短縮係数の定義(正規化済みか否か)を確認し、適切に再正規化を行うこと。

計算コスト: 縮約数 KK が増えると計算コストは K2K^2 で増大するため、積分スクリーニング(値が無視できるほど小さい項の計算をスキップする技術)が重要となる。

本稿で示した実装は、Hartree-Fock法やDFT計算における重なり行列生成の最小単位となるものである。

短縮GTO(Contracted GTO)間重なり積分の数理と実装"
https://ss0832.github.io/posts/20260123_cgto_s_s_overlapint/
Author
ss0832
Published at
2026-01-23
License
CC BY-NC-SA 4.0

Related Posts

p軌道-p軌道間重なり積分の数理的導出と実装
2026-01-23
Cartesian GTOを用いたp軌道同士(計9成分)の重なり積分について、ガウス積定理に基づく統一的な数式表現と、厳密な正規化処理を含むPython実装を解説する。
s軌道-d軌道間重なり積分の数理的導出と実装
2026-01-23
Cartesian GTOを用いたs軌道とd軌道(6成分:xx, yy, zz, xy, xz, yz)間の重なり積分について、統一的な数式表現とPython実装を解説する。
s軌道-p軌道間重なり積分の数理的導出と実装
2026-01-23
Cartesian GTOを用いたs軌道とp軌道(px, py, pz)間の重なり積分について、ガウス積定理の微分形を用いた導出と、3成分を一度に計算するPython実装を解説する。
GTO 1s軌道間重なり積分の数理的導出と実装
2026-01-23
ガウス型軌道(GTO)を用いた異なる指数を持つ1s軌道間の重なり積分について、ガウス積定理に基づく解析的な導出とPythonによる実装を記述する。
NCIplot (Non-Covalent Interaction plot) の数理的基盤とアルゴリズム:密度汎関数理論からの導出と応用
2026-01-04
非共有結合性相互作用(Non-Covalent Interactions; NCI)を可視化する手法であるNCIplotについて、その理論的背景となるReduced Density Gradient(RDG)の数学的導出、QTAIMとの関係性、およびアルゴリズムの実装詳細を学術的な視点から包括的に解説する。密度汎関数理論における均一電子ガスモデルからの展開と、ヘシアン行列の固有値解析に基づく相互作用の分類について詳述する。
【計算化学】ASEでAFIR法を使用する
2025-03-04
ASEを使った人工力誘起反応法の実装について解説