last_modified: 2026-01-23
注記:本稿では、角運動量 を持つp軌道()とs軌道との重なり積分 を扱う。Cartesian GTO(デカルト座標型ガウス関数)を用いる場合、p軌道はs軌道の空間微分として表現できる性質を利用すると、計算が非常に簡潔になる。 注記2: 生成AIへの指示で自動生成し、検算をしておりますが、内容が誤っている可能性があります。ご了承ください。Gemini 3.0 Pro及びGPT-5.2の性能を確かめる目的も兼ねています。
1. 数理的定式化
1.1 Cartesian p型GTOの定義
中心 にある、指数 の正規化されていないプリミティブp型GTO(例:)は、次のように定義される。これは、s型GTO に を乗じたものである。
1.2 重なり積分の導出(s-p overlap)
中心Aのs軌道 と、中心Bのp軌道 の重なり積分 を考える。ガウス積定理により、指数部分は中心 、合成指数 のガウス関数にまとめることができる(前稿参照)。ここで重要なのは、多項式項 の処理である。積分変数変換 を行うと、 となる。これを積分内で展開する。第1項は対称性により消滅する。したがって、s-p重なり積分は、「s-s重なり積分」に「幾何学的因子」を乗じたものとして表現される。ここで、 はガウス積の中心座標のx成分であり、以下で与えられる。
1.3 正規化
p軌道の正規化定数 はs軌道のそれとは異なる。プリミティブレベルでの正規化定数は以下の通りである。
2. Pythonによる実装
s軌道(中心A)とp軌道(中心B、x,y,z成分)の重なりを計算するクラス設計を行う。p軌道の短縮(Contraction)においては、3つの成分()は通常同じ指数と係数を共有するため、一度の計算でベクトルとして処理するのが効率的である。
import numpy as np
# --- 1. 基礎的な数学関数 ---
def calculate_primitive_ss_overlap(alpha: float, beta: float, R2: float) -> float:
"""s-s プリミティブ重なり積分 (正規化定数を含まない)"""
p = alpha + beta
K_AB = np.exp( - (alpha * beta / p) * R2 )
return (np.pi / p)**1.5 * K_AB
def get_normalization_primitive_s(alpha: float) -> float:
"""s型プリミティブの正規化定数"""
return (2.0 * alpha / np.pi)**0.75
def get_normalization_primitive_p(beta: float) -> float:
"""p型プリミティブの正規化定数"""
# N_p = 2 * sqrt(beta) * N_s
return 2.0 * np.sqrt(beta) * (2.0 * beta / np.pi)**0.75
# --- 2. 短縮GTOの正規化 ---
def normalize_contraction_s(exponents: list[float], coeffs: list[float]) -> list[float]:
"""s軌道の短縮係数を正規化して返す"""
n_prim = len(exponents)
# 行列形式で計算
S_mat = np.zeros((n_prim, n_prim))
for i in range(n_prim):
for j in range(n_prim):
# s-s overlap at R=0
sab = calculate_primitive_ss_overlap(exponents[i], exponents[j], 0.0)
ni = get_normalization_primitive_s(exponents[i])
nj = get_normalization_primitive_s(exponents[j])
S_mat[i, j] = sab * ni * nj
# 全体のノルム
norm_sq = np.dot(coeffs, np.dot(S_mat, coeffs))
norm_factor = 1.0 / np.sqrt(norm_sq)
return [c * norm_factor for c in coeffs]
def normalize_contraction_p(exponents: list[float], coeffs: list[float]) -> list[float]:
"""p軌道の短縮係数を正規化して返す"""
n_prim = len(exponents)
S_mat = np.zeros((n_prim, n_prim))
for i in range(n_prim):
for j in range(n_prim):
# p-p overlap at R=0 (orthogonality ensures only same components overlap)
# <px|px> = (1/2p) * <s|s>_unnormalized (standard result for p-p same center)
# しかしここでは定義通り計算する:
# S_px_px = S_ss_prim * (1 / (2*(alpha+beta))) + terms depending on distance (0 here)
alpha = exponents[i]
beta = exponents[j]
p = alpha + beta
s_ss = calculate_primitive_ss_overlap(alpha, beta, 0.0)
# <px|px> @ R=0 term is s_ss / (2*p)
s_pp = s_ss / (2.0 * p)
ni = get_normalization_primitive_p(alpha)
nj = get_normalization_primitive_p(beta)
S_mat[i, j] = s_pp * ni * nj
norm_sq = np.dot(coeffs, np.dot(S_mat, coeffs))
norm_factor = 1.0 / np.sqrt(norm_sq)
return [c * norm_factor for c in coeffs]
# --- 3. s-p 重なり積分計算 (メイン) ---
def calculate_overlap_sp(
center_A: np.ndarray, exps_A: list[float], coeffs_A: list[float], # s-orbital
center_B: np.ndarray, exps_B: list[float], coeffs_B: list[float] # p-orbital
) -> np.ndarray:
"""
CGTO s軌道(A) と CGTO p軌道(B) の重なり積分ベクトルを計算する。
Args:
center_A, center_B: 原子核座標 (x, y, z)
exps_A, coeffs_A: s軌道のパラメータ
exps_B, coeffs_B: p軌道のパラメータ
Returns:
np.ndarray: [S_spx, S_spy, S_spz] の3要素配列
"""
# 座標差ベクトル
R_vec = center_A - center_B
R2 = np.dot(R_vec, R_vec)
# 正規化済み係数の取得
norm_coeffs_A = normalize_contraction_s(exps_A, coeffs_A)
norm_coeffs_B = normalize_contraction_p(exps_B, coeffs_B)
# 結果格納用 (x, y, z)
S_vector = np.zeros(3)
# 二重ループ
for i, alpha in enumerate(exps_A):
ca = norm_coeffs_A[i]
N_s_prim = get_normalization_primitive_s(alpha)
for j, beta in enumerate(exps_B):
cb = norm_coeffs_B[j]
N_p_prim = get_normalization_primitive_p(beta)
# 1. s-s プリミティブ重なりの計算
s_ss_prim = calculate_primitive_ss_overlap(alpha, beta, R2)
# 2. 幾何学的因子の計算: (XP - XB)
# XP = (alpha*XA + beta*XB) / (alpha+beta)
# XP - XB = alpha*(XA - XB) / (alpha+beta)
factor_geom = (alpha / (alpha + beta)) * (center_A - center_B)
# 3. 統合
# S_sp = N_s * N_p * S_ss * (XP - XB)
term = ca * cb * N_s_prim * N_p_prim * s_ss_prim
S_vector += term * factor_geom
return S_vector
# --- 実行例 ---
if __name__ == "__main__":
# フッ化水素 (HF) 分子のモデル
# H (Center A): s軌道
# F (Center B): p軌道
# 座標 (Z軸上に配置)
pos_H = np.array([0.0, 0.0, -1.7328]) # 約 0.917 Angstrom
pos_F = np.array([0.0, 0.0, 0.0])
# 基底関数パラメータ (STO-3G dummy for example)
# H 1s
h_exps = [3.42525, 0.623913, 0.168856]
h_coeffs = [0.154329, 0.535328, 0.444635]
# F 2p (STO-3G parameters for Fluorine 2p shell)
# Note: 2sと2pは指数を共有するが、ここでは2pとして扱う
f_exps = [99.1111, 23.1031, 6.55627, 1.95679] # 実際はもっと複雑だが例示用
# F 2p STO-3G (Standard Hehre values for alpha)
f_sto3g_exps = [2.2793, 0.5287, 0.1697] # Hに近いダミー値ではなく適切な値を設定すべきだが
# ここではロジック確認のため、Hと同じセットを「p軌道として」使ってみる実験
# 現実的なFのデータを使うと以下のようになる:
f_real_exps = [52.793206, 11.235948, 3.109767] # STO-3G F 2sp exponents (partial)
f_real_coeffs_p = [0.089808, 0.456637, 0.629112]
# 計算実行
overlaps = calculate_overlap_sp(
pos_H, h_exps, h_coeffs,
pos_F, f_real_exps, f_real_coeffs_p
)
print("--- s-p Orbital Overlap (HF molecule along Z-axis) ---")
print(f"H Position: {pos_H}")
print(f"F Position: {pos_F}")
print(f"Overlap Vector [S_spx, S_spy, S_spz]:")
print(overlaps)
print("\n--- Interpretation ---")
print(f"S_x (pi-type): {overlaps[0]:.6f} (Should be 0.0)")
print(f"S_y (pi-type): {overlaps[1]:.6f} (Should be 0.0)")
print(f"S_z (sigma-type): {overlaps[2]:.6f} (Should be non-zero)")
# 符号の確認:
# HがZマイナス側、Fが原点。
# s軌道は正、p_z軌道はZ正方向が正。
# H(s)とF(p_z)のローブの符号関係により、負の値になる可能性がある
# (結合性軌道を作るには位相合わせが必要)
3. 結果の物理的解釈
配向依存性: 出力結果の overlaps ベクトルを見ると、原子がZ軸上に配置されている場合、 成分( 方向の重なり)は数値誤差の範囲内で となる。 成分のみが有意な値を持ち、これが 結合に対応する。
符号の意味: 重なり積分の符号は、座標系と基底関数の位相定義に依存する。負の値が出た場合、それは単にp軌道の正のローブがs軌道と反対方向を向いていることを意味し、分子軌道形成時には係数の符号で調整される。
計算効率: calculate_overlap_sp 関数は、 ベクトルを利用することで、3成分の重なり積分をループ内で同時に計算している。これにより、個別に計算する場合と比較して指数関数の評価回数を1/3に削減している。
4. 結論
s軌道とp軌道の重なり積分は、s-s重なり積分に対して、幾何学的な因子 を乗じることで解析的に求められる。この単純な関係性は、Cartesian GTOが高次角運動量の微分として定義されていることに由来し、d軌道やf軌道への拡張も同様の微分操作(または漸化式)によって体系的に行うことが可能である。
補足
以下に、中心 に位置する短縮s型GTO()と、中心 に位置する短縮p型GTOの成分 ()の間の重なり積分 を1つの閉じた数式で示す。s-p 重なり積分公式 (CGTO)
変数定義全体パラメータ:: 短縮GTO全体の正規化定数。
: 短縮の次数(プリミティブ数)。
: 各プリミティブの短縮係数。
: 核間距離ベクトル
。 はその二乗ノルム。
: 原子核座標の成分(例:)。
プリミティブパラメータ:: 中心 の 番目のプリミティブ軌道指数。
: 中心 の 番目のプリミティブ軌道指数。
プリミティブ正規化定数 (Primitive Normalization Constants):
構造的解釈
この式は以下の3つの要素の積の総和として構成されている。
係数項: および各正規化定数。
幾何学的因子: 。
これがp軌道の配向性とs軌道との相対位置による符号・強度を決定する。
距離減衰項: 。ガウス関数の重なりによる距離依存性を示す。