- Lanczos approximation
In
mathematics , the Lanczos approximation is a method for computing theGamma function numerically, published byCornelius Lanczos in 1964. It is a practical alternative to the more popularStirling's approximation for calculating the Gamma function with fixed precision.Introduction
The Lanczos approximation consists of the formula
:Gamma(z+1) = sqrt{2pi} {left( z + g + frac{1}{2} ight)}^{z + frac{1}{2} } e^{-left(z+g+frac{1}{2} ight)} A_g(z)
for the Gamma function, with
:A_g(z) = frac{1}{2}p_0(g) + p_1(g) frac{z}{z+1} + p_2(g) frac{z(z-1)}{(z+1)(z+2)} + cdots.
Here "g" is a
constant that may be chosen arbitrarily subject to the restriction that Re("z"+"g"+1/2) > 0. The coefficients "p", which depend on "g", are slightly more difficult to calculate (see below). Although the formula as stated here is only valid for arguments in the right complexhalf-plane , it can be extended to the entirecomplex plane by thereflection formula ,:Gamma(1-z) ; Gamma(z) = {pi over sin pi z}.
The series "A" is convergent, and may be truncated to obtain an approximation with the desired precision. By choosing an appropriate "g" (typically a small integer), only some 5-10 terms of the series are needed to compute the Gamma function with typical single or double floating-point precision. If a fixed "g" is chosen, the coefficients can be calculated in advance and the sum is recast into the following form:
:A_g(z) = c_0 + sum_{k=1}^{N} frac{c_k}{z+k}
Thus computing the Gamma function becomes a matter of evaluating only a small number of
elementary function s and multiplying by stored constants. The Lanczos approximation was popularized by "Numerical Recipes ", according to which computing the Gamma function becomes "not much more difficult than other built-in functions that we take for granted, such as sin "x" or "e""x"". The method is also implemented in theGNU Scientific Library .Coefficients
The coefficients are given by:p_k(g) = sum_{a=0}^k C(2k+1, 2a+1) frac{sqrt{2{pi} left(a - egin{matrix} frac{1}{2} end{matrix} ight)! {left(a + g + egin{matrix} frac{1}{2} end{matrix} ight)}^{- left( a + frac{1}{2} ight) } e^{a + g + frac{1}{2} }
with C(i,j) denoting the ("i", "j")th element of the
Chebyshev polynomial coefficient matrix which can be calculated recursively from the identities:
Paul Godfrey describes how to obtain the coefficients and also the value of the truncated series "A" as a matrix product.
Derivation
Lanczos derived the formula from
Leonhard Euler 'sintegral :Gamma(z+1) = int_0^infty t^{z},e^{-t},dt,performing a sequence of basic manipulations to obtain
:Gamma(z+1) = (z+g+1)^{z+1} e^{-(z+g+1)} int_0^e [v(1-log v)] ^{z-frac{1}{2 v^g,dv,
and deriving a series for the integral.
imple implementation
The following implementation in the Python programming language works for complex arguments and typically gives 15 correct decimal places:
from cmath import *# Coefficients used by the GNU Scientific Libraryg = 7p = [0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313, -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7]
def gamma(z): z = complex(z) # Reflection formula if z.real < 0.5: return pi / (sin(pi*z)*gamma(1-z)) else: z -= 1 x = p [0] for i in range(1, g+2): x += p [i] /(z+i) t = z + g + 0.5 return sqrt(2*pi) * t**(z+0.5) * exp(-t) * x
References
* Godfrey, Paul (2001). [http://home.att.net/~numericana/answer/info/godfrey.htm Lanczos Implementation of the Gamma Function]
* cite journal
last = Lanczos
first = Cornelius
authorlink = Cornelius Lanczos
title = A Precision Approximation of the Gamma Function
journal = [http://www.siam.org/journals/sinum.php SIAM Journal on Numerical Analysis series B]
volume = 1
pages = pp.86–96
date = 1964
publisher = Society for Industrial and Applied Mathematics
id = ISSN: 0887459X
url = http://links.jstor.org/sici?sici=0887-459X%281964%291%3C86%3AAPAOTG%3E2.0.CO%3B2-F
* Press, William et al. [http://www.library.cornell.edu/nr/cbookcpdf.html "Numerical Recipes in C"] . (Second edition, Cambridge University Press 1992). ISBN 0-521-43108-5
* Pugh, Glendon (2004). [http://web.mala.bc.ca/pughg/phdThesis/phdThesis.pdf An analysis of the Lanczos Gamma approximation]
* Toth, Viktor (2005). [http://www.rskey.org/lanczos.htm Programmable Calculators: The Lanczos Approximation]
*
Wikimedia Foundation. 2010.