54 protected static final int NEXACT = 500;
57 private static final double NORM = 1.0e140;
58 private static final double INORM = 1.0e-140;
59 private static final int LOGNORM = 140;
67 public Function(
int n,
double u) {
72 public double evaluate(
double x) {
90 public double cdf(
double x) {
94 public double barF(
double x) {
102 private static double dclem(
int n,
double x,
double EPS) {
103 return (
cdf(n, x + EPS) -
cdf(n, x - EPS)) / (2.0 * EPS);
106 protected static double densConnue(
int n,
double x) {
107 if ((x >= 1.0) || (x <= 0.5 / n))
114 double t = 2.0 * x * n - 1.0;
117 w *= Math.pow(t, (
double) (n - 1));
121 return 2 * n * Math.exp(w);
124 if (x >= 1.0 - 1.0 / n)
125 return 2.0 * n * Math.pow(1.0 - x, (
double) (n - 1));
134 public static double density(
int n,
double x) {
135 double Res = densConnue(n, x);
139 double EPS = 1.0 / 200.0;
140 final double D1 = dclem(n, x, EPS);
141 final double D2 = dclem(n, x, 2.0 * EPS);
142 Res = D1 + (D1 - D2) / 3.0;
173 private static void mMultiply(
double[] A,
double[] B,
double[] C,
int m) {
176 for (i = 0; i < m; i++)
177 for (j = 0; j < m; j++) {
179 for (k = 0; k < m; k++)
180 s += A[i * m + k] * B[k * m + j];
185 private static void renormalize(
double[] V,
int m,
int[] p) {
187 for (i = 0; i < m * m; i++)
192 private static void mPower(
double[] A,
int eA,
double[] V,
int[] eV,
int m,
int n) {
195 for (i = 0; i < m * m; i++)
200 mPower(A, eA, V, eV, m, n / 2);
202 double[] B =
new double[m * m];
203 int[] pB =
new int[1];
205 mMultiply(V, V, B, m);
207 if (B[(m / 2) * m + (m / 2)] > NORM)
208 renormalize(B, m, pB);
211 for (i = 0; i < m * m; i++)
215 mMultiply(A, B, V, m);
219 if (V[(m / 2) * m + (m / 2)] > NORM)
220 renormalize(V, m, eV);
223 protected static double DurbinMatrix(
int n,
double d) {
224 int k, m, i, j, g, eH;
233 if (s > 7.24 || (s > 3.76 && n > 99))
234 return 1 - 2 * Math.exp(-(2.000071 + .331 / Math.sqrt(n) + 1.409 / n) * s);
236 k = (int) (n * d) + 1;
239 H =
new double[m * m];
240 Q =
new double[m * m];
243 for (i = 0; i < m; i++)
244 for (j = 0; j < m; j++)
249 for (i = 0; i < m; i++) {
250 H[i * m] -= Math.pow(h, (
double) (i + 1));
251 H[(m - 1) * m + i] -= Math.pow(h, (
double) (m - i));
253 H[(m - 1) * m] += (2 * h - 1 > 0 ? Math.pow(2 * h - 1, (
double) m) : 0);
254 for (i = 0; i < m; i++)
255 for (j = 0; j < m; j++)
257 for (g = 1; g <= i - j + 1; g++)
260 mPower(H, eH, Q, pQ, m, n);
261 s = Q[(k - 1) * m + k - 1];
263 for (i = 1; i <= n; i++) {
264 s = s * (double) i / n;
270 s *= Math.pow(10., (
double) pQ[0]);
274 protected static double cdfConnu(
int n,
double x) {
276 if ((n * x * x >= 18.0) || (x >= 1.0))
283 return 2.0 * x - 1.0;
287 double t = 2.0 * x * n - 1.0;
290 return w * Math.pow(t, (
double) n);
292 w = Num.lnFactorial(n) + n * Math.log(t / n);
296 if (x >= 1.0 - 1.0 / n) {
297 return 1.0 - 2.0 * Math.pow(1.0 - x, (
double) n);
310 public static double cdf(
int n,
double x) {
311 double Res = cdfConnu(n, x);
315 return DurbinMatrix(n, x);
318 protected static double barFConnu(
int n,
double x) {
319 final double w = n * x * x;
321 if ((w >= 370.0) || (x >= 1.0))
323 if ((w <= 0.0274) || (x <= 0.5 / n))
326 return 2.0 - 2.0 * x;
330 final double t = 2.0 * x * n - 1.0;
333 return 1.0 - v * Math.pow(t, (
double) n);
336 return 1.0 - Math.exp(v);
339 if (x >= 1.0 - 1.0 / n) {
340 return 2.0 * Math.pow(1.0 - x, (
double) n);
351 public static double barF(
int n,
double x) {
352 double h = barFConnu(n, x);
362 protected static double inverseConnue(
int n,
double u) {
364 throw new IllegalArgumentException(
"n <= 0");
365 if (u < 0.0 || u > 1.0)
366 throw new IllegalArgumentException(
"u must be in [0,1]");
374 return (u + 1.0) / 2.0;
376 final double NLNN = n * Math.log(n);
379 double t = 1.0 / n * (LNU);
380 return 0.5 * (Math.exp(t) + 1.0 / n);
383 if (u >= 1.0 - 2.0 / Math.exp(NLNN))
384 return 1.0 - Math.pow((1.0 - u) / 2.0, 1.0 / n);
394 double Res = inverseConnue(n, u);
397 Function f =
new Function(n, u);
413 throw new IllegalArgumentException(
"n <= 0");
423 double[] retour = { n };
431 return getClass().getSimpleName() +
" : n = " + n;