特殊関数デモ — ガンマ・ベッセル・ゼータを計算する

sangi の特殊関数モジュールは、ガンマ関数・ベッセル関数・ゼータ関数といった 数理物理や統計に頻出する関数を統一的に扱える。 このページでは 3 つのデモで代表的なユースケースを紹介する。

Demo 1: ガンマ関数と組合せ論

ガンマ関数 $\Gamma(x)$ は階乗を実数・複素数へ拡張したもので、$\Gamma(n)=(n-1)!$、$\Gamma(1/2)=\sqrt{\pi}$ という有名な値を持つ。二項係数も計算できる。

=== Demo 1: Gamma function === gamma(0.5) = 1.772453851 (= sqrt(pi)) gamma(5.0) = 24 (= 4! = 24) binomialCoefficient(10, 3) = 120
$\Gamma(1/2)=\sqrt{\pi}\approx1.7724539$、$\Gamma(5)=4!=24$。連続な階乗としてのガンマ関数が確かめられる。

Demo 2: 誤差関数とベッセル関数

誤差関数 $\operatorname{erf}(x)$ は正規分布の積分で、統計や拡散方程式に現れる。ベッセル関数 $J_\nu(x)$ は円柱座標の波動方程式の解で、$J_0(0)=1$, $J_1(0)=0$ という値を持つ。

=== Demo 2: Error and Bessel functions === erf(1.0) = 0.8427007929 besselJ(0, 0.0) = 1 (= 1) besselJ(1, 0.0) = 0 (= 0)
$\operatorname{erf}(1)\approx0.8427$ は標準正規分布で $\pm1/\sqrt{2}\sigma$ 内に入る確率に対応する。$J_0(0)=1$ は太鼓の中心の基本振動に対応。

Demo 3: ゼータ関数と楕円積分

リーマンゼータ関数 $\zeta(s)=\sum_{n\ge1} n^{-s}$ は偶数で閉じた値を持ち、$\zeta(2)=\pi^2/6$(バーゼル問題)、$\zeta(4)=\pi^4/90$ が有名。完全楕円積分 $K(k)$ は単振り子の周期などに現れ、$K(0)=\pi/2$。

=== Demo 3: Zeta function and elliptic integral === zeta(2.0) = 1.644934067 (= pi^2/6) zeta(4.0) = 1.082323234 (= pi^4/90) ellipticK(0.0) = 1.570796327 (= pi/2)
$\zeta(2)=\pi^2/6\approx1.6449$ はバーゼル問題の答え。$K(0)=\pi/2$ は振幅が小さい極限での単振り子の($1/4$ 周期に比例する)値。

ソースコードと実行方法

example_specialfunctions.cpp (完全なソースコード)
// example_specialfunctions.cpp — Special functions demo
#include <math/special/special.hpp>
#include <iostream>
#include <iomanip>
using namespace sangi;
using namespace sangi::special;

int main() {
    std::cout << std::setprecision(10);

    // --- Demo 1: Gamma function and combinatorics ---
    std::cout << "=== Demo 1: Gamma function ===\n";
    std::cout << "  gamma(0.5) = " << gamma(0.5) << "   (= sqrt(pi))\n";
    std::cout << "  gamma(5.0) = " << gamma(5.0) << "   (= 4! = 24)\n";
    std::cout << "  binomialCoefficient(10, 3) = " << binomialCoefficient(10, 3) << "\n";

    // --- Demo 2: Error function and Bessel function ---
    std::cout << "\n=== Demo 2: Error and Bessel functions ===\n";
    std::cout << "  erf(1.0)       = " << erf(1.0) << "\n";
    std::cout << "  besselJ(0, 0.0) = " << besselJ(0, 0.0) << "   (= 1)\n";
    std::cout << "  besselJ(1, 0.0) = " << besselJ(1, 0.0) << "   (= 0)\n";

    // --- Demo 3: Zeta function and elliptic integral ---
    std::cout << "\n=== Demo 3: Zeta function and elliptic integral ===\n";
    std::cout << "  zeta(2.0)     = " << riemannZeta(2.0) << "   (= pi^2/6)\n";
    std::cout << "  zeta(4.0)     = " << riemannZeta(4.0) << "   (= pi^4/90)\n";
    std::cout << "  ellipticK(0.0) = " << ellipticK(0.0) << "   (= pi/2)\n";

    return 0;
}

API の詳細は Special Functions API リファレンス を参照のこと。

ビルドと実行

cd sangi
mkdir build && cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release --target example-specialfunctions
examples\Release\example-specialfunctions.exe