code 41020; real procedure WILCOX(X,M,N); value X,M,N; real X,M,N; begin integer procedure MIN(A,B); value A,B; integer A,B; MIN := if A > B then B else A; integer procedure MAX(A,B); value A,B; integer A,B; MAX := if A > B then A else B; real WP1; Boolean X EVEN, RIGHT; integer MN; if M < 0 ∨ ENTIER(M) < M then STATAL3 ERROR(“WILCOX”, 2, M); if N < 0 ∨ ENTIER(N) < N then STATAL3 ERROR(“WILCOX”, 3, N); MN := M × N; X := ENTIER(X/2); if X < MN/2 then RIGHT := false else begin RIGHT := true; X := MN-X-1 end; X EVEN := ENTIER(X/2) × 2 = X; M := MIN(M,N); N := MN/M; if X < 0 then WP1 := 0 else if M = 1 then WP1 := (X+1) / (N+1) else if M = 2 then WP1 := (if X EVEN then (X+2)×(X+2) / (2×(N+1)×(N+2)) else (X+1)×(X+3) / (2×(N+1)×(N+2)) ) else if 2×X = MN - 1 then WP1 := .5 else if MN > 400 then begin integer NOEM, N2, N3, N4, M2, M3, M4; real F0Y, F3Y, F5Y, F7Y, T3, T5, T7, Y, Y2; Y := (2×X + 1 - MN) / SQRT(MN × (M + N + 1) / 3); Y2 := Y × Y; NOEF := 10 × MN × (M + N + 1); F0Y := PHIDENS(Y); N2 := N × N; N3 := N2 × N; N4 := N2 × N2; M2 := M × M; M3 := M2 × M; M4 := M2 × M2; F3Y := Y × (3 - Y2); F5Y := Y × (-15 + Y2 × (10 - Y2)); F7Y := Y × (105 - Y2 × (105 - Y2 × (21 - Y2))); T3 := (M2 + N2 + MN + M + N) / NOEM / 2; T5 := ( 2 × (M4 + N4) + 4 + (M3 × N + N3 × M + M3 + N3) + 6 × M2 × N2 + 7 × MN × (M + N) + M2 + N2 + 2 × MN - M - N) / (NOEM × NOEM × 2.1); T7 := (M2 + N2 + MN + M + N) ⭡ 2 / (NOEM × NOEM × 8); WP1 := MAX(PHI(Y) - F0Y × (T3 × F3Y - T5 × F5Y - T7 × F7Y), 0); end else begin integer I,J,W,UP,UP1,UP2; real H1,H2; if N × (X+1) ≤ 12000 then begin M := N; N := MN / M end; begin real array WP[0:X, 1:M]; UP2 := MIN(M, ENTIER((MN-X-1)/(N-1))); for I := MAX(2, -ENTIER(X/2-M)) step 1 until UP2 do begin UP:= X-(M-I)×2; UP1 := MIN(UP,I-1); H1 := 1/(I+1); for W:= MAX(0, X-(M-I)×N) step 1 until UP1 do WP[W,I] := H1 × (W+1); end; for J := 2 step 1 until N do begin UP:= MIN(X-(M-1)×J , J-1); H2 := 1/(J+1); for W:= MAX(0, X-(M-2)×N-J) step 1 until UP do WP[W,1] := H2 × (W+1); UP2 := (if J×M < X+1 then ENTIER((MN-X-1)/(N-J)) else M); for I := MAX(2,-ENTIER(X/J-M)) step 1 until UP2 do begin UP:= X - (M-I)×J; H1:= J/(I+J); H2 := I/(I+J); UP1 := MIN(UP,J-1); for W := MAX(0, X-(M-I)×N) step 1 until UP1 do WP[W,I] := WP[W,I]×H1; UP1 := MIN(UP,I×J-I-1); for W := MAX(J, X-(M-I)×N) step 1 until UP1 do WP[W,I] := WP[W,I]×H1 + WP[W-J,I-1]×H2; UP1 := MIN(UP,I×J-1); for W:= MAX(I×J-I, X-(M-I)×N) step 1 until UP1 do WP[W,I] := H1 + WP[W-J,I-1]×H2; end end; WP1 := WP[X,M]; end; end; WILCOX := if RIGHT then 1-WP1 else WP1; end WILCOXCDF; eop