# ガンマ関数 Gamma Function # 引数 自由度 ($DegreesOfDreedom) # 戻り値 ガンマ関数 (@GammaFunction) sub GAMMAFUNCTION{ my ($DegreesOfDreedom) = @_; my $GammaFunction = 0; my $X = $DegreesOfDreedom; my $Factorial = 1; my $Diff = $X - int($X); my $Pi = atan2(1, 1) * 4; if($Diff == 0){ for(my $i = $X - 1; $i > 1; $i--){ $Factorial *= $i; } # N-1の階乗 $GammaFunction = $Factorial; }elsif($Diff == 0.5){ for(my $i = int($X); $i > 0; $i--){ $Factorial *= ((2 * $i) + 1) / 2; } # 半整数 $GammaFunction = $Factorial * sqrt($Pi); }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; }