Author: celestin Date: Thu May 10 05:08:01 2012 New Revision: 1336483 URL: http://svn.apache.org/viewvc?rev=1336483&view=rev Log: In o.a.c.m3.special.Gamma, exposed the Lanczos approximation (MATH-753).
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Gamma.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Gamma.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Gamma.java?rev=1336483&r1=1336482&r2=1336483&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Gamma.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/special/Gamma.java Thu May 10 05:08:01 2012 @@ -32,6 +32,13 @@ public class Gamma { * @since 2.0 */ public static final double GAMMA = 0.577215664901532860606512090082; + + /** + * The value of the {@code g} constant in the Lanczos approximation, see + * {@link #lanczos(double)}. + */ + public static final double LANCZOS_G = 607.0 / 128.0; + /** Maximum allowed numerical error. */ private static final double DEFAULT_EPSILON = 10e-15; /** Lanczos coefficients */ @@ -89,13 +96,7 @@ public class Gamma { ret = Double.NaN; } else { double g = 607.0 / 128.0; - - double sum = 0.0; - for (int i = LANCZOS.length - 1; i > 0; --i) { - sum = sum + (LANCZOS[i] / (x + i)); - } - sum = sum + LANCZOS[0]; - + double sum = lanczos(x); double tmp = x + g + .5; ret = ((x + .5) * FastMath.log(tmp)) - tmp + HALF_LOG_2_PI + FastMath.log(sum / x); @@ -325,4 +326,31 @@ public class Gamma { return trigamma(x + 1) + 1 / (x * x); } + + /** + * <p> + * Returns the Lanczos approximation used to compute the gamma function. + * The Lanczos approximation is related to the Gamma function by the + * following equation + * <center> + * {@code gamma(x) = sqrt(2 * pi) / x * (x + g + 0.5) ^ (x + 0.5) + * * exp(-x - g - 0.5) * lanczos(x)}, + * </center> + * where {@code g} is a constant, returned by {@link #getLanczosG()}. + * </p> + * + * @param x the argument + * @return the Lanczos approximation + * @see <a href="http://mathworld.wolfram.com/LanczosApproximation.html">Lanczos Approximation</a>, + * equations (1) through (5), and Paul Godfrey's + * <a href="http://my.fit.edu/~gabdo/gamma.txt">Note on the computation + * of the convergent Lanczos complex Gamma approximation</a> + */ + public static double lanczos(final double x) { + double sum = 0.0; + for (int i = LANCZOS.length - 1; i > 0; --i) { + sum = sum + (LANCZOS[i] / (x + i)); + } + return sum + LANCZOS[0]; + } }