44 private static final double EPSILONSCAN = 1.0E-7;
46 private static double scanGlaz(
int n,
double d,
int m) {
49 double jr, jm1r, nr = n;
52 double q4, q3, q2, q1;
55 jmoy = (int) ((n + 1) * d);
67 for (j = 1; j <= jmoy; j++) {
69 q1 += Math.log(nr - jr + 1.0) - Math.log(jr);
71 q1 += jmoy * Math.log(d) + (nr - jmoy) * Math.log(q);
72 binMoy = Math.exp(q1);
75 if (((jmoy - m + 1) & 1) != 0)
80 q3 = signe * binMoy * (2.0 - jm1r * jm1r + jm1r);
81 q4 = signe * binMoy * (jm1r + 1.0) * (jm1r + 2.0) * (6.0 + jm1r * jm1r - 5.0 * jm1r);
84 if (((jmoy - m + 1) & 1) != 0)
91 for (j = jmoy + 1; j <= n; j++) {
95 bin = (bin * (nr - jr + 1.0) * d) / (jr * q);
96 if (bin < EPSILONSCAN)
100 q3 += signe * bin * (2.0 - jm1r * jm1r + jm1r);
101 q4 += signe * bin * (jm1r + 1.0) * (jm1r + 2.0) * (6.0 + jm1r * jm1r - 5.0 * jm1r);
109 q4 = ((nr * (nr - 1.0) * d * d * Math.pow(q, nr - 2.0)) / 8.0
110 + nr * d * 2.0 * Math.pow(1.0 - 2.0 * d, nr - 1.0)) - 4.0 * Math.pow(1.0 - 2.0 * d, nr);
112 q4 += nr * d * 2.0 * Math.pow(1.0 - 3.0 * d, nr - 1.0) + 4.0 * Math.pow(1.0 - 3.0 * d, nr);
119 temp = Math.log(q3) + (nr - m - 2.0) * Math.log(q4 / q3);
130 private static double scanWNeff(
int n,
double d,
int m) {
143 for (j = 1; j <= m; j++)
144 sum += Math.log((
double) (n - j + 1)) - Math.log((
double) j);
146 sum += m * Math.log(d) + (n - m) * Math.log(q);
148 temp = (m / d - n - 1.0) * bin;
152 for (j = m + 1; j <= n; j++) {
153 bin *= (n - j + 1) * d / (j * q);
154 if (bin < EPSILONSCAN)
158 sum = 2.0 * sum + temp;
164 private static double scanAsympt(
int n,
double d,
int m) {
174 theta = Math.sqrt(d / (1.0 - d));
175 temp = Math.sqrt((
double) n);
176 kappa = m / (d * temp) - temp;
177 temp = theta * kappa;
178 temp = temp * temp / 2.0;
180 + (kappa * theta * Math.exp(-temp)) / (d * Math.sqrt(2.0 * Math.PI));
234 public static double scan(
int n,
double d,
int m) {
239 throw new IllegalArgumentException(
"Calling scan with n < 2");
240 if (d <= 0.0 || d >= 1.0)
241 throw new IllegalArgumentException(
"Calling scan with " +
"d outside (0,1)");
248 if ((n - 1) * d >= 1.0)
250 return 1.0 - Math.pow(1.0 - (n - 1) * d, (
double) n);
252 if (d >= 0.5 && m <= (n + 1) / 2.0)
262 return scanGlaz(n, d, m);
263 prob = scanAsympt(n, d, m);
264 if ((d >= 0.3 && n >= 50.0) || (n * d * d >= 250.0 && d < 0.3)) {
268 prob = scanWNeff(n, d, m);
271 prob = scanGlaz(n, d, m);
272 if (prob > 0.4 && prob <= 1.0)
static double scan(int n, double d, int m)
Return , where is the scan statistic(see tgla89a, tgla01a and GofStat.scan ), defined as.