gsl_specfunc__hyperg_U.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407
  1. /* specfunc/hyperg_U.c
  2. *
  3. * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 3 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. */
  19. /* Author: G. Jungman */
  20. #include "gsl__config.h"
  21. #include "gsl_math.h"
  22. #include "gsl_errno.h"
  23. #include "gsl_sf_exp.h"
  24. #include "gsl_sf_gamma.h"
  25. #include "gsl_sf_bessel.h"
  26. #include "gsl_sf_laguerre.h"
  27. #include "gsl_sf_pow_int.h"
  28. #include "gsl_sf_hyperg.h"
  29. #include "gsl_specfunc__error.h"
  30. #include "gsl_specfunc__hyperg.h"
  31. #define INT_THRESHOLD (1000.0*GSL_DBL_EPSILON)
  32. #define SERIES_EVAL_OK(a,b,x) ((fabs(a) < 5 && b < 5 && x < 2.0) || (fabs(a) < 10 && b < 10 && x < 1.0))
  33. #define ASYMP_EVAL_OK(a,b,x) (GSL_MAX_DBL(fabs(a),1.0)*GSL_MAX_DBL(fabs(1.0+a-b),1.0) < 0.99*fabs(x))
  34. /* Log[U(a,2a,x)]
  35. * [Abramowitz+stegun, 13.6.21]
  36. * Assumes x > 0, a > 1/2.
  37. */
  38. static
  39. int
  40. hyperg_lnU_beq2a(const double a, const double x, gsl_sf_result * result)
  41. {
  42. const double lx = log(x);
  43. const double nu = a - 0.5;
  44. const double lnpre = 0.5*(x - M_LNPI) - nu*lx;
  45. gsl_sf_result lnK;
  46. gsl_sf_bessel_lnKnu_e(nu, 0.5*x, &lnK);
  47. result->val = lnpre + lnK.val;
  48. result->err = 2.0 * GSL_DBL_EPSILON * (fabs(0.5*x) + 0.5*M_LNPI + fabs(nu*lx));
  49. result->err += lnK.err;
  50. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  51. return GSL_SUCCESS;
  52. }
  53. /* Evaluate u_{N+1}/u_N by Steed's continued fraction method.
  54. *
  55. * u_N := Gamma[a+N]/Gamma[a] U(a + N, b, x)
  56. *
  57. * u_{N+1}/u_N = (a+N) U(a+N+1,b,x)/U(a+N,b,x)
  58. */
  59. static
  60. int
  61. hyperg_U_CF1(const double a, const double b, const int N, const double x,
  62. double * result, int * count)
  63. {
  64. const double RECUR_BIG = GSL_SQRT_DBL_MAX;
  65. const int maxiter = 20000;
  66. int n = 1;
  67. double Anm2 = 1.0;
  68. double Bnm2 = 0.0;
  69. double Anm1 = 0.0;
  70. double Bnm1 = 1.0;
  71. double a1 = -(a + N);
  72. double b1 = (b - 2.0*a - x - 2.0*(N+1));
  73. double An = b1*Anm1 + a1*Anm2;
  74. double Bn = b1*Bnm1 + a1*Bnm2;
  75. double an, bn;
  76. double fn = An/Bn;
  77. while(n < maxiter) {
  78. double old_fn;
  79. double del;
  80. n++;
  81. Anm2 = Anm1;
  82. Bnm2 = Bnm1;
  83. Anm1 = An;
  84. Bnm1 = Bn;
  85. an = -(a + N + n - b)*(a + N + n - 1.0);
  86. bn = (b - 2.0*a - x - 2.0*(N+n));
  87. An = bn*Anm1 + an*Anm2;
  88. Bn = bn*Bnm1 + an*Bnm2;
  89. if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
  90. An /= RECUR_BIG;
  91. Bn /= RECUR_BIG;
  92. Anm1 /= RECUR_BIG;
  93. Bnm1 /= RECUR_BIG;
  94. Anm2 /= RECUR_BIG;
  95. Bnm2 /= RECUR_BIG;
  96. }
  97. old_fn = fn;
  98. fn = An/Bn;
  99. del = old_fn/fn;
  100. if(fabs(del - 1.0) < 10.0*GSL_DBL_EPSILON) break;
  101. }
  102. *result = fn;
  103. *count = n;
  104. if(n == maxiter)
  105. GSL_ERROR ("error", GSL_EMAXITER);
  106. else
  107. return GSL_SUCCESS;
  108. }
  109. /* Large x asymptotic for x^a U(a,b,x)
  110. * Based on SLATEC D9CHU() [W. Fullerton]
  111. *
  112. * Uses a rational approximation due to Luke.
  113. * See [Luke, Algorithms for the Computation of Special Functions, p. 252]
  114. * [Luke, Utilitas Math. (1977)]
  115. *
  116. * z^a U(a,b,z) ~ 2F0(a,1+a-b,-1/z)
  117. *
  118. * This assumes that a is not a negative integer and
  119. * that 1+a-b is not a negative integer. If one of them
  120. * is, then the 2F0 actually terminates, the above
  121. * relation is an equality, and the sum should be
  122. * evaluated directly [see below].
  123. */
  124. static
  125. int
  126. d9chu(const double a, const double b, const double x, gsl_sf_result * result)
  127. {
  128. const double EPS = 8.0 * GSL_DBL_EPSILON; /* EPS = 4.0D0*D1MACH(4) */
  129. const int maxiter = 500;
  130. double aa[4], bb[4];
  131. int i;
  132. double bp = 1.0 + a - b;
  133. double ab = a*bp;
  134. double ct2 = 2.0 * (x - ab);
  135. double sab = a + bp;
  136. double ct3 = sab + 1.0 + ab;
  137. double anbn = ct3 + sab + 3.0;
  138. double ct1 = 1.0 + 2.0*x/anbn;
  139. bb[0] = 1.0;
  140. aa[0] = 1.0;
  141. bb[1] = 1.0 + 2.0*x/ct3;
  142. aa[1] = 1.0 + ct2/ct3;
  143. bb[2] = 1.0 + 6.0*ct1*x/ct3;
  144. aa[2] = 1.0 + 6.0*ab/anbn + 3.0*ct1*ct2/ct3;
  145. for(i=4; i<maxiter; i++) {
  146. int j;
  147. double c2;
  148. double d1z;
  149. double g1, g2, g3;
  150. double x2i1 = 2*i - 3;
  151. ct1 = x2i1/(x2i1-2.0);
  152. anbn += x2i1 + sab;
  153. ct2 = (x2i1 - 1.0)/anbn;
  154. c2 = x2i1*ct2 - 1.0;
  155. d1z = 2.0*x2i1*x/anbn;
  156. ct3 = sab*ct2;
  157. g1 = d1z + ct1*(c2+ct3);
  158. g2 = d1z - c2;
  159. g3 = ct1*(1.0 - ct3 - 2.0*ct2);
  160. bb[3] = g1*bb[2] + g2*bb[1] + g3*bb[0];
  161. aa[3] = g1*aa[2] + g2*aa[1] + g3*aa[0];
  162. if(fabs(aa[3]*bb[0]-aa[0]*bb[3]) < EPS*fabs(bb[3]*bb[0])) break;
  163. for(j=0; j<3; j++) {
  164. aa[j] = aa[j+1];
  165. bb[j] = bb[j+1];
  166. }
  167. }
  168. result->val = aa[3]/bb[3];
  169. result->err = 8.0 * GSL_DBL_EPSILON * fabs(result->val);
  170. if(i == maxiter) {
  171. GSL_ERROR ("error", GSL_EMAXITER);
  172. }
  173. else {
  174. return GSL_SUCCESS;
  175. }
  176. }
  177. /* Evaluate asymptotic for z^a U(a,b,z) ~ 2F0(a,1+a-b,-1/z)
  178. * We check for termination of the 2F0 as a special case.
  179. * Assumes x > 0.
  180. * Also assumes a,b are not too large compared to x.
  181. */
  182. static
  183. int
  184. hyperg_zaU_asymp(const double a, const double b, const double x, gsl_sf_result *result)
  185. {
  186. const double ap = a;
  187. const double bp = 1.0 + a - b;
  188. const double rintap = floor(ap + 0.5);
  189. const double rintbp = floor(bp + 0.5);
  190. const int ap_neg_int = ( ap < 0.0 && fabs(ap - rintap) < INT_THRESHOLD );
  191. const int bp_neg_int = ( bp < 0.0 && fabs(bp - rintbp) < INT_THRESHOLD );
  192. if(ap_neg_int || bp_neg_int) {
  193. /* Evaluate 2F0 polynomial.
  194. */
  195. double mxi = -1.0/x;
  196. double nmax = -(int)(GSL_MIN(ap,bp) - 0.1);
  197. double tn = 1.0;
  198. double sum = 1.0;
  199. double n = 1.0;
  200. double sum_err = 0.0;
  201. while(n <= nmax) {
  202. double apn = (ap+n-1.0);
  203. double bpn = (bp+n-1.0);
  204. tn *= ((apn/n)*mxi)*bpn;
  205. sum += tn;
  206. sum_err += 2.0 * GSL_DBL_EPSILON * fabs(tn);
  207. n += 1.0;
  208. }
  209. result->val = sum;
  210. result->err = sum_err;
  211. result->err += 2.0 * GSL_DBL_EPSILON * (fabs(nmax)+1.0) * fabs(sum);
  212. return GSL_SUCCESS;
  213. }
  214. else {
  215. return d9chu(a,b,x,result);
  216. }
  217. }
  218. /* Evaluate finite sum which appears below.
  219. */
  220. static
  221. int
  222. hyperg_U_finite_sum(int N, double a, double b, double x, double xeps,
  223. gsl_sf_result * result)
  224. {
  225. int i;
  226. double sum_val;
  227. double sum_err;
  228. if(N <= 0) {
  229. double t_val = 1.0;
  230. double t_err = 0.0;
  231. gsl_sf_result poch;
  232. int stat_poch;
  233. sum_val = 1.0;
  234. sum_err = 0.0;
  235. for(i=1; i<= -N; i++) {
  236. const double xi1 = i - 1;
  237. const double mult = (a+xi1)*x/((b+xi1)*(xi1+1.0));
  238. t_val *= mult;
  239. t_err += fabs(mult) * t_err + fabs(t_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
  240. sum_val += t_val;
  241. sum_err += t_err;
  242. }
  243. stat_poch = gsl_sf_poch_e(1.0+a-b, -a, &poch);
  244. result->val = sum_val * poch.val;
  245. result->err = fabs(sum_val) * poch.err + sum_err * fabs(poch.val);
  246. result->err += fabs(poch.val) * (fabs(N) + 2.0) * GSL_DBL_EPSILON * fabs(sum_val);
  247. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  248. result->err *= 2.0; /* FIXME: fudge factor... why is the error estimate too small? */
  249. return stat_poch;
  250. }
  251. else {
  252. const int M = N - 2;
  253. if(M < 0) {
  254. result->val = 0.0;
  255. result->err = 0.0;
  256. return GSL_SUCCESS;
  257. }
  258. else {
  259. gsl_sf_result gbm1;
  260. gsl_sf_result gamr;
  261. int stat_gbm1;
  262. int stat_gamr;
  263. double t_val = 1.0;
  264. double t_err = 0.0;
  265. sum_val = 1.0;
  266. sum_err = 0.0;
  267. for(i=1; i<=M; i++) {
  268. const double mult = (a-b+i)*x/((1.0-b+i)*i);
  269. t_val *= mult;
  270. t_err += t_err * fabs(mult) + fabs(t_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
  271. sum_val += t_val;
  272. sum_err += t_err;
  273. }
  274. stat_gbm1 = gsl_sf_gamma_e(b-1.0, &gbm1);
  275. stat_gamr = gsl_sf_gammainv_e(a, &gamr);
  276. if(stat_gbm1 == GSL_SUCCESS) {
  277. gsl_sf_result powx1N;
  278. int stat_p = gsl_sf_pow_int_e(x, 1-N, &powx1N);
  279. double pe_val = powx1N.val * xeps;
  280. double pe_err = powx1N.err * fabs(xeps) + 2.0 * GSL_DBL_EPSILON * fabs(pe_val);
  281. double coeff_val = gbm1.val * gamr.val * pe_val;
  282. double coeff_err = gbm1.err * fabs(gamr.val * pe_val)
  283. + gamr.err * fabs(gbm1.val * pe_val)
  284. + fabs(gbm1.val * gamr.val) * pe_err
  285. + 2.0 * GSL_DBL_EPSILON * fabs(coeff_val);
  286. result->val = sum_val * coeff_val;
  287. result->err = fabs(sum_val) * coeff_err + sum_err * fabs(coeff_val);
  288. result->err += 2.0 * GSL_DBL_EPSILON * (M+2.0) * fabs(result->val);
  289. result->err *= 2.0; /* FIXME: fudge factor... why is the error estimate too small? */
  290. return stat_p;
  291. }
  292. else {
  293. result->val = 0.0;
  294. result->err = 0.0;
  295. return stat_gbm1;
  296. }
  297. }
  298. }
  299. }
  300. /* Based on SLATEC DCHU() [W. Fullerton]
  301. * Assumes x > 0.
  302. * This is just a series summation method, and
  303. * it is not good for large a.
  304. *
  305. * I patched up the window for 1+a-b near zero. [GJ]
  306. */
  307. static
  308. int
  309. hyperg_U_series(const double a, const double b, const double x, gsl_sf_result * result)
  310. {
  311. const double EPS = 2.0 * GSL_DBL_EPSILON; /* EPS = D1MACH(3) */
  312. const double SQRT_EPS = M_SQRT2 * GSL_SQRT_DBL_EPSILON;
  313. if(fabs(1.0 + a - b) < SQRT_EPS) {
  314. /* Original Comment: ALGORITHM IS BAD WHEN 1+A-B IS NEAR ZERO FOR SMALL X
  315. */
  316. /* We can however do the following:
  317. * U(a,b,x) = U(a,a+1,x) when 1+a-b=0
  318. * and U(a,a+1,x) = x^(-a).
  319. */
  320. double lnr = -a * log(x);
  321. int stat_e = gsl_sf_exp_e(lnr, result);
  322. result->err += 2.0 * SQRT_EPS * fabs(result->val);
  323. return stat_e;
  324. }
  325. else {
  326. double aintb = ( b < 0.0 ? ceil(b-0.5) : floor(b+0.5) );
  327. double beps = b - aintb;
  328. int N = aintb;
  329. double lnx = log(x);
  330. double xeps = exp(-beps*lnx);
  331. /* Evaluate finite sum.
  332. */
  333. gsl_sf_result sum;
  334. int stat_sum = hyperg_U_finite_sum(N, a, b, x, xeps, &sum);
  335. /* Evaluate infinite sum. */
  336. int istrt = ( N < 1 ? 1-N : 0 );
  337. double xi = istrt;
  338. gsl_sf_result gamr;
  339. gsl_sf_result powx;
  340. int stat_gamr = gsl_sf_gammainv_e(1.0+a-b, &gamr);
  341. int stat_powx = gsl_sf_pow_int_e(x, istrt, &powx);
  342. double sarg = beps*M_PI;
  343. double sfact = ( sarg != 0.0 ? sarg/sin(sarg) : 1.0 );
  344. double factor_val = sfact * ( GSL_IS_ODD(N) ? -1.0 : 1.0 ) * gamr.val * powx.val;
  345. double factor_err = fabs(gamr.val) * powx.err + fabs(powx.val) * gamr.err
  346. + 2.0 * GSL_DBL_EPSILON * fabs(factor_val);
  347. gsl_sf_result pochai;
  348. gsl_sf_result gamri1;
  349. gsl_sf_result gamrni;
  350. int stat_pochai = gsl_sf_poch_e(a, xi, &pochai);
  351. int stat_gamri1 = gsl_sf_gammainv_e(xi + 1.0, &gamri1);
  352. int stat_gamrni = gsl_sf_gammainv_e(aintb + xi, &gamrni);
  353. int stat_gam123 = GSL_ERROR_SELECT_3(stat_gamr, stat_gamri1, stat_gamrni);
  354. int stat_gamall = GSL_ERROR_SELECT_4(stat_sum, stat_gam123, stat_pochai, stat_powx);
  355. gsl_sf_result pochaxibeps;
  356. gsl_sf_result gamrxi1beps;
  357. int stat_pochaxibeps = gsl_sf_poch_e(a, xi-beps, &pochaxibeps);
  358. int stat_gamrxi1beps = gsl_sf_gammainv_e(xi + 1.0 - beps, &gamrxi1beps);
  359. int stat_all = GSL_ERROR_SELECT_3(stat_gamall, stat_pochaxibeps, stat_gamrxi1beps);
  360. double b0_val = factor_val * pochaxibeps.val * gamrni.val * gamrxi1beps.val;
  361. double b0_err = fabs(factor_val * pochaxibeps.val * gamrni.val) * gamrxi1beps.err
  362. + fabs(factor_val * pochaxibeps.val * gamrxi1beps.val) * gamrni.err
  363. + fabs(factor_val * gamrni.val * gamrxi1beps.val) * pochaxibeps.err
  364. + fabs(pochaxibeps.val * gamrni.val * gamrxi1beps.val) * factor_err
  365. + 2.0 * GSL_DBL_EPSILON * fabs(b0_val);
  366. if(fabs(xeps-1.0) < 0.5) {
  367. /*
  368. C X**(-BEPS) IS CLOSE TO 1.0D0, SO WE MUST BE
  369. C CAREFUL IN EVALUATING THE DIFFERENCES.
  370. */
  371. int i;
  372. gsl_sf_result pch1ai;
  373. gsl_sf_result pch1i;
  374. gsl_sf_result poch1bxibeps;
  375. int stat_pch1ai = gsl_sf_pochrel_e(a + xi, -beps, &pch1ai);
  376. int stat_pch1i = gsl_sf_pochrel_e(xi + 1.0 - beps, beps, &pch1i);
  377. int stat_poch1bxibeps = gsl_sf_pochrel_e(b+xi, -beps, &poch1bxibeps);
  378. double c0_t1_val = beps*pch1ai.val*pch1i.val;
  379. double c0_t1_err = fabs(beps) * fabs(pch1ai.val) * pch1i.err
  380. + fabs(beps) * fabs(pch1i.val) * pch1ai.err
  381. + 2.0 * GSL_DBL_EPSILON * fabs(c0_t1_val);
  382. double c0_t2_val = -poch1bxibeps.val + pch1ai.val - pch1i.val + c0_t1_val;
  383. double c0_t2_err = poch1bxibeps.err + pch1ai.err + pch1i.err + c0_t1_err
  384. + 2.0 * GSL_DBL_EPSILON * fabs(c0_t2_val);
  385. double c0_val = factor_val * pochai.val * gamrni.val * gamri1.val * c0_t2_val;
  386. double c0_err = fabs(factor_val * pochai.val * gamrni.val * gamri1.val) * c0_t2_err
  387. + fabs(factor_val * pochai.val * gamrni.val * c0_t2_val) * gamri1.err
  388. + fabs(factor_val * pochai.val * gamri1.val * c0_t2_val) * gamrni.err
  389. + fabs(factor_val * gamrni.val * gamri1.val * c0_t2_val) * pochai.err
  390. + fabs(pochai.val * gamrni.val * gamri1.val * c0_t2_val) * factor_err
  391. + 2.0 * GSL_DBL_EPSILON * fabs(c0_val);
  392. /*
  393. C XEPS1 = (1.0 - X**(-BEPS))/BEPS = (X**(-BEPS) - 1.0)/(-BEPS)
  394. */
  395. gsl_sf_result dexprl;
  396. int stat_dexprl = gsl_sf_exprel_e(-beps*lnx, &dexprl);
  397. double xeps1_val = lnx * dexprl.val;
  398. double xeps1_err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(beps*lnx)) * fabs(dexprl.val)
  399. + fabs(lnx) * dexprl.err
  400. + 2.0 * GSL_DBL_EPSILON * fabs(xeps1_val);
  401. double dchu_val = sum.val + c0_val + xeps1_val*b0_val;
  402. double dchu_err = sum.err + c0_err
  403. + fabs(xeps1_val)*b0_err + xeps1_err * fabs(b0_val)
  404. + fabs(b0_val*lnx)*dexprl.err
  405. + 2.0 * GSL_DBL_EPSILON * (fabs(sum.val) + fabs(c0_val) + fabs(xeps1_val*b0_val));
  406. double xn = N;
  407. double t_val;
  408. double t_err;
  409. stat_all = GSL_ERROR_SELECT_5(stat_all, stat_dexprl, stat_poch1bxibeps, stat_pch1i, stat_pch1ai);
  410. for(i=1; i<2000; i++) {
  411. const double xi = istrt + i;
  412. const double xi1 = istrt + i - 1;
  413. const double tmp = (a-1.0)*(xn+2.0*xi-1.0) + xi*(xi-beps);
  414. const double b0_multiplier = (a+xi1-beps)*x/((xn+xi1)*(xi-beps));
  415. const double c0_multiplier_1 = (a+xi1)*x/((b+xi1)*xi);
  416. const double c0_multiplier_2 = tmp / (xi*(b+xi1)*(a+xi1-beps));
  417. b0_val *= b0_multiplier;
  418. b0_err += fabs(b0_multiplier) * b0_err + fabs(b0_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
  419. c0_val = c0_multiplier_1 * c0_val - c0_multiplier_2 * b0_val;
  420. c0_err = fabs(c0_multiplier_1) * c0_err
  421. + fabs(c0_multiplier_2) * b0_err
  422. + fabs(c0_val) * 8.0 * 2.0 * GSL_DBL_EPSILON
  423. + fabs(b0_val * c0_multiplier_2) * 16.0 * 2.0 * GSL_DBL_EPSILON;
  424. t_val = c0_val + xeps1_val*b0_val;
  425. t_err = c0_err + fabs(xeps1_val)*b0_err;
  426. t_err += fabs(b0_val*lnx) * dexprl.err;
  427. t_err += fabs(b0_val)*xeps1_err;
  428. dchu_val += t_val;
  429. dchu_err += t_err;
  430. if(fabs(t_val) < EPS*fabs(dchu_val)) break;
  431. }
  432. result->val = dchu_val;
  433. result->err = 2.0 * dchu_err;
  434. result->err += 2.0 * fabs(t_val);
  435. result->err += 4.0 * GSL_DBL_EPSILON * (i+2.0) * fabs(dchu_val);
  436. result->err *= 2.0; /* FIXME: fudge factor */
  437. if(i >= 2000) {
  438. GSL_ERROR ("error", GSL_EMAXITER);
  439. }
  440. else {
  441. return stat_all;
  442. }
  443. }
  444. else {
  445. /*
  446. C X**(-BEPS) IS VERY DIFFERENT FROM 1.0, SO THE
  447. C STRAIGHTFORWARD FORMULATION IS STABLE.
  448. */
  449. int i;
  450. double dchu_val;
  451. double dchu_err;
  452. double t_val;
  453. double t_err;
  454. gsl_sf_result dgamrbxi;
  455. int stat_dgamrbxi = gsl_sf_gammainv_e(b+xi, &dgamrbxi);
  456. double a0_val = factor_val * pochai.val * dgamrbxi.val * gamri1.val / beps;
  457. double a0_err = fabs(factor_val * pochai.val * dgamrbxi.val / beps) * gamri1.err
  458. + fabs(factor_val * pochai.val * gamri1.val / beps) * dgamrbxi.err
  459. + fabs(factor_val * dgamrbxi.val * gamri1.val / beps) * pochai.err
  460. + fabs(pochai.val * dgamrbxi.val * gamri1.val / beps) * factor_err
  461. + 2.0 * GSL_DBL_EPSILON * fabs(a0_val);
  462. stat_all = GSL_ERROR_SELECT_2(stat_all, stat_dgamrbxi);
  463. b0_val = xeps * b0_val / beps;
  464. b0_err = fabs(xeps / beps) * b0_err + 4.0 * GSL_DBL_EPSILON * fabs(b0_val);
  465. dchu_val = sum.val + a0_val - b0_val;
  466. dchu_err = sum.err + a0_err + b0_err
  467. + 2.0 * GSL_DBL_EPSILON * (fabs(sum.val) + fabs(a0_val) + fabs(b0_val));
  468. for(i=1; i<2000; i++) {
  469. double xi = istrt + i;
  470. double xi1 = istrt + i - 1;
  471. double a0_multiplier = (a+xi1)*x/((b+xi1)*xi);
  472. double b0_multiplier = (a+xi1-beps)*x/((aintb+xi1)*(xi-beps));
  473. a0_val *= a0_multiplier;
  474. a0_err += fabs(a0_multiplier) * a0_err;
  475. b0_val *= b0_multiplier;
  476. b0_err += fabs(b0_multiplier) * b0_err;
  477. t_val = a0_val - b0_val;
  478. t_err = a0_err + b0_err;
  479. dchu_val += t_val;
  480. dchu_err += t_err;
  481. if(fabs(t_val) < EPS*fabs(dchu_val)) break;
  482. }
  483. result->val = dchu_val;
  484. result->err = 2.0 * dchu_err;
  485. result->err += 2.0 * fabs(t_val);
  486. result->err += 4.0 * GSL_DBL_EPSILON * (i+2.0) * fabs(dchu_val);
  487. result->err *= 2.0; /* FIXME: fudge factor */
  488. if(i >= 2000) {
  489. GSL_ERROR ("error", GSL_EMAXITER);
  490. }
  491. else {
  492. return stat_all;
  493. }
  494. }
  495. }
  496. }
  497. /* Assumes b > 0 and x > 0.
  498. */
  499. static
  500. int
  501. hyperg_U_small_ab(const double a, const double b, const double x, gsl_sf_result * result)
  502. {
  503. if(a == -1.0) {
  504. /* U(-1,c+1,x) = Laguerre[c,0,x] = -b + x
  505. */
  506. result->val = -b + x;
  507. result->err = 2.0 * GSL_DBL_EPSILON * (fabs(b) + fabs(x));
  508. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  509. return GSL_SUCCESS;
  510. }
  511. else if(a == 0.0) {
  512. /* U(0,c+1,x) = Laguerre[c,0,x] = 1
  513. */
  514. result->val = 1.0;
  515. result->err = 0.0;
  516. return GSL_SUCCESS;
  517. }
  518. else if(ASYMP_EVAL_OK(a,b,x)) {
  519. double p = pow(x, -a);
  520. gsl_sf_result asymp;
  521. int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
  522. result->val = asymp.val * p;
  523. result->err = asymp.err * p;
  524. result->err += fabs(asymp.val) * GSL_DBL_EPSILON * fabs(a) * p;
  525. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  526. return stat_asymp;
  527. }
  528. else {
  529. return hyperg_U_series(a, b, x, result);
  530. }
  531. }
  532. /* Assumes b > 0 and x > 0.
  533. */
  534. static
  535. int
  536. hyperg_U_small_a_bgt0(const double a, const double b, const double x,
  537. gsl_sf_result * result,
  538. double * ln_multiplier
  539. )
  540. {
  541. if(a == 0.0) {
  542. result->val = 1.0;
  543. result->err = 1.0;
  544. *ln_multiplier = 0.0;
  545. return GSL_SUCCESS;
  546. }
  547. else if( (b > 5000.0 && x < 0.90 * fabs(b))
  548. || (b > 500.0 && x < 0.50 * fabs(b))
  549. ) {
  550. int stat = gsl_sf_hyperg_U_large_b_e(a, b, x, result, ln_multiplier);
  551. if(stat == GSL_EOVRFLW)
  552. return GSL_SUCCESS;
  553. else
  554. return stat;
  555. }
  556. else if(b > 15.0) {
  557. /* Recurse up from b near 1.
  558. */
  559. double eps = b - floor(b);
  560. double b0 = 1.0 + eps;
  561. gsl_sf_result r_Ubm1;
  562. gsl_sf_result r_Ub;
  563. int stat_0 = hyperg_U_small_ab(a, b0, x, &r_Ubm1);
  564. int stat_1 = hyperg_U_small_ab(a, b0+1.0, x, &r_Ub);
  565. double Ubm1 = r_Ubm1.val;
  566. double Ub = r_Ub.val;
  567. double Ubp1;
  568. double bp;
  569. for(bp = b0+1.0; bp<b-0.1; bp += 1.0) {
  570. Ubp1 = ((1.0+a-bp)*Ubm1 + (bp+x-1.0)*Ub)/x;
  571. Ubm1 = Ub;
  572. Ub = Ubp1;
  573. }
  574. result->val = Ub;
  575. result->err = (fabs(r_Ubm1.err/r_Ubm1.val) + fabs(r_Ub.err/r_Ub.val)) * fabs(Ub);
  576. result->err += 2.0 * GSL_DBL_EPSILON * (fabs(b-b0)+1.0) * fabs(Ub);
  577. *ln_multiplier = 0.0;
  578. return GSL_ERROR_SELECT_2(stat_0, stat_1);
  579. }
  580. else {
  581. *ln_multiplier = 0.0;
  582. return hyperg_U_small_ab(a, b, x, result);
  583. }
  584. }
  585. /* We use this to keep track of large
  586. * dynamic ranges in the recursions.
  587. * This can be important because sometimes
  588. * we want to calculate a very large and
  589. * a very small number and the answer is
  590. * the product, of order 1. This happens,
  591. * for instance, when we apply a Kummer
  592. * transform to make b positive and
  593. * both x and b are large.
  594. */
  595. #define RESCALE_2(u0,u1,factor,count) \
  596. do { \
  597. double au0 = fabs(u0); \
  598. if(au0 > factor) { \
  599. u0 /= factor; \
  600. u1 /= factor; \
  601. count++; \
  602. } \
  603. else if(au0 < 1.0/factor) { \
  604. u0 *= factor; \
  605. u1 *= factor; \
  606. count--; \
  607. } \
  608. } while (0)
  609. /* Specialization to b >= 1, for integer parameters.
  610. * Assumes x > 0.
  611. */
  612. static
  613. int
  614. hyperg_U_int_bge1(const int a, const int b, const double x,
  615. gsl_sf_result_e10 * result)
  616. {
  617. if(a == 0) {
  618. result->val = 1.0;
  619. result->err = 0.0;
  620. result->e10 = 0;
  621. return GSL_SUCCESS;
  622. }
  623. else if(a == -1) {
  624. result->val = -b + x;
  625. result->err = 2.0 * GSL_DBL_EPSILON * (fabs(b) + fabs(x));
  626. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  627. result->e10 = 0;
  628. return GSL_SUCCESS;
  629. }
  630. else if(b == a + 1) {
  631. /* U(a,a+1,x) = x^(-a)
  632. */
  633. return gsl_sf_exp_e10_e(-a*log(x), result);
  634. }
  635. else if(ASYMP_EVAL_OK(a,b,x)) {
  636. const double ln_pre_val = -a*log(x);
  637. const double ln_pre_err = 2.0 * GSL_DBL_EPSILON * fabs(ln_pre_val);
  638. gsl_sf_result asymp;
  639. int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
  640. int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val, ln_pre_err,
  641. asymp.val, asymp.err,
  642. result);
  643. return GSL_ERROR_SELECT_2(stat_e, stat_asymp);
  644. }
  645. else if(SERIES_EVAL_OK(a,b,x)) {
  646. gsl_sf_result ser;
  647. const int stat_ser = hyperg_U_series(a, b, x, &ser);
  648. result->val = ser.val;
  649. result->err = ser.err;
  650. result->e10 = 0;
  651. return stat_ser;
  652. }
  653. else if(a < 0) {
  654. /* Recurse backward from a = -1,0.
  655. */
  656. int scale_count = 0;
  657. const double scale_factor = GSL_SQRT_DBL_MAX;
  658. gsl_sf_result lnm;
  659. gsl_sf_result y;
  660. double lnscale;
  661. double Uap1 = 1.0; /* U(0,b,x) */
  662. double Ua = -b + x; /* U(-1,b,x) */
  663. double Uam1;
  664. int ap;
  665. for(ap=-1; ap>a; ap--) {
  666. Uam1 = ap*(b-ap-1.0)*Uap1 + (x+2.0*ap-b)*Ua;
  667. Uap1 = Ua;
  668. Ua = Uam1;
  669. RESCALE_2(Ua,Uap1,scale_factor,scale_count);
  670. }
  671. lnscale = log(scale_factor);
  672. lnm.val = scale_count*lnscale;
  673. lnm.err = 2.0 * GSL_DBL_EPSILON * fabs(lnm.val);
  674. y.val = Ua;
  675. y.err = 4.0 * GSL_DBL_EPSILON * (fabs(a)+1.0) * fabs(Ua);
  676. return gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  677. }
  678. else if(b >= 2.0*a + x) {
  679. /* Recurse forward from a = 0,1.
  680. */
  681. int scale_count = 0;
  682. const double scale_factor = GSL_SQRT_DBL_MAX;
  683. gsl_sf_result r_Ua;
  684. gsl_sf_result lnm;
  685. gsl_sf_result y;
  686. double lnscale;
  687. double lm;
  688. int stat_1 = hyperg_U_small_a_bgt0(1.0, b, x, &r_Ua, &lm); /* U(1,b,x) */
  689. int stat_e;
  690. double Uam1 = 1.0; /* U(0,b,x) */
  691. double Ua = r_Ua.val;
  692. double Uap1;
  693. int ap;
  694. Uam1 *= exp(-lm);
  695. for(ap=1; ap<a; ap++) {
  696. Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
  697. Uam1 = Ua;
  698. Ua = Uap1;
  699. RESCALE_2(Ua,Uam1,scale_factor,scale_count);
  700. }
  701. lnscale = log(scale_factor);
  702. lnm.val = lm + scale_count * lnscale;
  703. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm) + fabs(scale_count*lnscale));
  704. y.val = Ua;
  705. y.err = fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
  706. y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a) + 1.0) * fabs(Ua);
  707. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  708. return GSL_ERROR_SELECT_2(stat_e, stat_1);
  709. }
  710. else {
  711. if(b <= x) {
  712. /* Recurse backward either to the b=a+1 line
  713. * or to a=0, whichever we hit.
  714. */
  715. const double scale_factor = GSL_SQRT_DBL_MAX;
  716. int scale_count = 0;
  717. int stat_CF1;
  718. double ru;
  719. int CF1_count;
  720. int a_target;
  721. double lnU_target;
  722. double Ua;
  723. double Uap1;
  724. double Uam1;
  725. int ap;
  726. if(b < a + 1) {
  727. a_target = b-1;
  728. lnU_target = -a_target*log(x);
  729. }
  730. else {
  731. a_target = 0;
  732. lnU_target = 0.0;
  733. }
  734. stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
  735. Ua = 1.0;
  736. Uap1 = ru/a * Ua;
  737. for(ap=a; ap>a_target; ap--) {
  738. Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
  739. Uap1 = Ua;
  740. Ua = Uam1;
  741. RESCALE_2(Ua,Uap1,scale_factor,scale_count);
  742. }
  743. if(Ua == 0.0) {
  744. result->val = 0.0;
  745. result->err = 0.0;
  746. result->e10 = 0;
  747. GSL_ERROR ("error", GSL_EZERODIV);
  748. }
  749. else {
  750. double lnscl = -scale_count*log(scale_factor);
  751. double lnpre_val = lnU_target + lnscl;
  752. double lnpre_err = 2.0 * GSL_DBL_EPSILON * (fabs(lnU_target) + fabs(lnscl));
  753. double oUa_err = 2.0 * (fabs(a_target-a) + CF1_count + 1.0) * GSL_DBL_EPSILON * fabs(1.0/Ua);
  754. int stat_e = gsl_sf_exp_mult_err_e10_e(lnpre_val, lnpre_err,
  755. 1.0/Ua, oUa_err,
  756. result);
  757. return GSL_ERROR_SELECT_2(stat_e, stat_CF1);
  758. }
  759. }
  760. else {
  761. /* Recurse backward to near the b=2a+x line, then
  762. * determine normalization by either direct evaluation
  763. * or by a forward recursion. The direct evaluation
  764. * is needed when x is small (which is precisely
  765. * when it is easy to do).
  766. */
  767. const double scale_factor = GSL_SQRT_DBL_MAX;
  768. int scale_count_for = 0;
  769. int scale_count_bck = 0;
  770. int a0 = 1;
  771. int a1 = a0 + ceil(0.5*(b-x) - a0);
  772. double Ua1_bck_val;
  773. double Ua1_bck_err;
  774. double Ua1_for_val;
  775. double Ua1_for_err;
  776. int stat_for;
  777. int stat_bck;
  778. gsl_sf_result lm_for;
  779. {
  780. /* Recurse back to determine U(a1,b), sans normalization.
  781. */
  782. double ru;
  783. int CF1_count;
  784. int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
  785. double Ua = 1.0;
  786. double Uap1 = ru/a * Ua;
  787. double Uam1;
  788. int ap;
  789. for(ap=a; ap>a1; ap--) {
  790. Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
  791. Uap1 = Ua;
  792. Ua = Uam1;
  793. RESCALE_2(Ua,Uap1,scale_factor,scale_count_bck);
  794. }
  795. Ua1_bck_val = Ua;
  796. Ua1_bck_err = 2.0 * GSL_DBL_EPSILON * (fabs(a1-a)+CF1_count+1.0) * fabs(Ua);
  797. stat_bck = stat_CF1;
  798. }
  799. if(b == 2*a1 && a1 > 1) {
  800. /* This can happen when x is small, which is
  801. * precisely when we need to be careful with
  802. * this evaluation.
  803. */
  804. hyperg_lnU_beq2a((double)a1, x, &lm_for);
  805. Ua1_for_val = 1.0;
  806. Ua1_for_err = 0.0;
  807. stat_for = GSL_SUCCESS;
  808. }
  809. else if(b == 2*a1 - 1 && a1 > 1) {
  810. /* Similar to the above. Happens when x is small.
  811. * Use
  812. * U(a,2a-1) = (x U(a,2a) - U(a-1,2(a-1))) / (2a - 2)
  813. */
  814. gsl_sf_result lnU00, lnU12;
  815. gsl_sf_result U00, U12;
  816. hyperg_lnU_beq2a(a1-1.0, x, &lnU00);
  817. hyperg_lnU_beq2a(a1, x, &lnU12);
  818. if(lnU00.val > lnU12.val) {
  819. lm_for.val = lnU00.val;
  820. lm_for.err = lnU00.err;
  821. U00.val = 1.0;
  822. U00.err = 0.0;
  823. gsl_sf_exp_err_e(lnU12.val - lm_for.val, lnU12.err + lm_for.err, &U12);
  824. }
  825. else {
  826. lm_for.val = lnU12.val;
  827. lm_for.err = lnU12.err;
  828. U12.val = 1.0;
  829. U12.err = 0.0;
  830. gsl_sf_exp_err_e(lnU00.val - lm_for.val, lnU00.err + lm_for.err, &U00);
  831. }
  832. Ua1_for_val = (x * U12.val - U00.val) / (2.0*a1 - 2.0);
  833. Ua1_for_err = (fabs(x)*U12.err + U00.err) / fabs(2.0*a1 - 2.0);
  834. Ua1_for_err += 2.0 * GSL_DBL_EPSILON * fabs(Ua1_for_val);
  835. stat_for = GSL_SUCCESS;
  836. }
  837. else {
  838. /* Recurse forward to determine U(a1,b) with
  839. * absolute normalization.
  840. */
  841. gsl_sf_result r_Ua;
  842. double Uam1 = 1.0; /* U(a0-1,b,x) = U(0,b,x) */
  843. double Ua;
  844. double Uap1;
  845. int ap;
  846. double lm_for_local;
  847. stat_for = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_for_local); /* U(1,b,x) */
  848. Ua = r_Ua.val;
  849. Uam1 *= exp(-lm_for_local);
  850. lm_for.val = lm_for_local;
  851. lm_for.err = 0.0;
  852. for(ap=a0; ap<a1; ap++) {
  853. Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
  854. Uam1 = Ua;
  855. Ua = Uap1;
  856. RESCALE_2(Ua,Uam1,scale_factor,scale_count_for);
  857. }
  858. Ua1_for_val = Ua;
  859. Ua1_for_err = fabs(Ua) * fabs(r_Ua.err/r_Ua.val);
  860. Ua1_for_err += 2.0 * GSL_DBL_EPSILON * (fabs(a1-a0)+1.0) * fabs(Ua1_for_val);
  861. }
  862. /* Now do the matching to produce the final result.
  863. */
  864. if(Ua1_bck_val == 0.0) {
  865. result->val = 0.0;
  866. result->err = 0.0;
  867. result->e10 = 0;
  868. GSL_ERROR ("error", GSL_EZERODIV);
  869. }
  870. else if(Ua1_for_val == 0.0) {
  871. /* Should never happen. */
  872. UNDERFLOW_ERROR_E10(result);
  873. }
  874. else {
  875. double lns = (scale_count_for - scale_count_bck)*log(scale_factor);
  876. double ln_for_val = log(fabs(Ua1_for_val));
  877. double ln_for_err = GSL_DBL_EPSILON + fabs(Ua1_for_err/Ua1_for_val);
  878. double ln_bck_val = log(fabs(Ua1_bck_val));
  879. double ln_bck_err = GSL_DBL_EPSILON + fabs(Ua1_bck_err/Ua1_bck_val);
  880. double lnr_val = lm_for.val + ln_for_val - ln_bck_val + lns;
  881. double lnr_err = lm_for.err + ln_for_err + ln_bck_err
  882. + 2.0 * GSL_DBL_EPSILON * (fabs(lm_for.val) + fabs(ln_for_val) + fabs(ln_bck_val) + fabs(lns));
  883. double sgn = GSL_SIGN(Ua1_for_val) * GSL_SIGN(Ua1_bck_val);
  884. int stat_e = gsl_sf_exp_err_e10_e(lnr_val, lnr_err, result);
  885. result->val *= sgn;
  886. return GSL_ERROR_SELECT_3(stat_e, stat_bck, stat_for);
  887. }
  888. }
  889. }
  890. }
  891. /* Handle b >= 1 for generic a,b values.
  892. */
  893. static
  894. int
  895. hyperg_U_bge1(const double a, const double b, const double x,
  896. gsl_sf_result_e10 * result)
  897. {
  898. const double rinta = floor(a+0.5);
  899. const int a_neg_integer = (a < 0.0 && fabs(a - rinta) < INT_THRESHOLD);
  900. if(a == 0.0) {
  901. result->val = 1.0;
  902. result->err = 0.0;
  903. result->e10 = 0;
  904. return GSL_SUCCESS;
  905. }
  906. else if(a_neg_integer && fabs(rinta) < INT_MAX) {
  907. /* U(-n,b,x) = (-1)^n n! Laguerre[n,b-1,x]
  908. */
  909. const int n = -(int)rinta;
  910. const double sgn = (GSL_IS_ODD(n) ? -1.0 : 1.0);
  911. gsl_sf_result lnfact;
  912. gsl_sf_result L;
  913. const int stat_L = gsl_sf_laguerre_n_e(n, b-1.0, x, &L);
  914. gsl_sf_lnfact_e(n, &lnfact);
  915. {
  916. const int stat_e = gsl_sf_exp_mult_err_e10_e(lnfact.val, lnfact.err,
  917. sgn*L.val, L.err,
  918. result);
  919. return GSL_ERROR_SELECT_2(stat_e, stat_L);
  920. }
  921. }
  922. else if(ASYMP_EVAL_OK(a,b,x)) {
  923. const double ln_pre_val = -a*log(x);
  924. const double ln_pre_err = 2.0 * GSL_DBL_EPSILON * fabs(ln_pre_val);
  925. gsl_sf_result asymp;
  926. int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
  927. int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val, ln_pre_err,
  928. asymp.val, asymp.err,
  929. result);
  930. return GSL_ERROR_SELECT_2(stat_e, stat_asymp);
  931. }
  932. else if(fabs(a) <= 1.0) {
  933. gsl_sf_result rU;
  934. double ln_multiplier;
  935. int stat_U = hyperg_U_small_a_bgt0(a, b, x, &rU, &ln_multiplier);
  936. int stat_e = gsl_sf_exp_mult_err_e10_e(ln_multiplier, 2.0*GSL_DBL_EPSILON*fabs(ln_multiplier), rU.val, rU.err, result);
  937. return GSL_ERROR_SELECT_2(stat_U, stat_e);
  938. }
  939. else if(SERIES_EVAL_OK(a,b,x)) {
  940. gsl_sf_result ser;
  941. const int stat_ser = hyperg_U_series(a, b, x, &ser);
  942. result->val = ser.val;
  943. result->err = ser.err;
  944. result->e10 = 0;
  945. return stat_ser;
  946. }
  947. else if(a < 0.0) {
  948. /* Recurse backward on a and then upward on b.
  949. */
  950. const double scale_factor = GSL_SQRT_DBL_MAX;
  951. const double a0 = a - floor(a) - 1.0;
  952. const double b0 = b - floor(b) + 1.0;
  953. int scale_count = 0;
  954. double lm_0, lm_1;
  955. double lm_max;
  956. gsl_sf_result r_Uap1;
  957. gsl_sf_result r_Ua;
  958. int stat_0 = hyperg_U_small_a_bgt0(a0+1.0, b0, x, &r_Uap1, &lm_0);
  959. int stat_1 = hyperg_U_small_a_bgt0(a0, b0, x, &r_Ua, &lm_1);
  960. int stat_e;
  961. double Uap1 = r_Uap1.val;
  962. double Ua = r_Ua.val;
  963. double Uam1;
  964. double ap;
  965. lm_max = GSL_MAX(lm_0, lm_1);
  966. Uap1 *= exp(lm_0-lm_max);
  967. Ua *= exp(lm_1-lm_max);
  968. /* Downward recursion on a.
  969. */
  970. for(ap=a0; ap>a+0.1; ap -= 1.0) {
  971. Uam1 = ap*(b0-ap-1.0)*Uap1 + (x+2.0*ap-b0)*Ua;
  972. Uap1 = Ua;
  973. Ua = Uam1;
  974. RESCALE_2(Ua,Uap1,scale_factor,scale_count);
  975. }
  976. if(b < 2.0) {
  977. /* b == b0, so no recursion necessary
  978. */
  979. const double lnscale = log(scale_factor);
  980. gsl_sf_result lnm;
  981. gsl_sf_result y;
  982. lnm.val = lm_max + scale_count * lnscale;
  983. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + scale_count * fabs(lnscale));
  984. y.val = Ua;
  985. y.err = fabs(r_Uap1.err/r_Uap1.val) * fabs(Ua);
  986. y.err += fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
  987. y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + 1.0) * fabs(Ua);
  988. y.err *= fabs(lm_0-lm_max) + 1.0;
  989. y.err *= fabs(lm_1-lm_max) + 1.0;
  990. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  991. }
  992. else {
  993. /* Upward recursion on b.
  994. */
  995. const double err_mult = fabs(b-b0) + fabs(a-a0) + 1.0;
  996. const double lnscale = log(scale_factor);
  997. gsl_sf_result lnm;
  998. gsl_sf_result y;
  999. double Ubm1 = Ua; /* U(a,b0) */
  1000. double Ub = (a*(b0-a-1.0)*Uap1 + (a+x)*Ua)/x; /* U(a,b0+1) */
  1001. double Ubp1;
  1002. double bp;
  1003. for(bp=b0+1.0; bp<b-0.1; bp += 1.0) {
  1004. Ubp1 = ((1.0+a-bp)*Ubm1 + (bp+x-1.0)*Ub)/x;
  1005. Ubm1 = Ub;
  1006. Ub = Ubp1;
  1007. RESCALE_2(Ub,Ubm1,scale_factor,scale_count);
  1008. }
  1009. lnm.val = lm_max + scale_count * lnscale;
  1010. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + fabs(scale_count * lnscale));
  1011. y.val = Ub;
  1012. y.err = 2.0 * err_mult * fabs(r_Uap1.err/r_Uap1.val) * fabs(Ub);
  1013. y.err += 2.0 * err_mult * fabs(r_Ua.err/r_Ua.val) * fabs(Ub);
  1014. y.err += 2.0 * GSL_DBL_EPSILON * err_mult * fabs(Ub);
  1015. y.err *= fabs(lm_0-lm_max) + 1.0;
  1016. y.err *= fabs(lm_1-lm_max) + 1.0;
  1017. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  1018. }
  1019. return GSL_ERROR_SELECT_3(stat_e, stat_0, stat_1);
  1020. }
  1021. else if(b >= 2*a + x) {
  1022. /* Recurse forward from a near zero.
  1023. * Note that we cannot cross the singularity at
  1024. * the line b=a+1, because the only way we could
  1025. * be in that little wedge is if a < 1. But we
  1026. * have already dealt with the small a case.
  1027. */
  1028. int scale_count = 0;
  1029. const double a0 = a - floor(a);
  1030. const double scale_factor = GSL_SQRT_DBL_MAX;
  1031. double lnscale;
  1032. double lm_0, lm_1, lm_max;
  1033. gsl_sf_result r_Uam1;
  1034. gsl_sf_result r_Ua;
  1035. int stat_0 = hyperg_U_small_a_bgt0(a0-1.0, b, x, &r_Uam1, &lm_0);
  1036. int stat_1 = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_1);
  1037. int stat_e;
  1038. gsl_sf_result lnm;
  1039. gsl_sf_result y;
  1040. double Uam1 = r_Uam1.val;
  1041. double Ua = r_Ua.val;
  1042. double Uap1;
  1043. double ap;
  1044. lm_max = GSL_MAX(lm_0, lm_1);
  1045. Uam1 *= exp(lm_0-lm_max);
  1046. Ua *= exp(lm_1-lm_max);
  1047. for(ap=a0; ap<a-0.1; ap += 1.0) {
  1048. Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
  1049. Uam1 = Ua;
  1050. Ua = Uap1;
  1051. RESCALE_2(Ua,Uam1,scale_factor,scale_count);
  1052. }
  1053. lnscale = log(scale_factor);
  1054. lnm.val = lm_max + scale_count * lnscale;
  1055. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + fabs(scale_count * lnscale));
  1056. y.val = Ua;
  1057. y.err = fabs(r_Uam1.err/r_Uam1.val) * fabs(Ua);
  1058. y.err += fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
  1059. y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + 1.0) * fabs(Ua);
  1060. y.err *= fabs(lm_0-lm_max) + 1.0;
  1061. y.err *= fabs(lm_1-lm_max) + 1.0;
  1062. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  1063. return GSL_ERROR_SELECT_3(stat_e, stat_0, stat_1);
  1064. }
  1065. else {
  1066. if(b <= x) {
  1067. /* Recurse backward to a near zero.
  1068. */
  1069. const double a0 = a - floor(a);
  1070. const double scale_factor = GSL_SQRT_DBL_MAX;
  1071. int scale_count = 0;
  1072. gsl_sf_result lnm;
  1073. gsl_sf_result y;
  1074. double lnscale;
  1075. double lm_0;
  1076. double Uap1;
  1077. double Ua;
  1078. double Uam1;
  1079. gsl_sf_result U0;
  1080. double ap;
  1081. double ru;
  1082. double r;
  1083. int CF1_count;
  1084. int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
  1085. int stat_U0;
  1086. int stat_e;
  1087. r = ru/a;
  1088. Ua = GSL_SQRT_DBL_MIN;
  1089. Uap1 = r * Ua;
  1090. for(ap=a; ap>a0+0.1; ap -= 1.0) {
  1091. Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
  1092. Uap1 = Ua;
  1093. Ua = Uam1;
  1094. RESCALE_2(Ua,Uap1,scale_factor,scale_count);
  1095. }
  1096. stat_U0 = hyperg_U_small_a_bgt0(a0, b, x, &U0, &lm_0);
  1097. lnscale = log(scale_factor);
  1098. lnm.val = lm_0 - scale_count * lnscale;
  1099. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_0) + fabs(scale_count * lnscale));
  1100. y.val = GSL_SQRT_DBL_MIN*(U0.val/Ua);
  1101. y.err = GSL_SQRT_DBL_MIN*(U0.err/fabs(Ua));
  1102. y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a0-a) + CF1_count + 1.0) * fabs(y.val);
  1103. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  1104. return GSL_ERROR_SELECT_3(stat_e, stat_U0, stat_CF1);
  1105. }
  1106. else {
  1107. /* Recurse backward to near the b=2a+x line, then
  1108. * forward from a near zero to get the normalization.
  1109. */
  1110. int scale_count_for = 0;
  1111. int scale_count_bck = 0;
  1112. const double scale_factor = GSL_SQRT_DBL_MAX;
  1113. const double eps = a - floor(a);
  1114. const double a0 = ( eps == 0.0 ? 1.0 : eps );
  1115. const double a1 = a0 + ceil(0.5*(b-x) - a0);
  1116. gsl_sf_result lnm;
  1117. gsl_sf_result y;
  1118. double lm_for;
  1119. double lnscale;
  1120. double Ua1_bck;
  1121. double Ua1_for;
  1122. int stat_for;
  1123. int stat_bck;
  1124. int stat_e;
  1125. int CF1_count;
  1126. {
  1127. /* Recurse back to determine U(a1,b), sans normalization.
  1128. */
  1129. double Uap1;
  1130. double Ua;
  1131. double Uam1;
  1132. double ap;
  1133. double ru;
  1134. double r;
  1135. int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
  1136. r = ru/a;
  1137. Ua = GSL_SQRT_DBL_MIN;
  1138. Uap1 = r * Ua;
  1139. for(ap=a; ap>a1+0.1; ap -= 1.0) {
  1140. Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
  1141. Uap1 = Ua;
  1142. Ua = Uam1;
  1143. RESCALE_2(Ua,Uap1,scale_factor,scale_count_bck);
  1144. }
  1145. Ua1_bck = Ua;
  1146. stat_bck = stat_CF1;
  1147. }
  1148. {
  1149. /* Recurse forward to determine U(a1,b) with
  1150. * absolute normalization.
  1151. */
  1152. gsl_sf_result r_Uam1;
  1153. gsl_sf_result r_Ua;
  1154. double lm_0, lm_1;
  1155. int stat_0 = hyperg_U_small_a_bgt0(a0-1.0, b, x, &r_Uam1, &lm_0);
  1156. int stat_1 = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_1);
  1157. double Uam1 = r_Uam1.val;
  1158. double Ua = r_Ua.val;
  1159. double Uap1;
  1160. double ap;
  1161. lm_for = GSL_MAX(lm_0, lm_1);
  1162. Uam1 *= exp(lm_0 - lm_for);
  1163. Ua *= exp(lm_1 - lm_for);
  1164. for(ap=a0; ap<a1-0.1; ap += 1.0) {
  1165. Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
  1166. Uam1 = Ua;
  1167. Ua = Uap1;
  1168. RESCALE_2(Ua,Uam1,scale_factor,scale_count_for);
  1169. }
  1170. Ua1_for = Ua;
  1171. stat_for = GSL_ERROR_SELECT_2(stat_0, stat_1);
  1172. }
  1173. lnscale = log(scale_factor);
  1174. lnm.val = lm_for + (scale_count_for - scale_count_bck)*lnscale;
  1175. lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_for) + fabs(scale_count_for - scale_count_bck)*fabs(lnscale));
  1176. y.val = GSL_SQRT_DBL_MIN*Ua1_for/Ua1_bck;
  1177. y.err = 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + CF1_count + 1.0) * fabs(y.val);
  1178. stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
  1179. return GSL_ERROR_SELECT_3(stat_e, stat_bck, stat_for);
  1180. }
  1181. }
  1182. }
  1183. /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
  1184. int
  1185. gsl_sf_hyperg_U_int_e10_e(const int a, const int b, const double x,
  1186. gsl_sf_result_e10 * result)
  1187. {
  1188. /* CHECK_POINTER(result) */
  1189. if(x <= 0.0) {
  1190. DOMAIN_ERROR_E10(result);
  1191. }
  1192. else {
  1193. if(b >= 1) {
  1194. return hyperg_U_int_bge1(a, b, x, result);
  1195. }
  1196. else {
  1197. /* Use the reflection formula
  1198. * U(a,b,x) = x^(1-b) U(1+a-b,2-b,x)
  1199. */
  1200. gsl_sf_result_e10 U;
  1201. double ln_x = log(x);
  1202. int ap = 1 + a - b;
  1203. int bp = 2 - b;
  1204. int stat_e;
  1205. int stat_U = hyperg_U_int_bge1(ap, bp, x, &U);
  1206. double ln_pre_val = (1.0-b)*ln_x;
  1207. double ln_pre_err = 2.0 * GSL_DBL_EPSILON * (fabs(b)+1.0) * fabs(ln_x);
  1208. ln_pre_err += 2.0 * GSL_DBL_EPSILON * fabs(1.0-b); /* error in log(x) */
  1209. stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val + U.e10*M_LN10, ln_pre_err,
  1210. U.val, U.err,
  1211. result);
  1212. return GSL_ERROR_SELECT_2(stat_e, stat_U);
  1213. }
  1214. }
  1215. }
  1216. int
  1217. gsl_sf_hyperg_U_e10_e(const double a, const double b, const double x,
  1218. gsl_sf_result_e10 * result)
  1219. {
  1220. const double rinta = floor(a + 0.5);
  1221. const double rintb = floor(b + 0.5);
  1222. const int a_integer = ( fabs(a - rinta) < INT_THRESHOLD );
  1223. const int b_integer = ( fabs(b - rintb) < INT_THRESHOLD );
  1224. /* CHECK_POINTER(result) */
  1225. if(x <= 0.0) {
  1226. DOMAIN_ERROR_E10(result);
  1227. }
  1228. else if(a == 0.0) {
  1229. result->val = 1.0;
  1230. result->err = 0.0;
  1231. result->e10 = 0;
  1232. return GSL_SUCCESS;
  1233. }
  1234. else if(a_integer && b_integer) {
  1235. return gsl_sf_hyperg_U_int_e10_e(rinta, rintb, x, result);
  1236. }
  1237. else {
  1238. if(b >= 1.0) {
  1239. /* Use b >= 1 function.
  1240. */
  1241. return hyperg_U_bge1(a, b, x, result);
  1242. }
  1243. else {
  1244. /* Use the reflection formula
  1245. * U(a,b,x) = x^(1-b) U(1+a-b,2-b,x)
  1246. */
  1247. const double lnx = log(x);
  1248. const double ln_pre_val = (1.0-b)*lnx;
  1249. const double ln_pre_err = fabs(lnx) * 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(b));
  1250. const double ap = 1.0 + a - b;
  1251. const double bp = 2.0 - b;
  1252. gsl_sf_result_e10 U;
  1253. int stat_U = hyperg_U_bge1(ap, bp, x, &U);
  1254. int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val + U.e10*M_LN10, ln_pre_err,
  1255. U.val, U.err,
  1256. result);
  1257. return GSL_ERROR_SELECT_2(stat_e, stat_U);
  1258. }
  1259. }
  1260. }
  1261. int
  1262. gsl_sf_hyperg_U_int_e(const int a, const int b, const double x, gsl_sf_result * result)
  1263. {
  1264. gsl_sf_result_e10 re;
  1265. int stat_U = gsl_sf_hyperg_U_int_e10_e(a, b, x, &re);
  1266. int stat_c = gsl_sf_result_smash_e(&re, result);
  1267. return GSL_ERROR_SELECT_2(stat_c, stat_U);
  1268. }
  1269. int
  1270. gsl_sf_hyperg_U_e(const double a, const double b, const double x, gsl_sf_result * result)
  1271. {
  1272. gsl_sf_result_e10 re;
  1273. int stat_U = gsl_sf_hyperg_U_e10_e(a, b, x, &re);
  1274. int stat_c = gsl_sf_result_smash_e(&re, result);
  1275. return GSL_ERROR_SELECT_2(stat_c, stat_U);
  1276. }
  1277. /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
  1278. #include "gsl_specfunc__eval.h"
  1279. double gsl_sf_hyperg_U_int(const int a, const int b, const double x)
  1280. {
  1281. EVAL_RESULT(gsl_sf_hyperg_U_int_e(a, b, x, &result));
  1282. }
  1283. double gsl_sf_hyperg_U(const double a, const double b, const double x)
  1284. {
  1285. EVAL_RESULT(gsl_sf_hyperg_U_e(a, b, x, &result));
  1286. }