ガンマ関数の近似式
初等関数の近似
を参考にしましたが、近似式でうまく出力できなかったので『C言語による最新アルゴリズム事典』を参考にしてガンマ関数について書きました。以下にコードとその近似式について書きます。
ガンマ関数
漸化式
対数は漸近展開すると
また、x<0のときは
とした。
と参考文献には書かれているんだけどコード的にところどころ違う。
#-*- coding:utf-8 -*- from numpy import * PI=3.14159265358979324 LOG_2PI=1.837877066400934548 N=8 B0=1 B1=(-1.0/2.0) B2=(1.0/6.0) B4=(1.0/30.0) B6=(1.0/42.0) B8=(-1.0/30.0) B10=(5.0/66.0) B12=(-691.0/2730.0) B14=(7.0/6.0) B16=(-3617.0/510.0) B18=(43867.0/798.0) B20=(-174611.0/330.0) def log_gamma(x): v=1 while x < N: v*=x x+=1 w=1/(x*x) return 0.5*LOG_2PI - log(v) -x + (x-0.5) *log(x) + (((((((( (B16/(16*15))*w + (B14/(14*13))) *w + (B12/(12*11))) *w + (B10*9)))*w +(B8/(8*7)))*w + (B6/(6*5)))*w +(B4/(4*3))) *w + (B2/(2*1)))/x def gamma(x): if x < 0: return PI/(sin(PI*x)*exp(log_gamma(1-x))) return exp(log_gamma(x))