# ガンマ関数 Gamma Function # 引数 値 ($X) # 戻り値 ガンマ関数 ($GammaFunction) sub GAMMAFUNCTION{ my ($X) = @_; my $GammaFunction = 0; my $Factorial = 1; my $Diff = $X - int($X); my $Pi = atan2(1, 1) * 4; if($Diff == 0){ for(my $i = $X - 1; $i >= 2; $i--){ $Factorial *= $i; } # X-1の階乗 $GammaFunction = $Factorial; }elsif($Diff == 0.5){ for(my $i = (2 * int($X)) - 1; $i > 1; $i -= 2){ $Factorial *= $i; } # 半整数 $GammaFunction = $Factorial * sqrt($Pi) / (2 ** int($X)); }else { my $X1 = 1 / (12 * $X); my $X2 = 1 / (288 * ($X * $X)); my $X3 = 139 / (51840 * ($X * $X * $X)); my $X4 = 571 / (2488320 * ($X * $X * $X * $X)); my $X5 = 163879 / (209018880 * ($X * $X * $X * $X * $X)); my $X6 = 5246819 / (75246796800 * ($X * $X * $X * $X * $X * $X)); my $X7 = 534703531 / (902961561600 * ($X * $X * $X * $X * $X * $X * $X)); my $X8 = 4483131259 / (86684309913600 * ($X * $X * $X * $X * $X * $X * $X * $X)); my $X9 = 432261921612371 / (514904800886784000 * ($X * $X * $X * $X * $X * $X * $X * $X)); # スターリングの近似 Stirling's Approximation $GammaFunction = sqrt(2 * $Pi) * ($X ** ($X - (1 / 2))) * exp(-$X) * (1 + $X1 + $X2 - $X3 - $X4 + $X5 + $X6 - $X7 - $X8 + $X9); } return $GammaFunction; }