def _dstable_sym_small(alpha, x, tolr): """ A series expansion for small x due to Bergstrom. Converges for x < 1.0 and in practice also for somewhat larger x. The function uses the Kahan summation procedure (cf. Dahlquist, Bjorck & Anderson). """ summ = 0.0 c = 0.0 fact = -1.0 xx = x * x xpart = 1.0 k = 0 zero2 = zero1 = False while True: k += 1 summo = summ twokm1 = 2 * k - 1 twokm1oa = float(twokm1) / alpha r = lngamma(twokm1oa) - lnfactorial(twokm1) term = twokm1 * exp(r) * xpart fact = -fact term *= fact y = term + c t = summ + y if fsign(y) == fsign(summ): f = (0.46 * t - t) + t c = ((summ - f) - (t - f)) + y else: c = (summ - t) + y summ = t if abs(summ - summo) < tolr * abs(summ) and abs(term) < tolr and zero2: break xpart *= xx if abs(term) < tolr: if zero1: zero2 = True else: zero1 = True summ += c pdf = summ / (PI * alpha) pdf = kept_within(0.0, pdf) return pdf
def _dstable_sym_small(alpha, x, tolr): """ A series expansion for small x due to Bergstrom. Converges for x < 1.0 and in practice also for somewhat larger x. The function uses the Kahan summation procedure (cf. Dahlquist, Bjorck & Anderson). """ summ = 0.0 c = 0.0 fact = -1.0 xx = x*x xpart = 1.0 k = 0 zero2 = zero1 = False while True: k += 1 summo = summ twokm1 = 2*k - 1 twokm1oa = float(twokm1)/alpha r = lngamma(twokm1oa) - lnfactorial(twokm1) term = twokm1 * exp(r) * xpart fact = - fact term *= fact y = term + c t = summ + y if fsign(y) == fsign(summ): f = (0.46*t-t) + t c = ((summ-f)-(t-f)) + y else: c = (summ-t) + y summ = t if abs(summ-summo) < tolr*abs(summ) and abs(term) < tolr and zero2: break xpart *= xx if abs(term) < tolr: if zero1: zero2 = True else: zero1 = True summ += c pdf = summ / (PI*alpha) pdf = kept_within(0.0, pdf) return pdf
def _dstable_sym_big(alpha, x, tolr): """ A series expansion for large x due to Bergstrom. Converges for x > 1.0 The function uses the Kahan summation procedure (cf. Dahlquist, Bjorck & Anderson). """ summ = 0.0 c = 0.0 fact = 1.0 k = 0 zero2 = zero1 = False while True: k += 1 summo = summ ak = alpha * k akh = 0.5 * ak r = lngamma(ak) - lnfactorial(k) term = -ak * exp(r) * sin(PIHALF * ak) / pow(x, ak + 1) fact = -fact term *= fact y = term + c t = summ + y if fsign(y) == fsign(summ): f = (0.46 * t - t) + t c = ((summ - f) - (t - f)) + y else: c = (summ - t) + y summ = t if abs(summ - summo) < tolr * abs(summ) and abs(term) < tolr and zero2: break if abs(term) < tolr: if zero1: zero2 = True else: zero1 = True summ += c #pdf = summ / PI pdf = PIINV * summ pdf = kept_within(0.0, pdf) return pdf
def _dstable_sym_big(alpha, x, tolr): """ A series expansion for large x due to Bergstrom. Converges for x > 1.0 The function uses the Kahan summation procedure (cf. Dahlquist, Bjorck & Anderson). """ summ = 0.0 c = 0.0 fact = 1.0 k = 0 zero2 = zero1 = False while True: k += 1 summo = summ ak = alpha * k akh = 0.5 * ak r = lngamma(ak) - lnfactorial(k) term = - ak * exp(r) * sin(PIHALF*ak) / pow(x, ak+1) fact = - fact term *= fact y = term + c t = summ + y if fsign(y) == fsign(summ): f = (0.46*t-t) + t c = ((summ-f)-(t-f)) + y else: c = (summ-t) + y summ = t if abs(summ-summo) < tolr*abs(summ) and abs(term) < tolr and zero2: break if abs(term) < tolr: if zero1: zero2 = True else: zero1 = True summ += c #pdf = summ / PI pdf = PIINV * summ pdf = kept_within(0.0, pdf) return pdf