Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

GammaFunc

How to compute the Gamma function.

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

GammaFunc

ガンマ関数の計算方法。

ガンマ関数は以下のように定義される。


* Gamma function:Wikipedia

ここでは扱わないが、複素数への拡張も可能である。


* Gamma Function:Wolfram MathWorld

数値計算によって求める手法には以下の3つが存在するが、ここでは最も一般的な Lanczos近似 を用いる。

Lanczos近似 は以下のように、適切な定数gに依存する係数列pk(g)によって定義され、数列の個数Nが多いほど高精度な近似が可能となる。ここではN = 7, 9, 11, 15の場合を実装し、対応するgはそれぞれg = 5, 7, 9, 607/128となる。

* Lanczos approximation:Wikipedia

ガンマ関数は、発散する特異点を含まない正の定義域においても非常に大きな値となるので、倍精度浮動小数点数(Double型)で計算したとしても、約 171.7 以上の定義域 における算術オーバーフローが避けられない。

そこで、ガンマ関数を利用する諸計算には、ガンマ関数の対数である 対数ガンマ関数(log-gamma function)を間接的に利用した方が扱いやすい。


* Log Gamma Function:Wolfram MathWorld

なお、対数ガンマ関数Ln(Γ(x))は ガンマ関数Γ(x)が正となる定義域 でしか定義されないので、対数ガンマ関数からガンマ関数を逆算する際には オイラーの相半公式(reflection formula)を利用する必要がある。


* Lanczos approximation:Wikipedia

ここでは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;
      ガンマ関数(対数ガンマ関数から逆算)。

Delphi Starter