Class Gamma
This is a utility class that provides computation methods related to the Γ (Gamma) family of functions.
Implementation of invGamma1pm1(double)
and
logGamma1p(double)
is based on the algorithms described in
- Didonato and Morris (1986), Computation of the Incomplete Gamma Function Ratios and their Inverse, TOMS 12(4), 377-393,
- Didonato and Morris (1992), Algorithm 708: Significant Digit Computation of the Incomplete Beta Function Ratios, TOMS 18(3), 360-373,
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final double
C limit.private static final double
Maximum allowed numerical error.static final double
private static final double
Avoid repeated computation of log of 2 PI in logGammaprivate static final double
The constantA0
defined inDGAM1
.private static final double
The constantA1
defined inDGAM1
.private static final double
The constantB1
defined inDGAM1
.private static final double
The constantB2
defined inDGAM1
.private static final double
The constantB3
defined inDGAM1
.private static final double
The constantB4
defined inDGAM1
.private static final double
The constantB5
defined inDGAM1
.private static final double
The constantB6
defined inDGAM1
.private static final double
The constantB7
defined inDGAM1
.private static final double
The constantB8
defined inDGAM1
.private static final double
The constantC
defined inDGAM1
.private static final double
The constantC0
defined inDGAM1
.private static final double
The constantC1
defined inDGAM1
.private static final double
The constantC10
defined inDGAM1
.private static final double
The constantC11
defined inDGAM1
.private static final double
The constantC12
defined inDGAM1
.private static final double
The constantC13
defined inDGAM1
.private static final double
The constantC2
defined inDGAM1
.private static final double
The constantC3
defined inDGAM1
.private static final double
The constantC4
defined inDGAM1
.private static final double
The constantC5
defined inDGAM1
.private static final double
The constantC6
defined inDGAM1
.private static final double
The constantC7
defined inDGAM1
.private static final double
The constantC8
defined inDGAM1
.private static final double
The constantC9
defined inDGAM1
.private static final double
The constantP0
defined inDGAM1
.private static final double
The constantP1
defined inDGAM1
.private static final double
The constantP2
defined inDGAM1
.private static final double
The constantP3
defined inDGAM1
.private static final double
The constantP4
defined inDGAM1
.private static final double
The constantP5
defined inDGAM1
.private static final double
The constantP6
defined inDGAM1
.private static final double
The constantQ1
defined inDGAM1
.private static final double
The constantQ2
defined inDGAM1
.private static final double
The constantQ3
defined inDGAM1
.private static final double
The constantQ4
defined inDGAM1
.private static final double[]
Lanczos coefficientsstatic final double
The value of theg
constant in the Lanczos approximation, seelanczos(double)
.private static final double
S limit.private static final double
The constant value of √(2π). -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic double
digamma
(double x) Computes the digamma function of x.static double
gamma
(double x) Returns the value of Γ(x).static double
invGamma1pm1
(double x) Returns the value of 1 / Γ(1 + x) - 1 for -0.5 ≤ x ≤ 1.5.static double
lanczos
(double x) Returns the Lanczos approximation used to compute the gamma function.static double
logGamma
(double x) Returns the value of log Γ(x) for x > 0.static double
logGamma1p
(double x) Returns the value of log Γ(1 + x) for -0.5 ≤ x ≤ 1.5.static double
regularizedGammaP
(double a, double x) Returns the regularized gamma function P(a, x).static double
regularizedGammaP
(double a, double x, double epsilon, int maxIterations) Returns the regularized gamma function P(a, x).static double
regularizedGammaQ
(double a, double x) Returns the regularized gamma function Q(a, x) = 1 - P(a, x).static double
regularizedGammaQ
(double a, double x, double epsilon, int maxIterations) Returns the regularized gamma function Q(a, x) = 1 - P(a, x).static double
trigamma
(double x) Computes the trigamma function of x.
-
Field Details
-
GAMMA
public static final double GAMMA- Since:
- 2.0
- See Also:
-
LANCZOS_G
public static final double LANCZOS_GThe value of theg
constant in the Lanczos approximation, seelanczos(double)
.- Since:
- 3.1
- See Also:
-
DEFAULT_EPSILON
private static final double DEFAULT_EPSILONMaximum allowed numerical error.- See Also:
-
LANCZOS
private static final double[] LANCZOSLanczos coefficients -
HALF_LOG_2_PI
private static final double HALF_LOG_2_PIAvoid repeated computation of log of 2 PI in logGamma -
SQRT_TWO_PI
private static final double SQRT_TWO_PIThe constant value of √(2π).- See Also:
-
C_LIMIT
private static final double C_LIMITC limit.- See Also:
-
S_LIMIT
private static final double S_LIMITS limit.- See Also:
-
INV_GAMMA1P_M1_A0
private static final double INV_GAMMA1P_M1_A0The constantA0
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_A1
private static final double INV_GAMMA1P_M1_A1The constantA1
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B1
private static final double INV_GAMMA1P_M1_B1The constantB1
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B2
private static final double INV_GAMMA1P_M1_B2The constantB2
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B3
private static final double INV_GAMMA1P_M1_B3The constantB3
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B4
private static final double INV_GAMMA1P_M1_B4The constantB4
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B5
private static final double INV_GAMMA1P_M1_B5The constantB5
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B6
private static final double INV_GAMMA1P_M1_B6The constantB6
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B7
private static final double INV_GAMMA1P_M1_B7The constantB7
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_B8
private static final double INV_GAMMA1P_M1_B8The constantB8
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P0
private static final double INV_GAMMA1P_M1_P0The constantP0
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P1
private static final double INV_GAMMA1P_M1_P1The constantP1
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P2
private static final double INV_GAMMA1P_M1_P2The constantP2
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P3
private static final double INV_GAMMA1P_M1_P3The constantP3
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P4
private static final double INV_GAMMA1P_M1_P4The constantP4
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P5
private static final double INV_GAMMA1P_M1_P5The constantP5
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_P6
private static final double INV_GAMMA1P_M1_P6The constantP6
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_Q1
private static final double INV_GAMMA1P_M1_Q1The constantQ1
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_Q2
private static final double INV_GAMMA1P_M1_Q2The constantQ2
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_Q3
private static final double INV_GAMMA1P_M1_Q3The constantQ3
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_Q4
private static final double INV_GAMMA1P_M1_Q4The constantQ4
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C
private static final double INV_GAMMA1P_M1_CThe constantC
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C0
private static final double INV_GAMMA1P_M1_C0The constantC0
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C1
private static final double INV_GAMMA1P_M1_C1The constantC1
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C2
private static final double INV_GAMMA1P_M1_C2The constantC2
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C3
private static final double INV_GAMMA1P_M1_C3The constantC3
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C4
private static final double INV_GAMMA1P_M1_C4The constantC4
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C5
private static final double INV_GAMMA1P_M1_C5The constantC5
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C6
private static final double INV_GAMMA1P_M1_C6The constantC6
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C7
private static final double INV_GAMMA1P_M1_C7The constantC7
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C8
private static final double INV_GAMMA1P_M1_C8The constantC8
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C9
private static final double INV_GAMMA1P_M1_C9The constantC9
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C10
private static final double INV_GAMMA1P_M1_C10The constantC10
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C11
private static final double INV_GAMMA1P_M1_C11The constantC11
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C12
private static final double INV_GAMMA1P_M1_C12The constantC12
defined inDGAM1
.- See Also:
-
INV_GAMMA1P_M1_C13
private static final double INV_GAMMA1P_M1_C13The constantC13
defined inDGAM1
.- See Also:
-
-
Constructor Details
-
Gamma
private Gamma()Default constructor. Prohibit instantiation.
-
-
Method Details
-
logGamma
public static double logGamma(double x) Returns the value of log Γ(x) for x > 0.
For x ≤ 8, the implementation is based on the double precision implementation in the NSWC Library of Mathematics Subroutines,
DGAMLN
. For x > 8, the implementation is based on- Gamma Function, equation (28).
- Lanczos Approximation, equations (1) through (5).
- Paul Godfrey, A note on the computation of the convergent Lanczos complex Gamma approximation
- Parameters:
x
- Argument.- Returns:
- the value of
log(Gamma(x))
,Double.NaN
ifx <= 0.0
.
-
regularizedGammaP
public static double regularizedGammaP(double a, double x) Returns the regularized gamma function P(a, x).- Parameters:
a
- Parameter.x
- Value.- Returns:
- the regularized gamma function P(a, x).
- Throws:
MaxCountExceededException
- if the algorithm fails to converge.
-
regularizedGammaP
public static double regularizedGammaP(double a, double x, double epsilon, int maxIterations) Returns the regularized gamma function P(a, x). The implementation of this method is based on:- Regularized Gamma Function, equation (1)
- Incomplete Gamma Function, equation (4).
- Confluent Hypergeometric Function of the First Kind, equation (1).
- Parameters:
a
- the a parameter.x
- the value.epsilon
- When the absolute value of the nth item in the series is less than epsilon the approximation ceases to calculate further elements in the series.maxIterations
- Maximum number of "iterations" to complete.- Returns:
- the regularized gamma function P(a, x)
- Throws:
MaxCountExceededException
- if the algorithm fails to converge.
-
regularizedGammaQ
public static double regularizedGammaQ(double a, double x) Returns the regularized gamma function Q(a, x) = 1 - P(a, x).- Parameters:
a
- the a parameter.x
- the value.- Returns:
- the regularized gamma function Q(a, x)
- Throws:
MaxCountExceededException
- if the algorithm fails to converge.
-
regularizedGammaQ
public static double regularizedGammaQ(double a, double x, double epsilon, int maxIterations) Returns the regularized gamma function Q(a, x) = 1 - P(a, x). The implementation of this method is based on:- Parameters:
a
- the a parameter.x
- the value.epsilon
- When the absolute value of the nth item in the series is less than epsilon the approximation ceases to calculate further elements in the series.maxIterations
- Maximum number of "iterations" to complete.- Returns:
- the regularized gamma function P(a, x)
- Throws:
MaxCountExceededException
- if the algorithm fails to converge.
-
digamma
public static double digamma(double x) Computes the digamma function of x.
This is an independently written implementation of the algorithm described in Jose Bernardo, Algorithm AS 103: Psi (Digamma) Function, Applied Statistics, 1976.
Some of the constants have been changed to increase accuracy at the moderate expense of run-time. The result should be accurate to within 10^-8 absolute tolerance for x >= 10^-5 and within 10^-8 relative tolerance for x > 0.
Performance for large negative values of x will be quite expensive (proportional to |x|). Accuracy for negative values of x should be about 10^-8 absolute for results less than 10^5 and 10^-8 relative for results larger than that.
- Parameters:
x
- Argument.- Returns:
- digamma(x) to within 10-8 relative or absolute error whichever is smaller.
- Since:
- 2.0
- See Also:
-
trigamma
public static double trigamma(double x) Computes the trigamma function of x. This function is derived by taking the derivative of the implementation of digamma.- Parameters:
x
- Argument.- Returns:
- trigamma(x) to within 10-8 relative or absolute error whichever is smaller
- Since:
- 2.0
- See Also:
-
lanczos
public static double lanczos(double x) Returns the Lanczos approximation used to compute the gamma function. The Lanczos approximation is related to the Gamma function by the following equation
gamma(x) = sqrt(2 * pi) / x * (x + g + 0.5) ^ (x + 0.5) * exp(-x - g - 0.5) * lanczos(x)
,g
is the Lanczos constant.- Parameters:
x
- Argument.- Returns:
- The Lanczos approximation.
- Since:
- 3.1
- See Also:
-
invGamma1pm1
public static double invGamma1pm1(double x) Returns the value of 1 / Γ(1 + x) - 1 for -0.5 ≤ x ≤ 1.5. This implementation is based on the double precision implementation in the NSWC Library of Mathematics Subroutines,DGAM1
.- Parameters:
x
- Argument.- Returns:
- The value of
1.0 / Gamma(1.0 + x) - 1.0
. - Throws:
NumberIsTooSmallException
- ifx < -0.5
NumberIsTooLargeException
- ifx > 1.5
- Since:
- 3.1
-
logGamma1p
public static double logGamma1p(double x) throws NumberIsTooSmallException, NumberIsTooLargeException Returns the value of log Γ(1 + x) for -0.5 ≤ x ≤ 1.5. This implementation is based on the double precision implementation in the NSWC Library of Mathematics Subroutines,DGMLN1
.- Parameters:
x
- Argument.- Returns:
- The value of
log(Gamma(1 + x))
. - Throws:
NumberIsTooSmallException
- ifx < -0.5
.NumberIsTooLargeException
- ifx > 1.5
.- Since:
- 3.1
-
gamma
public static double gamma(double x) Returns the value of Γ(x). Based on the NSWC Library of Mathematics Subroutines double precision implementation,DGAMMA
.- Parameters:
x
- Argument.- Returns:
- the value of
Gamma(x)
. - Since:
- 3.1
-