/// <summary> /// Simple, stable, but not very accurate LogGammaP for small z < 0.7*a /// <para>Log((z^a)(e^-z)/(a*Γ(a)) * 1F1(1, a+1, z))</para> /// </summary> /// <param name="a"></param> /// <param name="z"></param> /// <returns></returns> static double LogGammaPSmallZ(double a, double z) { // See: http://dlmf.nist.gov/8.5#E1 double t = HypergeometricSeries.Sum1F1(1, a + 1, z, -1); double result = a * Math.Log(z) - z - Math2.Lgamma(1 + a) + Math2.Log1p(t); return(result); }
/// <summary> /// Lower gamma series sum: Σ( z^k/(a+1)_k) k={0, inf} /// <para>γ(a,z) = ((z^a) * (e^-z) / a) * LowerSeriesSum(a,z)</para> /// </summary> /// <param name="a"></param> /// <param name="z"></param> /// <returns></returns> /// <see href="http://dlmf.nist.gov/8.5#E1"/> public static double LowerSeries(double a, double z) { // Sum1F1 is optimized for a1 == 1 return(HypergeometricSeries.Sum1F1(1, 1 + a, z)); }