Special Functions — 特殊関数

概要

sangi の特殊関数モジュールは、数理物理・統計・数値解析で頻出する約 30 ファミリー・80 以上の特殊関数を統一的に提供する。 すべて namespace sangi::special の自由関数である。

対応スカラー型は次の 3 系統である。

  • ネイティブ浮動小数点float / double / long doubletemplate<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, ほか

ガンマ関数族

ガンマ関数 $\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)TFresnel 余弦積分 $C(x) = \int_0^x \cos(\tfrac{\pi}{2}t^2)\,dt$
fresnelS(x)TFresnel 正弦積分 $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)TDawson 関数 $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 Rdouble または 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)TKelvin 関数 (実部・虚部 $J_0(xe^{3\pi i/4})$)。 kelvin.hpp
ker(x), kei(x)TKelvin 関数 ($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)TAnger 関数 $\mathbf{J}_\nu(z)$。 anger_weber.hpp
weberE(nu, z)TWeber 関数 $\mathbf{E}_\nu(z)$。 anger_weber.hpp

これらはすべてネイティブ浮動小数点のみで、 複素・多倍長オーバーロードは持たない。 kelvin.hpp / struve.hpp / anger_weber.hpp のうち kelvin.hppstruve.hppspecial.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 / ComplexLegendre 多項式 $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 / ComplexJacobi 多項式 $P_n^{(\alpha,\beta)}(x)$
gegenbauerC(n, lambda, x)int n, T lambda, xGegenbauer (超球) 多項式 $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, TLaguerre 多項式 $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)TJacobi 楕円関数 $\operatorname{sn}(u, k)$
jacobiCn(u, k)TJacobi 楕円関数 $\operatorname{cn}(u, k)$
jacobiDn(u, k)TJacobi 楕円関数 $\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> / doubleWeierstrass の $\wp(z; \omega_1, \omega_2)$ (半周期で指定)
weierstrassZeta(z, omega1, omega2)Complex<double> / doubleWeierstrass の $\zeta_W$ (Riemann ζ ではない)
weierstrassSigma(z, omega1, omega2)Complex<double> / doubleWeierstrass の $\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.hppspecial.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)TClausen 関数 $\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 / FloatLerch 超越関数 $\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.hppmittag_leffler.hppspecial.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/列挙, TMeijer 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)TMittag-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 Rdouble / 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.hppspecial.hpp に含まれず個別 include が必要

Lambert W・Owen の T (lambert_w.hpp, owens_t.hpp)

関数シグネチャ概要説明・定義域
lambertW0(x)T / ComplexLambert W の主枝 $W_0$。 $W e^W = x$、 実は $x \ge -1/e$
lambertWm1(x)T / ComplexLambert W の下枝 $W_{-1}$。 実は $-1/e \le x < 0$
owensT(h, a)T / FloatOwen の 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 etaCoulomb 規格化定数 $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, TDebye 関数 $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, Ttransport 積分 $\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);

関連する数学的背景

以下の記事では、特殊関数モジュールの基盤となる数学的概念を解説している。