gsl_specfunc__hyperg_2F1.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. /* specfunc/hyperg_2F1.c
  2. *
  3. * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 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_pow_int.h"
  25. #include "gsl_sf_gamma.h"
  26. #include "gsl_sf_psi.h"
  27. #include "gsl_sf_hyperg.h"
  28. #include "gsl_specfunc__error.h"
  29. #define locEPS (1000.0*GSL_DBL_EPSILON)
  30. /* Assumes c != negative integer.
  31. */
  32. static int
  33. hyperg_2F1_series(const double a, const double b, const double c,
  34. const double x,
  35. gsl_sf_result * result
  36. )
  37. {
  38. double sum_pos = 1.0;
  39. double sum_neg = 0.0;
  40. double del_pos = 1.0;
  41. double del_neg = 0.0;
  42. double del = 1.0;
  43. double k = 0.0;
  44. int i = 0;
  45. if(fabs(c) < GSL_DBL_EPSILON) {
  46. result->val = 0.0; /* FIXME: ?? */
  47. result->err = 1.0;
  48. GSL_ERROR ("error", GSL_EDOM);
  49. }
  50. do {
  51. if(++i > 30000) {
  52. result->val = sum_pos - sum_neg;
  53. result->err = del_pos + del_neg;
  54. result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
  55. result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k)+1.0) * fabs(result->val);
  56. GSL_ERROR ("error", GSL_EMAXITER);
  57. }
  58. del *= (a+k)*(b+k) * x / ((c+k) * (k+1.0)); /* Gauss series */
  59. if(del > 0.0) {
  60. del_pos = del;
  61. sum_pos += del;
  62. }
  63. else if(del == 0.0) {
  64. /* Exact termination (a or b was a negative integer).
  65. */
  66. del_pos = 0.0;
  67. del_neg = 0.0;
  68. break;
  69. }
  70. else {
  71. del_neg = -del;
  72. sum_neg -= del;
  73. }
  74. k += 1.0;
  75. } while(fabs((del_pos + del_neg)/(sum_pos-sum_neg)) > GSL_DBL_EPSILON);
  76. result->val = sum_pos - sum_neg;
  77. result->err = del_pos + del_neg;
  78. result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
  79. result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k) + 1.0) * fabs(result->val);
  80. return GSL_SUCCESS;
  81. }
  82. /* a = aR + i aI, b = aR - i aI */
  83. static
  84. int
  85. hyperg_2F1_conj_series(const double aR, const double aI, const double c,
  86. double x,
  87. gsl_sf_result * result)
  88. {
  89. if(c == 0.0) {
  90. result->val = 0.0; /* FIXME: should be Inf */
  91. result->err = 0.0;
  92. GSL_ERROR ("error", GSL_EDOM);
  93. }
  94. else {
  95. double sum_pos = 1.0;
  96. double sum_neg = 0.0;
  97. double del_pos = 1.0;
  98. double del_neg = 0.0;
  99. double del = 1.0;
  100. double k = 0.0;
  101. do {
  102. del *= ((aR+k)*(aR+k) + aI*aI)/((k+1.0)*(c+k)) * x;
  103. if(del >= 0.0) {
  104. del_pos = del;
  105. sum_pos += del;
  106. }
  107. else {
  108. del_neg = -del;
  109. sum_neg -= del;
  110. }
  111. if(k > 30000) {
  112. result->val = sum_pos - sum_neg;
  113. result->err = del_pos + del_neg;
  114. result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
  115. result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k)+1.0) * fabs(result->val);
  116. GSL_ERROR ("error", GSL_EMAXITER);
  117. }
  118. k += 1.0;
  119. } while(fabs((del_pos + del_neg)/(sum_pos - sum_neg)) > GSL_DBL_EPSILON);
  120. result->val = sum_pos - sum_neg;
  121. result->err = del_pos + del_neg;
  122. result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
  123. result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k) + 1.0) * fabs(result->val);
  124. return GSL_SUCCESS;
  125. }
  126. }
  127. /* Luke's rational approximation. The most accesible
  128. * discussion is in [Kolbig, CPC 23, 51 (1981)].
  129. * The convergence is supposedly guaranteed for x < 0.
  130. * You have to read Luke's books to see this and other
  131. * results. Unfortunately, the stability is not so
  132. * clear to me, although it seems very efficient when
  133. * it works.
  134. */
  135. static
  136. int
  137. hyperg_2F1_luke(const double a, const double b, const double c,
  138. const double xin,
  139. gsl_sf_result * result)
  140. {
  141. int stat_iter;
  142. const double RECUR_BIG = 1.0e+50;
  143. const int nmax = 20000;
  144. int n = 3;
  145. const double x = -xin;
  146. const double x3 = x*x*x;
  147. const double t0 = a*b/c;
  148. const double t1 = (a+1.0)*(b+1.0)/(2.0*c);
  149. const double t2 = (a+2.0)*(b+2.0)/(2.0*(c+1.0));
  150. double F = 1.0;
  151. double prec;
  152. double Bnm3 = 1.0; /* B0 */
  153. double Bnm2 = 1.0 + t1 * x; /* B1 */
  154. double Bnm1 = 1.0 + t2 * x * (1.0 + t1/3.0 * x); /* B2 */
  155. double Anm3 = 1.0; /* A0 */
  156. double Anm2 = Bnm2 - t0 * x; /* A1 */
  157. double Anm1 = Bnm1 - t0*(1.0 + t2*x)*x + t0 * t1 * (c/(c+1.0)) * x*x; /* A2 */
  158. while(1) {
  159. double npam1 = n + a - 1;
  160. double npbm1 = n + b - 1;
  161. double npcm1 = n + c - 1;
  162. double npam2 = n + a - 2;
  163. double npbm2 = n + b - 2;
  164. double npcm2 = n + c - 2;
  165. double tnm1 = 2*n - 1;
  166. double tnm3 = 2*n - 3;
  167. double tnm5 = 2*n - 5;
  168. double n2 = n*n;
  169. double F1 = (3.0*n2 + (a+b-6)*n + 2 - a*b - 2*(a+b)) / (2*tnm3*npcm1);
  170. double F2 = -(3.0*n2 - (a+b+6)*n + 2 - a*b)*npam1*npbm1/(4*tnm1*tnm3*npcm2*npcm1);
  171. double F3 = (npam2*npam1*npbm2*npbm1*(n-a-2)*(n-b-2)) / (8*tnm3*tnm3*tnm5*(n+c-3)*npcm2*npcm1);
  172. double E = -npam1*npbm1*(n-c-1) / (2*tnm3*npcm2*npcm1);
  173. double An = (1.0+F1*x)*Anm1 + (E + F2*x)*x*Anm2 + F3*x3*Anm3;
  174. double Bn = (1.0+F1*x)*Bnm1 + (E + F2*x)*x*Bnm2 + F3*x3*Bnm3;
  175. double r = An/Bn;
  176. prec = fabs((F - r)/F);
  177. F = r;
  178. if(prec < GSL_DBL_EPSILON || n > nmax) break;
  179. if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
  180. An /= RECUR_BIG;
  181. Bn /= RECUR_BIG;
  182. Anm1 /= RECUR_BIG;
  183. Bnm1 /= RECUR_BIG;
  184. Anm2 /= RECUR_BIG;
  185. Bnm2 /= RECUR_BIG;
  186. Anm3 /= RECUR_BIG;
  187. Bnm3 /= RECUR_BIG;
  188. }
  189. else if(fabs(An) < 1.0/RECUR_BIG || fabs(Bn) < 1.0/RECUR_BIG) {
  190. An *= RECUR_BIG;
  191. Bn *= RECUR_BIG;
  192. Anm1 *= RECUR_BIG;
  193. Bnm1 *= RECUR_BIG;
  194. Anm2 *= RECUR_BIG;
  195. Bnm2 *= RECUR_BIG;
  196. Anm3 *= RECUR_BIG;
  197. Bnm3 *= RECUR_BIG;
  198. }
  199. n++;
  200. Bnm3 = Bnm2;
  201. Bnm2 = Bnm1;
  202. Bnm1 = Bn;
  203. Anm3 = Anm2;
  204. Anm2 = Anm1;
  205. Anm1 = An;
  206. }
  207. result->val = F;
  208. result->err = 2.0 * fabs(prec * F);
  209. result->err += 2.0 * GSL_DBL_EPSILON * (n+1.0) * fabs(F);
  210. /* FIXME: just a hack: there's a lot of shit going on here */
  211. result->err *= 8.0 * (fabs(a) + fabs(b) + 1.0);
  212. stat_iter = (n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
  213. return stat_iter;
  214. }
  215. /* Luke's rational approximation for the
  216. * case a = aR + i aI, b = aR - i aI.
  217. */
  218. static
  219. int
  220. hyperg_2F1_conj_luke(const double aR, const double aI, const double c,
  221. const double xin,
  222. gsl_sf_result * result)
  223. {
  224. int stat_iter;
  225. const double RECUR_BIG = 1.0e+50;
  226. const int nmax = 10000;
  227. int n = 3;
  228. const double x = -xin;
  229. const double x3 = x*x*x;
  230. const double atimesb = aR*aR + aI*aI;
  231. const double apb = 2.0*aR;
  232. const double t0 = atimesb/c;
  233. const double t1 = (atimesb + apb + 1.0)/(2.0*c);
  234. const double t2 = (atimesb + 2.0*apb + 4.0)/(2.0*(c+1.0));
  235. double F = 1.0;
  236. double prec;
  237. double Bnm3 = 1.0; /* B0 */
  238. double Bnm2 = 1.0 + t1 * x; /* B1 */
  239. double Bnm1 = 1.0 + t2 * x * (1.0 + t1/3.0 * x); /* B2 */
  240. double Anm3 = 1.0; /* A0 */
  241. double Anm2 = Bnm2 - t0 * x; /* A1 */
  242. double Anm1 = Bnm1 - t0*(1.0 + t2*x)*x + t0 * t1 * (c/(c+1.0)) * x*x; /* A2 */
  243. while(1) {
  244. double nm1 = n - 1;
  245. double nm2 = n - 2;
  246. double npam1_npbm1 = atimesb + nm1*apb + nm1*nm1;
  247. double npam2_npbm2 = atimesb + nm2*apb + nm2*nm2;
  248. double npcm1 = nm1 + c;
  249. double npcm2 = nm2 + c;
  250. double tnm1 = 2*n - 1;
  251. double tnm3 = 2*n - 3;
  252. double tnm5 = 2*n - 5;
  253. double n2 = n*n;
  254. double F1 = (3.0*n2 + (apb-6)*n + 2 - atimesb - 2*apb) / (2*tnm3*npcm1);
  255. double F2 = -(3.0*n2 - (apb+6)*n + 2 - atimesb)*npam1_npbm1/(4*tnm1*tnm3*npcm2*npcm1);
  256. double F3 = (npam2_npbm2*npam1_npbm1*(nm2*nm2 - nm2*apb + atimesb)) / (8*tnm3*tnm3*tnm5*(n+c-3)*npcm2*npcm1);
  257. double E = -npam1_npbm1*(n-c-1) / (2*tnm3*npcm2*npcm1);
  258. double An = (1.0+F1*x)*Anm1 + (E + F2*x)*x*Anm2 + F3*x3*Anm3;
  259. double Bn = (1.0+F1*x)*Bnm1 + (E + F2*x)*x*Bnm2 + F3*x3*Bnm3;
  260. double r = An/Bn;
  261. prec = fabs(F - r)/fabs(F);
  262. F = r;
  263. if(prec < GSL_DBL_EPSILON || n > nmax) break;
  264. if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
  265. An /= RECUR_BIG;
  266. Bn /= RECUR_BIG;
  267. Anm1 /= RECUR_BIG;
  268. Bnm1 /= RECUR_BIG;
  269. Anm2 /= RECUR_BIG;
  270. Bnm2 /= RECUR_BIG;
  271. Anm3 /= RECUR_BIG;
  272. Bnm3 /= RECUR_BIG;
  273. }
  274. else if(fabs(An) < 1.0/RECUR_BIG || fabs(Bn) < 1.0/RECUR_BIG) {
  275. An *= RECUR_BIG;
  276. Bn *= RECUR_BIG;
  277. Anm1 *= RECUR_BIG;
  278. Bnm1 *= RECUR_BIG;
  279. Anm2 *= RECUR_BIG;
  280. Bnm2 *= RECUR_BIG;
  281. Anm3 *= RECUR_BIG;
  282. Bnm3 *= RECUR_BIG;
  283. }
  284. n++;
  285. Bnm3 = Bnm2;
  286. Bnm2 = Bnm1;
  287. Bnm1 = Bn;
  288. Anm3 = Anm2;
  289. Anm2 = Anm1;
  290. Anm1 = An;
  291. }
  292. result->val = F;
  293. result->err = 2.0 * fabs(prec * F);
  294. result->err += 2.0 * GSL_DBL_EPSILON * (n+1.0) * fabs(F);
  295. /* FIXME: see above */
  296. result->err *= 8.0 * (fabs(aR) + fabs(aI) + 1.0);
  297. stat_iter = (n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
  298. return stat_iter;
  299. }
  300. /* Do the reflection described in [Moshier, p. 334].
  301. * Assumes a,b,c != neg integer.
  302. */
  303. static
  304. int
  305. hyperg_2F1_reflect(const double a, const double b, const double c,
  306. const double x, gsl_sf_result * result)
  307. {
  308. const double d = c - a - b;
  309. const int intd = floor(d+0.5);
  310. const int d_integer = ( fabs(d - intd) < locEPS );
  311. if(d_integer) {
  312. const double ln_omx = log(1.0 - x);
  313. const double ad = fabs(d);
  314. int stat_F2 = GSL_SUCCESS;
  315. double sgn_2;
  316. gsl_sf_result F1;
  317. gsl_sf_result F2;
  318. double d1, d2;
  319. gsl_sf_result lng_c;
  320. gsl_sf_result lng_ad2;
  321. gsl_sf_result lng_bd2;
  322. int stat_c;
  323. int stat_ad2;
  324. int stat_bd2;
  325. if(d >= 0.0) {
  326. d1 = d;
  327. d2 = 0.0;
  328. }
  329. else {
  330. d1 = 0.0;
  331. d2 = d;
  332. }
  333. stat_ad2 = gsl_sf_lngamma_e(a+d2, &lng_ad2);
  334. stat_bd2 = gsl_sf_lngamma_e(b+d2, &lng_bd2);
  335. stat_c = gsl_sf_lngamma_e(c, &lng_c);
  336. /* Evaluate F1.
  337. */
  338. if(ad < GSL_DBL_EPSILON) {
  339. /* d = 0 */
  340. F1.val = 0.0;
  341. F1.err = 0.0;
  342. }
  343. else {
  344. gsl_sf_result lng_ad;
  345. gsl_sf_result lng_ad1;
  346. gsl_sf_result lng_bd1;
  347. int stat_ad = gsl_sf_lngamma_e(ad, &lng_ad);
  348. int stat_ad1 = gsl_sf_lngamma_e(a+d1, &lng_ad1);
  349. int stat_bd1 = gsl_sf_lngamma_e(b+d1, &lng_bd1);
  350. if(stat_ad1 == GSL_SUCCESS && stat_bd1 == GSL_SUCCESS && stat_ad == GSL_SUCCESS) {
  351. /* Gamma functions in the denominator are ok.
  352. * Proceed with evaluation.
  353. */
  354. int i;
  355. double sum1 = 1.0;
  356. double term = 1.0;
  357. double ln_pre1_val = lng_ad.val + lng_c.val + d2*ln_omx - lng_ad1.val - lng_bd1.val;
  358. double ln_pre1_err = lng_ad.err + lng_c.err + lng_ad1.err + lng_bd1.err + GSL_DBL_EPSILON * fabs(ln_pre1_val);
  359. int stat_e;
  360. /* Do F1 sum.
  361. */
  362. for(i=1; i<ad; i++) {
  363. int j = i-1;
  364. term *= (a + d2 + j) * (b + d2 + j) / (1.0 + d2 + j) / i * (1.0-x);
  365. sum1 += term;
  366. }
  367. stat_e = gsl_sf_exp_mult_err_e(ln_pre1_val, ln_pre1_err,
  368. sum1, GSL_DBL_EPSILON*fabs(sum1),
  369. &F1);
  370. if(stat_e == GSL_EOVRFLW) {
  371. OVERFLOW_ERROR(result);
  372. }
  373. }
  374. else {
  375. /* Gamma functions in the denominator were not ok.
  376. * So the F1 term is zero.
  377. */
  378. F1.val = 0.0;
  379. F1.err = 0.0;
  380. }
  381. } /* end F1 evaluation */
  382. /* Evaluate F2.
  383. */
  384. if(stat_ad2 == GSL_SUCCESS && stat_bd2 == GSL_SUCCESS) {
  385. /* Gamma functions in the denominator are ok.
  386. * Proceed with evaluation.
  387. */
  388. const int maxiter = 2000;
  389. double psi_1 = -M_EULER;
  390. gsl_sf_result psi_1pd;
  391. gsl_sf_result psi_apd1;
  392. gsl_sf_result psi_bpd1;
  393. int stat_1pd = gsl_sf_psi_e(1.0 + ad, &psi_1pd);
  394. int stat_apd1 = gsl_sf_psi_e(a + d1, &psi_apd1);
  395. int stat_bpd1 = gsl_sf_psi_e(b + d1, &psi_bpd1);
  396. int stat_dall = GSL_ERROR_SELECT_3(stat_1pd, stat_apd1, stat_bpd1);
  397. double psi_val = psi_1 + psi_1pd.val - psi_apd1.val - psi_bpd1.val - ln_omx;
  398. double psi_err = psi_1pd.err + psi_apd1.err + psi_bpd1.err + GSL_DBL_EPSILON*fabs(psi_val);
  399. double fact = 1.0;
  400. double sum2_val = psi_val;
  401. double sum2_err = psi_err;
  402. double ln_pre2_val = lng_c.val + d1*ln_omx - lng_ad2.val - lng_bd2.val;
  403. double ln_pre2_err = lng_c.err + lng_ad2.err + lng_bd2.err + GSL_DBL_EPSILON * fabs(ln_pre2_val);
  404. int stat_e;
  405. int j;
  406. /* Do F2 sum.
  407. */
  408. for(j=1; j<maxiter; j++) {
  409. /* values for psi functions use recurrence; Abramowitz+Stegun 6.3.5 */
  410. double term1 = 1.0/(double)j + 1.0/(ad+j);
  411. double term2 = 1.0/(a+d1+j-1.0) + 1.0/(b+d1+j-1.0);
  412. double delta = 0.0;
  413. psi_val += term1 - term2;
  414. psi_err += GSL_DBL_EPSILON * (fabs(term1) + fabs(term2));
  415. fact *= (a+d1+j-1.0)*(b+d1+j-1.0)/((ad+j)*j) * (1.0-x);
  416. delta = fact * psi_val;
  417. sum2_val += delta;
  418. sum2_err += fabs(fact * psi_err) + GSL_DBL_EPSILON*fabs(delta);
  419. if(fabs(delta) < GSL_DBL_EPSILON * fabs(sum2_val)) break;
  420. }
  421. if(j == maxiter) stat_F2 = GSL_EMAXITER;
  422. if(sum2_val == 0.0) {
  423. F2.val = 0.0;
  424. F2.err = 0.0;
  425. }
  426. else {
  427. stat_e = gsl_sf_exp_mult_err_e(ln_pre2_val, ln_pre2_err,
  428. sum2_val, sum2_err,
  429. &F2);
  430. if(stat_e == GSL_EOVRFLW) {
  431. result->val = 0.0;
  432. result->err = 0.0;
  433. GSL_ERROR ("error", GSL_EOVRFLW);
  434. }
  435. }
  436. stat_F2 = GSL_ERROR_SELECT_2(stat_F2, stat_dall);
  437. }
  438. else {
  439. /* Gamma functions in the denominator not ok.
  440. * So the F2 term is zero.
  441. */
  442. F2.val = 0.0;
  443. F2.err = 0.0;
  444. } /* end F2 evaluation */
  445. sgn_2 = ( GSL_IS_ODD(intd) ? -1.0 : 1.0 );
  446. result->val = F1.val + sgn_2 * F2.val;
  447. result->err = F1.err + F2. err;
  448. result->err += 2.0 * GSL_DBL_EPSILON * (fabs(F1.val) + fabs(F2.val));
  449. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  450. return stat_F2;
  451. }
  452. else {
  453. /* d not an integer */
  454. gsl_sf_result pre1, pre2;
  455. double sgn1, sgn2;
  456. gsl_sf_result F1, F2;
  457. int status_F1, status_F2;
  458. /* These gamma functions appear in the denominator, so we
  459. * catch their harmless domain errors and set the terms to zero.
  460. */
  461. gsl_sf_result ln_g1ca, ln_g1cb, ln_g2a, ln_g2b;
  462. double sgn_g1ca, sgn_g1cb, sgn_g2a, sgn_g2b;
  463. int stat_1ca = gsl_sf_lngamma_sgn_e(c-a, &ln_g1ca, &sgn_g1ca);
  464. int stat_1cb = gsl_sf_lngamma_sgn_e(c-b, &ln_g1cb, &sgn_g1cb);
  465. int stat_2a = gsl_sf_lngamma_sgn_e(a, &ln_g2a, &sgn_g2a);
  466. int stat_2b = gsl_sf_lngamma_sgn_e(b, &ln_g2b, &sgn_g2b);
  467. int ok1 = (stat_1ca == GSL_SUCCESS && stat_1cb == GSL_SUCCESS);
  468. int ok2 = (stat_2a == GSL_SUCCESS && stat_2b == GSL_SUCCESS);
  469. gsl_sf_result ln_gc, ln_gd, ln_gmd;
  470. double sgn_gc, sgn_gd, sgn_gmd;
  471. gsl_sf_lngamma_sgn_e( c, &ln_gc, &sgn_gc);
  472. gsl_sf_lngamma_sgn_e( d, &ln_gd, &sgn_gd);
  473. gsl_sf_lngamma_sgn_e(-d, &ln_gmd, &sgn_gmd);
  474. sgn1 = sgn_gc * sgn_gd * sgn_g1ca * sgn_g1cb;
  475. sgn2 = sgn_gc * sgn_gmd * sgn_g2a * sgn_g2b;
  476. if(ok1 && ok2) {
  477. double ln_pre1_val = ln_gc.val + ln_gd.val - ln_g1ca.val - ln_g1cb.val;
  478. double ln_pre2_val = ln_gc.val + ln_gmd.val - ln_g2a.val - ln_g2b.val + d*log(1.0-x);
  479. double ln_pre1_err = ln_gc.err + ln_gd.err + ln_g1ca.err + ln_g1cb.err;
  480. double ln_pre2_err = ln_gc.err + ln_gmd.err + ln_g2a.err + ln_g2b.err;
  481. if(ln_pre1_val < GSL_LOG_DBL_MAX && ln_pre2_val < GSL_LOG_DBL_MAX) {
  482. gsl_sf_exp_err_e(ln_pre1_val, ln_pre1_err, &pre1);
  483. gsl_sf_exp_err_e(ln_pre2_val, ln_pre2_err, &pre2);
  484. pre1.val *= sgn1;
  485. pre2.val *= sgn2;
  486. }
  487. else {
  488. OVERFLOW_ERROR(result);
  489. }
  490. }
  491. else if(ok1 && !ok2) {
  492. double ln_pre1_val = ln_gc.val + ln_gd.val - ln_g1ca.val - ln_g1cb.val;
  493. double ln_pre1_err = ln_gc.err + ln_gd.err + ln_g1ca.err + ln_g1cb.err;
  494. if(ln_pre1_val < GSL_LOG_DBL_MAX) {
  495. gsl_sf_exp_err_e(ln_pre1_val, ln_pre1_err, &pre1);
  496. pre1.val *= sgn1;
  497. pre2.val = 0.0;
  498. pre2.err = 0.0;
  499. }
  500. else {
  501. OVERFLOW_ERROR(result);
  502. }
  503. }
  504. else if(!ok1 && ok2) {
  505. double ln_pre2_val = ln_gc.val + ln_gmd.val - ln_g2a.val - ln_g2b.val + d*log(1.0-x);
  506. double ln_pre2_err = ln_gc.err + ln_gmd.err + ln_g2a.err + ln_g2b.err;
  507. if(ln_pre2_val < GSL_LOG_DBL_MAX) {
  508. pre1.val = 0.0;
  509. pre1.err = 0.0;
  510. gsl_sf_exp_err_e(ln_pre2_val, ln_pre2_err, &pre2);
  511. pre2.val *= sgn2;
  512. }
  513. else {
  514. OVERFLOW_ERROR(result);
  515. }
  516. }
  517. else {
  518. pre1.val = 0.0;
  519. pre2.val = 0.0;
  520. UNDERFLOW_ERROR(result);
  521. }
  522. status_F1 = hyperg_2F1_series( a, b, 1.0-d, 1.0-x, &F1);
  523. status_F2 = hyperg_2F1_series(c-a, c-b, 1.0+d, 1.0-x, &F2);
  524. result->val = pre1.val*F1.val + pre2.val*F2.val;
  525. result->err = fabs(pre1.val*F1.err) + fabs(pre2.val*F2.err);
  526. result->err += fabs(pre1.err*F1.val) + fabs(pre2.err*F2.val);
  527. result->err += 2.0 * GSL_DBL_EPSILON * (fabs(pre1.val*F1.val) + fabs(pre2.val*F2.val));
  528. result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  529. return GSL_SUCCESS;
  530. }
  531. }
  532. static int pow_omx(const double x, const double p, gsl_sf_result * result)
  533. {
  534. double ln_omx;
  535. double ln_result;
  536. if(fabs(x) < GSL_ROOT5_DBL_EPSILON) {
  537. ln_omx = -x*(1.0 + x*(1.0/2.0 + x*(1.0/3.0 + x/4.0 + x*x/5.0)));
  538. }
  539. else {
  540. ln_omx = log(1.0-x);
  541. }
  542. ln_result = p * ln_omx;
  543. return gsl_sf_exp_err_e(ln_result, GSL_DBL_EPSILON * fabs(ln_result), result);
  544. }
  545. /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
  546. int
  547. gsl_sf_hyperg_2F1_e(double a, double b, const double c,
  548. const double x,
  549. gsl_sf_result * result)
  550. {
  551. const double d = c - a - b;
  552. const double rinta = floor(a + 0.5);
  553. const double rintb = floor(b + 0.5);
  554. const double rintc = floor(c + 0.5);
  555. const int a_neg_integer = ( a < 0.0 && fabs(a - rinta) < locEPS );
  556. const int b_neg_integer = ( b < 0.0 && fabs(b - rintb) < locEPS );
  557. const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
  558. result->val = 0.0;
  559. result->err = 0.0;
  560. if(x < -1.0 || 1.0 <= x) {
  561. DOMAIN_ERROR(result);
  562. }
  563. if(c_neg_integer) {
  564. if(! (a_neg_integer && a > c + 0.1)) DOMAIN_ERROR(result);
  565. if(! (b_neg_integer && b > c + 0.1)) DOMAIN_ERROR(result);
  566. }
  567. if(fabs(c-b) < locEPS || fabs(c-a) < locEPS) {
  568. return pow_omx(x, d, result); /* (1-x)^(c-a-b) */
  569. }
  570. if(a >= 0.0 && b >= 0.0 && c >=0.0 && x >= 0.0 && x < 0.995) {
  571. /* Series has all positive definite
  572. * terms and x is not close to 1.
  573. */
  574. return hyperg_2F1_series(a, b, c, x, result);
  575. }
  576. if(fabs(a) < 10.0 && fabs(b) < 10.0) {
  577. /* a and b are not too large, so we attempt
  578. * variations on the series summation.
  579. */
  580. if(a_neg_integer) {
  581. return hyperg_2F1_series(rinta, b, c, x, result);
  582. }
  583. if(b_neg_integer) {
  584. return hyperg_2F1_series(a, rintb, c, x, result);
  585. }
  586. if(x < -0.25) {
  587. return hyperg_2F1_luke(a, b, c, x, result);
  588. }
  589. else if(x < 0.5) {
  590. return hyperg_2F1_series(a, b, c, x, result);
  591. }
  592. else {
  593. if(fabs(c) > 10.0) {
  594. return hyperg_2F1_series(a, b, c, x, result);
  595. }
  596. else {
  597. return hyperg_2F1_reflect(a, b, c, x, result);
  598. }
  599. }
  600. }
  601. else {
  602. /* Either a or b or both large.
  603. * Introduce some new variables ap,bp so that bp is
  604. * the larger in magnitude.
  605. */
  606. double ap, bp;
  607. if(fabs(a) > fabs(b)) {
  608. bp = a;
  609. ap = b;
  610. }
  611. else {
  612. bp = b;
  613. ap = a;
  614. }
  615. if(x < 0.0) {
  616. /* What the hell, maybe Luke will converge.
  617. */
  618. return hyperg_2F1_luke(a, b, c, x, result);
  619. }
  620. if(GSL_MAX_DBL(fabs(a),1.0)*fabs(bp)*fabs(x) < 2.0*fabs(c)) {
  621. /* If c is large enough or x is small enough,
  622. * we can attempt the series anyway.
  623. */
  624. return hyperg_2F1_series(a, b, c, x, result);
  625. }
  626. if(fabs(bp*bp*x*x) < 0.001*fabs(bp) && fabs(a) < 10.0) {
  627. /* The famous but nearly worthless "large b" asymptotic.
  628. */
  629. int stat = gsl_sf_hyperg_1F1_e(a, c, bp*x, result);
  630. result->err = 0.001 * fabs(result->val);
  631. return stat;
  632. }
  633. /* We give up. */
  634. result->val = 0.0;
  635. result->err = 0.0;
  636. GSL_ERROR ("error", GSL_EUNIMPL);
  637. }
  638. }
  639. int
  640. gsl_sf_hyperg_2F1_conj_e(const double aR, const double aI, const double c,
  641. const double x,
  642. gsl_sf_result * result)
  643. {
  644. const double ax = fabs(x);
  645. const double rintc = floor(c + 0.5);
  646. const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
  647. result->val = 0.0;
  648. result->err = 0.0;
  649. if(ax >= 1.0 || c_neg_integer || c == 0.0) {
  650. DOMAIN_ERROR(result);
  651. }
  652. if( (ax < 0.25 && fabs(aR) < 20.0 && fabs(aI) < 20.0)
  653. || (c > 0.0 && x > 0.0)
  654. ) {
  655. return hyperg_2F1_conj_series(aR, aI, c, x, result);
  656. }
  657. else if(fabs(aR) < 10.0 && fabs(aI) < 10.0) {
  658. if(x < -0.25) {
  659. return hyperg_2F1_conj_luke(aR, aI, c, x, result);
  660. }
  661. else {
  662. return hyperg_2F1_conj_series(aR, aI, c, x, result);
  663. }
  664. }
  665. else {
  666. if(x < 0.0) {
  667. /* What the hell, maybe Luke will converge.
  668. */
  669. return hyperg_2F1_conj_luke(aR, aI, c, x, result);
  670. }
  671. /* Give up. */
  672. result->val = 0.0;
  673. result->err = 0.0;
  674. GSL_ERROR ("error", GSL_EUNIMPL);
  675. }
  676. }
  677. int
  678. gsl_sf_hyperg_2F1_renorm_e(const double a, const double b, const double c,
  679. const double x,
  680. gsl_sf_result * result
  681. )
  682. {
  683. const double rinta = floor(a + 0.5);
  684. const double rintb = floor(b + 0.5);
  685. const double rintc = floor(c + 0.5);
  686. const int a_neg_integer = ( a < 0.0 && fabs(a - rinta) < locEPS );
  687. const int b_neg_integer = ( b < 0.0 && fabs(b - rintb) < locEPS );
  688. const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
  689. if(c_neg_integer) {
  690. if((a_neg_integer && a > c+0.1) || (b_neg_integer && b > c+0.1)) {
  691. /* 2F1 terminates early */
  692. result->val = 0.0;
  693. result->err = 0.0;
  694. return GSL_SUCCESS;
  695. }
  696. else {
  697. /* 2F1 does not terminate early enough, so something survives */
  698. /* [Abramowitz+Stegun, 15.1.2] */
  699. gsl_sf_result g1, g2, g3, g4, g5;
  700. double s1, s2, s3, s4, s5;
  701. int stat = 0;
  702. stat += gsl_sf_lngamma_sgn_e(a-c+1, &g1, &s1);
  703. stat += gsl_sf_lngamma_sgn_e(b-c+1, &g2, &s2);
  704. stat += gsl_sf_lngamma_sgn_e(a, &g3, &s3);
  705. stat += gsl_sf_lngamma_sgn_e(b, &g4, &s4);
  706. stat += gsl_sf_lngamma_sgn_e(-c+2, &g5, &s5);
  707. if(stat != 0) {
  708. DOMAIN_ERROR(result);
  709. }
  710. else {
  711. gsl_sf_result F;
  712. int stat_F = gsl_sf_hyperg_2F1_e(a-c+1, b-c+1, -c+2, x, &F);
  713. double ln_pre_val = g1.val + g2.val - g3.val - g4.val - g5.val;
  714. double ln_pre_err = g1.err + g2.err + g3.err + g4.err + g5.err;
  715. double sg = s1 * s2 * s3 * s4 * s5;
  716. int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
  717. sg * F.val, F.err,
  718. result);
  719. return GSL_ERROR_SELECT_2(stat_e, stat_F);
  720. }
  721. }
  722. }
  723. else {
  724. /* generic c */
  725. gsl_sf_result F;
  726. gsl_sf_result lng;
  727. double sgn;
  728. int stat_g = gsl_sf_lngamma_sgn_e(c, &lng, &sgn);
  729. int stat_F = gsl_sf_hyperg_2F1_e(a, b, c, x, &F);
  730. int stat_e = gsl_sf_exp_mult_err_e(-lng.val, lng.err,
  731. sgn*F.val, F.err,
  732. result);
  733. return GSL_ERROR_SELECT_3(stat_e, stat_F, stat_g);
  734. }
  735. }
  736. int
  737. gsl_sf_hyperg_2F1_conj_renorm_e(const double aR, const double aI, const double c,
  738. const double x,
  739. gsl_sf_result * result
  740. )
  741. {
  742. const double rintc = floor(c + 0.5);
  743. const double rinta = floor(aR + 0.5);
  744. const int a_neg_integer = ( aR < 0.0 && fabs(aR-rinta) < locEPS && aI == 0.0);
  745. const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
  746. if(c_neg_integer) {
  747. if(a_neg_integer && aR > c+0.1) {
  748. /* 2F1 terminates early */
  749. result->val = 0.0;
  750. result->err = 0.0;
  751. return GSL_SUCCESS;
  752. }
  753. else {
  754. /* 2F1 does not terminate early enough, so something survives */
  755. /* [Abramowitz+Stegun, 15.1.2] */
  756. gsl_sf_result g1, g2;
  757. gsl_sf_result g3;
  758. gsl_sf_result a1, a2;
  759. int stat = 0;
  760. stat += gsl_sf_lngamma_complex_e(aR-c+1, aI, &g1, &a1);
  761. stat += gsl_sf_lngamma_complex_e(aR, aI, &g2, &a2);
  762. stat += gsl_sf_lngamma_e(-c+2.0, &g3);
  763. if(stat != 0) {
  764. DOMAIN_ERROR(result);
  765. }
  766. else {
  767. gsl_sf_result F;
  768. int stat_F = gsl_sf_hyperg_2F1_conj_e(aR-c+1, aI, -c+2, x, &F);
  769. double ln_pre_val = 2.0*(g1.val - g2.val) - g3.val;
  770. double ln_pre_err = 2.0 * (g1.err + g2.err) + g3.err;
  771. int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
  772. F.val, F.err,
  773. result);
  774. return GSL_ERROR_SELECT_2(stat_e, stat_F);
  775. }
  776. }
  777. }
  778. else {
  779. /* generic c */
  780. gsl_sf_result F;
  781. gsl_sf_result lng;
  782. double sgn;
  783. int stat_g = gsl_sf_lngamma_sgn_e(c, &lng, &sgn);
  784. int stat_F = gsl_sf_hyperg_2F1_conj_e(aR, aI, c, x, &F);
  785. int stat_e = gsl_sf_exp_mult_err_e(-lng.val, lng.err,
  786. sgn*F.val, F.err,
  787. result);
  788. return GSL_ERROR_SELECT_3(stat_e, stat_F, stat_g);
  789. }
  790. }
  791. /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
  792. #include "gsl_specfunc__eval.h"
  793. double gsl_sf_hyperg_2F1(double a, double b, double c, double x)
  794. {
  795. EVAL_RESULT(gsl_sf_hyperg_2F1_e(a, b, c, x, &result));
  796. }
  797. double gsl_sf_hyperg_2F1_conj(double aR, double aI, double c, double x)
  798. {
  799. EVAL_RESULT(gsl_sf_hyperg_2F1_conj_e(aR, aI, c, x, &result));
  800. }
  801. double gsl_sf_hyperg_2F1_renorm(double a, double b, double c, double x)
  802. {
  803. EVAL_RESULT(gsl_sf_hyperg_2F1_renorm_e(a, b, c, x, &result));
  804. }
  805. double gsl_sf_hyperg_2F1_conj_renorm(double aR, double aI, double c, double x)
  806. {
  807. EVAL_RESULT(gsl_sf_hyperg_2F1_conj_renorm_e(aR, aI, c, x, &result));
  808. }