# ガンマ関数(近似) Gamma Function Approximation # 引数 値 ($X) # 戻り値 ガンマ関数(近似) ($GammaFunction) sub GAMMAFUNCTION{ my ($X) = @_; my $GammaFunction = 0; my $Factorial = 1; my $Diff = abs($X - int($X)); my $Pi = atan2(1, 1) * 4; my $Temp = 0; # 値の確認 if(($X <= 0) && ($Diff == 0)){ return 0; } if($Diff == 0){ for(my $i = $X - 1; $i >= 2; $i--){ $Factorial *= $i; } # X-1の階乗 ガンマ関数 Gamma Function $GammaFunction = $Factorial; }elsif($Diff == 0.5){ my $Start = ($X > 0 ? ((2 * int($X)) - 1) : ((2 * int(abs($X) + 1)) - 1)); for(my $i = $Start; $i > 1; $i -= 2){ $Factorial *= $i; } if($X > 0){ $Temp = ($Factorial / (2 ** int($X))) * sqrt($Pi); }else { $Temp = ((((-1) ** int(abs($X) + 1)) * (2 ** int(abs($X) + 1))) / $Factorial) * sqrt($Pi); } # 半整数 ガンマ関数 Gamma Function $GammaFunction = $Temp }else { if($X > 0){ $Temp = exp(LOGGAMMAFUNCTION($X)); }else { $Temp = $Pi / (sin($Pi * $X) * exp(LOGGAMMAFUNCTION(1 - $X))); } # ガンマ関数(近似) Gamma Function Approximation $GammaFunction = $Temp } return $GammaFunction; } # ログガンマ関数(近似) Log Gamma Function Approximation # 引数 値 ($X) # 戻り値 ログガンマ関数(近似) ($LogGammaFunction) sub LOGGAMMAFUNCTION{ my ($X) = @_; my $LogGammaFunction = 0; my $Pi = atan2(1, 1) * 4; 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; }