46 static scalar
minimaxs(
const scalar P)
50 constexpr scalar a_0 = 3.31125922108741;
51 constexpr scalar a_1 = 11.6616720288968;
52 constexpr scalar a_2 = 4.28342155967104;
53 constexpr scalar a_3 = 0.213623493715853;
55 constexpr scalar b_0 = 6.61053765625462;
56 constexpr scalar b_1 = 6.40691597760039;
57 constexpr scalar b_2 = 1.27364489782223;
58 constexpr scalar b_3 = 0.03611708101884203;
64 - (a_0 + t*(a_1 + t*(a_2 + t*a_3)))
65 /(1 + t*(b_0 + t*(b_1 + t*(b_2 + t*b_3))));
67 return P < 0.5 ? -
s :
s;
71 static scalar
Sn(
const scalar a,
const scalar
x)
78 for (
int i=1; i<100; ++i)
100 <<
"The parameter (i.e. a) cannot be negative or zero"
104 return std::numeric_limits<scalar>::infinity();
110 <<
"The domain of the parameter (i.e. P) should be limited to [0,1]"
114 return std::numeric_limits<scalar>::infinity();
118 const scalar Q = 1 - P;
126 const scalar Ga = tgamma(a);
127 const scalar
B = Q*Ga;
129 if (
B > 0.6 || (
B >= 0.45 && a >= 0.3))
133 (
B*Q > 1
e-8) ?
pow(P*Ga*a, 1/a) :
exp((-Q/a) -
Eu);
135 return u/(1 - (u/(a + 1)));
137 else if (a < 0.3 && B >= 0.35)
140 const scalar t =
exp(-
Eu -
B);
141 const scalar u = t*
exp(t);
145 else if (
B > 0.15 || a >= 0.3)
148 const scalar
y = -
log(
B);
149 const scalar u =
y - (1 - a)*
log(
y);
151 return y - (1 - a)*
log(u) -
log(1 + (1 - a)/(1 + u));
156 const scalar
y = -
log(
B);
157 const scalar u =
y - (1 - a)*
log(
y);
163 (
sqr(u) + 2*(3 - a)*u + (2 - a)*(3 - a))
164 /(
sqr(u) + (5 - a)*u + 2)
170 const scalar
y = -
log(
B);
171 const scalar
c1 = (a - 1)*
log(
y);
172 const scalar c12 =
c1*
c1;
173 const scalar c13 = c12*
c1;
174 const scalar c14 = c12*c12;
175 const scalar a2 = a*a;
176 const scalar a3 = a2*a;
177 const scalar
c2 = (a - 1)*(1 +
c1);
178 const scalar c3 = (a - 1)*(-(c12/2) + (a - 2)*
c1 + (3*a - 5)/2);
185 + (11*a2 - 46*a + 47)/6
190 + (-3*a2 + 13*a - 13)*c12
191 + (2*a3 - 25*a2 + 72*a - 61)*
c1/2
192 + (25*a3 - 195*a2 + 477*a - 379)/12);
193 const scalar y2 =
y*
y;
194 const scalar y3 = y2*
y;
195 const scalar y4 = y2*y2;
197 return y +
c1 + (
c2/
y) + (c3/y2) + (c4/y3) + (c5/y4);
205 const scalar s2 =
sqr(
s);
206 const scalar s3 =
s*s2;
207 const scalar s4 = s2*s2;
208 const scalar s5 =
s*s4;
209 const scalar sqrta =
sqrt(a);
212 a +
s*sqrta + (s2 - 1)/3
213 + (s3 - 7*
s)/(36*sqrta)
214 - (3*s4 + 7*s2 - 16)/(810*a)
215 + (9*s5 + 256*s3 - 433*
s)/(38880*a*sqrta);
217 if (a >= 500 &&
mag(1 - w/a) < 1
e-6)
229 const scalar
D =
max(scalar(2), scalar(a*(a - 1)));
230 const scalar lnGa =
lgamma(a);
231 const scalar lnB =
log(Q) + lnGa;
236 const scalar
y = -lnB;
237 const scalar
c1 = (a - 1)*
log(
y);
238 const scalar c12 =
c1*
c1;
239 const scalar c13 = c12*
c1;
240 const scalar c14 = c12*c12;
241 const scalar a2 = a*a;
242 const scalar a3 = a2*a;
244 const scalar
c2 = (a - 1)*(1 +
c1);
258 + (11*a2 - 46*a + 47)/6
265 + (-3*a2 + 13*a - 13)*c12
266 + (2*a3 - 25*a2 + 72*a - 61)*
c1/2
267 + (25*a3 - 195*a2 + 477*a - 379)/12
270 const scalar y2 =
y*
y;
271 const scalar y3 = y2*
y;
272 const scalar y4 = y2*y2;
274 return y +
c1 + (
c2/
y) + (c3/y2) + (c4/y3) + (c5/y4);
280 -lnB + (a - 1)*
log(w) -
log(1 + (1 - a)/(1 + w));
282 return -lnB + (a - 1)*
log(u) -
log(1 + (1 - a)/(1 + u));
289 const scalar ap1 = a + 1;
294 const scalar ap2 = a + 2;
297 s = log1p(z/ap1*(1 + z/ap2));
298 z =
exp((v + z -
s)/a);
299 s = log1p(z/ap1*(1 + z/ap2));
300 z =
exp((v + z -
s)/a);
301 s = log1p(z/ap1*(1 + z/ap2*(1 + z/(a + 3))));
302 z =
exp((v + z -
s)/a);
305 if (z <= 0.01*ap1 || z > 0.7*ap1)
312 const scalar lnSn =
log(
Sn(a, z));
314 z =
exp((v + z - lnSn)/a);
316 return z*(1 - (a*
log(z) - z - v + lnSn)/(a - z));