スターリングの公式は、俗には階乗の近似式 もしくはこれにもう少し係数などが付いた物を指します。
今、求めた式を少し移項した上で両辺の対数を取ってみると、たしかに となってよく似た式になります。
あるいは だけずらすことにすると なので、 と置き換えて、 となります。
数値的に の差を取って比較してみます。
プログラム3
差 とその差に を掛けたものを出力します。 を掛けるのはスターリングの公式の近似の高次項からの類比による戯れです。
program gam3
use, intrinsic :: iso_fortran_env
implicit none
integer, parameter :: kq = real128
real(kq), parameter :: pi = 4 * atan(1.0_kq)
real(kq) :: x
integer :: i
do i = 1, 1000, 100
x = i
print '(i3,2(x,g0))', i, log(gamma(x + 0.5_kq)) - ( log(2 * pi) / 2 - x + x * log(x) ), &
( log(gamma(x + 0.5_kq)) - ( log(2 * pi) / 2 - x + x * log(x) ) ) * i
end do
end program gam3
計算結果
1 -.397207708399179641258481821872649E-001 -.397207708399179641258481821872649E-001
101 -.412538895125284184356880268682438E-003 -.416664284076537026200449071369262E-001
201 -.207296549782888548831458473423111E-003 -.416666065063605983151231531580453E-001
301 -.138427374882831965831612061863506E-003 -.416666398397324217153152306209154E-001
401 -.103906861724177446060175670243060E-003 -.416666515513951558701304437674669E-001
501 -.831669800064454703178056020480413E-004 -.416666569832291806292206066260687E-001
601 -.693288850874847850447310043197465E-004 -.416666599375783558118833335961676E-001
701 -.594388897581945996700061322962287E-004 -.416666617204944143686742987396564E-001
801 -.520183057158577580123800189897250E-004 -.416666628784020641679163952107697E-001
901 -.462449097365583306083968409790626E-004 -.416666636726390558781655537221354E-001
計算結果をみると、差は結構小さくよく近似されていることが分かります。また高次の補正項が であることも分かります。
そこで調子に乗って、もう一段同じ手続きを進めます。
プログラム4
差 とその差に を掛けたものを出力します。 は、計算結果からの逆算です。
program gam4
use, intrinsic :: iso_fortran_env
implicit none
integer, parameter :: kq = real128
real(kq), parameter :: pi = 4 * atan(1.0_kq)
real(kq) :: x
integer :: i
do i = 1, 1000, 100
x = i
print '(i3,2(x,g0))', i, log(gamma(x + 0.5_kq)) - ( log(2 * pi) / 2 - x + x * log(x) - 1.0_kq / (24 * x) ), &
( log(gamma(x + 0.5_kq)) - ( log(2 * pi) / 2 - x + x * log(x) - 1.0_kq / (24 * x) ) ) * i**3
end do
end program gam4
計算結果4
1 .194589582674870254081848447940181E-002 .194589582674870254081848447940181E-002
101 .235900012835689724514385849088463E-008 .243048019124623958856896254701693E-002
201 .299305005315181808524918841287283E-009 .243053652546747070948926446747635E-002
301 .891260273918649549369722899779121E-010 .243054706952683739145563255973093E-002
401 .376939439171983446954764391899663E-010 .243055077420759382117630006617249E-002
501 .193282185350048823554048332146143E-010 .243055249243288499852057323939240E-002
601 .111964863741344148635793726845698E-010 .243055342696905859466697952881662E-002
701 .705588053109556685876677566004617E-011 .243055399095148574762536148061177E-002
801 .472941897939918885290992188350704E-011 .243055435722780067273990289109438E-002
901 .332300511741232087996684894263910E-011 .243055460846571599191284911257351E-002
計算結果をみると、差は 程度とかなり小さくなっていることが分かります。また高次の補正項は電卓をいじっていると であることが分かります。
すなわち となっていると考えられます。
ここで近似は 10^-17 程度と倍精度を超えるところまで来ており、これ以上は同じやり方を繰り返しても数値誤差のためにうまくゆきませんでした。これを普通のスターリングの公式の補正項と比較してみると、べきも二次の(逆数)項がないなど、こちらの方が補正項が小さいことが分かります。
結論
以上、ガンマ関数が被積分関数のピーク値の寄与しかないと考えることで、おおむね直観的に理解でき、しかもそこから出てくるスターリングの公式に似た式は、元のスターリングの公式よりも補正項が小さくなっており、より良い近似になっていることも分かりました。
ここでは数値的に補正項を類推しましたが、被積分関数をピーク値での1の幅の短冊積分になっていると思ってやれば、オイラー=マクローリンの公式で導出できると思われます。