FC2ブログ

# ログガンマ関数(近似) Log Gamma Function Approximation
# 引数 値 ($X)
# 戻り値 ログガンマ関数(近似) ($LogGammaFunction)
sub LOGGAMMAFUNCTION{
my ($X) = @_;
my $LogGammaFunction = 0;
my $Pi = atan2(1, 1) * 4;

# 値の確認
if($X <= 0){
return 0;
}

my $Ln1 = log(2 * $Pi) / log(exp(1));
my $Ln2 = log($X) / log(exp(1));
my $X1 = 1 / (12 * $X);
my $X3 = 1 / (360 * ($X * $X * $X));
my $X5 = 1 / (1260 * ($X * $X * $X * $X * $X));
my $X7 = 1 / (1680 * ($X * $X * $X * $X * $X * $X * $X));
my $X9 = 1 / (1188 * ($X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X11 = 691 / (360360 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X13 = 1 / (156 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X15 = 3617 / (122400 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X17 = 43867 / (244188 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X19 = 174611 / (125400 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X21 = 77683 / (5796 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));
my $X23 = 236364091 / (1506960 * ($X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X * $X));

# スターリングの近似 Stirling's Approximation
# ログガンマ関数(近似) Log Gamma Function Approximation
$LogGammaFunction = ((1 / 2) * $Ln1) + (($X - (1 / 2)) * $Ln2) - $X + $X1 - $X3 + $X5 - $X7 + $X9 - $X11 + $X13 - $X15 + $X17 - $X19 + $X21 - $X23;

return $LogGammaFunction;
}


C言語による最新アルゴリズム事典

# ログガンマ関数(近似) Log Gamma Function Approximation
# 引数 値 ($x)
# 戻り値 ログガンマ関数(近似) ($LogGammaFunction)
sub LOGGAMMAFUNCTION{
my ($x) = @_;
my $LogGammaFunction = 0;
my @Bernoulli = ((1 / 12), (1 / 360), (1 / 1260), (1 / 1680), (1 / 1188), (691 / 360360), (1 / 156), (3617 / 122400), (43867 / 244188), (174611 / 125400), (77683 / 5796), (236364091 / 1506960));
my $Pi = atan2(1, 1) * 4;
my $X = $x;
my $Sum = 0;
my $Sign = 0;
my $Power1 = 1;
my $Power2 = 1;
my $Count = @Bernoulli - 1;

# 値の確認
if($X <= 0){
return 0;
}

for($X = $x; $X <= $Count; $X++){
$Power1 *= $X;
}
$Power2 = 1 / ($X * $X);

for(my $i = $Count; $i >= 0; $i--){
# 符号
$Sign = (($i % 2) == 0 ? 1: -1);

$Sum = $Sum + ($Sign * $Bernoulli[$i]);
$Sum = $Sum * $Power2 if($i != 0);
}
$Sum = $Sum / $X;

# スターリングの近似 Stirling's Approximation
# ログガンマ関数(近似) Log Gamma Function Approximation
$LogGammaFunction = ((1 / 2) * log(2 * $Pi)) - log($Power1) - $X + (($X - (1 / 2)) * log($X)) + $Sum;

return $LogGammaFunction;
}


参考URL
ログガンマ関数 - 高精度計算サイト
log gamma stirling - Gamma - Special - Maths Code in C, C++
Coefficients of Stirling approximation to log factorial

一言
上のログガンマ関数だと0付近になると近似しない
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS