gsl_randist__landau.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. /* randist/landau.c
  2. *
  3. * Copyright (C) 2001, 2004 David Morrison
  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. /* Adapted from the CERN library routines DENLAN, RANLAN, and DISLAN
  20. * as described in http://consult.cern.ch/shortwrups/g110/top.html.
  21. * Original author: K.S. K\"olbig.
  22. *
  23. * The distribution is given by the complex path integral,
  24. *
  25. * p(x) = (1/(2 pi i)) \int_{c-i\inf}^{c+i\inf} ds exp(s log(s) + x s)
  26. *
  27. * which can be converted into a real integral over [0,+\inf]
  28. *
  29. * p(x) = (1/pi) \int_0^\inf dt \exp(-t log(t) - x t) sin(pi t)
  30. *
  31. */
  32. #include "gsl__config.h"
  33. #include <math.h>
  34. #include "gsl_rng.h"
  35. #include "gsl_randist.h"
  36. double
  37. gsl_ran_landau_pdf(const double x)
  38. {
  39. static double P1[5] =
  40. {
  41. 0.4259894875E0, -0.1249762550E0, 0.3984243700E-1,
  42. -0.6298287635E-2, 0.1511162253E-2
  43. };
  44. static double P2[5] =
  45. {
  46. 0.1788541609E0, 0.1173957403E0, 0.1488850518E-1,
  47. -0.1394989411E-2, 0.1283617211E-3
  48. };
  49. static double P3[5] =
  50. {
  51. 0.1788544503E0, 0.9359161662E-1, 0.6325387654E-2,
  52. 0.6611667319E-4, -0.2031049101E-5
  53. };
  54. static double P4[5] =
  55. {
  56. 0.9874054407E0, 0.1186723273E3, 0.8492794360E3,
  57. -0.7437792444E3, 0.4270262186E3
  58. };
  59. static double P5[5] =
  60. {
  61. 0.1003675074E1, 0.1675702434E3, 0.4789711289E4,
  62. 0.2121786767E5, -0.2232494910E5
  63. };
  64. static double P6[5] =
  65. {
  66. 0.1000827619E1, 0.6649143136E3, 0.6297292665E5,
  67. 0.4755546998E6, -0.5743609109E7
  68. };
  69. static double Q1[5] =
  70. {
  71. 1.0, -0.3388260629E0, 0.9594393323E-1,
  72. -0.1608042283E-1, 0.3778942063E-2
  73. };
  74. static double Q2[5] =
  75. {
  76. 1.0, 0.7428795082E0, 0.3153932961E0,
  77. 0.6694219548E-1, 0.8790609714E-2
  78. };
  79. static double Q3[5] =
  80. {
  81. 1.0, 0.6097809921E0, 0.2560616665E0,
  82. 0.4746722384E-1, 0.6957301675E-2
  83. };
  84. static double Q4[5] =
  85. {
  86. 1.0, 0.1068615961E3, 0.3376496214E3,
  87. 0.2016712389E4, 0.1597063511E4
  88. };
  89. static double Q5[5] =
  90. {
  91. 1.0, 0.1569424537E3, 0.3745310488E4,
  92. 0.9834698876E4, 0.6692428357E5
  93. };
  94. static double Q6[5] =
  95. {
  96. 1.0, 0.6514101098E3, 0.5697473333E5,
  97. 0.1659174725E6, -0.2815759939E7
  98. };
  99. static double A1[3] =
  100. {
  101. 0.4166666667E-1, -0.1996527778E-1, 0.2709538966E-1
  102. };
  103. static double A2[2] =
  104. {
  105. -0.1845568670E1, -0.4284640743E1
  106. };
  107. double U, V, DENLAN;
  108. V = x;
  109. if (V < -5.5)
  110. {
  111. U = exp(V + 1.0);
  112. DENLAN = 0.3989422803 * (exp( -1 / U) / sqrt(U)) *
  113. (1 + (A1[0] + (A1[1] + A1[2] * U) * U) * U);
  114. }
  115. else if (V < -1)
  116. {
  117. U = exp( -V - 1);
  118. DENLAN = exp( -U) * sqrt(U) *
  119. (P1[0] + (P1[1] + (P1[2] + (P1[3] + P1[4] * V) * V) * V) * V) /
  120. (Q1[0] + (Q1[1] + (Q1[2] + (Q1[3] + Q1[4] * V) * V) * V) * V);
  121. }
  122. else if (V < 1)
  123. {
  124. DENLAN = (P2[0] + (P2[1] + (P2[2] + (P2[3] + P2[4] * V) * V) * V) * V) /
  125. (Q2[0] + (Q2[1] + (Q2[2] + (Q2[3] + Q2[4] * V) * V) * V) * V);
  126. }
  127. else if (V < 5)
  128. {
  129. DENLAN = (P3[0] + (P3[1] + (P3[2] + (P3[3] + P3[4] * V) * V) * V) * V) /
  130. (Q3[0] + (Q3[1] + (Q3[2] + (Q3[3] + Q3[4] * V) * V) * V) * V);
  131. }
  132. else if (V < 12)
  133. {
  134. U = 1 / V;
  135. DENLAN = U * U *
  136. (P4[0] + (P4[1] + (P4[2] + (P4[3] + P4[4] * U) * U) * U) * U) /
  137. (Q4[0] + (Q4[1] + (Q4[2] + (Q4[3] + Q4[4] * U) * U) * U) * U);
  138. }
  139. else if (V < 50)
  140. {
  141. U = 1 / V;
  142. DENLAN = U * U *
  143. (P5[0] + (P5[1] + (P5[2] + (P5[3] + P5[4] * U) * U) * U) * U) /
  144. (Q5[0] + (Q5[1] + (Q5[2] + (Q5[3] + Q5[4] * U) * U) * U) * U);
  145. }
  146. else if (V < 300)
  147. {
  148. U = 1 / V;
  149. DENLAN = U * U *
  150. (P6[0] + (P6[1] + (P6[2] + (P6[3] + P6[4] * U) * U) * U) * U) /
  151. (Q6[0] + (Q6[1] + (Q6[2] + (Q6[3] + Q6[4] * U) * U) * U) * U);
  152. }
  153. else
  154. {
  155. U = 1 / (V - V * log(V) / (V + 1));
  156. DENLAN = U * U * (1 + (A2[0] + A2[1] * U) * U);
  157. }
  158. return DENLAN;
  159. }
  160. #if 0 /* Not needed yet */
  161. /* This function is a translation from the original Fortran of the
  162. * CERN library routine DISLAN, the integral from -inf to x of the
  163. * Landau p.d.f.
  164. */
  165. static
  166. double
  167. gsl_ran_landau_dislan(const double x)
  168. {
  169. static double P1[5] =
  170. {
  171. 0.2514091491E0, -0.6250580444E-1,
  172. 0.1458381230E-1, -0.2108817737E-2,
  173. 0.7411247290E-3
  174. };
  175. static double P2[4] =
  176. {
  177. 0.2868328584E0, 0.3564363231E0,
  178. 0.1523518695E0, 0.2251304883E-1
  179. };
  180. static double P3[4] =
  181. {
  182. 0.2868329066E0, 0.3003828436E0,
  183. 0.9950951941E-1, 0.8733827185E-2
  184. };
  185. static double P4[4] =
  186. {
  187. 0.1000351630E1, 0.4503592498E1,
  188. 0.1085883880E2, 0.7536052269E1
  189. };
  190. static double P5[4] =
  191. {
  192. 0.1000006517E1, 0.4909414111E2,
  193. 0.8505544753E2, 0.1532153455E3
  194. };
  195. static double P6[4] =
  196. {
  197. 0.1000000983E1, 0.1329868456E3,
  198. 0.9162149244E3, -0.9605054274E3
  199. };
  200. static double Q1[5] =
  201. {
  202. 1.0, -0.5571175625E-2,
  203. 0.6225310236E-1, -0.3137378427E-2,
  204. 0.1931496439E-2
  205. };
  206. static double Q2[4] =
  207. {
  208. 1.0, 0.6191136137E0,
  209. 0.1720721448E0, 0.2278594771E-1
  210. };
  211. static double Q3[4] =
  212. {
  213. 1.0, 0.4237190502E0,
  214. 0.1095631512E0, 0.8693851567E-2
  215. };
  216. static double Q4[4] =
  217. {
  218. 1.0, 0.5539969678E1,
  219. 0.1933581111E2, 0.2721321508E2
  220. };
  221. static double Q5[4] =
  222. {
  223. 1.0, 0.5009928881E2,
  224. 0.1399819104E3, 0.4200002909E3
  225. };
  226. static double Q6[4] =
  227. {
  228. 1.0, 0.1339887843E3,
  229. 0.1055990413E4, 0.5532224619E3
  230. };
  231. static double A1[3] =
  232. {
  233. -0.4583333333E0, 0.6675347222E0, -0.1641741416E1
  234. };
  235. static double A2[3] =
  236. {
  237. 1.0, -0.4227843351E0, -0.2043403138E1
  238. };
  239. double U, V, DISLAN;
  240. V = x;
  241. if (V < -5.5)
  242. {
  243. U = exp(V + 1);
  244. DISLAN = 0.3989422803 * exp( -1 / U) * sqrt(U) *
  245. (1 + (A1[0] + (A1[1] + A1[2] * U) * U) * U);
  246. }
  247. else if (V < -1)
  248. {
  249. U = exp( -V - 1);
  250. DISLAN = (exp( -U) / sqrt(U)) *
  251. (P1[0] + (P1[1] + (P1[2] + (P1[3] + P1[4] * V) * V) * V) * V) /
  252. (Q1[0] + (Q1[1] + (Q1[2] + (Q1[3] + Q1[4] * V) * V) * V) * V);
  253. }
  254. else if (V < 1)
  255. {
  256. DISLAN = (P2[0] + (P2[1] + (P2[2] + P2[3] * V) * V) * V) /
  257. (Q2[0] + (Q2[1] + (Q2[2] + Q2[3] * V) * V) * V);
  258. }
  259. else if (V < 4)
  260. {
  261. DISLAN = (P3[0] + (P3[1] + (P3[2] + P3[3] * V) * V) * V) /
  262. (Q3[0] + (Q3[1] + (Q3[2] + Q3[3] * V) * V) * V);
  263. }
  264. else if (V < 12)
  265. {
  266. U = 1 / V;
  267. DISLAN = (P4[0] + (P4[1] + (P4[2] + P4[3] * U) * U) * U) /
  268. (Q4[0] + (Q4[1] + (Q4[2] + Q4[3] * U) * U) * U);
  269. }
  270. else if (V < 50)
  271. {
  272. U = 1 / V;
  273. DISLAN = (P5[0] + (P5[1] + (P5[2] + P5[3] * U) * U) * U) /
  274. (Q5[0] + (Q5[1] + (Q5[2] + Q5[3] * U) * U) * U);
  275. }
  276. else if (V < 300)
  277. {
  278. U = 1 / V;
  279. DISLAN = (P6[0] + (P6[1] + (P6[2] + P6[3] * U) * U) * U) /
  280. (Q6[0] + (Q6[1] + (Q6[2] + Q6[3] * U) * U) * U);
  281. }
  282. else
  283. {
  284. U = 1 / (V - V * log(V) / (V + 1));
  285. DISLAN = 1 - (A2[0] + (A2[1] + A2[2] * U) * U) * U;
  286. }
  287. return DISLAN;
  288. }
  289. #endif
  290. double
  291. gsl_ran_landau(const gsl_rng * r)
  292. {
  293. static double F[983] =
  294. {
  295. 0.0000000, /* Add empty element [0] to account for difference
  296. between C and Fortran convention for lower bound. */
  297. 00.000000, 00.000000, 00.000000, 00.000000, 00.000000,
  298. -2.244733, -2.204365, -2.168163, -2.135219, -2.104898,
  299. -2.076740, -2.050397, -2.025605, -2.002150, -1.979866,
  300. -1.958612, -1.938275, -1.918760, -1.899984, -1.881879,
  301. -1.864385, -1.847451, -1.831030, -1.815083, -1.799574,
  302. -1.784473, -1.769751, -1.755383, -1.741346, -1.727620,
  303. -1.714187, -1.701029, -1.688130, -1.675477, -1.663057,
  304. -1.650858, -1.638868, -1.627078, -1.615477, -1.604058,
  305. -1.592811, -1.581729, -1.570806, -1.560034, -1.549407,
  306. -1.538919, -1.528565, -1.518339, -1.508237, -1.498254,
  307. -1.488386, -1.478628, -1.468976, -1.459428, -1.449979,
  308. -1.440626, -1.431365, -1.422195, -1.413111, -1.404112,
  309. -1.395194, -1.386356, -1.377594, -1.368906, -1.360291,
  310. -1.351746, -1.343269, -1.334859, -1.326512, -1.318229,
  311. -1.310006, -1.301843, -1.293737, -1.285688, -1.277693,
  312. -1.269752, -1.261863, -1.254024, -1.246235, -1.238494,
  313. -1.230800, -1.223153, -1.215550, -1.207990, -1.200474,
  314. -1.192999, -1.185566, -1.178172, -1.170817, -1.163500,
  315. -1.156220, -1.148977, -1.141770, -1.134598, -1.127459,
  316. -1.120354, -1.113282, -1.106242, -1.099233, -1.092255,
  317. -1.085306, -1.078388, -1.071498, -1.064636, -1.057802,
  318. -1.050996, -1.044215, -1.037461, -1.030733, -1.024029,
  319. -1.017350, -1.010695, -1.004064, -0.997456, -0.990871,
  320. -0.984308, -0.977767, -0.971247, -0.964749, -0.958271,
  321. -0.951813, -0.945375, -0.938957, -0.932558, -0.926178,
  322. -0.919816, -0.913472, -0.907146, -0.900838, -0.894547,
  323. -0.888272, -0.882014, -0.875773, -0.869547, -0.863337,
  324. -0.857142, -0.850963, -0.844798, -0.838648, -0.832512,
  325. -0.826390, -0.820282, -0.814187, -0.808106, -0.802038,
  326. -0.795982, -0.789940, -0.783909, -0.777891, -0.771884,
  327. -0.765889, -0.759906, -0.753934, -0.747973, -0.742023,
  328. -0.736084, -0.730155, -0.724237, -0.718328, -0.712429,
  329. -0.706541, -0.700661, -0.694791, -0.688931, -0.683079,
  330. -0.677236, -0.671402, -0.665576, -0.659759, -0.653950,
  331. -0.648149, -0.642356, -0.636570, -0.630793, -0.625022,
  332. -0.619259, -0.613503, -0.607754, -0.602012, -0.596276,
  333. -0.590548, -0.584825, -0.579109, -0.573399, -0.567695,
  334. -0.561997, -0.556305, -0.550618, -0.544937, -0.539262,
  335. -0.533592, -0.527926, -0.522266, -0.516611, -0.510961,
  336. -0.505315, -0.499674, -0.494037, -0.488405, -0.482777,
  337. -0.477153, -0.471533, -0.465917, -0.460305, -0.454697,
  338. -0.449092, -0.443491, -0.437893, -0.432299, -0.426707,
  339. -0.421119, -0.415534, -0.409951, -0.404372, -0.398795,
  340. -0.393221, -0.387649, -0.382080, -0.376513, -0.370949,
  341. -0.365387, -0.359826, -0.354268, -0.348712, -0.343157,
  342. -0.337604, -0.332053, -0.326503, -0.320955, -0.315408,
  343. -0.309863, -0.304318, -0.298775, -0.293233, -0.287692,
  344. -0.282152, -0.276613, -0.271074, -0.265536, -0.259999,
  345. -0.254462, -0.248926, -0.243389, -0.237854, -0.232318,
  346. -0.226783, -0.221247, -0.215712, -0.210176, -0.204641,
  347. -0.199105, -0.193568, -0.188032, -0.182495, -0.176957,
  348. -0.171419, -0.165880, -0.160341, -0.154800, -0.149259,
  349. -0.143717, -0.138173, -0.132629, -0.127083, -0.121537,
  350. -0.115989, -0.110439, -0.104889, -0.099336, -0.093782,
  351. -0.088227, -0.082670, -0.077111, -0.071550, -0.065987,
  352. -0.060423, -0.054856, -0.049288, -0.043717, -0.038144,
  353. -0.032569, -0.026991, -0.021411, -0.015828, -0.010243,
  354. -0.004656, 00.000934, 00.006527, 00.012123, 00.017722,
  355. 00.023323, 00.028928, 00.034535, 00.040146, 00.045759,
  356. 00.051376, 00.056997, 00.062620, 00.068247, 00.073877,
  357. 00.079511, 00.085149, 00.090790, 00.096435, 00.102083,
  358. 00.107736, 00.113392, 00.119052, 00.124716, 00.130385,
  359. 00.136057, 00.141734, 00.147414, 00.153100, 00.158789,
  360. 00.164483, 00.170181, 00.175884, 00.181592, 00.187304,
  361. 00.193021, 00.198743, 00.204469, 00.210201, 00.215937,
  362. 00.221678, 00.227425, 00.233177, 00.238933, 00.244696,
  363. 00.250463, 00.256236, 00.262014, 00.267798, 00.273587,
  364. 00.279382, 00.285183, 00.290989, 00.296801, 00.302619,
  365. 00.308443, 00.314273, 00.320109, 00.325951, 00.331799,
  366. 00.337654, 00.343515, 00.349382, 00.355255, 00.361135,
  367. 00.367022, 00.372915, 00.378815, 00.384721, 00.390634,
  368. 00.396554, 00.402481, 00.408415, 00.414356, 00.420304,
  369. 00.426260, 00.432222, 00.438192, 00.444169, 00.450153,
  370. 00.456145, 00.462144, 00.468151, 00.474166, 00.480188,
  371. 00.486218, 00.492256, 00.498302, 00.504356, 00.510418,
  372. 00.516488, 00.522566, 00.528653, 00.534747, 00.540850,
  373. 00.546962, 00.553082, 00.559210, 00.565347, 00.571493,
  374. 00.577648, 00.583811, 00.589983, 00.596164, 00.602355,
  375. 00.608554, 00.614762, 00.620980, 00.627207, 00.633444,
  376. 00.639689, 00.645945, 00.652210, 00.658484, 00.664768,
  377. 00.671062, 00.677366, 00.683680, 00.690004, 00.696338,
  378. 00.702682, 00.709036, 00.715400, 00.721775, 00.728160,
  379. 00.734556, 00.740963, 00.747379, 00.753807, 00.760246,
  380. 00.766695, 00.773155, 00.779627, 00.786109, 00.792603,
  381. 00.799107, 00.805624, 00.812151, 00.818690, 00.825241,
  382. 00.831803, 00.838377, 00.844962, 00.851560, 00.858170,
  383. 00.864791, 00.871425, 00.878071, 00.884729, 00.891399,
  384. 00.898082, 00.904778, 00.911486, 00.918206, 00.924940,
  385. 00.931686, 00.938446, 00.945218, 00.952003, 00.958802,
  386. 00.965614, 00.972439, 00.979278, 00.986130, 00.992996,
  387. 00.999875, 01.006769, 01.013676, 01.020597, 01.027533,
  388. 01.034482, 01.041446, 01.048424, 01.055417, 01.062424,
  389. 01.069446, 01.076482, 01.083534, 01.090600, 01.097681,
  390. 01.104778, 01.111889, 01.119016, 01.126159, 01.133316,
  391. 01.140490, 01.147679, 01.154884, 01.162105, 01.169342,
  392. 01.176595, 01.183864, 01.191149, 01.198451, 01.205770,
  393. 01.213105, 01.220457, 01.227826, 01.235211, 01.242614,
  394. 01.250034, 01.257471, 01.264926, 01.272398, 01.279888,
  395. 01.287395, 01.294921, 01.302464, 01.310026, 01.317605,
  396. 01.325203, 01.332819, 01.340454, 01.348108, 01.355780,
  397. 01.363472, 01.371182, 01.378912, 01.386660, 01.394429,
  398. 01.402216, 01.410024, 01.417851, 01.425698, 01.433565,
  399. 01.441453, 01.449360, 01.457288, 01.465237, 01.473206,
  400. 01.481196, 01.489208, 01.497240, 01.505293, 01.513368,
  401. 01.521465, 01.529583, 01.537723, 01.545885, 01.554068,
  402. 01.562275, 01.570503, 01.578754, 01.587028, 01.595325,
  403. 01.603644, 01.611987, 01.620353, 01.628743, 01.637156,
  404. 01.645593, 01.654053, 01.662538, 01.671047, 01.679581,
  405. 01.688139, 01.696721, 01.705329, 01.713961, 01.722619,
  406. 01.731303, 01.740011, 01.748746, 01.757506, 01.766293,
  407. 01.775106, 01.783945, 01.792810, 01.801703, 01.810623,
  408. 01.819569, 01.828543, 01.837545, 01.846574, 01.855631,
  409. 01.864717, 01.873830, 01.882972, 01.892143, 01.901343,
  410. 01.910572, 01.919830, 01.929117, 01.938434, 01.947781,
  411. 01.957158, 01.966566, 01.976004, 01.985473, 01.994972,
  412. 02.004503, 02.014065, 02.023659, 02.033285, 02.042943,
  413. 02.052633, 02.062355, 02.072110, 02.081899, 02.091720,
  414. 02.101575, 02.111464, 02.121386, 02.131343, 02.141334,
  415. 02.151360, 02.161421, 02.171517, 02.181648, 02.191815,
  416. 02.202018, 02.212257, 02.222533, 02.232845, 02.243195,
  417. 02.253582, 02.264006, 02.274468, 02.284968, 02.295507,
  418. 02.306084, 02.316701, 02.327356, 02.338051, 02.348786,
  419. 02.359562, 02.370377, 02.381234, 02.392131, 02.403070,
  420. 02.414051, 02.425073, 02.436138, 02.447246, 02.458397,
  421. 02.469591, 02.480828, 02.492110, 02.503436, 02.514807,
  422. 02.526222, 02.537684, 02.549190, 02.560743, 02.572343,
  423. 02.583989, 02.595682, 02.607423, 02.619212, 02.631050,
  424. 02.642936, 02.654871, 02.666855, 02.678890, 02.690975,
  425. 02.703110, 02.715297, 02.727535, 02.739825, 02.752168,
  426. 02.764563, 02.777012, 02.789514, 02.802070, 02.814681,
  427. 02.827347, 02.840069, 02.852846, 02.865680, 02.878570,
  428. 02.891518, 02.904524, 02.917588, 02.930712, 02.943894,
  429. 02.957136, 02.970439, 02.983802, 02.997227, 03.010714,
  430. 03.024263, 03.037875, 03.051551, 03.065290, 03.079095,
  431. 03.092965, 03.106900, 03.120902, 03.134971, 03.149107,
  432. 03.163312, 03.177585, 03.191928, 03.206340, 03.220824,
  433. 03.235378, 03.250005, 03.264704, 03.279477, 03.294323,
  434. 03.309244, 03.324240, 03.339312, 03.354461, 03.369687,
  435. 03.384992, 03.400375, 03.415838, 03.431381, 03.447005,
  436. 03.462711, 03.478500, 03.494372, 03.510328, 03.526370,
  437. 03.542497, 03.558711, 03.575012, 03.591402, 03.607881,
  438. 03.624450, 03.641111, 03.657863, 03.674708, 03.691646,
  439. 03.708680, 03.725809, 03.743034, 03.760357, 03.777779,
  440. 03.795300, 03.812921, 03.830645, 03.848470, 03.866400,
  441. 03.884434, 03.902574, 03.920821, 03.939176, 03.957640,
  442. 03.976215, 03.994901, 04.013699, 04.032612, 04.051639,
  443. 04.070783, 04.090045, 04.109425, 04.128925, 04.148547,
  444. 04.168292, 04.188160, 04.208154, 04.228275, 04.248524,
  445. 04.268903, 04.289413, 04.310056, 04.330832, 04.351745,
  446. 04.372794, 04.393982, 04.415310, 04.436781, 04.458395,
  447. 04.480154, 04.502060, 04.524114, 04.546319, 04.568676,
  448. 04.591187, 04.613854, 04.636678, 04.659662, 04.682807,
  449. 04.706116, 04.729590, 04.753231, 04.777041, 04.801024,
  450. 04.825179, 04.849511, 04.874020, 04.898710, 04.923582,
  451. 04.948639, 04.973883, 04.999316, 05.024942, 05.050761,
  452. 05.076778, 05.102993, 05.129411, 05.156034, 05.182864,
  453. 05.209903, 05.237156, 05.264625, 05.292312, 05.320220,
  454. 05.348354, 05.376714, 05.405306, 05.434131, 05.463193,
  455. 05.492496, 05.522042, 05.551836, 05.581880, 05.612178,
  456. 05.642734, 05.673552, 05.704634, 05.735986, 05.767610,
  457. 05.799512, 05.831694, 05.864161, 05.896918, 05.929968,
  458. 05.963316, 05.996967, 06.030925, 06.065194, 06.099780,
  459. 06.134687, 06.169921, 06.205486, 06.241387, 06.277630,
  460. 06.314220, 06.351163, 06.388465, 06.426130, 06.464166,
  461. 06.502578, 06.541371, 06.580553, 06.620130, 06.660109,
  462. 06.700495, 06.741297, 06.782520, 06.824173, 06.866262,
  463. 06.908795, 06.951780, 06.995225, 07.039137, 07.083525,
  464. 07.128398, 07.173764, 07.219632, 07.266011, 07.312910,
  465. 07.360339, 07.408308, 07.456827, 07.505905, 07.555554,
  466. 07.605785, 07.656608, 07.708035, 07.760077, 07.812747,
  467. 07.866057, 07.920019, 07.974647, 08.029953, 08.085952,
  468. 08.142657, 08.200083, 08.258245, 08.317158, 08.376837,
  469. 08.437300, 08.498562, 08.560641, 08.623554, 08.687319,
  470. 08.751955, 08.817481, 08.883916, 08.951282, 09.019600,
  471. 09.088889, 09.159174, 09.230477, 09.302822, 09.376233,
  472. 09.450735, 09.526355, 09.603118, 09.681054, 09.760191,
  473. 09.840558, 09.922186, 10.005107, 10.089353, 10.174959,
  474. 10.261958, 10.350389, 10.440287, 10.531693, 10.624646,
  475. 10.719188, 10.815362, 10.913214, 11.012789, 11.114137,
  476. 11.217307, 11.322352, 11.429325, 11.538283, 11.649285,
  477. 11.762390, 11.877664, 11.995170, 12.114979, 12.237161,
  478. 12.361791, 12.488946, 12.618708, 12.751161, 12.886394,
  479. 13.024498, 13.165570, 13.309711, 13.457026, 13.607625,
  480. 13.761625, 13.919145, 14.080314, 14.245263, 14.414134,
  481. 14.587072, 14.764233, 14.945778, 15.131877, 15.322712,
  482. 15.518470, 15.719353, 15.925570, 16.137345, 16.354912,
  483. 16.578520, 16.808433, 17.044929, 17.288305, 17.538873,
  484. 17.796967, 18.062943, 18.337176, 18.620068, 18.912049,
  485. 19.213574, 19.525133, 19.847249, 20.180480, 20.525429,
  486. 20.882738, 21.253102, 21.637266, 22.036036, 22.450278,
  487. 22.880933, 23.329017, 23.795634, 24.281981, 24.789364,
  488. 25.319207, 25.873062, 26.452634, 27.059789, 27.696581,
  489. 28.365274, 29.068370, 29.808638, 30.589157, 31.413354,
  490. 32.285060, 33.208568, 34.188705, 35.230920, 36.341388,
  491. 37.527131, 38.796172, 40.157721, 41.622399, 43.202525,
  492. 44.912465, 46.769077, 48.792279, 51.005773, 53.437996,
  493. 56.123356, 59.103894
  494. };
  495. double X, U, V, RANLAN;
  496. int I;
  497. X = gsl_rng_uniform_pos(r);
  498. U = 1000.0 * X;
  499. I = U;
  500. U = U - I;
  501. if (I >= 70 && I <= 800)
  502. {
  503. RANLAN = F[I] + U * (F[I + 1] - F[I]);
  504. }
  505. else if (I >= 7 && I <= 980)
  506. {
  507. RANLAN = F[I]
  508. + U * (F[I + 1] - F[I]
  509. - 0.25 * (1 - U) * (F[I + 2] - F[I + 1] - F[I] + F[I - 1]));
  510. }
  511. else if (I < 7)
  512. {
  513. V = log(X);
  514. U = 1 / V;
  515. RANLAN = ((0.99858950 + (3.45213058E1 + 1.70854528E1 * U) * U) /
  516. (1 + (3.41760202E1 + 4.01244582 * U) * U)) *
  517. ( -log( -0.91893853 - V) - 1);
  518. }
  519. else
  520. {
  521. U = 1 - X;
  522. V = U * U;
  523. if (X <= 0.999)
  524. {
  525. RANLAN = (1.00060006 + 2.63991156E2 * U + 4.37320068E3 * V) /
  526. ((1 + 2.57368075E2 * U + 3.41448018E3 * V) * U);
  527. }
  528. else
  529. {
  530. RANLAN = (1.00001538 + 6.07514119E3 * U + 7.34266409E5 * V) /
  531. ((1 + 6.06511919E3 * U + 6.94021044E5 * V) * U);
  532. }
  533. }
  534. return RANLAN;
  535. }