Catalog · How the catalog works
GammaFunc
How to compute the Gamma function.
- ★ 5 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README
GammaFunc
ガンマ関数の計算方法。

ガンマ関数は以下のように定義される。
ここでは扱わないが、複素数への拡張も可能である。
数値計算によって求める手法には以下の3つが存在するが、ここでは最も一般的な Lanczos近似 を用いる。
Lanczos近似 は以下のように、適切な定数gに依存する係数列pk(g)によって定義され、数列の個数Nが多いほど高精度な近似が可能となる。ここではN = 7, 9, 11, 15の場合を実装し、対応するgはそれぞれg = 5, 7, 9, 607/128となる。
ガンマ関数は、発散する特異点を含まない正の定義域においても非常に大きな値となるので、倍精度浮動小数点数(Double型)で計算したとしても、約 171.7 以上の定義域 における算術オーバーフローが避けられない。
そこで、ガンマ関数を利用する諸計算には、ガンマ関数の対数である 対数ガンマ関数(log-gamma function)を間接的に利用した方が扱いやすい。
なお、対数ガンマ関数Ln(Γ(x))は ガンマ関数Γ(x)が正となる定義域 でしか定義されないので、対数ガンマ関数からガンマ関数を逆算する際には オイラーの相半公式(reflection formula)を利用する必要がある。
ここでは2種類の実装方法を提供する。
LUX.Math.Special.Gamma.Lanczos.pas
Lanczos近似に忠実な実装。function LnGammaP*( const X_:Double ) :Double;
正の定義域のみの対数ガンマ関数。function LnGamma*( const X_:Double ) :Double;
対数ガンマ関数(負の値域は未定義)。function GammaP*( const X_:Double ) :Double;
正の定義域のみのガンマ関数(対数ガンマ関数から逆算)。function Gamma*( const X_:Double ) :Double;
ガンマ関数(対数ガンマ関数から逆算)。
LUX.Math.Special.Gamma.Ooura.pas
大浦拓哉氏による最適化実装。function dgamma( const X_:Double ) :Double;
直接計算型のガンマ関数。function LnGammaP( const X_:Double ) :Double;
正の定義域のみの対数ガンマ関数。function LnGamma( const X_:Double ) :Double;
対数ガンマ関数(負の値域は未定義)。function GammaP( const X_:Double ) :Double;
正の定義域のみのガンマ関数(対数ガンマ関数から逆算)。function Gamma( const X_:Double ) :Double;
ガンマ関数(対数ガンマ関数から逆算)。







