alglib 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. data/History.txt +7 -0
  2. data/Manifest.txt +253 -0
  3. data/README.txt +33 -0
  4. data/Rakefile +27 -0
  5. data/ext/Rakefile +24 -0
  6. data/ext/alglib.i +24 -0
  7. data/ext/alglib/Makefile +157 -0
  8. data/ext/alglib/airyf.cpp +372 -0
  9. data/ext/alglib/airyf.h +81 -0
  10. data/ext/alglib/alglib.cpp +8558 -0
  11. data/ext/alglib/alglib_util.cpp +19 -0
  12. data/ext/alglib/alglib_util.h +14 -0
  13. data/ext/alglib/ap.cpp +877 -0
  14. data/ext/alglib/ap.english.html +364 -0
  15. data/ext/alglib/ap.h +666 -0
  16. data/ext/alglib/ap.russian.html +442 -0
  17. data/ext/alglib/apvt.h +754 -0
  18. data/ext/alglib/bdss.cpp +1500 -0
  19. data/ext/alglib/bdss.h +251 -0
  20. data/ext/alglib/bdsvd.cpp +1339 -0
  21. data/ext/alglib/bdsvd.h +164 -0
  22. data/ext/alglib/bessel.cpp +1226 -0
  23. data/ext/alglib/bessel.h +331 -0
  24. data/ext/alglib/betaf.cpp +105 -0
  25. data/ext/alglib/betaf.h +74 -0
  26. data/ext/alglib/bidiagonal.cpp +1328 -0
  27. data/ext/alglib/bidiagonal.h +350 -0
  28. data/ext/alglib/binomialdistr.cpp +247 -0
  29. data/ext/alglib/binomialdistr.h +153 -0
  30. data/ext/alglib/blas.cpp +576 -0
  31. data/ext/alglib/blas.h +132 -0
  32. data/ext/alglib/cblas.cpp +226 -0
  33. data/ext/alglib/cblas.h +57 -0
  34. data/ext/alglib/cdet.cpp +138 -0
  35. data/ext/alglib/cdet.h +92 -0
  36. data/ext/alglib/chebyshev.cpp +216 -0
  37. data/ext/alglib/chebyshev.h +76 -0
  38. data/ext/alglib/chisquaredistr.cpp +157 -0
  39. data/ext/alglib/chisquaredistr.h +144 -0
  40. data/ext/alglib/cholesky.cpp +285 -0
  41. data/ext/alglib/cholesky.h +86 -0
  42. data/ext/alglib/cinverse.cpp +298 -0
  43. data/ext/alglib/cinverse.h +111 -0
  44. data/ext/alglib/clu.cpp +337 -0
  45. data/ext/alglib/clu.h +120 -0
  46. data/ext/alglib/correlation.cpp +280 -0
  47. data/ext/alglib/correlation.h +77 -0
  48. data/ext/alglib/correlationtests.cpp +726 -0
  49. data/ext/alglib/correlationtests.h +134 -0
  50. data/ext/alglib/crcond.cpp +826 -0
  51. data/ext/alglib/crcond.h +148 -0
  52. data/ext/alglib/creflections.cpp +310 -0
  53. data/ext/alglib/creflections.h +165 -0
  54. data/ext/alglib/csolve.cpp +312 -0
  55. data/ext/alglib/csolve.h +99 -0
  56. data/ext/alglib/ctrinverse.cpp +387 -0
  57. data/ext/alglib/ctrinverse.h +98 -0
  58. data/ext/alglib/ctrlinsolve.cpp +297 -0
  59. data/ext/alglib/ctrlinsolve.h +81 -0
  60. data/ext/alglib/dawson.cpp +234 -0
  61. data/ext/alglib/dawson.h +74 -0
  62. data/ext/alglib/descriptivestatistics.cpp +436 -0
  63. data/ext/alglib/descriptivestatistics.h +112 -0
  64. data/ext/alglib/det.cpp +140 -0
  65. data/ext/alglib/det.h +94 -0
  66. data/ext/alglib/dforest.cpp +1819 -0
  67. data/ext/alglib/dforest.h +316 -0
  68. data/ext/alglib/elliptic.cpp +497 -0
  69. data/ext/alglib/elliptic.h +217 -0
  70. data/ext/alglib/estnorm.cpp +429 -0
  71. data/ext/alglib/estnorm.h +107 -0
  72. data/ext/alglib/expintegrals.cpp +422 -0
  73. data/ext/alglib/expintegrals.h +108 -0
  74. data/ext/alglib/faq.english.html +258 -0
  75. data/ext/alglib/faq.russian.html +272 -0
  76. data/ext/alglib/fdistr.cpp +202 -0
  77. data/ext/alglib/fdistr.h +163 -0
  78. data/ext/alglib/fresnel.cpp +211 -0
  79. data/ext/alglib/fresnel.h +91 -0
  80. data/ext/alglib/gammaf.cpp +338 -0
  81. data/ext/alglib/gammaf.h +104 -0
  82. data/ext/alglib/gqgengauss.cpp +235 -0
  83. data/ext/alglib/gqgengauss.h +92 -0
  84. data/ext/alglib/gqgenhermite.cpp +268 -0
  85. data/ext/alglib/gqgenhermite.h +63 -0
  86. data/ext/alglib/gqgenjacobi.cpp +297 -0
  87. data/ext/alglib/gqgenjacobi.h +72 -0
  88. data/ext/alglib/gqgenlaguerre.cpp +265 -0
  89. data/ext/alglib/gqgenlaguerre.h +69 -0
  90. data/ext/alglib/gqgenlegendre.cpp +300 -0
  91. data/ext/alglib/gqgenlegendre.h +62 -0
  92. data/ext/alglib/gqgenlobatto.cpp +305 -0
  93. data/ext/alglib/gqgenlobatto.h +97 -0
  94. data/ext/alglib/gqgenradau.cpp +232 -0
  95. data/ext/alglib/gqgenradau.h +95 -0
  96. data/ext/alglib/hbisinv.cpp +480 -0
  97. data/ext/alglib/hbisinv.h +183 -0
  98. data/ext/alglib/hblas.cpp +228 -0
  99. data/ext/alglib/hblas.h +64 -0
  100. data/ext/alglib/hcholesky.cpp +339 -0
  101. data/ext/alglib/hcholesky.h +91 -0
  102. data/ext/alglib/hermite.cpp +114 -0
  103. data/ext/alglib/hermite.h +49 -0
  104. data/ext/alglib/hessenberg.cpp +370 -0
  105. data/ext/alglib/hessenberg.h +152 -0
  106. data/ext/alglib/hevd.cpp +247 -0
  107. data/ext/alglib/hevd.h +107 -0
  108. data/ext/alglib/hsschur.cpp +1316 -0
  109. data/ext/alglib/hsschur.h +108 -0
  110. data/ext/alglib/htridiagonal.cpp +734 -0
  111. data/ext/alglib/htridiagonal.h +180 -0
  112. data/ext/alglib/ialglib.cpp +6 -0
  113. data/ext/alglib/ialglib.h +9 -0
  114. data/ext/alglib/ibetaf.cpp +960 -0
  115. data/ext/alglib/ibetaf.h +125 -0
  116. data/ext/alglib/igammaf.cpp +430 -0
  117. data/ext/alglib/igammaf.h +157 -0
  118. data/ext/alglib/inv.cpp +274 -0
  119. data/ext/alglib/inv.h +115 -0
  120. data/ext/alglib/inverseupdate.cpp +480 -0
  121. data/ext/alglib/inverseupdate.h +185 -0
  122. data/ext/alglib/jacobianelliptic.cpp +164 -0
  123. data/ext/alglib/jacobianelliptic.h +94 -0
  124. data/ext/alglib/jarquebera.cpp +2271 -0
  125. data/ext/alglib/jarquebera.h +80 -0
  126. data/ext/alglib/kmeans.cpp +356 -0
  127. data/ext/alglib/kmeans.h +76 -0
  128. data/ext/alglib/laguerre.cpp +94 -0
  129. data/ext/alglib/laguerre.h +48 -0
  130. data/ext/alglib/lbfgs.cpp +1167 -0
  131. data/ext/alglib/lbfgs.h +218 -0
  132. data/ext/alglib/lda.cpp +434 -0
  133. data/ext/alglib/lda.h +133 -0
  134. data/ext/alglib/ldlt.cpp +1130 -0
  135. data/ext/alglib/ldlt.h +124 -0
  136. data/ext/alglib/leastsquares.cpp +1252 -0
  137. data/ext/alglib/leastsquares.h +290 -0
  138. data/ext/alglib/legendre.cpp +107 -0
  139. data/ext/alglib/legendre.h +49 -0
  140. data/ext/alglib/linreg.cpp +1185 -0
  141. data/ext/alglib/linreg.h +380 -0
  142. data/ext/alglib/logit.cpp +1523 -0
  143. data/ext/alglib/logit.h +333 -0
  144. data/ext/alglib/lq.cpp +399 -0
  145. data/ext/alglib/lq.h +160 -0
  146. data/ext/alglib/lu.cpp +462 -0
  147. data/ext/alglib/lu.h +119 -0
  148. data/ext/alglib/mannwhitneyu.cpp +4490 -0
  149. data/ext/alglib/mannwhitneyu.h +115 -0
  150. data/ext/alglib/minlm.cpp +918 -0
  151. data/ext/alglib/minlm.h +312 -0
  152. data/ext/alglib/mlpbase.cpp +3375 -0
  153. data/ext/alglib/mlpbase.h +589 -0
  154. data/ext/alglib/mlpe.cpp +1369 -0
  155. data/ext/alglib/mlpe.h +552 -0
  156. data/ext/alglib/mlptrain.cpp +1056 -0
  157. data/ext/alglib/mlptrain.h +283 -0
  158. data/ext/alglib/nearunityunit.cpp +91 -0
  159. data/ext/alglib/nearunityunit.h +17 -0
  160. data/ext/alglib/normaldistr.cpp +377 -0
  161. data/ext/alglib/normaldistr.h +175 -0
  162. data/ext/alglib/nsevd.cpp +1869 -0
  163. data/ext/alglib/nsevd.h +140 -0
  164. data/ext/alglib/pca.cpp +168 -0
  165. data/ext/alglib/pca.h +87 -0
  166. data/ext/alglib/poissondistr.cpp +143 -0
  167. data/ext/alglib/poissondistr.h +130 -0
  168. data/ext/alglib/polinterpolation.cpp +685 -0
  169. data/ext/alglib/polinterpolation.h +206 -0
  170. data/ext/alglib/psif.cpp +173 -0
  171. data/ext/alglib/psif.h +88 -0
  172. data/ext/alglib/qr.cpp +414 -0
  173. data/ext/alglib/qr.h +168 -0
  174. data/ext/alglib/ratinterpolation.cpp +134 -0
  175. data/ext/alglib/ratinterpolation.h +72 -0
  176. data/ext/alglib/rcond.cpp +705 -0
  177. data/ext/alglib/rcond.h +140 -0
  178. data/ext/alglib/reflections.cpp +504 -0
  179. data/ext/alglib/reflections.h +165 -0
  180. data/ext/alglib/rotations.cpp +473 -0
  181. data/ext/alglib/rotations.h +128 -0
  182. data/ext/alglib/rsolve.cpp +221 -0
  183. data/ext/alglib/rsolve.h +99 -0
  184. data/ext/alglib/sbisinv.cpp +217 -0
  185. data/ext/alglib/sbisinv.h +171 -0
  186. data/ext/alglib/sblas.cpp +185 -0
  187. data/ext/alglib/sblas.h +64 -0
  188. data/ext/alglib/schur.cpp +156 -0
  189. data/ext/alglib/schur.h +102 -0
  190. data/ext/alglib/sdet.cpp +193 -0
  191. data/ext/alglib/sdet.h +101 -0
  192. data/ext/alglib/sevd.cpp +116 -0
  193. data/ext/alglib/sevd.h +99 -0
  194. data/ext/alglib/sinverse.cpp +672 -0
  195. data/ext/alglib/sinverse.h +138 -0
  196. data/ext/alglib/spddet.cpp +138 -0
  197. data/ext/alglib/spddet.h +96 -0
  198. data/ext/alglib/spdgevd.cpp +842 -0
  199. data/ext/alglib/spdgevd.h +200 -0
  200. data/ext/alglib/spdinverse.cpp +509 -0
  201. data/ext/alglib/spdinverse.h +122 -0
  202. data/ext/alglib/spdrcond.cpp +421 -0
  203. data/ext/alglib/spdrcond.h +118 -0
  204. data/ext/alglib/spdsolve.cpp +275 -0
  205. data/ext/alglib/spdsolve.h +105 -0
  206. data/ext/alglib/spline2d.cpp +1192 -0
  207. data/ext/alglib/spline2d.h +301 -0
  208. data/ext/alglib/spline3.cpp +1264 -0
  209. data/ext/alglib/spline3.h +290 -0
  210. data/ext/alglib/srcond.cpp +595 -0
  211. data/ext/alglib/srcond.h +127 -0
  212. data/ext/alglib/ssolve.cpp +895 -0
  213. data/ext/alglib/ssolve.h +139 -0
  214. data/ext/alglib/stdafx.h +0 -0
  215. data/ext/alglib/stest.cpp +131 -0
  216. data/ext/alglib/stest.h +94 -0
  217. data/ext/alglib/studenttdistr.cpp +222 -0
  218. data/ext/alglib/studenttdistr.h +115 -0
  219. data/ext/alglib/studentttests.cpp +377 -0
  220. data/ext/alglib/studentttests.h +178 -0
  221. data/ext/alglib/svd.cpp +620 -0
  222. data/ext/alglib/svd.h +126 -0
  223. data/ext/alglib/tdbisinv.cpp +2608 -0
  224. data/ext/alglib/tdbisinv.h +228 -0
  225. data/ext/alglib/tdevd.cpp +1229 -0
  226. data/ext/alglib/tdevd.h +115 -0
  227. data/ext/alglib/tridiagonal.cpp +594 -0
  228. data/ext/alglib/tridiagonal.h +171 -0
  229. data/ext/alglib/trigintegrals.cpp +490 -0
  230. data/ext/alglib/trigintegrals.h +131 -0
  231. data/ext/alglib/trinverse.cpp +345 -0
  232. data/ext/alglib/trinverse.h +98 -0
  233. data/ext/alglib/trlinsolve.cpp +926 -0
  234. data/ext/alglib/trlinsolve.h +73 -0
  235. data/ext/alglib/tsort.cpp +405 -0
  236. data/ext/alglib/tsort.h +54 -0
  237. data/ext/alglib/variancetests.cpp +245 -0
  238. data/ext/alglib/variancetests.h +134 -0
  239. data/ext/alglib/wsr.cpp +6285 -0
  240. data/ext/alglib/wsr.h +96 -0
  241. data/ext/ap.i +97 -0
  242. data/ext/correlation.i +24 -0
  243. data/ext/extconf.rb +6 -0
  244. data/ext/logit.i +89 -0
  245. data/lib/alglib.rb +71 -0
  246. data/lib/alglib/correlation.rb +26 -0
  247. data/lib/alglib/linearregression.rb +63 -0
  248. data/lib/alglib/logit.rb +42 -0
  249. data/test/test_alglib.rb +52 -0
  250. data/test/test_correlation.rb +44 -0
  251. data/test/test_correlationtest.rb +45 -0
  252. data/test/test_linreg.rb +35 -0
  253. data/test/test_logit.rb +43 -0
  254. data/test/test_pca.rb +27 -0
  255. metadata +326 -0
@@ -0,0 +1,125 @@
1
+ /*************************************************************************
2
+ Cephes Math Library Release 2.8: June, 2000
3
+ Copyright by Stephen L. Moshier
4
+
5
+ Contributors:
6
+ * Sergey Bochkanov (ALGLIB project). Translation from C to
7
+ pseudocode.
8
+
9
+ See subroutines comments for additional copyrights.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are
13
+ met:
14
+
15
+ - Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ - Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer listed
20
+ in this license in the documentation and/or other materials
21
+ provided with the distribution.
22
+
23
+ - Neither the name of the copyright holders nor the names of its
24
+ contributors may be used to endorse or promote products derived from
25
+ this software without specific prior written permission.
26
+
27
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
+ *************************************************************************/
39
+
40
+ #ifndef _ibetaf_h
41
+ #define _ibetaf_h
42
+
43
+ #include "ap.h"
44
+ #include "ialglib.h"
45
+
46
+ #include "gammaf.h"
47
+ #include "normaldistr.h"
48
+
49
+
50
+ /*************************************************************************
51
+ Incomplete beta integral
52
+
53
+ Returns incomplete beta integral of the arguments, evaluated
54
+ from zero to x. The function is defined as
55
+
56
+ x
57
+ - -
58
+ | (a+b) | | a-1 b-1
59
+ ----------- | t (1-t) dt.
60
+ - - | |
61
+ | (a) | (b) -
62
+ 0
63
+
64
+ The domain of definition is 0 <= x <= 1. In this
65
+ implementation a and b are restricted to positive values.
66
+ The integral from x to 1 may be obtained by the symmetry
67
+ relation
68
+
69
+ 1 - incbet( a, b, x ) = incbet( b, a, 1-x ).
70
+
71
+ The integral is evaluated by a continued fraction expansion
72
+ or, when b*x is small, by a power series.
73
+
74
+ ACCURACY:
75
+
76
+ Tested at uniformly distributed random points (a,b,x) with a and b
77
+ in "domain" and x between 0 and 1.
78
+ Relative error
79
+ arithmetic domain # trials peak rms
80
+ IEEE 0,5 10000 6.9e-15 4.5e-16
81
+ IEEE 0,85 250000 2.2e-13 1.7e-14
82
+ IEEE 0,1000 30000 5.3e-12 6.3e-13
83
+ IEEE 0,10000 250000 9.3e-11 7.1e-12
84
+ IEEE 0,100000 10000 8.7e-10 4.8e-11
85
+ Outputs smaller than the IEEE gradual underflow threshold
86
+ were excluded from these statistics.
87
+
88
+ Cephes Math Library, Release 2.8: June, 2000
89
+ Copyright 1984, 1995, 2000 by Stephen L. Moshier
90
+ *************************************************************************/
91
+ double incompletebeta(double a, double b, double x);
92
+
93
+
94
+ /*************************************************************************
95
+ Inverse of imcomplete beta integral
96
+
97
+ Given y, the function finds x such that
98
+
99
+ incbet( a, b, x ) = y .
100
+
101
+ The routine performs interval halving or Newton iterations to find the
102
+ root of incbet(a,b,x) - y = 0.
103
+
104
+
105
+ ACCURACY:
106
+
107
+ Relative error:
108
+ x a,b
109
+ arithmetic domain domain # trials peak rms
110
+ IEEE 0,1 .5,10000 50000 5.8e-12 1.3e-13
111
+ IEEE 0,1 .25,100 100000 1.8e-13 3.9e-15
112
+ IEEE 0,1 0,5 50000 1.1e-12 5.5e-15
113
+ With a and b constrained to half-integer or integer values:
114
+ IEEE 0,1 .5,10000 50000 5.8e-12 1.1e-13
115
+ IEEE 0,1 .5,100 100000 1.7e-14 7.9e-16
116
+ With a = .5, b constrained to half-integer or integer values:
117
+ IEEE 0,1 .5,10000 10000 8.3e-11 1.0e-11
118
+
119
+ Cephes Math Library Release 2.8: June, 2000
120
+ Copyright 1984, 1996, 2000 by Stephen L. Moshier
121
+ *************************************************************************/
122
+ double invincompletebeta(double a, double b, double y);
123
+
124
+
125
+ #endif
@@ -0,0 +1,430 @@
1
+ /*************************************************************************
2
+ Cephes Math Library Release 2.8: June, 2000
3
+ Copyright by Stephen L. Moshier
4
+
5
+ Contributors:
6
+ * Sergey Bochkanov (ALGLIB project). Translation from C to
7
+ pseudocode.
8
+
9
+ See subroutines comments for additional copyrights.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are
13
+ met:
14
+
15
+ - Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ - Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer listed
20
+ in this license in the documentation and/or other materials
21
+ provided with the distribution.
22
+
23
+ - Neither the name of the copyright holders nor the names of its
24
+ contributors may be used to endorse or promote products derived from
25
+ this software without specific prior written permission.
26
+
27
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
+ *************************************************************************/
39
+
40
+ #include <stdafx.h>
41
+ #include "igammaf.h"
42
+
43
+ /*************************************************************************
44
+ Incomplete gamma integral
45
+
46
+ The function is defined by
47
+
48
+ x
49
+ -
50
+ 1 | | -t a-1
51
+ igam(a,x) = ----- | e t dt.
52
+ - | |
53
+ | (a) -
54
+ 0
55
+
56
+
57
+ In this implementation both arguments must be positive.
58
+ The integral is evaluated by either a power series or
59
+ continued fraction expansion, depending on the relative
60
+ values of a and x.
61
+
62
+ ACCURACY:
63
+
64
+ Relative error:
65
+ arithmetic domain # trials peak rms
66
+ IEEE 0,30 200000 3.6e-14 2.9e-15
67
+ IEEE 0,100 300000 9.9e-14 1.5e-14
68
+
69
+ Cephes Math Library Release 2.8: June, 2000
70
+ Copyright 1985, 1987, 2000 by Stephen L. Moshier
71
+ *************************************************************************/
72
+ double incompletegamma(double a, double x)
73
+ {
74
+ double result;
75
+ double igammaepsilon;
76
+ double ans;
77
+ double ax;
78
+ double c;
79
+ double r;
80
+ double tmp;
81
+
82
+ igammaepsilon = 0.000000000000001;
83
+ if( x<=0||a<=0 )
84
+ {
85
+ result = 0;
86
+ return result;
87
+ }
88
+ if( x>1&&x>a )
89
+ {
90
+ result = 1-incompletegammac(a, x);
91
+ return result;
92
+ }
93
+ ax = a*log(x)-x-lngamma(a, tmp);
94
+ if( ax<-709.78271289338399 )
95
+ {
96
+ result = 0;
97
+ return result;
98
+ }
99
+ ax = exp(ax);
100
+ r = a;
101
+ c = 1;
102
+ ans = 1;
103
+ do
104
+ {
105
+ r = r+1;
106
+ c = c*x/r;
107
+ ans = ans+c;
108
+ }
109
+ while(c/ans>igammaepsilon);
110
+ result = ans*ax/a;
111
+ return result;
112
+ }
113
+
114
+
115
+ /*************************************************************************
116
+ Complemented incomplete gamma integral
117
+
118
+ The function is defined by
119
+
120
+
121
+ igamc(a,x) = 1 - igam(a,x)
122
+
123
+ inf.
124
+ -
125
+ 1 | | -t a-1
126
+ = ----- | e t dt.
127
+ - | |
128
+ | (a) -
129
+ x
130
+
131
+
132
+ In this implementation both arguments must be positive.
133
+ The integral is evaluated by either a power series or
134
+ continued fraction expansion, depending on the relative
135
+ values of a and x.
136
+
137
+ ACCURACY:
138
+
139
+ Tested at random a, x.
140
+ a x Relative error:
141
+ arithmetic domain domain # trials peak rms
142
+ IEEE 0.5,100 0,100 200000 1.9e-14 1.7e-15
143
+ IEEE 0.01,0.5 0,100 200000 1.4e-13 1.6e-15
144
+
145
+ Cephes Math Library Release 2.8: June, 2000
146
+ Copyright 1985, 1987, 2000 by Stephen L. Moshier
147
+ *************************************************************************/
148
+ double incompletegammac(double a, double x)
149
+ {
150
+ double result;
151
+ double igammaepsilon;
152
+ double igammabignumber;
153
+ double igammabignumberinv;
154
+ double ans;
155
+ double ax;
156
+ double c;
157
+ double yc;
158
+ double r;
159
+ double t;
160
+ double y;
161
+ double z;
162
+ double pk;
163
+ double pkm1;
164
+ double pkm2;
165
+ double qk;
166
+ double qkm1;
167
+ double qkm2;
168
+ double tmp;
169
+
170
+ igammaepsilon = 0.000000000000001;
171
+ igammabignumber = 4503599627370496.0;
172
+ igammabignumberinv = 2.22044604925031308085*0.0000000000000001;
173
+ if( x<=0||a<=0 )
174
+ {
175
+ result = 1;
176
+ return result;
177
+ }
178
+ if( x<1||x<a )
179
+ {
180
+ result = 1-incompletegamma(a, x);
181
+ return result;
182
+ }
183
+ ax = a*log(x)-x-lngamma(a, tmp);
184
+ if( ax<-709.78271289338399 )
185
+ {
186
+ result = 0;
187
+ return result;
188
+ }
189
+ ax = exp(ax);
190
+ y = 1-a;
191
+ z = x+y+1;
192
+ c = 0;
193
+ pkm2 = 1;
194
+ qkm2 = x;
195
+ pkm1 = x+1;
196
+ qkm1 = z*x;
197
+ ans = pkm1/qkm1;
198
+ do
199
+ {
200
+ c = c+1;
201
+ y = y+1;
202
+ z = z+2;
203
+ yc = y*c;
204
+ pk = pkm1*z-pkm2*yc;
205
+ qk = qkm1*z-qkm2*yc;
206
+ if( qk!=0 )
207
+ {
208
+ r = pk/qk;
209
+ t = fabs((ans-r)/r);
210
+ ans = r;
211
+ }
212
+ else
213
+ {
214
+ t = 1;
215
+ }
216
+ pkm2 = pkm1;
217
+ pkm1 = pk;
218
+ qkm2 = qkm1;
219
+ qkm1 = qk;
220
+ if( fabs(pk)>igammabignumber )
221
+ {
222
+ pkm2 = pkm2*igammabignumberinv;
223
+ pkm1 = pkm1*igammabignumberinv;
224
+ qkm2 = qkm2*igammabignumberinv;
225
+ qkm1 = qkm1*igammabignumberinv;
226
+ }
227
+ }
228
+ while(t>igammaepsilon);
229
+ result = ans*ax;
230
+ return result;
231
+ }
232
+
233
+
234
+ /*************************************************************************
235
+ Inverse of complemented imcomplete gamma integral
236
+
237
+ Given p, the function finds x such that
238
+
239
+ igamc( a, x ) = p.
240
+
241
+ Starting with the approximate value
242
+
243
+ 3
244
+ x = a t
245
+
246
+ where
247
+
248
+ t = 1 - d - ndtri(p) sqrt(d)
249
+
250
+ and
251
+
252
+ d = 1/9a,
253
+
254
+ the routine performs up to 10 Newton iterations to find the
255
+ root of igamc(a,x) - p = 0.
256
+
257
+ ACCURACY:
258
+
259
+ Tested at random a, p in the intervals indicated.
260
+
261
+ a p Relative error:
262
+ arithmetic domain domain # trials peak rms
263
+ IEEE 0.5,100 0,0.5 100000 1.0e-14 1.7e-15
264
+ IEEE 0.01,0.5 0,0.5 100000 9.0e-14 3.4e-15
265
+ IEEE 0.5,10000 0,0.5 20000 2.3e-13 3.8e-14
266
+
267
+ Cephes Math Library Release 2.8: June, 2000
268
+ Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier
269
+ *************************************************************************/
270
+ double invincompletegammac(double a, double y0)
271
+ {
272
+ double result;
273
+ double igammaepsilon;
274
+ double iinvgammabignumber;
275
+ double x0;
276
+ double x1;
277
+ double x;
278
+ double yl;
279
+ double yh;
280
+ double y;
281
+ double d;
282
+ double lgm;
283
+ double dithresh;
284
+ int i;
285
+ int dir;
286
+ double tmp;
287
+
288
+ igammaepsilon = 0.000000000000001;
289
+ iinvgammabignumber = 4503599627370496.0;
290
+ x0 = iinvgammabignumber;
291
+ yl = 0;
292
+ x1 = 0;
293
+ yh = 1;
294
+ dithresh = 5*igammaepsilon;
295
+ d = 1/(9*a);
296
+ y = 1-d-invnormaldistribution(y0)*sqrt(d);
297
+ x = a*y*y*y;
298
+ lgm = lngamma(a, tmp);
299
+ i = 0;
300
+ while(i<10)
301
+ {
302
+ if( x>x0||x<x1 )
303
+ {
304
+ d = 0.0625;
305
+ break;
306
+ }
307
+ y = incompletegammac(a, x);
308
+ if( y<yl||y>yh )
309
+ {
310
+ d = 0.0625;
311
+ break;
312
+ }
313
+ if( y<y0 )
314
+ {
315
+ x0 = x;
316
+ yl = y;
317
+ }
318
+ else
319
+ {
320
+ x1 = x;
321
+ yh = y;
322
+ }
323
+ d = (a-1)*log(x)-x-lgm;
324
+ if( d<-709.78271289338399 )
325
+ {
326
+ d = 0.0625;
327
+ break;
328
+ }
329
+ d = -exp(d);
330
+ d = (y-y0)/d;
331
+ if( fabs(d/x)<igammaepsilon )
332
+ {
333
+ result = x;
334
+ return result;
335
+ }
336
+ x = x-d;
337
+ i = i+1;
338
+ }
339
+ if( x0==iinvgammabignumber )
340
+ {
341
+ if( x<=0 )
342
+ {
343
+ x = 1;
344
+ }
345
+ while(x0==iinvgammabignumber)
346
+ {
347
+ x = (1+d)*x;
348
+ y = incompletegammac(a, x);
349
+ if( y<y0 )
350
+ {
351
+ x0 = x;
352
+ yl = y;
353
+ break;
354
+ }
355
+ d = d+d;
356
+ }
357
+ }
358
+ d = 0.5;
359
+ dir = 0;
360
+ i = 0;
361
+ while(i<400)
362
+ {
363
+ x = x1+d*(x0-x1);
364
+ y = incompletegammac(a, x);
365
+ lgm = (x0-x1)/(x1+x0);
366
+ if( fabs(lgm)<dithresh )
367
+ {
368
+ break;
369
+ }
370
+ lgm = (y-y0)/y0;
371
+ if( fabs(lgm)<dithresh )
372
+ {
373
+ break;
374
+ }
375
+ if( x<=0.0 )
376
+ {
377
+ break;
378
+ }
379
+ if( y>=y0 )
380
+ {
381
+ x1 = x;
382
+ yh = y;
383
+ if( dir<0 )
384
+ {
385
+ dir = 0;
386
+ d = 0.5;
387
+ }
388
+ else
389
+ {
390
+ if( dir>1 )
391
+ {
392
+ d = 0.5*d+0.5;
393
+ }
394
+ else
395
+ {
396
+ d = (y0-yl)/(yh-yl);
397
+ }
398
+ }
399
+ dir = dir+1;
400
+ }
401
+ else
402
+ {
403
+ x0 = x;
404
+ yl = y;
405
+ if( dir>0 )
406
+ {
407
+ dir = 0;
408
+ d = 0.5;
409
+ }
410
+ else
411
+ {
412
+ if( dir<-1 )
413
+ {
414
+ d = 0.5*d;
415
+ }
416
+ else
417
+ {
418
+ d = (y0-yl)/(yh-yl);
419
+ }
420
+ }
421
+ dir = dir-1;
422
+ }
423
+ i = i+1;
424
+ }
425
+ result = x;
426
+ return result;
427
+ }
428
+
429
+
430
+