/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_lgammal.c */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */
/*
 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
/* lgammal(x)
 * Reentrant version of the logarithm of the Gamma function
 * with user provide pointer for the sign of Gamma(x).
 *
 * Method:
 *   1. Argument Reduction for 0 < x <= 8
 *      Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
 *      reduce x to a number in [1.5,2.5] by
 *              lgamma(1+s) = log(s) + lgamma(s)
 *      for example,
 *              lgamma(7.3) = log(6.3) + lgamma(6.3)
 *                          = log(6.3*5.3) + lgamma(5.3)
 *                          = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
 *   2. Polynomial approximation of lgamma around its
 *      minimun ymin=1.461632144968362245 to maintain monotonicity.
 *      On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
 *              Let z = x-ymin;
 *              lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
 *   2. Rational approximation in the primary interval [2,3]
 *      We use the following approximation:
 *              s = x-2.0;
 *              lgamma(x) = 0.5*s + s*P(s)/Q(s)
 *      Our algorithms are based on the following observation
 *
 *                             zeta(2)-1    2    zeta(3)-1    3
 * lgamma(2+s) = s*(1-Euler) + --------- * s  -  --------- * s  + ...
 *                                 2                 3
 *
 *      where Euler = 0.5771... is the Euler constant, which is very
 *      close to 0.5.
 *
 *   3. For x>=8, we have
 *      lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
 *      (better formula:
 *         lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
 *      Let z = 1/x, then we approximation
 *              f(z) = lgamma(x) - (x-0.5)(log(x)-1)
 *      by
 *                                  3       5             11
 *              w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
 *
 *   4. For negative x, since (G is gamma function)
 *              -x*G(-x)*G(x) = pi/sin(pi*x),
 *      we have
 *              G(x) = pi/(sin(pi*x)*(-x)*G(-x))
 *      since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
 *      Hence, for x<0, signgam = sign(sin(pi*x)) and
 *              lgamma(x) = log(|Gamma(x)|)
 *                        = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
 *      Note: one should avoid compute pi*(-x) directly in the
 *            computation of sin(pi*(-x)).
 *
 *   5. Special Cases
 *              lgamma(2+s) ~ s*(1-Euler) for tiny s
 *              lgamma(1)=lgamma(2)=0
 *              lgamma(x) ~ -log(x) for tiny x
 *              lgamma(0) = lgamma(inf) = inf
 *              lgamma(-integer) = +-inf
 *
 */

#define _GNU_SOURCE
#include "libm.h"
#include "libc.h"

#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
double __lgamma_r(double x, int *sg);

long double __lgammal_r(long double x, int *sg)
{
	return __lgamma_r(x, sg);
}
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
static const long double
pi = 3.14159265358979323846264L,

/* lgam(1+x) = 0.5 x + x a(x)/b(x)
    -0.268402099609375 <= x <= 0
    peak relative error 6.6e-22 */
a0 = -6.343246574721079391729402781192128239938E2L,
a1 =  1.856560238672465796768677717168371401378E3L,
a2 =  2.404733102163746263689288466865843408429E3L,
a3 =  8.804188795790383497379532868917517596322E2L,
a4 =  1.135361354097447729740103745999661157426E2L,
a5 =  3.766956539107615557608581581190400021285E0L,

b0 =  8.214973713960928795704317259806842490498E3L,
b1 =  1.026343508841367384879065363925870888012E4L,
b2 =  4.553337477045763320522762343132210919277E3L,
b3 =  8.506975785032585797446253359230031874803E2L,
b4 =  6.042447899703295436820744186992189445813E1L,
/* b5 =  1.000000000000000000000000000000000000000E0 */


tc =  1.4616321449683623412626595423257213284682E0L,
tf = -1.2148629053584961146050602565082954242826E-1, /* double precision */
/* tt = (tail of tf), i.e. tf + tt has extended precision. */
tt = 3.3649914684731379602768989080467587736363E-18L,
/* lgam ( 1.4616321449683623412626595423257213284682E0 ) =
-1.2148629053584960809551455717769158215135617312999903886372437313313530E-1 */

/* lgam (x + tc) = tf + tt + x g(x)/h(x)
    -0.230003726999612341262659542325721328468 <= x
       <= 0.2699962730003876587373404576742786715318
     peak relative error 2.1e-21 */
g0 = 3.645529916721223331888305293534095553827E-18L,
g1 = 5.126654642791082497002594216163574795690E3L,
g2 = 8.828603575854624811911631336122070070327E3L,
g3 = 5.464186426932117031234820886525701595203E3L,
g4 = 1.455427403530884193180776558102868592293E3L,
g5 = 1.541735456969245924860307497029155838446E2L,
g6 = 4.335498275274822298341872707453445815118E0L,

h0 = 1.059584930106085509696730443974495979641E4L,
h1 = 2.147921653490043010629481226937850618860E4L,
h2 = 1.643014770044524804175197151958100656728E4L,
h3 = 5.869021995186925517228323497501767586078E3L,
h4 = 9.764244777714344488787381271643502742293E2L,
h5 = 6.442485441570592541741092969581997002349E1L,
/* h6 = 1.000000000000000000000000000000000000000E0 */


/* lgam (x+1) = -0.5 x + x u(x)/v(x)
    -0.100006103515625 <= x <= 0.231639862060546875
    peak relative error 1.3e-21 */
u0 = -8.886217500092090678492242071879342025627E1L,
u1 =  6.840109978129177639438792958320783599310E2L,
u2 =  2.042626104514127267855588786511809932433E3L,
u3 =  1.911723903442667422201651063009856064275E3L,
u4 =  7.447065275665887457628865263491667767695E2L,
u5 =  1.132256494121790736268471016493103952637E2L,
u6 =  4.484398885516614191003094714505960972894E0L,

v0 =  1.150830924194461522996462401210374632929E3L,
v1 =  3.399692260848747447377972081399737098610E3L,
v2 =  3.786631705644460255229513563657226008015E3L,
v3 =  1.966450123004478374557778781564114347876E3L,
v4 =  4.741359068914069299837355438370682773122E2L,
v5 =  4.508989649747184050907206782117647852364E1L,
/* v6 =  1.000000000000000000000000000000000000000E0 */


/* lgam (x+2) = .5 x + x s(x)/r(x)
     0 <= x <= 1
     peak relative error 7.2e-22 */
s0 =  1.454726263410661942989109455292824853344E6L,
s1 = -3.901428390086348447890408306153378922752E6L,
s2 = -6.573568698209374121847873064292963089438E6L,
s3 = -3.319055881485044417245964508099095984643E6L,
s4 = -7.094891568758439227560184618114707107977E5L,
s5 = -6.263426646464505837422314539808112478303E4L,
s6 = -1.684926520999477529949915657519454051529E3L,

r0 = -1.883978160734303518163008696712983134698E7L,
r1 = -2.815206082812062064902202753264922306830E7L,
r2 = -1.600245495251915899081846093343626358398E7L,
r3 = -4.310526301881305003489257052083370058799E6L,
r4 = -5.563807682263923279438235987186184968542E5L,
r5 = -3.027734654434169996032905158145259713083E4L,
r6 = -4.501995652861105629217250715790764371267E2L,
/* r6 =  1.000000000000000000000000000000000000000E0 */


/* lgam(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x w(1/x^2)
    x >= 8
    Peak relative error 1.51e-21
w0 = LS2PI - 0.5 */
w0 =  4.189385332046727417803e-1L,
w1 =  8.333333333333331447505E-2L,
w2 = -2.777777777750349603440E-3L,
w3 =  7.936507795855070755671E-4L,
w4 = -5.952345851765688514613E-4L,
w5 =  8.412723297322498080632E-4L,
w6 = -1.880801938119376907179E-3L,
w7 =  4.885026142432270781165E-3L;

/* sin(pi*x) assuming x > 2^-1000, if sin(pi*x)==0 the sign is arbitrary */
static long double sin_pi(long double x)
{
	int n;

	/* spurious inexact if odd int */
	x *= 0.5;
	x = 2.0*(x - floorl(x));  /* x mod 2.0 */

	n = (int)(x*4.0);
	n = (n+1)/2;
	x -= n*0.5f;
	x *= pi;

	switch (n) {
	default: /* case 4: */
	case 0: return __sinl(x, 0.0, 0);
	case 1: return __cosl(x, 0.0);
	case 2: return __sinl(-x, 0.0, 0);
	case 3: return -__cosl(x, 0.0);
	}
}

long double __lgammal_r(long double x, int *sg) {
	long double t, y, z, nadj, p, p1, p2, q, r, w;
	union ldshape u = {x};
	uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48;
	int sign = u.i.se >> 15;
	int i;

	*sg = 1;

	/* purge off +-inf, NaN, +-0, tiny and negative arguments */
	if (ix >= 0x7fff0000)
		return x * x;
	if (ix < 0x3fc08000) {  /* |x|<2**-63, return -log(|x|) */
		if (sign) {
			*sg = -1;
			x = -x;
		}
		return -logl(x);
	}
	if (sign) {
		x = -x;
		t = sin_pi(x);
		if (t == 0.0)
			return 1.0 / (x-x); /* -integer */
		if (t > 0.0)
			*sg = -1;
		else
			t = -t;
		nadj = logl(pi / (t * x));
	}

	/* purge off 1 and 2 (so the sign is ok with downward rounding) */
	if ((ix == 0x3fff8000 || ix == 0x40008000) && u.i.m == 0) {
		r = 0;
	} else if (ix < 0x40008000) {  /* x < 2.0 */
		if (ix <= 0x3ffee666) {  /* 8.99993896484375e-1 */
			/* lgamma(x) = lgamma(x+1) - log(x) */
			r = -logl(x);
			if (ix >= 0x3ffebb4a) {  /* 7.31597900390625e-1 */
				y = x - 1.0;
				i = 0;
			} else if (ix >= 0x3ffced33) {  /* 2.31639862060546875e-1 */
				y = x - (tc - 1.0);
				i = 1;
			} else { /* x < 0.23 */
				y = x;
				i = 2;
			}
		} else {
			r = 0.0;
			if (ix >= 0x3fffdda6) {  /* 1.73162841796875 */
				/* [1.7316,2] */
				y = x - 2.0;
				i = 0;
			} else if (ix >= 0x3fff9da6) {  /* 1.23162841796875 */
				/* [1.23,1.73] */
				y = x - tc;
				i = 1;
			} else {
				/* [0.9, 1.23] */
				y = x - 1.0;
				i = 2;
			}
		}
		switch (i) {
		case 0:
			p1 = a0 + y * (a1 + y * (a2 + y * (a3 + y * (a4 + y * a5))));
			p2 = b0 + y * (b1 + y * (b2 + y * (b3 + y * (b4 + y))));
			r += 0.5 * y + y * p1/p2;
			break;
		case 1:
			p1 = g0 + y * (g1 + y * (g2 + y * (g3 + y * (g4 + y * (g5 + y * g6)))));
			p2 = h0 + y * (h1 + y * (h2 + y * (h3 + y * (h4 + y * (h5 + y)))));
			p = tt + y * p1/p2;
			r += (tf + p);
			break;
		case 2:
			p1 = y * (u0 + y * (u1 + y * (u2 + y * (u3 + y * (u4 + y * (u5 + y * u6))))));
			p2 = v0 + y * (v1 + y * (v2 + y * (v3 + y * (v4 + y * (v5 + y)))));
			r += (-0.5 * y + p1 / p2);
		}
	} else if (ix < 0x40028000) {  /* 8.0 */
		/* x < 8.0 */
		i = (int)x;
		y = x - (double)i;
		p = y * (s0 + y * (s1 + y * (s2 + y * (s3 + y * (s4 + y * (s5 + y * s6))))));
		q = r0 + y * (r1 + y * (r2 + y * (r3 + y * (r4 + y * (r5 + y * (r6 + y))))));
		r = 0.5 * y + p / q;
		z = 1.0;
		/* lgamma(1+s) = log(s) + lgamma(s) */
		switch (i) {
		case 7:
			z *= (y + 6.0); /* FALLTHRU */
		case 6:
			z *= (y + 5.0); /* FALLTHRU */
		case 5:
			z *= (y + 4.0); /* FALLTHRU */
		case 4:
			z *= (y + 3.0); /* FALLTHRU */
		case 3:
			z *= (y + 2.0); /* FALLTHRU */
			r += logl(z);
			break;
		}
	} else if (ix < 0x40418000) {  /* 2^66 */
		/* 8.0 <= x < 2**66 */
		t = logl(x);
		z = 1.0 / x;
		y = z * z;
		w = w0 + z * (w1 + y * (w2 + y * (w3 + y * (w4 + y * (w5 + y * (w6 + y * w7))))));
		r = (x - 0.5) * (t - 1.0) + w;
	} else /* 2**66 <= x <= inf */
		r = x * (logl(x) - 1.0);
	if (sign)
		r = nadj - r;
	return r;
}
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
// TODO: broken implementation to make things compile
double __lgamma_r(double x, int *sg);

long double __lgammal_r(long double x, int *sg)
{
	return __lgamma_r(x, sg);
}
#endif

extern int __signgam;

long double lgammal(long double x)
{
	return __lgammal_r(x, &__signgam);
}

weak_alias(__lgammal_r, lgammal_r);
