Special Functions — 特殊関数
概要
sangi の特殊関数モジュールは、数理物理・統計・数値解析で頻出する約 30 ファミリー・80 以上の特殊関数を統一的に提供する。 すべて namespace sangi::special の自由関数である。
対応スカラー型は次の 3 系統である。
- ネイティブ浮動小数点 —
float/double/long double。template<IsNativeFloat T>形式で、 多くの関数の基本実装 - 複素数 —
Complex<double>(および一部はComplex<Float>)。 ガンマ・誤差関数・ベッセル・ゼータ・楕円・超幾何などが複素引数に対応 - 多倍長 —
Float(任意精度)。 多倍長版は精度引数int precisionを取り、sangi::gamma(x, precision)のように親名前空間sangi::直下、 もしくはヘッダ内にComplex<Float>オーバーロードとして提供される
各関数は [[nodiscard]] 指定され、 定義域外・極・発散では NaN または ±∞ を返す (関数ごとの規約は各表を参照)。
| ファミリー | 代表関数 | ヘッダ |
|---|---|---|
| ガンマ関数族 | $\Gamma$, $\ln\Gamma$, $\psi$, $B$, $P(a,x)$, $I_x(a,b)$ | gamma.hpp, factorial_utils.hpp |
| 誤差関数・Fresnel・Dawson | $\operatorname{erf}$, $\operatorname{erfc}$, $C(x)$, $S(x)$, $F(x)$ | error_function.hpp, fresnel.hpp, dawson.hpp |
| 指数積分・対数積分 | $\operatorname{Ei}$, $E_n$, $\operatorname{li}$, $\operatorname{Ci}$, $\operatorname{Si}$, $\operatorname{Li}_2$ | exponential_integral.hpp |
| ベッセル関数族 | $J_\nu$, $Y_\nu$, $I_\nu$, $K_\nu$, $H^{(1,2)}$, $\operatorname{Ai}$, $\operatorname{Bi}$ | bessel.hpp, airy.hpp, kelvin.hpp, struve.hpp, anger_weber.hpp |
| 直交多項式 | $P_n$, $P_n^m$, $P_n^{(\alpha,\beta)}$, $H_n$, $L_n$, $T_n$, $U_n$ | legendre.hpp, orthogonal_classical.hpp |
| 楕円積分・楕円関数 | $K(k)$, $E$, $F$, $\Pi$, $R_F$, $\operatorname{sn}$, $\vartheta_i$, $\wp$ | elliptic.hpp, theta.hpp, weierstrass.hpp |
| ゼータ関数族 | $\zeta(s)$, $\zeta(s,a)$, $\eta(s)$, $\operatorname{Cl}$, $\Phi$ | zeta.hpp, clausen.hpp, lerch.hpp |
| 超幾何関数 | ${}_2F_1$, ${}_1F_1$, ${}_0F_1$, ${}_pF_q$, $E_{\alpha,\beta}$ | hypergeometric.hpp, hypergeometric_pq.hpp, mittag_leffler.hpp |
| その他 | $W$, $T(h,a)$, $F_L$, $D_n$, Wigner $3j$/$6j$/$9j$ | lambert_w.hpp, owens_t.hpp, coulomb.hpp, ほか |
ビルド
// アグリゲートヘッダ: 主要ファミリーをまとめてインクルード
#include <math/special/special.hpp>
ヘッダオンリー。 リンクするライブラリは不要。 すべての関数は namespace sangi::special に属する。
special.hpp がまとめて取り込むのは次のファミリーである: ガンマ (gamma.hpp)、 階乗ユーティリティ (factorial_utils.hpp)、 誤差関数 (error_function.hpp)、 Dawson (dawson.hpp)、 ベッセル (bessel.hpp)、 Airy (airy.hpp)、 Anger-Weber (anger_weber.hpp)、 Legendre (legendre.hpp)、 楕円積分 (elliptic.hpp)、 テータ (theta.hpp)、 Weierstrass (weierstrass.hpp)、 ゼータ (zeta.hpp)、 Clausen (clausen.hpp)、 指数積分 (exponential_integral.hpp)、 超幾何 (hypergeometric.hpp)、 Lambert W (lambert_w.hpp)、 Owen の T (owens_t.hpp)、 Coulomb (coulomb.hpp)、 Fermi-Dirac (fermi_dirac.hpp)、 Debye (debye.hpp)、 transport (transport.hpp)、 角運動量結合 (coupling.hpp)。
次のファミリーは special.hpp に含まれないため、 個別にインクルードする必要がある。
#include <math/special/orthogonal_classical.hpp> // Hermite, Laguerre, Chebyshev
#include <math/special/fresnel.hpp> // Fresnel 積分 C(x), S(x)
#include <math/special/kelvin.hpp> // Kelvin 関数 ber, bei, ker, kei
#include <math/special/struve.hpp> // Struve 関数 H_ν, L_ν
#include <math/special/hypergeometric_pq.hpp> // 一般化超幾何 pFq, Meijer G
#include <math/special/mittag_leffler.hpp> // Mittag-Leffler 関数
#include <math/special/lerch.hpp> // Lerch 超越関数 Φ
#include <math/special/spheroidal.hpp> // 回転楕円体波動関数
ガンマ関数族
ガンマ関数 $\Gamma(z)$ とその対数・微分 (ディガンマ $\psi$、 ポリガンマ $\psi^{(n)}$)、 ベータ関数 $B(a,b)$、 不完全ガンマ・不完全ベータの正則化版を提供する。 gamma.hpp がこれらの解析的関数を、 factorial_utils.hpp が階乗系の組合せ論的ユーティリティを担う。 ネイティブ浮動小数点版に加え、 多くの関数に Complex<double> と Complex<Float> (精度引数付き) のオーバーロードがある。
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
gamma(x) | T / Complex<R> | ガンマ関数 $\Gamma(x)$。 ネイティブは std::tgamma へ委譲、 複素は Lanczos 近似 ($g{=}7$) |
lnGamma(x) | T / Complex<R> | 対数ガンマ $\ln\Gamma(x)$。 オーバーフローを避けて巨大引数を扱える |
digamma(x) | T / Complex<R> | ディガンマ $\psi(x) = \Gamma'(x)/\Gamma(x)$。 漸近展開 + 引数シフト。 非正整数で極 ($\mathrm{NaN}/{-\infty}$) |
trigamma(x) | T | トリガンマ $\psi_1(x) = \psi'(x)$ |
polygamma(n, x) | int n, T / Complex<R> | ポリガンマ $\psi^{(n)}(x)$ ($n \ge 0$)。 $n{=}0$ は digamma、 $n{=}1$ は trigamma |
beta(a, b) | T / Complex<R> | ベータ関数 $B(a,b) = \Gamma(a)\Gamma(b)/\Gamma(a+b)$ |
gammaP(a, x) | T / Complex<R> | 正則化下側不完全ガンマ $P(a,x) = \gamma(a,x)/\Gamma(a)$。 $a>0,\ x\ge0$ |
gammaQ(a, x) | T / Complex<R> | 正則化上側不完全ガンマ $Q(a,x) = \Gamma(a,x)/\Gamma(a) = 1 - P(a,x)$ |
gammaLower(a, x) | T / Complex<R> | 下側不完全ガンマ $\gamma(a,x) = P(a,x)\,\Gamma(a)$ |
gammaUpper(a, x) | T / Complex<R> | 上側不完全ガンマ $\Gamma(a,x) = Q(a,x)\,\Gamma(a)$ |
betaRegularized(x, a, b) | T / Complex<R> | 正則化不完全ベータ $I_x(a,b)$。 $x\in[0,1],\ a,b>0$。 連分数展開 |
doubleFactorial(n) | int n → long long | 二重階乗 $n!! = n(n-2)(n-4)\cdots$。 $0!!=1!!=1$ |
risingFactorial(x, n) | T, int n | 上昇階乗 (Pochhammer 記号) $(x)_n = x(x+1)\cdots(x+n-1)$ |
fallingFactorial(x, n) | T, int n | 下降階乗 $x^{(n)} = x(x-1)\cdots(x-n+1)$ |
binomialCoefficient(n, k) | int → long long | 二項係数 $\binom{n}{k}$ (整数版、 $n \lesssim 62$ で安全) |
binomialCoefficientReal(n, k) | T, int k | 二項係数 (実 $n$ 対応の浮動小数点版) |
関数詳細
gamma
// ネイティブ浮動小数点 (std::tgamma へ委譲)
template<IsNativeFloat T>
[[nodiscard]] T gamma(T x);
// 複素引数 (Lanczos 近似 g=7, n=9)
template<IsNativeFloat R>
[[nodiscard]] Complex<R> gamma(Complex<R> z);
// 多倍長複素 (任意精度、Stirling 漸近展開)
[[nodiscard]] Complex<Float> gamma(Complex<Float> z, int precision);
[[nodiscard]] Complex<Float> gamma(Complex<Float> z); // 既定精度
定義: $\Gamma(z) = \int_0^\infty t^{z-1} e^{-t}\,dt$ ($\operatorname{Re} z > 0$)、 一般には解析接続。 $\operatorname{Re}(z) < 0.5$ では反射公式 $\Gamma(z) = \pi / (\sin(\pi z)\,\Gamma(1-z))$ を用いる。 非正整数 $0, -1, -2, \dots$ で極。 多倍長版 Complex<Float> は精度引数 precision (10 進桁数) を取る。
lnGamma
template<IsNativeFloat T>
[[nodiscard]] T lnGamma(T x); // std::lgamma へ委譲
template<IsNativeFloat R>
[[nodiscard]] Complex<R> lnGamma(Complex<R> z); // Lanczos + log
[[nodiscard]] Complex<Float> lnGamma(Complex<Float> z, int precision);
[[nodiscard]] Complex<Float> lnGamma(Complex<Float> z);
説明: $\ln\Gamma(z)$。 ネイティブ版は実部のみ (主値 $\ln|\Gamma|$ に相当する std::lgamma)、 複素版は主枝の対数を返す。 統計分布の正規化定数など、 $\Gamma$ が桁あふれする大引数で有用。
beta
template<IsNativeFloat T>
[[nodiscard]] T beta(T a, T b);
template<IsNativeFloat R>
[[nodiscard]] Complex<R> beta(Complex<R> a, Complex<R> b);
[[nodiscard]] Complex<Float> beta(Complex<Float> a, Complex<Float> b, int precision);
[[nodiscard]] Complex<Float> beta(Complex<Float> a, Complex<Float> b);
定義: $B(a,b) = \dfrac{\Gamma(a)\,\Gamma(b)}{\Gamma(a+b)} = \displaystyle\int_0^1 t^{a-1}(1-t)^{b-1}\,dt$。 複素版は $\exp(\ln\Gamma(a) + \ln\Gamma(b) - \ln\Gamma(a+b))$ で計算しオーバーフローを抑える。
betaRegularized
template<IsNativeFloat T>
[[nodiscard]] T betaRegularized(T x, T a, T b); // x ∈ [0,1], a,b > 0
template<IsNativeFloat R>
[[nodiscard]] Complex<R> betaRegularized(Complex<R> z, Complex<R> a, Complex<R> b);
[[nodiscard]] Complex<Float> betaRegularized(Complex<Float> z, Complex<Float> a,
Complex<Float> b, int precision);
定義: 正則化不完全ベータ $I_x(a,b) = \dfrac{1}{B(a,b)}\displaystyle\int_0^x t^{a-1}(1-t)^{b-1}\,dt$。 第 1 引数が積分上限 $x$、 続いて形状母数 $a, b$。 $I_0=0,\ I_1=1$。 連分数 (Modified Lentz) と対称変換 $I_x(a,b) = 1 - I_{1-x}(b,a)$ で安定化。 二項分布・$F$ 分布・$t$ 分布の累積分布関数に現れる。
誤差関数・Fresnel・Dawson
誤差関数 $\operatorname{erf}$ とその親族 (補誤差 $\operatorname{erfc}$、 スケール補誤差 $\operatorname{erfcx}$、 虚誤差 $\operatorname{erfi}$、 逆誤差 $\operatorname{erf}^{-1}$)、 Fresnel 積分 $C(x), S(x)$、 Dawson 関数 $F(x)$ を提供する。 error_function.hpp は複素オーバーロードを持つが、 fresnel.hpp / dawson.hpp はネイティブ浮動小数点のみである。
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
erf(x) | T / Complex<R> | 誤差関数 $\operatorname{erf}(x) = \frac{2}{\sqrt\pi}\int_0^x e^{-t^2}dt$ |
erfc(x) | T / Complex<R> | 補誤差関数 $\operatorname{erfc}(x) = 1 - \operatorname{erf}(x)$ |
erfcx(x) | T / Complex<R> | スケール補誤差 $\operatorname{erfcx}(x) = e^{x^2}\operatorname{erfc}(x)$。 大 $x$ でも桁あふれしない |
erfi(x) | T | 虚誤差関数 $\operatorname{erfi}(x) = -i\,\operatorname{erf}(ix) = \frac{2}{\sqrt\pi}\int_0^x e^{t^2}dt$。 奇関数 |
erfInv(p) | T | 逆誤差関数。 $\operatorname{erf}(\operatorname{erfInv}(p)) = p$、 定義域 $p\in(-1,1)$ |
fresnelC(x) | T | Fresnel 余弦積分 $C(x) = \int_0^x \cos(\tfrac{\pi}{2}t^2)\,dt$ |
fresnelS(x) | T | Fresnel 正弦積分 $S(x) = \int_0^x \sin(\tfrac{\pi}{2}t^2)\,dt$ |
fresnelCS(x) | T → std::pair<T,T> | $C(x)$ と $S(x)$ を同時に返す ($\{C, S\}$) |
dawson(x) | T | Dawson 関数 $F(x) = e^{-x^2}\int_0^x e^{t^2}\,dt$ |
関数詳細
erf
template<IsNativeFloat T>
[[nodiscard]] T erf(T x); // std::erf へ委譲
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> erf(Complex<R> z); // 級数 (₁F₁ 形)
説明: 標準正規分布に現れる誤差関数。 複素版は全 $z$ で収束する級数 $\operatorname{erf}(z) = \frac{2z}{\sqrt\pi}e^{-z^2}\sum_{n\ge0}\frac{(2z^2)^n}{1\cdot3\cdots(2n+1)}$ を用いる。 SpecialFunctionScalar R は double または Float を許す (Complex<Float> は引数の作業精度で収束判定)。
erfcx
template<IsNativeFloat T>
[[nodiscard]] T erfcx(T x);
template<IsNativeFloat R>
[[nodiscard]] Complex<R> erfcx(Complex<R> z);
[[nodiscard]] Complex<Float> erfcx(Complex<Float> z, int precision);
[[nodiscard]] Complex<Float> erfcx(Complex<Float> z);
説明: $\operatorname{erfcx}(x) = e^{x^2}\operatorname{erfc}(x)$。 $\operatorname{erfc}$ が指数的に小さくなる大 $x$ でも有効桁を保つため、 Voigt プロファイルや拡散方程式の評価に用いる。 大 $x$ では漸近展開、 小 $|z|$ では直接計算、 $\operatorname{Re}(z)\ge0$ では Laplace 連分数を切り替える。
erfInv
template<IsNativeFloat T>
[[nodiscard]] T erfInv(T p); // p ∈ (-1, 1)
説明: 逆誤差関数。 $\operatorname{erf}(y) = p$ を満たす実数 $y$ を Newton 法で求める (3〜4 反復で機械精度)。 $p = \pm1$ で $\pm\infty$、 $|p| > 1$ で $\mathrm{NaN}$。 正規分布の分位点 (確率→値) の計算に使う。
fresnelC / fresnelS
template<IsNativeFloat T>
[[nodiscard]] T fresnelC(T x);
template<IsNativeFloat T>
[[nodiscard]] T fresnelS(T x);
定義: $C(x) = \displaystyle\int_0^x \cos\!\left(\tfrac{\pi}{2}t^2\right)dt$、 $S(x) = \displaystyle\int_0^x \sin\!\left(\tfrac{\pi}{2}t^2\right)dt$ (正規化形)。 ともに奇関数で $x\to\infty$ のとき $C, S \to 1/2$。 光学の回折・Cornu スパイラルに現れる。 小 $x$ で Taylor 級数、 大 $x$ で漸近展開を用いる。
fresnelCS
template<IsNativeFloat T>
[[nodiscard]] std::pair<T, T> fresnelCS(T x); // { C(x), S(x) }
説明: $C(x)$ と $S(x)$ をまとめて計算し std::pair<T,T> ($\{C, S\}$、 すなわち .first = C(x), .second = S(x)) で返す。 両方が必要なとき重複計算を避けられる。
dawson
template<IsNativeFloat T>
[[nodiscard]] T dawson(T x);
定義: Dawson 関数 $F(x) = e^{-x^2}\displaystyle\int_0^x e^{t^2}\,dt$。 奇関数で $x=0$ 付近では $F(x)\approx x$、 $x\to\infty$ では $F(x)\approx 1/(2x)$。 $\operatorname{erfi}$ と $F(x) = \frac{\sqrt\pi}{2}e^{-x^2}\operatorname{erfi}(x)$ で関係する。 Rybicki (1989) のアルゴリズムで実装。
指数積分・対数積分
指数積分 $\operatorname{Ei}$ とその一般化 $E_n$、 対数積分 $\operatorname{li}$、 三角・双曲線積分 ($\operatorname{Si}, \operatorname{Ci}, \operatorname{Shi}, \operatorname{Chi}$)、 二重対数 $\operatorname{Li}_2$ を exponential_integral.hpp が提供する。 expint (Ei) と dilog ($\operatorname{Li}_2$) には複素オーバーロードがある。
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
expint(x) | T / Complex<R> | 指数積分 $\operatorname{Ei}(x) = -\!\!\int_{-x}^\infty \frac{e^{-t}}{t}dt$ (主値) |
expintN(n, x) | int n, T | 一般化指数積分 $E_n(x) = \int_1^\infty \frac{e^{-xt}}{t^n}dt$ |
li(x) | T | 対数積分 $\operatorname{li}(x) = \int_0^x \frac{dt}{\ln t}$ ($x > 1$ は主値) |
sinIntegral(x) | T | 正弦積分 $\operatorname{Si}(x) = \int_0^x \frac{\sin t}{t}dt$ |
cosIntegral(x) | T | 余弦積分 $\operatorname{Ci}(x) = -\!\!\int_x^\infty \frac{\cos t}{t}dt$ ($x > 0$) |
sinhIntegral(x) | T | 双曲線正弦積分 $\operatorname{Shi}(x) = \int_0^x \frac{\sinh t}{t}dt$ |
coshIntegral(x) | T | 双曲線余弦積分 $\operatorname{Chi}(x)$ ($x > 0$) |
dilog(x) | T / Complex<R> | 二重対数 (Spence) $\operatorname{Li}_2(x) = -\!\!\int_0^x \frac{\ln(1-t)}{t}dt$ |
関数詳細
expint / expintN
// 指数積分 Ei(x)
template<IsNativeFloat T>
[[nodiscard]] T expint(T x);
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> expint(Complex<R> z);
// 一般化指数積分 E_n(x)
template<IsNativeFloat T>
[[nodiscard]] T expintN(int n, T x); // n ≥ 0
説明: expint は指数積分 $\operatorname{Ei}(x)$ (実軸上は $x=0$ で対数発散、 主値)。 expintN は次数 $n$ の一般化指数積分 $E_n(x)$ で、 $E_1(x) = -\operatorname{Ei}(-x)$ の関係をもつ。 $n$ は非負整数の次数。
dilog
template<IsNativeFloat T>
[[nodiscard]] T dilog(T x);
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> dilog(Complex<R> z);
定義: 二重対数 (Spence の関数) $\operatorname{Li}_2(z) = \displaystyle\sum_{k=1}^\infty \frac{z^k}{k^2} = -\!\!\int_0^z \frac{\ln(1-t)}{t}\,dt$。 $\operatorname{Li}_2(1) = \pi^2/6$。 複素版は分岐切断 $[1,\infty)$ をもつ主枝。 統計力学・量子場理論のループ積分に頻出する。
ベッセル関数族
ベッセル関数 $J_\nu, Y_\nu$ (第 1・2 種)、 変形ベッセル $I_\nu, K_\nu$、 球ベッセル、 Hankel $H^{(1,2)}$、 Airy $\operatorname{Ai}, \operatorname{Bi}$、 Kelvin ($\operatorname{ber}, \operatorname{bei}, \operatorname{ker}, \operatorname{kei}$)、 Struve $\mathbf{H}_\nu, \mathbf{L}_\nu$、 Anger-Weber を集約する。 ベッセル本体と Airy は複素引数 (および多倍長 Complex<Float>) に対応する。 Kelvin・Struve・Anger-Weber はネイティブ浮動小数点のみ。
引数規約: 実数位数は nu (型 T)、 整数位数は n (型 int、 球ベッセルは unsigned int)、 実引数は x、 複素引数は z。
ベッセル関数 (bessel.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
besselJ(nu, x) | T / (int, Complex) | 第 1 種ベッセル $J_\nu(x)$。 実位数 nu または整数位数 n |
besselY(nu, x) | T / (int, Complex) | 第 2 種ベッセル (Neumann) $Y_\nu(x)$。 $x > 0$ |
besselI(nu, x) | T / (int, Complex) | 第 1 種変形ベッセル $I_\nu(x)$ |
besselK(nu, x) | T / (int, Complex) | 第 2 種変形ベッセル (Macdonald) $K_\nu(x)$。 $x > 0$ |
besselJPrime(nu, x) | T | 導関数 $J_\nu'(x)$ (Y/I/K 版も同様) |
sphericalBesselJ(n, x) | unsigned int n, T | 球ベッセル $j_n(x) = \sqrt{\tfrac{\pi}{2x}}J_{n+1/2}(x)$ |
sphericalBesselY(n, x) | unsigned int n, T | 球ノイマン $y_n(x)$ |
hankelH1(n, z) | (int, Complex) | 第 1 種 Hankel $H_n^{(1)}(z) = J_n + iY_n$ |
hankelH2(n, z) | (int, Complex) | 第 2 種 Hankel $H_n^{(2)}(z) = J_n - iY_n$ |
hankelH1Prime(n, z) | (int, Complex) | $H_n^{(1)}{}'(z)$ (H2 版も同様) |
sphericalHankelH1(n, z) | (int, Complex<double>) | 球 Hankel $h_n^{(1)}(z)$ (H2 版も) |
besselJ
// 実位数 nu (実数)
template<IsNativeFloat T>
[[nodiscard]] T besselJ(T nu, T x);
// 整数位数 n の簡便版
template<IsNativeFloat T>
[[nodiscard]] T besselJ(int n, T x);
// 複素引数 (整数位数)
[[nodiscard]] Complex<double> besselJ(int n, const Complex<double>& z);
[[nodiscard]] Complex<Float> besselJ(int n, const Complex<Float>& z, int precision);
[[nodiscard]] Complex<Float> besselJ(int n, const Complex<Float>& z);
定義: $J_\nu(x)$ はベッセルの微分方程式 $x^2 y'' + x y' + (x^2 - \nu^2)y = 0$ の有界解。 実位数 nu は任意実数、 整数位数版は int n。 複素オーバーロードは整数位数 n と複素引数 z を取る。 besselY / besselI / besselK も同一のオーバーロード構成 (実位数・整数位数・複素) をもつ。
Airy 関数 (airy.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
airyAi(x) | T / Complex | 第 1 種 Airy $\operatorname{Ai}(x)$ |
airyBi(x) | T / Complex | 第 2 種 Airy $\operatorname{Bi}(x)$ |
airyAiPrime(x) | T / Complex | 導関数 $\operatorname{Ai}'(x)$ |
airyBiPrime(x) | T / Complex | 導関数 $\operatorname{Bi}'(x)$ |
airyAi
template<IsNativeFloat T>
[[nodiscard]] T airyAi(T x);
[[nodiscard]] Complex<double> airyAi(const Complex<double>& z);
[[nodiscard]] Complex<Float> airyAi(const Complex<Float>& z, int precision);
定義: Airy 方程式 $y'' = x y$ の解。 $\operatorname{Ai}(x)$ は $x\to+\infty$ で指数的に減衰、 $\operatorname{Bi}(x)$ は発散する。 量子力学の転回点近傍 (WKB 接続)、 光学の焦点回折に現れる。 多倍長複素版は精度引数 precision が必須 (既定精度版は無し)。
Kelvin・Struve・Anger-Weber
| 関数 | シグネチャ概要 | 説明・定義域 / ヘッダ |
|---|---|---|
ber(x), bei(x) | T | Kelvin 関数 (実部・虚部 $J_0(xe^{3\pi i/4})$)。 kelvin.hpp |
ker(x), kei(x) | T | Kelvin 関数 ($K_0$ 系)。 kelvin.hpp |
struveH(nu, z) | T / (int, T) | Struve 関数 $\mathbf{H}_\nu(z)$。 $z \ge 0$。 struve.hpp |
struveL(nu, z) | T / (int, T) | 変形 Struve 関数 $\mathbf{L}_\nu(z)$。 struve.hpp |
angerJ(nu, z) | T | Anger 関数 $\mathbf{J}_\nu(z)$。 anger_weber.hpp |
weberE(nu, z) | T | Weber 関数 $\mathbf{E}_\nu(z)$。 anger_weber.hpp |
これらはすべてネイティブ浮動小数点のみで、 複素・多倍長オーバーロードは持たない。 kelvin.hpp / struve.hpp / anger_weber.hpp のうち kelvin.hpp と struve.hpp は special.hpp に含まれず個別 include が必要である (anger_weber.hpp はアグリゲートに含まれる)。
直交多項式
古典直交多項式: Legendre $P_n$ とその親族 (随伴 Legendre $P_n^m$、 球面調和の動径成分 $Y_n^m$、 Jacobi $P_n^{(\alpha,\beta)}$、 Gegenbauer $C_n^\lambda$) を legendre.hpp が、 Hermite・Laguerre・Chebyshev を orthogonal_classical.hpp が提供する。 Legendre 系の一部は複素引数 (および Complex<Float>) に対応する。 orthogonal_classical.hpp はネイティブ浮動小数点のみで、 special.hpp に含まれず個別 include が必要。
Legendre 系 (legendre.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
legendreP(n, x) | int n, T / Complex | Legendre 多項式 $P_n(x)$。 $x\in[-1,1]$ で直交 |
assocLegendreP(n, m, x) | int n, m, T / Complex | 随伴 Legendre $P_n^m(x)$ |
sphLegendre(n, m, theta) | int n, m, T theta | 正規化球面調和の動径部 $Y_n^m$ の $\theta$ 成分 |
jacobiP(n, alpha, beta, x) | int n, T alpha, beta, x / Complex | Jacobi 多項式 $P_n^{(\alpha,\beta)}(x)$ |
gegenbauerC(n, lambda, x) | int n, T lambda, x | Gegenbauer (超球) 多項式 $C_n^{\lambda}(x)$ |
legendreP
template<IsNativeFloat T>
[[nodiscard]] T legendreP(int n, T x);
[[nodiscard]] Complex<double> legendreP(int n, const Complex<double>& z);
[[nodiscard]] Complex<Float> legendreP(int n, const Complex<Float>& z, int precision);
定義: $P_n(x)$ は重み $1$ で区間 $[-1,1]$ 上直交する $n$ 次多項式 (Legendre 方程式の多項式解)。 引数 n は非負整数の次数。 assocLegendreP は階数 m を加えた $P_n^m$、 jacobiP は母数 alpha, beta をとる一般化で、 ともに複素オーバーロードをもつ。
Hermite・Laguerre・Chebyshev (orthogonal_classical.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
hermiteH(n, x) | int n, T | 物理学者の Hermite 多項式 $H_n(x)$ (重み $e^{-x^2}$) |
hermiteHe(n, x) | int n, T | 確率論の Hermite 多項式 $\operatorname{He}_n(x)$ (重み $e^{-x^2/2}$) |
laguerreL(n, x) | int n, T | Laguerre 多項式 $L_n(x)$ (重み $e^{-x}$, $[0,\infty)$) |
assocLaguerreL(n, alpha, x) | int n, T alpha, x | 随伴 Laguerre $L_n^{(\alpha)}(x)$ |
chebyshevT(n, x) | int n, T | 第 1 種 Chebyshev $T_n(x) = \cos(n\arccos x)$ |
chebyshevU(n, x) | int n, T | 第 2 種 Chebyshev $U_n(x)$ |
いずれも template<IsNativeFloat T> [[nodiscard]] T f(int n, ...) の形で、 次数 n は非負整数。 数値積分の Gauss 求積点・分光・スペクトル法の基底に用いる。
楕円積分・楕円関数
Legendre 標準形の楕円積分 ($K, E, F, \Pi$)、 Carlson 対称形 ($R_F, R_D, R_J, R_C$)、 Jacobi 楕円関数 ($\operatorname{sn}, \operatorname{cn}, \operatorname{dn}$) を elliptic.hpp が、 Jacobi テータ関数 $\vartheta_i$ を theta.hpp が、 Weierstrass の $\wp, \zeta_W, \sigma$ を weierstrass.hpp が提供する。 母数は k (modulus)、 振幅は phi、 特性は n の引数名を用いる。
楕円積分・Jacobi 楕円関数 (elliptic.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
ellipticK(k) | T / Complex | 第 1 種完全楕円積分 $K(k)$。 母数 $|k| < 1$ |
ellipticE(k) / ellipticE(phi, k) | T / Complex | 第 2 種楕円積分。 完全 $E(k)$ と不完全 $E(\varphi, k)$ (不完全は T のみ) |
ellipticF(phi, k) | T | 第 1 種不完全楕円積分 $F(\varphi, k)$ |
ellipticPi(n, k) / ellipticPi(n, phi, k) | T / Complex | 第 3 種楕円積分。 特性 $n$。 完全 $\Pi(n,k)$ と不完全 $\Pi(n,\varphi,k)$ |
carlsonRF(x, y, z) | T / Complex<double> | Carlson 第 1 種対称形 $R_F(x,y,z)$ |
carlsonRD(x, y, z) | T / Complex<double> | Carlson 第 2 種 $R_D(x,y,z)$ |
carlsonRJ(x, y, z, p) | T / Complex<double> | Carlson 第 3 種 $R_J(x,y,z,p)$ (特性 $p$) |
carlsonRC(x, y) | T / Complex<double> | Carlson 退化形 $R_C(x,y)$ |
jacobiSn(u, k) | T | Jacobi 楕円関数 $\operatorname{sn}(u, k)$ |
jacobiCn(u, k) | T | Jacobi 楕円関数 $\operatorname{cn}(u, k)$ |
jacobiDn(u, k) | T | Jacobi 楕円関数 $\operatorname{dn}(u, k)$ |
ellipticK
template<IsNativeFloat T>
[[nodiscard]] T ellipticK(T k); // 母数 k, |k| < 1
[[nodiscard]] Complex<double> ellipticK(const Complex<double>& k);
[[nodiscard]] Complex<Float> ellipticK(const Complex<Float>& k, int precision);
定義: 第 1 種完全楕円積分 $K(k) = \displaystyle\int_0^{\pi/2}\frac{d\theta}{\sqrt{1 - k^2\sin^2\theta}}$。 引数は母数 $k$ (parameter $m = k^2$ ではない)。 $k\to1$ で対数発散、 $K(0) = \pi/2$。 振り子の周期や AGM (算術幾何平均) と密接に関係する。
carlsonRF
template<IsNativeFloat T>
[[nodiscard]] T carlsonRF(T x, T y, T z);
[[nodiscard]] Complex<double> carlsonRF(const Complex<double>& x,
const Complex<double>& y,
const Complex<double>& z);
定義: $R_F(x,y,z) = \tfrac{1}{2}\displaystyle\int_0^\infty \frac{dt}{\sqrt{(t+x)(t+y)(t+z)}}$。 対称形は Legendre 標準形よりも数値的に安定で、 $K, E, F$ などはすべて Carlson 形で表せる (例: $K(k) = R_F(0, 1-k^2, 1)$)。 carlsonRJ は第 4 引数に特性 p を取る。 Carlson 系の複素オーバーロードは Complex<double> のみ。
Jacobi テータ関数 (theta.hpp)
Jacobi テータ関数 $\vartheta_1, \vartheta_2, \vartheta_3, \vartheta_4$。 引数は変数 z とノーム q (または半周期比 $\tau$ 版)。 ネイティブ・Float 実数・Complex<double>・Complex<Float> の各オーバーロードをもつ。
| 関数 | シグネチャ概要 | 説明 |
|---|---|---|
jacobiTheta1(z, q) | T / Float / Complex | テータ関数 $\vartheta_1(z, q)$ (奇) |
jacobiTheta2(z, q) | T / Float / Complex | $\vartheta_2(z, q)$ |
jacobiTheta3(z, q) | T / Float / Complex | $\vartheta_3(z, q)$ |
jacobiTheta4(z, q) | T / Float / Complex | $\vartheta_4(z, q)$ |
jacobiThetaiTau(z, tau) | Complex<Float> | $\tau$ 形のテータ (ノーム $q = e^{i\pi\tau}$)。 $i = 1,2,3,4$ |
qFromTau(tau) | Complex<Float> | 半周期比 $\tau$ からノーム $q$ への変換 |
jacobiTheta3ZeroAGM(q, precision) | Float | $z=0$ でのテータ値を AGM で高速計算 (2/3/4 各版) |
jacobiTheta1 (代表)
// ネイティブ浮動小数点 (変数 z, ノーム q)
template<IsNativeFloat T>
[[nodiscard]] T jacobiTheta1(T z, T q);
// 多倍長 Float 実数
[[nodiscard]] Float jacobiTheta1(const Float& z, const Float& q, int precision);
[[nodiscard]] Float jacobiTheta1(const Float& z, const Float& q);
// 複素 (実ノーム / 複素ノーム)
[[nodiscard]] Complex<double> jacobiTheta1(const Complex<double>& z, double q);
[[nodiscard]] Complex<double> jacobiTheta1(const Complex<double>& z, const Complex<double>& q);
// 多倍長複素 (実ノーム / 複素ノーム、precision 付きと既定精度)
[[nodiscard]] Complex<Float> jacobiTheta1(const Complex<Float>& z, const Float& q, int precision);
[[nodiscard]] Complex<Float> jacobiTheta1(const Complex<Float>& z, const Complex<Float>& q, int precision);
説明: ノーム $q = e^{i\pi\tau}$ ($|q| < 1$) を母数とするテータ級数。 $\vartheta_2, \vartheta_3, \vartheta_4$ も同一のオーバーロード構成をもつ。 楕円関数の構成、 ヤコビの三重積、 ヒート核の表現などに用いる。
Weierstrass 楕円関数 (weierstrass.hpp)
| 関数 | シグネチャ概要 | 説明 |
|---|---|---|
weierstrassP(z, omega1, omega2) | Complex<double> / double | Weierstrass の $\wp(z; \omega_1, \omega_2)$ (半周期で指定) |
weierstrassZeta(z, omega1, omega2) | Complex<double> / double | Weierstrass の $\zeta_W$ (Riemann ζ ではない) |
weierstrassSigma(z, omega1, omega2) | Complex<double> / double | Weierstrass の $\sigma$ |
半周期 $\omega_1, \omega_2$ で格子を指定する。 double オーバーロードは矩形格子向けに第 2 周期を純虚部 omega2_imag として与える。 Float / Complex<Float> 版は無い。
ゼータ関数族
Riemann ゼータ $\zeta(s)$、 Hurwitz ゼータ $\zeta(s, a)$、 Dirichlet イータ $\eta(s)$ を zeta.hpp が、 Clausen 関数 $\operatorname{Cl}$ を clausen.hpp が、 Lerch 超越関数 $\Phi$ を lerch.hpp が提供する。 zeta.hpp の 3 関数はネイティブ・複素・Complex<Float> の各オーバーロードをもつ。 lerch.hpp は special.hpp に含まれず個別 include が必要。
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
riemannZeta(s) | T / Complex<R> / Complex<Float> | Riemann ゼータ $\zeta(s) = \sum_{n\ge1} n^{-s}$。 $s\ne1$ |
hurwitzZeta(s, a) | T / Complex<R> / Complex<Float> | Hurwitz ゼータ $\zeta(s, a) = \sum_{n\ge0}(n+a)^{-s}$ |
dirichletEta(s) | T / Complex<R> / Complex<Float> | Dirichlet イータ $\eta(s) = \sum_{n\ge1}\frac{(-1)^{n-1}}{n^s} = (1-2^{1-s})\zeta(s)$ |
clausen(theta) | T | Clausen 関数 $\operatorname{Cl}_2(\theta) = -\int_0^\theta \ln|2\sin\tfrac{t}{2}|\,dt$ |
clausenCl(n, theta) | int n, T | 一般化 Clausen 関数 $\operatorname{Cl}_n(\theta)$ |
lerchPhi(z, s, a) | T / Float | Lerch 超越関数 $\Phi(z, s, a) = \sum_{n\ge0}\frac{z^n}{(n+a)^s}$ |
関数詳細
riemannZeta
template<IsNativeFloat T>
[[nodiscard]] T riemannZeta(T s);
template<IsNativeFloat R>
[[nodiscard]] Complex<R> riemannZeta(Complex<R> s);
[[nodiscard]] Complex<Float> riemannZeta(Complex<Float> s, int precision);
[[nodiscard]] Complex<Float> riemannZeta(Complex<Float> s);
定義: $\zeta(s) = \displaystyle\sum_{n=1}^\infty n^{-s}$ ($\operatorname{Re}s > 1$)、 一般には解析接続。 $s = 1$ で単純極。 $\zeta(2) = \pi^2/6$、 自明な零点は負の偶数。 複素版で臨界帯 $0 < \operatorname{Re}s < 1$ も評価できる。
hurwitzZeta
template<IsNativeFloat T>
[[nodiscard]] T hurwitzZeta(T s, T a);
template<IsNativeFloat R>
[[nodiscard]] Complex<R> hurwitzZeta(Complex<R> s, Complex<R> a);
[[nodiscard]] Complex<Float> hurwitzZeta(Complex<Float> s, Complex<Float> a, int precision);
[[nodiscard]] Complex<Float> hurwitzZeta(Complex<Float> s, Complex<Float> a);
定義: $\zeta(s, a) = \displaystyle\sum_{n=0}^\infty (n+a)^{-s}$。 $\zeta(s, 1) = \zeta(s)$ で Riemann ゼータを含む。 ポリガンマ $\psi^{(n)}$ や Lerch 超越関数と関係し、 Dirichlet $L$ 関数の構成にも使う。
lerchPhi
template<IsNativeFloat T>
[[nodiscard]] T lerchPhi(T z, T s, T a);
[[nodiscard]] Float lerchPhi(const Float& z, const Float& s, const Float& a, int precision);
[[nodiscard]] Float lerchPhi(const Float& z, const Float& s, const Float& a);
定義: Lerch 超越関数 $\Phi(z, s, a) = \displaystyle\sum_{n=0}^\infty \frac{z^n}{(n+a)^s}$。 多重対数 $\operatorname{Li}_s(z) = z\,\Phi(z, s, 1)$、 Hurwitz ゼータ $\zeta(s, a) = \Phi(1, s, a)$ を特殊形に含む統一的な関数。 多倍長 Float 版は精度引数をとる。
超幾何関数
Gauss 超幾何 ${}_2F_1$、 合流型 (Kummer) ${}_1F_1$、 ${}_0F_1$ を hypergeometric.hpp が、 一般化超幾何 ${}_pF_q$ と Meijer G を hypergeometric_pq.hpp が、 Mittag-Leffler 関数 $E_{\alpha,\beta}$ を mittag_leffler.hpp が提供する。 hypergeometric_pq.hpp と mittag_leffler.hpp は special.hpp に含まれず個別 include が必要。
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
hyperg(a, b, c, z) | T / Complex<R> | Gauss 超幾何 ${}_2F_1(a, b; c; z)$。 $|z| < 1$ で級数収束 |
confHyperg(a, b, z) | T / Complex<R> | 合流型超幾何 (Kummer の $M$) ${}_1F_1(a; b; z)$ |
hyperg0F1(b, z) | T / Complex<R> | ${}_0F_1(; b; z)$ (ベッセル系の母関数) |
pFq(a, b, z) | span/列挙, T / Float | 一般化超幾何 ${}_pF_q$。 分子・分母母数を配列で渡す |
meijerG(m, n, a, b, z) | int m, n, span/列挙, T | Meijer G 関数 $G^{m,n}_{p,q}$ (一般化された超越関数) |
meijerG_simple_b(m, b, z) | int m, span, T | $a$ 空・$n=0$ の簡約形 Meijer G |
mittagLeffler(alpha, beta, z) | T | Mittag-Leffler 関数 $E_{\alpha,\beta}(z)$。 単母数版 $E_\alpha(z)$ も |
関数詳細
hyperg / confHyperg / hyperg0F1
// ₂F₁(a, b; c; z)
template<IsNativeFloat T>
[[nodiscard]] T hyperg(T a, T b, T c, T z);
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> hyperg(Complex<R> a, Complex<R> b, Complex<R> c, Complex<R> z);
// ₁F₁(a; b; z) — Kummer 合流型
template<IsNativeFloat T>
[[nodiscard]] T confHyperg(T a, T b, T z);
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> confHyperg(Complex<R> a, Complex<R> b, Complex<R> z);
// ₀F₁(; b; z)
template<IsNativeFloat T>
[[nodiscard]] T hyperg0F1(T b, T z);
template<SpecialFunctionScalar R>
[[nodiscard]] Complex<R> hyperg0F1(Complex<R> b, Complex<R> z);
定義: ${}_2F_1(a,b;c;z) = \displaystyle\sum_{k=0}^\infty \frac{(a)_k (b)_k}{(c)_k}\frac{z^k}{k!}$ ($(x)_k$ は Pochhammer 記号)。 多くの特殊関数 (Legendre・Chebyshev・楕円積分など) を統一する。 confHyperg ${}_1F_1$ は Bessel・Laguerre・誤差関数の母体、 hyperg0F1 はベッセル関数 $J_\nu$ と関係する。 複素版の SpecialFunctionScalar R は double / Float を許す。
pFq
// ネイティブ (分子母数 a, 分母母数 b を span または initializer_list で)
template<IsNativeFloat T>
[[nodiscard]] T pFq(std::span<const T> a, std::span<const T> b, T z);
template<IsNativeFloat T>
[[nodiscard]] T pFq(std::initializer_list<T> a, std::initializer_list<T> b, T z);
// 多倍長 Float
[[nodiscard]] Float pFq(std::span<const Float> a, std::span<const Float> b,
const Float& z, int precision);
[[nodiscard]] Float pFq(std::initializer_list<Float> a, std::initializer_list<Float> b,
const Float& z, int precision);
定義: 一般化超幾何 ${}_pF_q(a_1,\dots,a_p; b_1,\dots,b_q; z) = \displaystyle\sum_{k=0}^\infty \frac{(a_1)_k\cdots(a_p)_k}{(b_1)_k\cdots(b_q)_k}\frac{z^k}{k!}$。 分子母数の配列 a ($p$ 個) と分母母数の配列 b ($q$ 個) を std::span または std::initializer_list で渡す。 ${}_2F_1$, ${}_1F_1$ などはこの特殊形。
// 例: ₂F₁(1, 2; 3; 0.5) を pFq で
double v = sangi::special::pFq<double>({1.0, 2.0}, {3.0}, 0.5);
mittagLeffler
// 二母数 E_{α,β}(z)
template<IsNativeFloat T>
[[nodiscard]] T mittagLeffler(T alpha, T beta, T z);
// 単母数 E_α(z) = E_{α,1}(z)
template<IsNativeFloat T>
[[nodiscard]] T mittagLeffler(T alpha, T z);
定義: $E_{\alpha,\beta}(z) = \displaystyle\sum_{k=0}^\infty \frac{z^k}{\Gamma(\alpha k + \beta)}$。 $E_{1,1}(z) = e^z$ を一般化し、 分数階微分方程式・異常拡散・粘弾性モデルの解に現れる。 引数が 2 個なら単母数版 $E_\alpha(z) = E_{\alpha,1}(z)$、 3 個なら二母数版。
その他の特殊関数
Lambert W、 Owen の T、 Coulomb 波動関数、 Fermi-Dirac 積分、 Debye 関数、 transport / synchrotron 積分、 角運動量結合係数 (Wigner)、 回転楕円体波動関数を収める。 spheroidal.hpp は special.hpp に含まれず個別 include が必要。
Lambert W・Owen の T (lambert_w.hpp, owens_t.hpp)
| 関数 | シグネチャ概要 | 説明・定義域 |
|---|---|---|
lambertW0(x) | T / Complex | Lambert W の主枝 $W_0$。 $W e^W = x$、 実は $x \ge -1/e$ |
lambertWm1(x) | T / Complex | Lambert W の下枝 $W_{-1}$。 実は $-1/e \le x < 0$ |
owensT(h, a) | T / Float | Owen の T 関数 $T(h, a)$ (二変量正規確率) |
lambertW0 / lambertWm1
template<IsNativeFloat T>
[[nodiscard]] T lambertW0(T x);
[[nodiscard]] Complex<double> lambertW0(const Complex<double>& z);
[[nodiscard]] Complex<Float> lambertW0(const Complex<Float>& z, int precision);
template<IsNativeFloat T>
[[nodiscard]] T lambertWm1(T x);
[[nodiscard]] Complex<double> lambertWm1(const Complex<double>& z);
[[nodiscard]] Complex<Float> lambertWm1(const Complex<Float>& z, int precision);
定義: $W(x)$ は $W e^{W} = x$ の解。 多価のため実数では 2 枝 ($W_0$ 主枝、 $W_{-1}$ 下枝) に分かれ、 $x = -1/e$ で両枝が合流する。 owensT(h, a) は $T(h,a) = \frac{1}{2\pi}\int_0^a \frac{e^{-h^2(1+t^2)/2}}{1+t^2}dt$ で、 二変量正規分布の確率計算に使う。
Coulomb・Fermi-Dirac・Debye・transport
| 関数 | シグネチャ概要 | 説明・定義域 / ヘッダ |
|---|---|---|
coulombF(L, eta, rho) | int L, T eta, rho | 正則 Coulomb 波動関数 $F_L(\eta, \rho)$。 coulomb.hpp |
coulombG(L, eta, rho) | int L, T eta, rho | 非正則 Coulomb 波動関数 $G_L(\eta, \rho)$。 coulomb.hpp |
coulombCL(L, eta) | int L, T eta | Coulomb 規格化定数 $C_L(\eta)$。 coulomb.hpp |
fermiDirac(s, x) | T s, x | 完全 Fermi-Dirac 積分 $F_s(x) = \frac{1}{\Gamma(s+1)}\int_0^\infty \frac{t^s}{e^{t-x}+1}dt$。 fermi_dirac.hpp |
fermiDiracHalf(x) | T | $s = 1/2$ の Fermi-Dirac 積分 (MHalf=$-\tfrac12$, 3Half=$\tfrac32$ も)。 fermi_dirac.hpp |
debye(n, x) | int n, T | Debye 関数 $D_n(x) = \frac{n}{x^n}\int_0^x \frac{t^n}{e^t-1}dt$。 debye.hpp |
debye1(x) … debye4(x) | T | 次数固定の Debye 関数 $D_1, \dots, D_4$。 debye.hpp |
transport(n, x) | int n, T | transport 積分 $\int_0^x \frac{t^n e^t}{(e^t-1)^2}dt$。 transport.hpp |
synchrotronF(x), synchrotronG(x) | T | シンクロトロン放射関数 $F(x), G(x)$。 transport.hpp |
角運動量結合 (coupling.hpp)
| 関数 | シグネチャ概要 | 説明 |
|---|---|---|
wigner3j(...) | inline double (int×6) | Wigner $3j$ 記号 |
wigner6j(...) | inline double (int×6) | Wigner $6j$ 記号 |
wigner9j(...) | inline double (int×9) | Wigner $9j$ 記号 |
clebschGordan(...) | inline double (int×6) | Clebsch-Gordan 係数 |
wigner3j / clebschGordan
inline double wigner3j(int two_j1, int two_j2, int two_j3,
int two_m1, int two_m2, int two_m3);
inline double clebschGordan(int two_j1, int two_m1,
int two_j2, int two_m2,
int two_J, int two_M);
inline double wigner6j(int two_j1, int two_j2, int two_j3,
int two_j4, int two_j5, int two_j6);
inline double wigner9j(int two_j1, int two_j2, int two_j3,
int two_j4, int two_j5, int two_j6,
int two_j7, int two_j8, int two_j9);
引数規約: 角運動量・磁気量子数はすべて2 倍した整数 (two_j = $2j$, two_m = $2m$) で渡す。 これにより半整数スピンを整数のみで厳密に扱える。 量子力学の角運動量結合、 分光学の選択則計算に用いる。 戻り値は double (テンプレートではない)。
回転楕円体波動関数 (spheroidal.hpp)
| 関数 | シグネチャ概要 | 説明 |
|---|---|---|
spheroidalEigenvalueProlate(m, n, c) | int m, n, T c | 扁長回転楕円体の固有値 $\lambda_{mn}(c)$ |
spheroidalEigenvalueOblate(m, n, c) | int m, n, T c | 扁平回転楕円体の固有値 |
spheroidalPS1(m, n, c, eta) | int m, n, T c, eta | 扁長角度波動関数 $S_{mn}^{(1)}(c, \eta)$ |
spheroidalOS1(m, n, c, eta) | int m, n, T c, eta | 扁平角度波動関数 |
次数 m, n ($n \ge m \ge 0$)、 スフェロイド母数 c、 角度変数 eta をとる。 波動方程式の回転楕円体座標系での分離解で、 アンテナ・音響散乱の解析に現れる。
使用例
#include <math/special/special.hpp>
#include <iostream>
using namespace sangi::special;
int main() {
// ガンマ関数: Γ(1/2) = √π
std::cout << "gamma(0.5) = " << gamma(0.5) << '\n';
// 実行結果: gamma(0.5) = 1.77245385090552 (√π)
// 第 1 種ベッセル関数: J_0(0) = 1
std::cout << "besselJ(0,0)= " << besselJ(0, 0.0) << '\n';
// 実行結果: besselJ(0,0)= 1
// 誤差関数: erf(1)
std::cout << "erf(1.0) = " << erf(1.0) << '\n';
// 実行結果: erf(1.0) = 0.842700792949715
// 第 1 種完全楕円積分: K(0) = π/2
std::cout << "ellipticK(0)= " << ellipticK(0.0) << '\n';
// 実行結果: ellipticK(0)= 1.5707963267949 (π/2)
return 0;
}
完全修飾で呼ぶ場合は using を省いて sangi::special::gamma(0.5) のように書く。 複素引数や多倍長 (Complex<Float> + 精度引数) を使うときは、 対応するオーバーロードがあるファミリー (ガンマ・誤差関数・ベッセル・Airy・楕円・ゼータ・超幾何など) を選ぶ。
// 複素引数の例: 臨界線上の Riemann ゼータ ζ(1/2 + 14.13i)
#include <math/special/special.hpp>
using namespace sangi;
using namespace sangi::special;
Complex<double> s(0.5, 14.134725);
Complex<double> z = riemannZeta(s); // 最初の非自明零点の近傍 → |z| ≈ 0
// 個別 include が要るファミリー: 一般化超幾何 ₂F₁(1,2;3;0.5)
#include <math/special/hypergeometric_pq.hpp>
double f = pFq<double>({1.0, 2.0}, {3.0}, 0.5);
関連する数学的背景
以下の記事では、特殊関数モジュールの基盤となる数学的概念を解説している。