code 41000;
real procedure BIN(X, N, P);
   value X, N, P; real X, N, P;
begin integer IX;

   IX ≔ ENTIER(X);
   if N < 0 ∨ N > ENTIER(N) then
     BIN ≔ STATAL3 ERROR(“BIN”, 2, N) else
   if P < 0 ∨ P > 1 then
     BIN ≔ STATAL3 ERROR(“BIN”, 3, P) else
   if IX < 0 then BIN ≔ 0 else
   if IX ⩾ N then BIN ≔ 1 else
   if P = 0 then BIN ≔ 1 else
   if P = 1 then BIN ≔ 0 else
   if N > 1000 then
   begin real B;
      B ≔ 1 - INCOMPLETE BETA(P, IX + 1, N - IX, ⏨-12);
      BIN ≔ if B < 0 then 0 else B;
   end   else
   begin real procedure TAIL;
      begin integer I; real PROB, CUM, LAST;
         PROB ≔ CUM ≔ BINPROB(IX, N, P);
         for I ≔ IX - 1, I - 1 while CUM > LAST do
            begin PROB ≔                  PROB × (1 - P) / P × (I + 1) / (N - I);
               LAST ≔ CUM; CUM ≔ CUM + PROB
            end;
         TAIL ≔ CUM
      end;
      if X > ENTIER(N / 2) then
      begin IX ≔ N - IX - 1; P ≔ 1 - P;
         BIN ≔ 1 - TAIL
      end else BIN ≔ TAIL
   end;
end BIN;
eop
code 41001;
real procedure BININV(PROB, N, P, LEFT);
   value PROB, N, P, LEFT;
   real PROB, N, P; Boolean LEFT;
begin integer X; real PX, PCUM;

   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“BININV”, 1, PROB) else
   if N > ENTIER(N) ∨ N < 0 then
     STATALS ERROR(“BININV”, 2, N) else
   if P < 0 ∨ P > 1 then
     STATAL3 ERROR(“BININV”, 3, P);

   if P = 0 ∨ N = 0 then
     BININV ≔ (if LEFT then -1 else 1)
     else if P = 1 then
     BININV ≔ (if LEFT then N - 1 else N + 1)
     else if LEFT then
   begin X ≔ PHINV(PROB) ×
        SQRT(N × P × (1 - P)) - 0·5 + N × P;
      if X < 0 then X ≔ 0
        else if X > N then X ≔ N;
      if PROB < (1 - P) ⭡ N then BININV ≔ -1 else
      begin PX ≔ BINPROB(X, N, P); PCUM ≔ BIN(X, N, P);
         if PCUM > PROB then
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × X × (1 - P) /
                    (N - X + 1) / P;
                  X ≔ X - 1
               end; X ≔ X - 1
         end else
         begin for PX ≔               PX × (N - X) / (X + 1) × P / (1 - P)
              while PCUM + PX < PROB do
               begin  X ≔ X + 1; PCUM ≔ PCUM + PX end
         end;
         BININV ≔ X
      end
   end else
   begin X ≔ PHINV(1 - PROB) ×
        SQRT(N × P × (1 - P)) + 0·5 + N × P;
      if X < 0 then X ≔ 0 else
      if X > N then X ≔ N;
      if PROB < P ⭡ N then BININV ≔ N + 1 else
      begin PCUM ≔ 1 - BIN(X - 1, N, P);
         PX ≔ BINPROB(X, N, P);
         if PCUM < PROB then
         begin for PX ≔               PX × X × (1 - P) / (N - X + 1) /P
              while PCUM + PX < PROB do
               begin X ≔ X - 1; PCUM ≔ PCUM + PX end
         end else
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × (N - X) × P /
                    (X + 1) / (1 - P);
                  X ≔ X + 1
               end; X ≔ X + 1
         end;
         BININV ≔ X
      end
   end
end BININV;
eop
code 41004;
real procedure HYPERG(X, N, R, NN);
   value X, N, R, NN; real X, N, R, NN;

begin integer I; real SUM, LAST, TERM; Boolean LEFT;
   if N < 0 ∨ N > NN ∨ N - ENTIER(N) ≠ 0 then
     STATAL3 ERROR(“HYPERG”, 2, N);
   if R <0 ∨ R > NN ∨ R - ENTIER(R) ≠ 0 then
     STATAL3 ERROR(“HYPERG”, 3, R);
   if NN - ENTIER(NN) ≠ 0 then
     STATAL3 ERROR(“HYPERG”, 4, NN);
   LEFT ≔ true;
   if N > NN / 2 then
   begin LEFT ≔ false; N ≔ NN - N; X ≔ R - X - 1 end;
   if R > NN / 2 then
   begin LEFT ≔ ¬ LEFT; R ≔ NN - R;
      X ≔ N - X - 1
   end;
   if N > R then begin I ≔ N; N ≔ R; R ≔ I end;
   if X <  0 then HYPERG ≔ if LEFT then 0 else 1
     else
   if X ⩾ N then HYPERG ≔ if LEFT then 1 else 0
     else if NN > ⏨5 then
   begin real BETA, TAU, CHI;
      TAU ≔ SQRT(R × N × (NN - N) × (NN - R) / NN) / NN;
      CHI ≔ (X + ·5 - N × R / NN) / TAU;
      BETA ≔ (CHI × CHI + 2) / 12;
      X ≔ if R ⩽ NN / 4 then
        2 × (SQRT((X + ·5 + BETA)× (NN - R - N + X + ·5 + BETA))
        - SQRT((N - X - ·5 + BETA) ×
        (R - X - ·5 + BETA))) /
        SQRT(NN + 1·5 - NN × NN / 2 / N / (NN - N))
      else
        CHI + (CHI × CHI - 1) ×
        (2 × N - NN) × (NN - 2 × R)
        / 6 / TAU / NN / NN + CHI ×
        (1 - 3 × (NN - N) × N / NN / NN)
        / 48 / TAU / TAU;
      HYPERG ≔ PHI(if LEFT then X else -X)
   end else
   begin X ≔ ENTIER(X);
      TERM ≔ SUM ≔ HYPERGPROB(X, N, R, NN);
      if X > (N + 1) × (R + 1) / (NN + 2) then
      begin LEFT ≔ ¬ LEFT; SUM ≔ 0;
         for I ≔ X + 1, I + 1 while LAST < SUM do
            begin TERM ≔ TERM × (N - I + 1) × (R - I + 1)
                 / I / (NN - R - N + I);
               LAST ≔ SUM; SUM ≔ SUM + TERM
            end
      end else
        for I ≔ X, I - 1 while LAST < SUM do
         begin TERM ≔ TERM × I × (NN - N - R + I)
              / (N - I + 1) / (R - I + 1);
            LAST ≔ SUM; SUM ≔ SUM + TERM
         end;
      HYPERG ≔ if LEFT then SUM else 1 - SUM
   end
end HYPERG;
eop
code 41005;
real procedure HYPERGINV(PROB, N, R, M, LEFT);
   value PROB, N, R, M, LEFT;
   real PROB, N, R, M; Boolean LEFT;
begin integer X; real PX, PCUM, LOW, UP;

   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“HYPERGINV”, 1, PROB) else
   if N > ENTIER(N) ∨ N < 0 ∨ N > M then
     STATAL3 ERROR(“HYPERGINV”, 2, N) else
   if R > ENTIER(R) ∨ R < 0 ∨ R > M then
     STATAL3 ERROR(“HYPERGINV”, 3, R) else
   if M > ENTIER(M) ∨ M < 0 then
     STATAL3 ERROR(“HYPERGINV”, 4, M);
   LOW ≔ if N + R - M > 0 then N + R - M else 0;
   UP ≔ if N < R then N else R;
   if N = 0 ∨ R = 0 then
     HYPERGINV ≔ (if LEFT then -1 else +1)
     else if N = M ∨ R = M then
     HYPERGINV ≔ (if LEFT then M - 1 else M + 1)
     else if LEFT then
   begin X ≔ PHINV(PROB) × SQRT((M - N) × N × R ×
        (M - R) / (M × M × (M - 1))) + R × N / M + 0·5;
      if X < LOW then X ≔ LOW else
      if X > UP then X ≔ UP;
      if PROB < HYPERGPROB(LOW, N, R, M) then
        HYPERGINV ≔ LOW - 1
      else
      begin PX ≔ HYPERGPROB(X, N, R, M);
         PCUM ≔ HYPERG(X, N, R, M);
         if PCUM > PROB then
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × X × (M - N - R + X) /
                    (N - X + 1) / (R - X + 1); X ≔ X - 1
               end; X ≔ X - 1
         end else
         begin for PX ≔ PX × (N - X) × (R - X) /
              (X + 1) / (R - X + 1)
              while PCUM + PX < PROB do
               begin X ≔ X + 1; PCUM ≔ PCUM + PX end
         end;
         HYPERGINV ≔ X
      end
   end else
   begin X ≔ PHINV(1 - PROB) × SQRT((M - N) × N × R ×
        (M - R) / (M × M × (M - 1))) + R × N / M - 0·5;
      if X < LOW then X ≔ LOW else
      if X > UP then X ≔ UP;
      if PROB < HYPERGPROB(UP, N, R, M) then
        HYPERGINV ≔ UP + 1
      else
      begin PCUM ≔ 1 - HYPERG(X - 1, N, R, M);
         PX ≔ HYPERGPROB(X, N, R, M);
         if PCUM < PROB then
         begin for PX ≔ PX × X × (M - N - R + X) /
              (N - X + 1) / (R - X + 1)
              while PCUM + PX < PROB do
               begin X ≔ X - 1; PCUM ≔ PCUM + PX end
         end else
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × (N - X) × (R - X) /
                    (X + 1) / (M - N - R + X + 1);
                  X ≔ X + 1
               end; X ≔ X + 1
         end;
         HYPERGINV ≔ X
      end
   end
end HYPERGINV;
eop
code 41009;
real procedure NEGBIN(X, K, P);
   value X, K, P; real X, K, P;
   NEGBIN ≔ if K < 0 ∨ K > ENTIER(K)
     then STATAL3 ERROR(“NEGBIN”, 2, K)
   else if P ⩽ 0 ∨ P > 1
     then STATAL3 ERROR(“NEGBIN”, 3, P)
   else if X ⩾ K then
     1 - BIN(K - 1, ENTIER(X), P)
   else 0;
eop
code 41010;
real procedure NEGBININV(PROB, K, P, LEFT);
   value PROB, K, P, LEFT;
   real PROB, K, P; Boolean LEFT;
begin integer X; real PX, PCUM;

   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“NEGBININV”, 1, PROB) else
   if K > ENTIER(K) ∨ K < 0 then
     STATAL3 ERROR(“NEGBININV”, 2, K) else
   if P ⩽ 0 ∨ P > 1 then
     STATAL3 ERROR(“NEGBININV”, 3, P);

   if P = 1 ∨ K = 0 then
     NEGBININV ≔ (if LEFT then K - 1 else K + 1)
     else if LEFT then
   begin X ≔ (PHINV(PROB) ×
        SQRT(K × (1 - P)) + K - P / 2) / P;
      if X < K then X ≔ K;
      if PROB < P ⭡ K then NEGBININV ≔ K - 1 else
      begin PX ≔ NEGBINPROB(X, K, P);
         PCUM ≔ NEGBIN(X, K, P);
         if PCUM > PROB then
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × (X - K) / (1 - P)
                    / (X - 1);
                  X ≔ X - 1
               end; X ≔ X - 1
         end else
         begin for PX ≔ PX × (1- P) × X / (X - K + 1)
              while PCUM + PX < PROB do
               begin X ≔ X + 1; PCUM ≔ PCUM + PX end
         end;
         NEGBININV ≔ X
      end
   end else
   begin X ≔ (PHINV(1 - PROB) ×
        SQRT(K × (1 - P)) + K + P / 2) / P;
      if X > K then X ≔ K;
      PCUM ≔ 1 - NEGBIN(X - 1, K, P);
      PX ≔ NEGBINPROB(X, K, P);
      if PCUM < PROB then
      begin for PX ≔ PX × (X - K) / (1 - P) / (X - 1)
           while PCUM + PX < PROB do
            begin X ≔ X - 1; PCUM ≔ PCUM + PX end
      end else
      begin for PCUM ≔ PCUM - PX
           while PCUM > PROB do
            begin PX ≔ PX × (1 - P) × X / (X - K + 1);
               X ≔ X + 1
            end; X ≔ X + 1
      end
   end;
   NEGBININV ≔ X
end NEGBININV;
eop
code 41013;
real procedure POISSON(X, MU);
   value X, MU; real X, MU;
begin integer IX;
   real procedure KSI(K, L);
      value K, L; real L; integer K;
   begin real U, U2, W; W ≔ SQRT(L);
      U ≔ 2 × (SQRT(K + 1) - W);
      U2 ≔ U × U; KSI ≔         U + (U2 - 4) / 12 / W + (-U2 × U + 10 × U) / 72 /
        L + (21 × U2 × U2 - 371 × U2 - 52) / 6480 / L / W
   end;

   IX ≔ ENTIER(X);
   if IX < 0 then POISSON ≔ 0 else
   if MU ⩽ 0 then
     POISSON ≔ STATAL3 ERROR(“POISSON”,2,MU)
     else
   if MU > 1000 then POISSON ≔ PHI(KSI(IX, MU))
   else
   begin integer I, MODUS; real MODUSPROB, PROB, CUM;
      MODUS ≔ ENTIER(MU) + 1; if IX < MODUS then
      begin PROB ≔ CUM ≔ POISSONPROB(IX, MU);
         for I ≔ IX step -1 until 1 do
            begin PROB ≔ PROB × I / MU;
               CUM ≔ CUM + PROB
            end
      end else
      begin MODUSPROB ≔ PROB ≔ CUM ≔            POISSONPROB(MODUS, MU);
         for I ≔ MODUS step -1 until 1 do
            begin PROB ≔ PROB × I / MU;
               CUM ≔ CUM + PROB
            end;  PROB ≔ MODUSPROB;
         for I ≔ MODUS + 1 step 1 until IX do
            begin PROB ≔ PROB × MU / I;
               CUM ≔ CUM + PROB
            end
      end;
      POISSON ≔ CUM
   end
end POISSON;
eop
code 41014;
real procedure POISSONINV(PROB, MU, LEFT);
   value PROB, MU, LEFT;
   real PROB, MU; Boolean LEFT;
begin integer X; real PX, PCUM;

   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“POISSONINV”, 1, PROB) else
   if MU ⩽ 0 then
     STATAL3 ERROR(“POISSONINV”, 2, MU);

   if LEFT then
   begin X ≔ (PHINV(PROB) / 2 + SQRT(MU)) ⭡ 2 - 1;
      if X < 0 then X ≔ 0;
      if PROB < EXP(-MU) then POISSONINV ≔ -1 else
      begin PX ≔ POISSONPROB(X, MU);
         PCUM ≔ POISSON(X, MU);
         if PCUM > PROB then
         begin for PCUM ≔ PCUM - PX
              while PCUM > PROB do
               begin PX ≔ PX × X / MU; X ≔ X - 1 end;
            X ≔  - 1
         end else
         begin for PX ≔ PX × MU / (X + 1)
              while PCUM + PX < PROB do
               begin X ≔ X + 1; PCUM ≔ PCUM + PX end
         end;
         POISSONINV ≔ X
      end
   end else
   begin X ≔ (PHINV(1 - PROB) / 2 + SQRT(MU)) ⭡ 2 + 1;
      if X < 0 then X ≔ 0;
      PCUM ≔ 1 - POISSON(X - 1, MU);
      PX ≔ POISSONPROB(X, MU);
      if PCUM < PROB then
      begin for PX ≔ PX × X / MU
           while PCUM + PX < PROB do
            begin X ≔ X - 1; PCUM ≔ PCUM + PX end
      end else
      begin for PCUM ≔ PCUM - PX
           while PCUM > PROB do
            begin PX ≔ PX × MU / (X + 1); X ≔ X + 1 end;
         X ≔ X + 1
      end;
      POISSONINV ≔ X
   end
end POISSONINV;
eop
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
code 41021;
real procedure WILCOXINV(PROB, M, N, LEFT);
   value PROB, M, N, LEFT; real PROB, M, N; Boolean LEFT;
begin
   integer X, W, WI, MN; real Z; Boolean MN EVEN;
   MN ≔ M × N;
   MN EVEN ≔ ENTIER(MN/2) × 2 = MN;
   X ≔ if MN EVEN then MN/2 - 1 else MN/2 - 1·5;
   PROB ≔ PROB + ⏨-13×(1-PROB);
   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“WILCOXINV”, 1, PROB) else
   if M < 0 ∨ ENTIER(M) < M then
     STATAL3 ERROR(“WILCOXINV”, 2, M) else
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“WILCOXINV”, 2, N) else
   if MN = 0 then WI ≔ -2 else
   if PROB = ·5 then WI ≔ ENTIER((MN-1)/2) × 2 else
   if M = 1 then WI ≔ ENTIER(PROB×(N+1)) × 2 - 2
     else
   if N = 1 then WI ≔ ENTIER(PROB×(M+1)) × 2 - 2
     else if MN > 400 ∨ M=2 ∨ N=2 then
   begin Z ≔ PHINV(PROB) × SQRT(MN×(M+N+1)/3) + MN;
      WI ≔ W ≔ ENTIER(Z/2) × 2;
      if WI < 0 then WI ≔ W ≔ 0;
      if WI > 2×MN then WI ≔ W ≔ 2×MN;
      if WILCOX(W, M, N) ⩽ PROB then
      begin for W ≔ W + 2
           while WILCOX(W, M, N) ⩽ PROB do WI ≔ W
      end else
      begin for W ≔ W - 2
           while WILCOX(W, M, N) > PROB do WI ≔ W;
         WI ≔ WI - 2;
      end;
   end else
   begin integer I,J,UP,UP1; real H1,H2;
      Boolean RIGHT, EQUAL; real array WCMN[-1:X+2];
      integer procedure MAX(A,B);
         value A,B; integer A,B;
         MAX ≔ if A > B then A else B;
      integer procedure MIN(A,B);
         value A,B; integer A,B;
         MIN ≔ if A > B then B else A;
      RIGHT ≔ PROB > ·5;
      if RIGHT then PROB ≔ 1 - PROB;
      I ≔ MAX(M,N); J ≔ MIN(M,N);
      if I × (X+1) > 12000 then
      begin M ≔ J; N ≔ I end else
      begin M ≔ I; N ≔ J end;
      begin real array WP[0:X, 1:M];
         for I ≔ MAX(2,-ENTIER(X/2-M)) step 1
           until M do
            begin UP ≔ X-(M-I)×2; UP1 ≔ MIN(UP,I);
               H1 ≔ 1/(I+1);
               for W ≔ 0 step 1 until UP1 do
                    WP[W,I] ≔ H1;
            end;
         for J ≔ 2 step 1 until N do
            begin UP ≔ MIN(X-(M-1)×J , J); H2 ≔ 1/(J+1);
               for W ≔ 0 step 1 until UP do
                    WP[W,1] ≔ H2;
               for I ≔ MAX(2,-ENTIER(X/J-M)) step 1
                 until M do
                  begin UP ≔ X - (M-I)×J;
                     H1 ≔ J/(I+J); H2 ≔ I/(I+J);
                     UP1 ≔ MIN(UP,J-1);
                     for W ≔ 0 step 1 until UP1 do
                          WP[W,I] ≔ WP[W,I]×H1;
                     UP1 ≔ MIN(UP,I×J-I);
                     for W ≔ J step 1 until UP1 do
                          WP[W,I] ≔ WP[W,I]×H1 + WP[W-J,I-1]×H2;
                     UP1 ≔ MIN(UP,I×J);
                     for  W ≔ I×J-I+1 step 1 until UP1
                       do  WP[W,I] ≔ WP[W-J,I-1]×H2;
                  end
            end;
         WCMN[-1] ≔ 0;
         WCMN[0] ≔ WP[0,M];
         for W ≔ 1 step 1 until X do
              WCMN[W] ≔ WCMN[W-1] + WP[W,M];
         if MN EVEN then
         begin WCMN[X+1] ≔ 1 - WCMN[X];
            WCMN[X+2] ≔ 1 - WCMN[X-1];
         end
         else
         begin WCMN[X+1] ≔ ·5;
            WCMN[X+2] ≔ 1 - WCMN[X];
         end;
      end;
      WI ≔ PHINV(PROB) × SQRT(MN×(M+N+1)/3) + MN;
      W ≔ ENTIER(WI/2);
      if W < 0 then WI ≔ W ≔ 0 else WI ≔ W;
      if WCMN[W] ⩽ PROB then
      begin for W ≔ W + 1
           while WCMN[W] ⩽ PROB do WI ≔ W
      end else
      begin for W ≔ W - 1
           while WCMN[W] > PROB do WI ≔ W;
         WI ≔ WI - 1;
      end;
      EQUAL ≔ WCMN[WI] = PROB;
      if RIGHT then
      begin if EQUAL then WI ≔ 2 × (MN - WI - 1)
         else WI ≔ 2 × (MN - WI - 2)
      end
      else WI ≔ 2 × WI;
   end;
   WILCOXINV ≔ if LEFT then WI else 2×MN - WI;
end WILCOXINV;
eop
code 41022;
real procedure WILCOXPROB(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;
   integer MN;
   if M < 0 ∨ ENTIER(M) < M then
     STATAL3 ERROR(“WILCOXPROB”, 2, M);
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“WILCOXPROB”, 3, N);
   MN ≔ M × N;
   X ≔ MIN(X/2, MN - X/2);
   M ≔ MIN(M,N); N ≔ MN/M;
   if ENTIER(X) < X then WP1 ≔ 0 else
   if X < 0 then WP1 ≔ 0 else
   if MN = 0 then WP1 ≔ 1 else
   if M = 1 then WP1 ≔ 1/(N+1) else
   if M = 2 then
     WP1 ≔ ENTIER(X/2+1) / ((N+1)×(N+2)/2) else
   if MN > 400 then
     WP1 ≔ WILCOX(2×X,M,N) - WILCOX(2×X-2,M,N) 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)/(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);
               H1 ≔ 1/(I+1);
               for W ≔ MAX(0, X-(M-I)×N) step 1
                 until UP1 do
                    WP[W,I] ≔ H1;
            end;
         for J ≔ 2 step 1 until N do
            begin UP ≔ MIN(X-(M-1)×J , J); H2 ≔ 1/(J+1);
               for W ≔ MAX(0, X-(M-2)×N-J) step 1
                 until UP do
                    WP[W,1] ≔ H2;
               UP2 ≔ if J×M<X+1 then
                 ENTIER((MN-X)/(N-J)) else M;
               for I ≔ MAX(2,-ENTIER(X/2-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,1]×H1;
                     UP1 ≔ MIN(UP,I×J-I);
                     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);
                     for W ≔ AX(I×J-I+1,X-(M-I)×N) step 1
                       until UP1 do
                          WP[W,I] ≔ WP[W-J,I-1]×H2;
                  end
            end;
         WP1   ≔ WP[X,M];
      end;
   end;
   WILCOXPROB ≔ WP1
end WILCOXPROB;
eop
code 41023;
real procedure RUN(X, M, N);
   value X, M, N; real X, M, N;
begin
   real P, PCUM; integer IX, I, K, UP;
   if M < 0 ∨ ENTIER(M) < M then
     STATAL3 ERROR(“RUN”, 2, M) else
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“RUN”, 3, N) else
   if M > N then begin K ≔ M; M ≔ N; N ≔ K end;
   if M = 0 then RUN ≔ (if X < 1 then 0 else 1)
     else if X < 2 then RUN ≔ 0 else
   if M = N ∧ X ⩾ M × 2 then RUN ≔ 1 else
   if X > M × 2 then RUN ≔ 1 else
   begin IX ≔ ENTIER(X); if IX ÷ 2 × 2 < IX then
      begin PCUM ≔ P ≔ RUNPROB(IX, M, N);
         K ≔ (IX - 1) / 2;
         P ≔ P×K×2 / (M + N - K × 2); PCUM ≔ PCUM + P
      end else
      begin K ≔ IX / 2;
         P ≔ PCUM ≔ RUNPROB(IX, M, N)
      end;
      for I ≔ K - 1 step -1 until 1 do
         begin P ≔ P × (M + N - I × 2) × I / (N - I) /
              (M - I) / 2; PCUM ≔ PCUM + P;
            P ≔ P×2×I / (M + N - 2 × I); PCUM ≔ PCUM + P
         end;
      RUN ≔ PCUM
   end
end RUN;
eop
code 41024;
real procedure RUNINV(PROB, M, N, LEFT);
   value PROB, M, N, LEFT; real PROB, M, N; Boolean LEFT;
begin
   integer H, R, MN; real P, PCUM;
   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“RUNINV”, 1, PROB) else
   if M < 0 ∨ ENTIER(M) < M then
     STATAL3 ERROR(“RUNINV”, 2, M) else
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“RUNINV”, 3, N);
   MN ≔ M + N;
   if M > N then begin H ≔ M; M ≔ N; N ≔ H end;
   if M = 0 then
     RUNINV ≔ (if LEFT then 0 else 2) else
   if LEFT then
   begin R ≔ PHINV(PROB) ×
        SQRT((MN ⭡ 3 - MN) / (2 × M × N ×
        (2 × M × N - MN))) + ·5 + 2 × M × N / MN;
      if R < 2 then R ≔ 2 else
      if R > M × 2 then R ≔ M × 2;
      if PROB < RUNPROB(2, M, N)
        then RUNINV ≔ +1 else
      begin PCUM ≔ RUN(R, M, N);
         if PCUM ⩽ PROB then
         begin for P ≔ RUNPROB(R + 1, M, N)
              while PCUM + P ⩽ PROB do
               begin R ≔ R + 1; PCUM ≔ PCUM + P end
         end else
         begin for P ≔ RUNPROB(R, M, N)
              while PCUM - P > PROB do
               begin R ≔ R - 1; PCUM ≔ PCUM - P end;
            R ≔ R - 1
         end; RUNINV ≔ R
      end
   end else
   begin R ≔ PHINV(1 - PROB) ×
        SQRT((MN ⭡ 3 - MN) / (2 × M × N ×
        (2 × M × N - MN))) + 1·5 + 2 × M × N / MN;
      if R < 2 then R ≔ 2 else
      if R > M × 2 then R ≔ M × 2;
      MN ≔ if M = N then 2 × M else 2 × M + 1;
      if PROB < RUNPROB(MN, M, N)
        then RUNINV ≔ MN + 1 else
      begin PCUM ≔ 1 - RUN(R - 1, M, N);
         if PCUM ⩽ PROB then
         begin for P ≔ RUNPROB(R - 1, M, N)
              while PCUM + P ⩽ PROB do
               begin R ≔ R - 1; PCUM ≔ PCUM + P end
         end else
         begin for P ≔ RUNPROB(R, M, N)
              while PCUM - P > PROB do
               begin R ≔ R + 1; PCUM ≔ PCUM - P end;
            R ≔ R + 1
         end;
         RUNINV ≔ R
      end
   end
end RUNINV;
eop
code 41025;
real procedure RUNPROB(X, M, N); value X, M, N;
   real X, M, N;
begin integer K; real P; Boolean EVEN;

   if M < 0 ∨ ENTIER(M) < M then
     STATAL3 ERROR(“RUNPROB”, 2, M) else
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“RUNPROB”, 3, N);
   if M > N then begin K ≔ N; N ≔ M; M ≔ K end;
   EVEN ≔ ENTIER(X / 2) × 2 = X;
   K ≔ if EVEN then X / 2 else (X + 1) / 2;
   RUNPROB ≔      if N = 0 then 0 else
     if M = 0 then (if X = 1 then 1 else 0) else
     if X < 2 ∨ X > 2 × M + 1 ∨ ENTIER(X) < X
     then 0 else
     if EVEN then
     2 × M × N × EXP(2 × (LOGGAMMA(M) + LOGGAMMA(N) -
     LOGGAMMA(K)) - LOGGAMMA(M - K + 1) - LOGGAMMA(N - K + 1)
     - LOGGAMMA(M + N + 1)) else
     (M + N - X + 1) × M × N / (K - 1) × EXP(2 × (LOGGAMMA(M)
     + LOGGAMMA(N) - LOGGAMMA(K - 1)) - LOGGAMMA(M + N + 1)
     - LOGGAMMA(M - K + 2) - LOGGAMMA(N - K + 2))
end RUNPROB;
eop
code 41026;
real procedure KENDALL(X, N); value X, N; real X, N;
begin
   integer I, G, IX; real P;
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“KENDALL”, 2, N);
   G ≔ N × (N - 1) / 2; IX ≔ G + ENTIER(-(G - X) / 2) × 2;
   if IX ⩾ G then KENDALL ≔ 1 else
   if IX < -G then KENDALL ≔ 0 else
   if N > 9 then
     KENDALL ≔ PHI(IX + 1 / SQRT(N × (N - 1) × (N+N+5) / 18))
     else if IX > 0 then
   begin P ≔ 0; for I ≔ G step -2 until IX + 2 do
           P ≔ P + KENDALLPROB(I, N); KENDALL ≔ 1 - P
   end else
   begin P ≔ 0; for I ≔ -G step 2 until IX do
           P ≔ P + KENDALLPROB(I, N); KENDALL ≔ P
   end
end KENDALL;
eop
code 41027;
real procedure KENDALLINV(PROB, N, LEFT);
   value PROB, N, LEFT; real PROB, N; Boolean LEFT;
begin integer S, G; real P, PCUM;

   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“KENDALLINV”, 1, PROB) else
   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“KENDALLINV”, 2, N);
   G ≔ N × (N - 1) / 2;
   if N = 0 then
     KENDALLINV ≔ (if LEFT then -1 else +1)
     else if LEFT then
   begin S ≔ PHINV(PROB) × SQRT(G × (N × 2 + 5) / 9);
      S ≔ if ABS(S) > G then G × SIGN(S) else
        G + ENTIER(-(G - S) / 2) × 2;
      if PROB < KENDALLPROB(-G, N) then
        KENDALLINV ≔ -G - 2
      else
      begin PCUM ≔ KENDALL(S, N);
         if PCUM ⩽ PROB then
         begin for P ≔ KENDALLPROB(S + 2, N)
              while PCUM + P ⩽ PROB do
               begin S ≔ S + 2; PCUM ≔ PCUM + P end
         end else
         begin for P ≔ KENDALLPROB(S, N)
              while PCUM - P > PROB do
               begin S ≔ S - 2; PCUM ≔ PCUM - P end;
            S ≔ -2
         end; KENDALLINV ≔ S
      end
   end else
   begin S ≔ PHINV(1 - PROB) × SQRT(G × (N × 2 + 5) / 9);
      S ≔ if ABS(S) > G then G × SIGN(S) else
        G - ENTIER((G - S) / 2) × 2;
      if PROB < KENDALLPROB(G, N) then
        KENDALLINV ≔ G + 2 else
      begin PCUM ≔ 1 - KENDALL(S - 2, N);
         if PCUM ⩽ PROB then
         begin for P ≔ KENDALLPROB(S - 2, N)
              while PCUM + P ⩽ PROB do
               begin S ≔ S - 2; PCUM ≔ PCUM + P end
         end else
         begin for P ≔ KENDALLPROB(S, ND)
              while PCUM - P > PROB do
               begin S ≔ S + 2; PCUM ≔ PCUM - P end;
            S ≔ S +2
         end;
         KENDALLINV ≔ S
      end
   end
end KENDALLINV;
eop
code 41028;
real procedure KENDALLPROB(X, N);
   value X, N; real X, N;
begin integer G, IX;

   real procedure PROB(S, N);
      value S, N; integer S, N;
   begin integer I; real P;
      if N = 2 then PROB ≔ (if ABS(S) = 1 then ·5
      else 0) else
      begin P ≔ 0;
         for I ≔ 0 step 1 until N - 1 do
              P ≔ P + PROB(S - N + 1 + I × 2, N - 1);
         PROB ≔ P / N
      end
   end;

   if N < 0 ∨ ENTIER(N) < N then
     STATAL3 ERROR(“KENDALLPROB”, 2, N);
   G ≔  × (N - 1) / 2; IX ≔ ENTIER(X);
   if N > 9 then
   begin real S; S ≔ SQRT(N × (N-1) × (N+N+5) / 18);
      KENDALLPROB ≔ PHI(IX + 1/S) - PHI(IX - 1/S)
   end else
     KENDALLPROB ≔ if IX < X ∨ ABS(IX) > G ∨
     (G - IX) ÷ 2 × 2 < G - IX then 0 else PROB(IX, N)
end KENDALLPROB;
eop
code 41251;
real procedure BINPROB(X, N, P);
   value X, N, P; real X, N, P;
   BINPROB ≔ if N < 0 ∨ N > ENTIER(N)
     then STATAL3 ERROR(“BINPROB”, 2, N)
   else if P < 0 ∨ P > 1
     then STATAL3 ERROR(“BINPROB”, 3, P)
   else if X < 0 ∨ X > N ∨ X > ENTIER(X)
     then 0 else if P = 0 ∨ N = 0
     then (if X = 0 then 1 else 0)
   else if P = 1
     then (if X = N then 1 else 0)
   else EXP(LOGGAMMA(N+1) - LOGGAMMA(X+1)
     - LOGGAMMA(N-X+1) + X × LN(P) + (N-X) × LN(1-P));
eop
code 41252;
real procedure POISSONPROB(X, MU);
   value X, MU; real X, MU;
   POISSONPROB ≔ if MU ⩽ 0
     then STATAL3 ERROR(“POISSONPROB”, 2, MU)
   else if X < 0 ∨ X > ENTIER(X) then 0
   else EXP(-MU + X × LN(MU) - LOGGAMMA(X+1));
eop
code 41253;
real procedure HYPERGPROB(X, N, R, M);
   value X, N, R, M; real X, N, R, M;
begin
   integer procedure BINCOEF(N, K); value N, K;
      integer N, K;
   begin integer B, L, B1;
      B1 ≔ if K > N - K then N - K else K; B ≔ 1;
      for L ≔ 1 step 1 until B1 do
           B ≔ B × (N + 1 - L) ÷ L;
      BINCOEF ≔ B
   end;
   if N < 0 ∨ N > M ∨ N > ENTIER(N)
     then STATAL3 ERROR(“HYPERGPROB”, 2, N)
     else if R < 0 ∨ R > M ∨ R > ENTIER(R)
     then STATAL3 ERROR(“HYPERGPROB”, 3, R)
     else if M > ENTIER(M)
     then STATAL3 ERROR(“HYPERGPROB”, 4, M);
   if X < 0 ∨ X < N + R - M ∨ X > N ∨ X > R∨ X > ENTIER(X)
     then HYPERGPROB ≔ 0 else
   if N = 0 ∨ M = 0 then HYPERGPROB ≔      (if X = 0 then 1 else 0) else
   if N = M ∨ R = M then HYPERGPROB ≔      (if X = M then 1 else 0) else
   if M ⩽ 51 then
     HYPERGPROB ≔ (BINCOEF(N, X) × BINCOEF(M - N, R - X))
     / BINCOEF(M, R)
   else
   begin integer I; real PROB; PROB ≔ 0;
      for I ≔ N, M-N, R, M-R do
           PROB ≔ PROB + LOGGAMMA(I + 1);
      for I ≔ N - X, X, M - N - R + X, R - X, M do
           PROB ≔ PROB - LOGGAMMA(I + 1);
      HYPERGPROB ≔ EXP(PROB)
   end
end HYPERGPROB;
eop
code 41254;
real procedure NEGBINPROB(X, K, P);
   value X, K, P; real X, K, P;
   NEGBINPROB ≔ if K < 0 ∨ K > ENTIER(K)
     then STATAL3 ERROR(“NEGBINPROB”, 2, K)
   else if P ⩽ 0 ∨ P > 1
     then STATAL3 ERROR(“NEGBINPROB”, 3, P)
   else if X < K ∨ X > ENTIER(X) then 0
   else if P = 0 then 0
   else if P = 1 ∨ K = 0
     then (if X = K then 1 else 0)
   else P × BINPROB(K - 1, X - 1, P);
eop
code 41255;
real procedure MULNOMPROB(XVEC, N, K, PVEC);
   value N,K; real N,K; array XVEC, PVEC;
begin real XL, PL, LNPR, EPS, PSUM;
   integer J, XSUM;

   if N > ENTIER(N) ∨ N < 1 then
     STATAL3 ERROR(“MULNOMPROB”,2,N) else
   if K > ENTIER(K) ∨ K < 2 then
     STATAL3 ERROR(“MULNOMPROB”,3,K) else
   begin PSUM ≔ 0; XSUM ≔ 0; EPS ≔ ⏨-14;
      for J ≔ 1 step 1 until K do
         begin PL ≔ PVEC[J];
            if PL < 0 then
              STATAL3 ERROR(“MULNOMPROB”,4,PL) else
              PSUM ≔ PSUM + PL
         end;
      if ABS(PSUM-1) > EPS then
        STATAL3 ERROR(“MULNOMPROB”,4,PSUM) else
      begin for J ≔ 1 step 1 until K do
            begin XL ≔ XVEC[J];
               if XL > ENTIER(XL) ∨ XL < 0 then
               begin MULNOMPROB ≔ 0; goto OUT end;
               XSUM ≔ XSUM + XL;
            end;
         if XSUM ≠ N then
         begin MULNOMPROB ≔ 0; goto OUT end else
         begin LNPR ≔ LOGGAMMA(N+1);
            for J ≔ 1 step 1 until K do
                 if PVEC[J] = 0 then
               begin if XVEC[J] ≠ 0 then
                  begin MULNOMPROB ≔ 0;
                     goto OUT
                  end
               end else
                 LNPR ≔ LNPR - LOGGAMMA(XVEC[J]+1) +
                 XVEC[J] × LN(PVEC[J]);
            MULNOMPROB ≔ EXP(LNPR);
         end;
      end;
   end; OUT:
end MULNOMPROB;
eop
code 41256;
real procedure MULHYPERGPROB(X,N,K,R);
   value N,K; real N,K; array X,R;
begin integer I,J,L,SR,SX; real MHP,XJ,RJ;
   if N < 1 ∨ N > ENTIER(N) then
     STATAL3 ERROR(“MULHYPERGPROB”,2,N);
   if K < 1 ∨ K > ENTIER(K) then
     STATAL3 ERROR(“MULHYPERGPROB”,3,K);
   SX ≔ SR ≔ 0;
   MHP ≔ 0;
   for J ≔ 1 step 1 until K do
      begin RJ ≔ R[J]; XJ ≔ X[J];
         if RJ < 0 ∨ RJ > ENTIER(RJ) then
           STATAL3 ERROR(“MULHYPERGPROB”,4,RJ);
         SR ≔ SR + RJ; SX ≔ SX + XJ;
         if XJ > RJ ∨ XJ < 0 ∨ XJ > ENTIER(XJ) then
         begin MULHYPERGPROB ≔ 0; goto OUT end;
         MHP ≔ MHP + LOGGAMMA(RJ+1) - LOGGAMMA(XJ+1)
           - LOGGAMMA(RJ-XJ+1);
      end J ;
   if SX ≠ N then
   begin MULHYPERGPROB ≔ 0; goto OUT end;
   MHP ≔ MHP + LOGGAMMA(N+1) + LOGGAMMA(SR-N+1)
     - LOGGAMMA(SR+1);
   MULHYPERGPROB ≔ EXP(MHP);
   OUT:
end MULHYPERGPROB;
eop
code 41500;
real procedure PHI(X); value X; real X;
begin real ABSX, ERF, ERFC, C, P, Q;
   X ≔ X × ·70710 67811 8655; ABSX ≔ ABS(X);
   if X > 5·5 then PHI ≔ 1 else if X < -5·5
     then PHI ≔ 0 else if ABSX ⩽ 0·5 then
   begin C ≔ X × X;
      P ≔ ((-0·35609 84370 1815⏨-1 × C +
        0·69963 83488 6191⏨+1) × C + 0·21979 26161 8294⏨+2)× C + 0·24266 79552 3053⏨+3;
      Q ≔ ((C +
        0·15082 79763 0408⏨+2) × C +
        0·91164 90540 4515⏨+2) × C +
        0·21505 88758 6986⏨+3;
      PHI ≔ ·5 × X × P / Q + ·5
   end else
   begin if ABSX < 4 then
      begin C ≔ ABSX;
         P ≔ ((((((-0·13686 48573 8272⏨-6 × C +
           0·56419 55174 7897⏨+0) × C +
           0·72117 58250 8831⏨+1) × C +
           0·43162 22722 2057⏨+2) × C +
           0·15298 92850 4694⏨+3) × C +
           0·33932 08167 3434⏨+3) × C +
           0·45191 89537 1187⏨+3) × C +
           0·30045 92610 2016⏨+3;
         Q ≔ ((((((C +
           0·12782 72731 9629⏨+2) × C +
           0·77000 15293 5230⏨+2) × C +
           0·27758 54447 4399⏨+3) × C +
           0·63898 02644 6563⏨+3) × C +
           0·93135 40948 3061⏨+3) × C +
           0·79095 09253 2790⏨+3) × C +
           0·30045 92609 3698⏨+3;
         C ≔ P/Q
      end else
      begin C ≔ 1 / X / X;
         P ≔ (((0·22319 24597 3419⏨-1 × C +
           0·27866 13086 0965⏨-0) × C +
           0·22695 65935 3969⏨-0) × C +
           0·49473 09106 2325⏨-1) × C +
           0·29961 07077 0354⏨-2;
         Q ≔ (((C +
           0·19873 32018 1714⏨+1) × C +
           0·10516 75107 0679⏨+1) × C +
           0·19130 89261 0783⏨+0) × C +
           0·10620 92305 2847⏨-1;
         C ≔ (C × (-P) / Q + 0·56418 95835 4776) / ABSX
      end;
      PHI ≔ ·5 + ·5 × SIGN(X) × (1 - C × EXP(-X × X))
   end
end PHI;
eop
code 41501;
real procedure PHINV(PROB); value PROB; real PROB;
begin real EPS;
   real procedure INVERF(X); value X; real X;
   begin real ABSX, P, BETAX;
      real array A[0 : 23];
      real procedure CHEPOLSER(N, X, A);
         value N, X; integer N; real X; array A;
      begin integer K; real H, R, S, TX;
         TX ≔ X + X; R ≔ A[N];
         H ≔ A[N - 1] + R × TX;
         for K ≔ N - 2 step -1 until 1 do
            begin S ≔ R; R ≔ H;
               H ≔ A[K] + R × TX - S
            end;
         CHEPOLSER ≔ A[0]- R + H × X
      end CHEPOLSER;

      ABSX ≔ ABS(X);
      if ABSX ⩽ 0·8 then
      begin
         A[ 0] ≔                 0·99288   53766   1894;
         A[ 1] ≔                 0·12046   75161   4310;
         A[ 2] ≔                 0·01607   81993   4210;
         A[ 3] ≔                 0·00268   67044   3716;
         A[ 4] ≔                 0·00049   96347   3024;
         A[ 5] ≔                 0·00009   88982   1860;
         A[ 6] ≔                 0·00002   03918   1276;
         A[ 7] ≔                 0·00000   43272   7162;
         A[ 8] ≔                 0·00000   09380   8141;
         A[ 9] ≔                 0·00000   02067   3472;
         A[10] ≔                 0·00000   00461   5970;
         A[11] ≔                 0·00000   00104   1668;
         A[12] ≔                 0·00000   00023   7150;
         A[13] ≔                 0·00000   00005   4393;
         A[14] ≔                 0·00000   00001   2555;
         A[15] ≔                 0·00000   00000   2914;
         A[16] ≔                 0·00000   00000   0680;
         A[17] ≔                 0·00000   00000   0159;
         A[18] ≔                 0·00000   00000   0037;
         A[19] ≔                 0·00000   00000   0009;
         A[20] ≔                 0·00000   00000   0002;
         A[21] ≔                 0·00000   00000   0001;
         INVERF ≔ CHEPOLSER(21, X × X / 0·32 - 1, A) × X
      end else
      if 1 - ABSX ⩾ 25⏨-4 then
      begin
         A[ 0] ≔                      0·91215   88034   1755;
         A[ 1] ≔                     -0·01626   62818   6766;
         A[ 2] ≔                      0·00043   35564   7295;
         A[ 3] ≔                      0·00021   44385   7007;
         A[ 4] ≔                      0·00000   26257   5108;
         A[ 5] ≔                     -0·00000   30210   9105;
         A[ 6] ≔                     -0·00000   00124   0606;
         A[ 7] ≔                      0·00000   00624   0661;
         A[ 8] ≔                     -0·00000   00005   4015;
         A[ 9] ≔                     -0·00000   00014   2321;
         A[10] ≔                      0·00000   00000   3438;
         A[11] ≔                      0·00000   00000   3358;
         A[12] ≔                     -0·00000   00000   0146;
         A[13] ≔                     -0·00000   00000   0081;
         A[14] ≔                      0·00000   00000   0005;
         A[15] ≔                      0·00000   00000   0002;
         BETAX ≔ SQRT(- LN((1 + ABSX) × (1 - ABSX)));
         P ≔ -1·54881 30423 7326 × BETAX +
           2·56549 01231 4782;
         P ≔ CHEPOLSER(15, P, A);
         INVERF ≔ if X < 0 then - BETAX × P
         else BETAX × P
      end else
      begin
         A[ 0] ≔    0·95667 97090   2049;
         A[ 1] ≔   -0·02310 70043   0907;
         A[ 2] ≔   -0·00437 42360   9751;
         A[ 3] ≔   -0·00057 65034   2265;
         A[ 4] ≔   -0·00001 09610   2231;
         A[ 5] ≔    0·00002 51085   4703;
         A[ 6] ≔    0·00001 05623   3607;
         A[ 7] ≔    0·00000 27544   1233;
         A[ 8] ≔    0·00000 04324   8450;
         A[ 9] ≔   -0·00000 00205   3034;
         A[10] ≔   -0·00000 00438   9154;
         A[11] ≔   -0·00000 00176   8401;
         A[12] ≔   -0·00000 00039   9129;
         A[13] ≔   -0·00000 00001   8693;
         A[14] ≔    0·00000 00002   7292;
         A[15] ≔    0·00000 00001   3282;
         A[16] ≔    0·00000 00000   3183;
         A[17] ≔    0·00000 00000   0167;
         A[18] ≔   -0·00000 00000   0204;
         A[19] ≔   -0·00000 00000   0097;
         A[20] ≔   -0·00000 00000   0022;
         A[21] ≔   -0·00000 00000   0001;
         A[22] ≔    0·00000 00000   0001;
         A[23] ≔    0·00000 00000   0001;
         BETAX ≔   SQRT(- LN((1 +   ABSX) × (1 - ABSX)));
         P ≔ -0·55945 76313 29832 × BETAX +
           2·28791 57162 6336;
         P ≔ CHEPOLSER(23, P, A);
         INVERF ≔ if X < 0 then - BETAX × P
         else BETAX × P
      end
   end INVERSE ERROR FUNCTION;
   EPS ≔ ⏨-14;
   if PROB < EPS ∨ 1 - PROB < EPS then
     STATAL3 ERROR(“PHINV”, 1, PROB);
   PHINV ≔ INVERF(2 × PROB - 1) × 1·41421356237310
end PHINV;
eop
code 41502;
real procedure NORMAL(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
   NORMAL ≔ if SIGMA ⩽ 0
     then STATAL3 ERROR(“NORMAL”, 3, SIGMA)
   else PHI((X - MU) / SIGMA);
eop
code 41503;
real procedure NORMALINV(PROB, MU, SIGMA);
   value PROB, MU, SIGMA; real PROB, MU, SIGMA;
   NORMALINV ≔ if SIGMA ⩽ 0
     then STATAL3 ERROR(“NORMALINV”, 3, SIGMA)
   else if PROB < ⏨-14 ∨ PROB > 1 - ⏨-14
     then STATAL3 ERROR(“NORMALINV”, 1, PROB)
   else MU + PHINV(PROB) × SIGMA;
eop
code 41506;
real procedure CHISQ(X, DF);
   value X, DF; real X, DF;
   CHISQ ≔ if DF ⩽ 0 then
     STATAL3 ERROR(“CHISQ”, 2, DF)
   else if X ⩽ 0 then 0 else
     GAMMA(X, DF / 2, 2);
eop
code 41507;
real procedure CHISQINV(PROB, DF);
   value PROB, DF; real PROB, DF;
   if PROB < ⏨-10 ∨ PROB > 1 - ⏨-10
     then STATAL3 ERROR(“CHISQINV”, 1, PROB)
     else if DF ⩽ 0
     then STATAL3 ERROR(“CHISQINV”, 2, DF)
   else
   begin real X;
      X ≔ PHINV(PROB) × SQRT(2 × DF) + DF;
      CHISQINV ≔ INVERSE(X, CHISQ(X, DF), PROB, ⏨-10)
   end CHISQINV;
eop
code 41509;
real procedure NCCHISQ(X, DF, DELTA);
   value X, DF, DELTA; real X, DF, DELTA;
begin real FACTOR1, FACTOR2, PROB, SUM, TERM;
   integer M;
   if DF < 1 ∨ DF > ENTIER(DF) then
     STATAL3ERROR(“NCCHISQ”, 2, DF);
   if DELTA < 0 then
     STATAL3ERROR(“NCCHISQ”, 3, DELTA);
   if X ⩽ 0 then NCCHISQ ≔ 0 else
   if DELTA = 0 then NCCHISQ ≔ CHISQ(X, DF) else
   begin PROB ≔ CHISQ(X, DF); X ≔ X / 2; DF ≔ DF / 2;
      DELTA ≔ DELTA / 2; FACTOR1 ≔ EXP(-DELTA);
      FACTOR2 ≔ EXP(DF × LN(X) - X - LOGGAMMA(DF + 1));
      TERM ≔ SUM ≔ PROB × FACTOR1; M ≔ 0;
      for M ≔ M + 1
        while ¬( TERM < ⏨-9 ∧ M > DELTA ) do
         begin FACTOR1 ≔ FACTOR1 × DELTA / M;
            PROB ≔ PROB - FACTOR2;
            FACTOR2 ≔ FACTOR2 × X / (DF + M);
            TERM ≔ PROB × FACTOR1; SUM ≔ SUM + TERM
         end;
      NCCHISQ ≔ SUM
   end;
end NCCHISQ;
eop
code 41513;
real procedure GAMMA(X, ALPHA, SCALE);
   value X, ALPHA, SCALE; real X, ALPHA, SCALE;
begin integer DELTA, UPP;
   real BETA, START, SUM, TERM;

   real procedure INCGAM(X, A, EPS);
      value X, A, EPS; real X, A, EPS;
   begin real C0, C1, C2, D0, D1, D2, X2, AX, P,
        Q, R, S, R1, R2, SCF; integer N;
      S ≔ EXP(-X + A × LN(X)); SCF ≔ ⏨+300;
      if X ⩽ 1 then
      begin X2 ≔ X × X; AX ≔ A × X;
         D0 ≔ 1; P ≔ A; C0 ≔ S;
         D1 ≔ (A + 1) × (A + 2 - X);
         C1 ≔ (D1 + AX + 2 × X) × S;
         R2 ≔ C1 / D1;
         for N ≔ 1, N + 1
           while ABS((R2 - R1) / R2) > EPS do
            begin P ≔ P + 2;
               Q ≔ (P + 1) × (P × (P + 2) - AX);
               R ≔ N × (N + A) × (P + 2) × X2;
               C2 ≔ (Q × C1 + R × C0) / P;
               D2 ≔ (Q × D1 + R × D0) / P;
               R1 ≔ R2; R2 ≔ C2 / D2;
               C0 ≔ C1; C1 ≔ C2; D0 ≔ D1; D1 ≔ D2;
               if ABS(C1) > SCF ∨ ABS(D1) > SCF then
               begin C0 ≔ C0 / SCF; C1 ≔ C1 / SCF;
                  D0 ≔ D0 / SCF; D1 ≔ D1 / SCF
               end
            end; INCGAM ≔ R2 / A / EXP(LOGGAMMA(A))
      end else
      begin C0 ≔ A × S; C1 ≔ (1 + X) × C0;
         Q ≔ X + 2 - A;
         D0 ≔ X; D1 ≔ X × Q; R2 ≔ C1 / D1;
         for N ≔ 1, N + 1
           while ABS((R2 - R1) / R2) > EPS do
            begin Q ≔ Q + 2; R ≔  × (N + 1 - A);
               C2 ≔ Q × C1 - R × C0; D2 ≔ Q × D1 - R × D0;
               R1 ≔ R2; R2 ≔ C2 / D2;
               C0 ≔ C1; C1 ≔ C2; D0 ≔ D1; D1 ≔ D2;
               if ABS(C1) > SCF ∨ ABS(D1) > SCF then
               begin C0 ≔ C0 / SCF; C1 ≔ C1 / SCF;
                  D0 ≔ D0 / SCF; D1 ≔ D1 / SCF
               end
            end; INCGAM ≔ 1 - R2 / A / EXP(LOGGAMMA(A))
      end
   end INCGAM;

   if ALPHA ⩽ 0 then
     STATAL3 ERROR(“GAMMA”, 2, ALPHA)
     else if SCALE ⩽ 0 then
     STATAL3 ERROR(“GAMMA”, 3, SCALE)
     else if X ⩽ 0 then GAMMA ≔ 0 else
   if ALPHA ⩾ 500 then
   begin
      GAMMA ≔ PHI(((X / SCALE / ALPHA) ⭡ ·33333333353333
        - 1 + 1 / (9 × ALPHA)) × 3 × SQRT(ALPHA))
   end else
   begin X ≔ X / SCALE; BETA ≔ ALPHA - ENTIER(ALPHA) + 1;
      START ≔ if X ⩾ 40 then 1 else
        INCGAM(X, BETA, ⏨-12);
      if ALPHA < 1 then
        GAMMA ≔ START + EXP(-X + ALPHA × LN(X)
        - LOGGAMMA(ALPHA + 1))
        else if ALPHA < 2 then GAMMA ≔ START
        else if X > 700 then GAMMA ≔ 1
      else
      begin UPP ≔ ENTIER(ALPHA) - 2; SUM ≔ TERM ≔            EXP(-X + (ALPHA - 1) × LN(X) - LOGGAMMA(ALPHA));
         for DELTA ≔ 1 step 1 until UPP do
            begin TERM ≔ TERM × (ALPHA - DELTA) / X;
               SUM ≔ SUM + TERM
            end;
         GAMMA ≔ START - SUM
      end
   end
end GAMMA;
eop
code 41514;
real procedure GAMMAINV(PROB,ALPHA,SCALE);
   value PROB,ALPHA,SCALE; real PROB,ALPHA,SCALE;
begin real X,TOL;

   TOL ≔ ⏨-10;
   if ALPHA ⩽ 0 then
     STATAL3 ERROR(“GAMMAINV”,2,ALPHA) else
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“GAMMAINV”,3,SCALE) else
   if PROB ⩽ TOL ∨ PROB ⩾ 1 - TOL then
     STATAL3 ERROR(“GAMMAINV”,1,PROB);
   X ≔ ALPHA × SCALE;
   GAMMAINV ≔ INVERSE(X,GAMMA(X,ALPHA,SCALE),PROB, TOL)
end GAMMAINV;
eop
code 41517;
real procedure BETA(X, ALPHA1, ALPHA2);
   value X, ALPHA1, ALPHA2; real X, ALPHA1, ALPHA2;
   BETA ≔ if ALPHA1 ⩽ 0
     then STATAL3 ERROR(“BETA”, 2, ALPHA1)
   else if ALPHA2 ⩽ 0
     then STATAL3 ERROR(“BETA”, 3, ALPHA2)
   else if X ⩽ 0 then 0
   else if X ⩾ 1 then 1
   else INCOMPLETE BETA(X, ALPHA1, ALPHA2, ⏨-12);
eop
code 41518;
real procedure BETAINV(PROB,ALPHA1,ALPHAZ2);
   value PROB,ALPHA1,ALPHA2; real PROB,ALPHA1,ALPHA2;
begin real X,Y,TOL;

   comment DEFINE ACCURACY;
   TOL ≔ ⏨-10;

   comment TEST FOR ADMISSIBILITY OF PARAMETERS;
   if ALPHA1 ⩽ 0 then
     STATAL3 ERROR(“BETAINV”,2,ALPHA1)
     else
   if ALPHA2 ⩽ 0 then
     STATAL3 ERROR(“BETAINV”,3,ALPHA2)
     else
   if PROB ⩽ TOL ∨ PROB ⩾ 1 - TOL then
     STATAL3 ERROR(“BETAINV”,1,PROB);

   X ≔ 0;
   BETAINV ≔ INVERSE(X,BETA(X,ALPHA1,ALPHA2),PROB,TOL)
end BETAINV;
eop
code 41521;
real procedure FISHER(X, DF1, DF2); value X, DF1, DF2;
   real X, DF1, DF2;
begin real IB;

   if DF1 ⩽ 0 then
     FISHER ≔ STATAL3 ERROR(“FISHER”,2,DF1)
     else
   if DF2 ⩽ 0 then
     FISHER ≔ STATAL3 ERROR(“FISHER”,3,DF2)
     else
   if X ⩽ 0 then FISHER ≔ 0
   else
   begin IB ≔ INCOMPLETE BETA(DF2/(DF2 + DF1 × X)
        , DF2/2,DF1/2,⏨-12);
      if IB < 0 then IB ≔ 0
        else if IB > 1 then IB ≔ 1;
      FISHER ≔ 1 - IB
   end
end FISHER;
eop
code 41522;
real procedure FISHERINV(PROB, DF1, DF2);
   value PROB, DF1, DF2; real PROB, DF1, DF2;
begin
   if PROB < ⏨-10 ∨ PROB > 1 - ⏨-10
     then STATAL3 ERROR(“FISHERINV”, 1, PROB)
     else if DF1 ⩽ 0
     then STATAL3 ERROR(“FISHERINV”, 2, DF1)
     else if DF2 ⩽ 0
     then STATAL3 ERROR(“FISHERINV”, 3, DF2)
   else
   begin real X;
      X ≔ if PROB ⩽ ·5 then ·5 else
        if DF2 ⩽ 4 then 1 else
        DF2 / (DF2 - 2) + PHINV(PROB) ×
        SQRT(2 × DF2 × DF2 × (DF1 + DF2 - 2) /
        (DF1 × (DF2 - 4) × (DF2- 2) × (DF2 - 2)));
      FISHERINV ≔         INVERSE(X, FISHER(X, DF1, DF2), PROB, ⏨-10)
   end
end FISHERINV;
eop
code 41525;
real procedure NCFISHER(X,DF1,DF2,DELTA);
   value X,DF1,DF2,DELTA; real X,DF1,DF2,DELTA;
begin integer J; real XX,FAKTOR1,FAKTOR2,EPS,SUM;

   if DF1 ⩽ 0 then STATAL3 ERROR(“NCFISHER”,2,DF1)
     else
   if DF2 ⩽ 0 then STATAL3 ERROR(“NCFISHER”,3,DF2)
     else
   if DELTA < 0 then
     STATAL3 ERROR(“NCFISHER”,4,DELTA)
     else if X ⩽ 0 then NCFISHER ≔ 0 else
   begin XX ≔ (DF1 × X) / (DF1 × X + DF2); EPS ≔ ⏨-12;
      DF1 ≔ DF1 / 2; DF2 ≔ DF2 / 2; DELTA ≔ DELTA / 2;
      FAKTOR1 ≔ 1;
      FAKTOR2 ≔ SUM ≔ INCOMPLETE BETA(XX,DF1,DF2,EPS);
      if DELTA = 0 then goto UIT;
      J ≔ 0; for J ≔ J + 1 while FAKTOR2 > EPS do
         begin FAKTOR1 ≔ FAKTOR1 × DELTA / J;
            FAKTOR2 ≔ FAKTOR1 ×
              INCOMPLETE BETA(XX,DF1 + J,DF2,EPS);
            SUM ≔ SUM + FAKTOR2
         end;
      UIT: NCFISHER ≔ EXP(-DELTA) × SUM
   end
end NCFISHER;
eop
code 41530;
real procedure STUDENT(X, DF); value X, DF;
   real X, DF;
begin realIB;

   if DF ⩽ 0 then
     STUDENT ≔ STATAL3 ERROR(“STUDENT”,2,DF)
   else
   begin IB ≔         INCOMPLETE BETA(DF/(DF + X × X),DF/2,0·5,⏨-12);
      if IB < 0 then IB ≔ 0
        else if IB > 2 then IB ≔ 2;
      STUDENT ≔ if X < 0 then IB / 2 else 1 - IB / 2
   end
end STUDENT;
eop
code 41531;
real procedure STUDENTINV(PROB, DF);
   value PROB, DF; real PROB, DF;
begin
   if PROB < ⏨-10 ∨ PROB > 1 - ⏨-10
     then STATAL3 ERROR(“STUDENTINV”, 1, PROB)
     else if DF ⩽ 0
     then STATAL3 ERROR(“STUDENTINV”, 2, DF)
   else
   begin real X, U, U2;
      U ≔ PHINV(PROB); U2 ≔ U × U;
      X ≔ U × (1 + (U2 + 1) / 4 / DF +
        (3 + U2 × (U2 × 5 + 16)) / 96 / DF / DF);
      STUDENTINV ≔ INVERSE(X, STUDENT(X, DF), PROB, ⏨-10)
   end
end STUDENTINV;
eop
code 41533;
real procedure NCSTUDENT(X, DF, DELTA);
   value X, DF, DELTA; real X, DF, DELTA;
begin real A, B, A2, WB, D2, TOL, TOLI, H, HELP, RESULT;
   Boolean DFEVEN;

   real procedure INTEGRATE(Y0, Y4, F0, F2, F4);
      value Y0, Y4, F0, F2, F4; real Y0, Y4, F0, F2, F4;
   begin real F1, F3, Y2, TEE, Y;
      Y2 ≔ Y0 + Y4)/2;
      Y ≔ Y0 + Y2)/2; F1 ≔ EXP(H×(1 + Y×Y))/(1 + Y×Y);
      Y ≔ Y2 + Y4)/2; F3 ≔ EXP(H×(1 + Y×Y))/(1 + Y×Y);
      TEE ≔ ×F2 - 4×(F1 + F3) + F0 + F4;
      INTEGRATE ≔ ̲f ABS(TEE) < TOLI
        then (Y4 - Y0)×(4×(F1 + F3) + 2×F2 +
        F0 + F4 - TEE/15)
      else INTEGRATE(Y0, Y2, F0, F1, F2) +
        INTEGRATE(Y2, Y4, F2, F3, F4);
   end INTEGRATE;

   real procedure SUMMATION OF FACTORS M;
   begin integer I;
      real MSUM, COEF, MIMIN2, MIMIN1, MI;
      Boolean ADD;
      MSUM ≔ 0;
      if DF > 1 then
      begin
         MIMIN2 ≔ A×WB × EXP(H) × PHI(HELP×WB) ×·3989422804;
         if DFEVEN then MSUM ≔ MSUM + MIMIN2;
         if DF > 2 then
         begin COEF ≔ 1;
            MIMIN1 ≔ B×(HELP×MIMIN2 +
              A×·1591549431×EXP(-·5×D2));
            if ¬ DFEVEN then MSUM ≔ MSUM + MIMIN1;
            ADD ≔ DFEVEN;
            for I ≔ 2 step 1 until DF - 2 do
               begin MI ≔ (I - 1)/I×B×
                    (COEF×HELP×MIMIN1 + MIMIN2);
                  if ADD then MSUM ≔ MSUM + MI;
                  ADD ≔  ADD; COEF ≔ 1/(I - 1)/COEF;
                  MIMIN2 ≔ MIMIN1; MIMIN1 ≔ MI;
               end I;
         end DF>2;
      end DF>1;
      SUMMATION OF FACTORS M ≔ MSUM;
   end SUMMATION OF FACTORS M;

   procedure INITIALISATION;
   begin TOL ≔ ⏨-8;
      if DF < 1 ∨ ENTIER(DF) ≠ DF then
        STATAL3 ERROR(“NCSTUDENT”, 2, DF);
      DFEVEN ≔ ENTIER(DF/2) = DF/2;
      A ≔ X/SQRT(DF); A2 ≔ A×A; D2 ≔ DELTA×DELTA;
      HELP ≔ DELTA×A;
      B ≔ F/(DF + X×X); WB ≔ SQRT(B); H ≔ D2×B×·5;
      if ABS(A) > TOL then TOLI ≔ 180 × TOL / ABS(A);
   end INITIALISATION;

   INITIALISATION;

   RESULT ≔      if DFEVEN then
     PHI(-DELTA) + SUMMATION OF FACTORS M × 2·5066282746
   else
     PHI(-DELTA×WB) + SUMMATION OF FACTORS M × 2 +
     (if ABS(A) ⩽ TOL then 0 else·31830 98862 × INTEGRATE(0, A, EXP(H),
     EXP(H×(1 + A2/4))/(1 + A2/4),
     EXP(H×(1 + A2))/(1 + A2)) / 12);

   NCSTUDENT ≔      if TOL ⩽ RESULT ∧ RESULT ⩽ 1 - TOL then RESULT
   else
     if ABS(RESULT) < TOL then 0 else
     if ABS(RESULT - 1) < TOL then 1 else
     STATAL3 ERROR(“NCSTUDENT”, 0, RESULT);
end NCSTUDENT;
eop
code 41534;
real procedure NCSTUDENTINVC(PROB, DF, DELTA);
   value PROB, DF, DELTA; real PROB, DF, DELTA;
begin real X, Y, TOL;

   procedure CORNISH FISHER EXPANSION;
   begin real UA, UA2, UA3, UA4, UA5;
      integer DF4, DFDF;
      UA ≔ HINV(PROB);
      UA2 ≔ A×UA; UA3 ≔ A2×UA; UA4 ≔ A2×UA2;
      UA5 ≔ A4×UA; DF4 ≔ F×4; DFDF ≔ F×DF;
      X ≔ UA/DFDF/32;
      X ≔ ×DELTA - (UA2 - 1)/DFDF/24;
      X ≔ ×DELTA + UA/DF4 + (UA3 + UA×4)/DFDF/16;
      X ≔ ×DELTA + 1 + (UA2×2 + 1)/DF4 +
        (UA4×4 + UA2×12 + 1)/DFDF/32;
      X ≔ ×DELTA + UA + (UA3 + UA)/DF4 + (UA5×5 + UA3×16
        + UA×3)/DFDF/96;
   end INITIAL APPROXIMATION BY CORNISH-FISHER METHOD;

   TOL ≔ ⏨-7;
   if PROB < TOL ∨ PROB > 1 - TOL then
     STATAL3 ERROR(“NCSTUDENTINV”, 1, PROB);
   if DF < 1 ∨ ENTIER(DF) ≠ DF then
     STATAL3 ERROR(“NCSTUDENTINV”, 2, DF);

   CORNISH FISHER EXPANSION;

   NCSTUDENTINV ≔      INVERSE(X, NCSTUDENT(X, DF, DELTA), PROB, TOL)
end NCSTUDENTINV;
eop
code 41539;
real procedure LOGNORMAL(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
   LOGNORMAL ≔ if SIGMA ⩽ 0
     then STATAL3 ERROR(“LOGNORMAL”, 3, SIGMA)
   else if X ⩽ 0 then 0
   else PHI((LN(X) - MU) / SIGMA);
eop
code 41540;
real procedure LOGNORMALINV(PROB, MU, SIGMA);
   value PROB, MU, SIGMA; real PROB, MU, SIGMA;
   LOGNORMALINV ≔ if SIGMA ⩽ 0
     then STATAL3 ERROR(“LOGNORMALINV”, 3, SIGMA)
   else if PROB < ⏨-14 ∨ PROB > 1 - ⏨-14
     then STATAL3 ERROR(“LOGNORMALINV”, 1, PROB)
   else EXP(PHINV(PROB) × SIGMA + MU);
eop
code 41541;
real procedure CAUCHY(X, LOC, SCALE);
   value X, LOC, SCALE; real X, LOC, SCALE;
   CAUCHY ≔ if SCALE ⩽ 0
     then STATAL3 ERROR(“CAUCHY”, 3, SCALE)
   else ARCTAN((X - LOC) / SCALE) × ·31830988618379 + ·5;
eop
code 41542;
real procedure CAUCHYINV (PROB, LOC, SCALE);
   value PROB, LOC, SCALE; real PROB, LOC, SCALE;
begin real ARG;
   ARG ≔ 3·1415 92653 5898 × PROB;
   CAUCHYINV ≔ if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR (“CAUCHYINV”, 1, PROB)
   else if SCALE ⩽ 0 then
     STATAL3 ERROR (“CAUCHYINV”, 3, SCALE)
   else
     -SCALE × COS (ARG) / SIN (ARG) + LOC
end CAUCHYINV;
eop
code 41545;
real procedure WEIBULL(X, LOC, SCALE, ALPHA);
   value X, LOC, SCALE, ALPHA; real X, LOC, SCALE, ALPHA;
   WEIBULL ≔ if SCALE ⩽ 0
     then STATAL3 ERROR(“WEIBULL”, 3, SCALE)
   else if ALPHA ⩽ 0
     then STATAL3 ERROR(“WEIBULL”, 4, ALPHA)
   else if X ⩽ LOC then 0
   else 1 - EXP(-((X - LOC) / SCALE) ⭡ ALPHA);
eop
code 41546;
real procedure WEIBULLINV(PROB,LOC,SCALE,ALPHA);
   value PROB,LOC,SCALE,ALPHA; real PROB,LOC,SCALE,ALPHA;
begin
   if PROB ⩽ ⏨-10 ∨ PROB ⩾ 1 - ⏨-10 then
     STATAL3 ERROR(“WEIBULLINV”,1,PROB) else
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“WEIBULLINV”,3,SCALE)
     else
   if ALPHA ⩽ 0 then
     STATAL3 ERROR(“WEIBULLINV”,4,ALPHA);

   WEIBULLINV ≔ LOC + SCALE × (-LN(1 - PROB)) ⭡ (1 / ALPHA)
end WEIBULLINV;
eop
code 41550;
real procedure LOGISTIC(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
   LOGISTIC ≔ if SIGMA ⩽ 0
     then STATAL3 ERROR(“LOGISTIC”, 3, SIGMA)
   else 1 / (1 + EXP(-(X - MU) / SIGMA));
eop
code 41551;
real procedure LOGISTICINV (PROB, MU, SIGMA);
   value PROB, MU, SIGMA; real PROB, MU, SIGMA;
   LOGISTICINV ≔ if SIGMA ⩽ 0
     then   STATAL3 ERROR(“LOGISTICINV”, 3, SIGMA)
   else   if PROB ⩽ 0 ∨ PROB ⩾ 1
     then   STATAL3 ERROR(“LOGISTICINV”, 1, PROB)
   else   - SIGMA × LN((1 - PROB) / PROB) + MU;
eop
code 41556;
real procedure KOLSMIR(D, XSIZE, YSIZE, EPS);
   value D, XSIZE, YSIZE, EPS; real D, XSIZE, YSIZE, EPS;
begin integer I, KGV, M, N;
   integer procedure GGD(M, N);
      value M, N; integer M, N;
      GGD ≔ if N = 0 then M else GGD(N, M - M ÷ N × N);

   procedure APPROX;
   begin integer K; real SUM, X, TERM, THETA;
      SUM ≔ ·5; THETA ≔ (1 + (M / KGV) ⭡ 1·2) / (M + N);
      X ≔ (I / KGV + THETA) ⭡ 2 × 2 / (1 / M + 1 / N);
      for K ≔ 1, K + 2 while TERM > EPS do
         begin TERM ≔ EXP(-X × K × K);
            SUM ≔ SUM - TERM × (1 - EXP(-X × (2 × K + 1)))
         end;
      KOLSMIR ≔ 2 × SUM
   end;

   procedure EXACT;
   begin integer array LOW[0:N]; array H[0:M];
      integer DMN, MN1, X, Y, UPP; real SUM, BINCOEF;
      BINCOEF ≔ 1; LOW[0] ≔ 0; MN1 ≔ M + N + 1;
      DMN ≔ I × M × N / KGV;
      for X ≔ 1 step 1 until N do
         begin integer T, TN;
            T ≔ M × X - DMN; TN ≔ T ÷ N;
            LOW[X] ≔ if T ⩽ 0 then 0 else
              if TN = T / N then TN else TN + 1;
            BINCOEF ≔ BINCOEF × (MN1 - X) / X;
            if BINCOEF > ⏨318 then
            begin EPS ≔ ⏨-4;goto L end
         end;
      H[0] ≔ 1;
      for Y ≔ 1 step 1 until M do H[Y] ≔ 0;
      for X ≔ 0 step 1 until N do
         begin Y ≔ LOW[X]; SUM ≔ H[Y];
            UPP ≔ M - LOW[N - X];
            for  Y ≔ Y + 1 step 1 until UPP do
                 H[Y] ≔ SUM ≔ SUM + H[Y]
         end;
      KOLSMIR ≔ SUM / BINCOEF
   end;
   if XSIZE ⩽ 0 ∨ XSIZE > ENTIER(XSIZE) then
     STATAL3 ERROR(“KOLSMIR”, 2, XSIZE);
   if YSIZE ⩽ 0 ∨ YSIZE > ENTIER(YSIZE) then
     STATAL3 ERROR(“KOLSMIR”, 3, YSIZE);
   if XSIZE < YSIZE then
   begin N ≔ XSIZE; M ≔ YSIZE end
   else begin M ≔ XSIZE; N ≔ YSIZE end;
   if EPS < 0 ∨ EPS > ⏨-2 then EPS ≔ ⏨-3;
   if XSIZE < YSIZE then
   begin N ≔ XSIZE; M ≔ YSIZE end
   else begin M ≔ XSIZE; N ≔ YSIZE end;
   KGV ≔ M × N / GGD(M, N);
   I ≔ ENTIER((1 + ⏨-14) × D × KGV);
   if EPS ⩾ ⏨-3 then L: APPROX else EXACT;
end KOLSMIR;
eop
code 41558;
real procedure BIVANORM(H, K, RHO); value H, K, RHO;
   real H, K, RHO;
begin real B;

   real procedure V(H, K, EPS); value H, K, EPS;
      real H, K, EPS;
      if H = 0 ∨ K = 0 then V ≔ 0 else
      if ABS(H) < ABS(K) then
        V ≔ (PHI(H) - ·5) × (PHI(K) - ·5) - V(K, H, EPS)
        else
      if ABS(K)> 8 then
        V ≔ 15915 49430 9189 × ARCTAN (K/H)
      else
      begin real M, L, L2, S, R, T, SS, TSN; integer N;
         L ≔ K / H; M ≔ H × H / 2; L2 ≔ L × L; R ≔ EXP(-M);
         S ≔ 1 - R; T ≔ L; SS ≔ T × S;
         for N ≔ 1, N + 1 while ABS(TSN) ⩾ EPS do
            begin R ≔ R × M / N; S ≔ S - R; T ≔ -T × L2;
               TSN ≔  × T / (2 × N + 1);
               SS ≔ SS + TSN
            end;
         V ≔ SS × ·15915 49430 9189
      end V;

   if H < -8 ∨ K < -8 then B ≔  else
   if H > 8 ∧ K > 8 then B ≔  else
     B ≔ if ABS(RHO) > 1 then
     STATAL3 ERROR(“BIVANORM”, 3, RHO)
   else if ABS(RHO) = 1 then
     (if RHO = 1 then (if K ⩽ H then PHI(K)
   else PHI(H))
   else (if H ⩽ -K then 0
   else PHI(K) - PHI(H)))
   else V(H,(K - RHO × H)/ SQRT(1 - RHO ⭡ 2), ⏨-14)
     + V(K,(H - RHO × K)/ SQRT(1 - RHO ⭡ 2), ⏨-14)
     + ·5 × (PHI(H) + PHI(K))
     - ·15915 49430 9189 × ARCCOS(RHO);
   if B < 0 then BIVANORM ≔  else BIVANORM ≔ ;
end BIVANORM;
eop
code 41560;
real procedure STUDRANGE(Q,N,NU);
   value Q,N,NU; real Q,N,NU;
begin real X, PI, LN4, LNSQRT2PI, LNSQRTPI4;
   array E[1 : 3];

   real procedure POWER(X)TO:(N); value X, N;
      real X; integer N;
   begin integer N2; real Y;
      Y ≔ 1;
      WHILE POS N:
      if N ⩽ 0 then goto END WHILE POS N;
      N2 ≔ N ÷ 2;
      WHILE EVEN N:
      if N2 × 2 ≠ N then goto END WHILE EVEN N;
      N ≔ N2; X ≔ X × X; N2 ≔ N ÷ 2;
      goto WHILE EVEN N;
      END WHILE EVEN N:
      N ≔ N - 1; Y ≔ Y × X;
      goto WHILE POS N;
      END WHILE POS N:
      POWER ≔ Y
   end POWER;

   real procedure RANGE(T,N); value T,N; real T,N;
   begin real U; real array E[1:3];
      E[1] ≔ E[2] ≔ ⏨-7;
      RANGE ≔ N × QADRAT(U, -5, +5,
        PHIDENS(U) × POWER(PHI(U + T) - PHI(U), N - 1), E);
   end RANGE;

   real procedure INTEGRAND(X); value X; real X;
   begin real XQ;
      XQ ≔ X / Q;
      INTEGRAND ≔ EXP(NU × (LN4 + LN(XQ) - LNSQRT2PI
        - XQ × XQ / 2)) × (1 - RANGE(X, N)) / X;
   end INTEGRAND;

   if N < 2 ∨ ENTIER(N) < N then
     STATAL ERROR(“STUDRANGE”, 2, N);
   if NU < 1 ∨ ENTIER(NU) < NU then
     STATAL ERROR(“STUDRANGE”, 3, NU);

   E[1] ≔ E[2] ≔ ⏨-6; PI ≔ ARCTAN(1) × 4;
   LNSQRT2PI ≔ ·5 × LN(2 × PI); LN4 ≔ LN(4);
   LNSQRTPI4 ≔ ·5 × LN(PI) - LN4;
   STUDRANGE ≔ if Q ⩽ 0 then 0 else
     1 - 2 × EXP(NU × (LN(NU) / 2 + LNSQRTPI4)
     - LOGGAMMA(NU / 2)) ×
     QADRAT(X, ⏨-6, Q × 7, INTEGRAND(X), E);
end STUDRANGE;
eop
code 41561;
real procedure EXPON (X, LAMBDA);
   value X, LAMBDA; real X, LAMBDA;
   EXPON ≔ if LAMBDA ⩽ 0
     then STATAL3 ERROR(“EXPON”, 2, LAMBDA)
   else if X ⩽ 0 then 0
   else 1 - EXP(-LAMBDA × X);
eop
code 41562;
real procedure EXPONINV(PROB, LAMBDA);
   value PROB, LAMBDA; real PROB, LAMBDA;
   EXPONINV ≔ if LAMBDA ⩽ 0
     then STATAL3 ERROR(“EXPONINV”,2,LAMBDA)
   else if PROB ⩽ 0 ∨ PROB ⩾ 1
     then STATAL3 ERROR(“EXPONINV”,1,PROB)
   else - LN(1 - PROB) / LAMBDA;
eop
code 41563;
real procedure ERLANG(X, N, SCALE);
   value X, N, SCALE; real X, N, SCALE;
   ERLANG ≔ if SCALE ⩽ 0
     then STATAL3 ERROR(“ERLANG”, 3, SCALE)
   else if N ⩽ 0 ∨ ENTIER(N) < N
     then STATAL3 ERROR(“ERLANG”, 2, N)
   else GAMMA(X, N, SCALE);
eop
code 41564;
real procedure ERLANGINV(PROB,ALPHA,SCALE);
   value PROB,ALPHA,SCALE; real PROB,ALPHA,SCALE;
   if PROB ⩽ ⏨-10 ∨ PROB ⩾ 1 - ⏨-10 then
     STATAL3 ERROR(“ERLANGINV”,1,PROB)
     else if ALPHA ⩽ 0 ∨ ENTIER(ALPHA) < ALPHA then
     STATAL3 ERROR(“ERLANGINV”,2,ALPHA)
     else if SCALE ⩽ 0 then
     STATAL3 ERROR(“ERLANGINV”,3,SCALE)
   else ERLANGINV ≔ GAMMAINV(PROB,ALPHA, SCALE);
eop
code 41565;
real procedure LAPLACE(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
begin
   if SIGMA ⩽ 0 then
     STATAL3 ERROR(“LAPLACE”, 3, SIGMA);
   X ≔ (X - MU) / SIGMA;
   LAPLACE ≔ ·5 × (1 + (1 - EXP(-ABS(X))) × SIGN(X))
end LAPLACE;
eop
code 41566;
real procedure LAPLACEINV(PROB,LOC,SCALE);
   value PROB, LOC, SCALE; real PROB, LOC, SCALE;
begin
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“LAPLACEINV”,3,SCALE);
   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“LAPLACEINV”,1,PROB);
   if PROB ⩽ ·5 then
     LAPLACEINV ≔ LOC + LN(2 × PROB) × SCALE
   else
     LAPLACEINV ≔ LOC - LN(2 × (1 - PROB)) × SCALE;
end LAPLACEINV;
eop
code 41567;
real procedure UNIFORM(X, A, B);
   value X, A, B; real X, A, B;
begin
   if B ⩽ A then
     STATAL3ERROR(“UNIFORM”, 2, B);
   UNIFORM ≔ if X ⩽ A then 0 else
     if X ⩾ B then 1 else (X - A) / (B - A)
end UNIFORM;
eop
code 41568;
real procedure UNIFORMINV(PROB, A, B);
   value PROB, A, B; real PROB, A, B;
begin
   if B ⩽ A then STATAL3ERROR(“UNIFORMINV”, 2, B);
   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3ERROR(“UNIFORMINV”, 1, PROB);
   UNIFORMINV ≔ (B - A) × PROB + A
end UNIFORMINV;
eop
code 41569;
real procedure BINORCOR(R,RHO,N);
   value R, RHO, N; real R, RHO, N;
begin
   real procedure SAMCORBIVNORDEN(R,RHO,N);
      value R, RHO, N; real R, RHO, N;
   begin
      if ABS(R) ⩾ 1 then SAMCORBIVNORDEN ≔ 0
      else
      begin
         real W1, W3, Y1, Y2, Y3, Y4, N1, R2, RRHO,
           R2RHO2, W2, PI, RHO2;
         R2 ≔ R × R;
         RHO2 ≔ RHO × RHO;
         RRHO ≔ R × RHO;
         R2RHO2 ≔ R2 × RHO2;
         W1 ≔ SQRT(1 - R2);
         W2 ≔ SQRT(1 - RHO2);
         W3 ≔ SQRT(1 - RHO2 × R2);
         PI ≔ ARCTAN(1) × 4;
         N1 ≔ N - 1;
         if N < 15 then
         begin
            real array SB[3:N]; integer I;
            SB[3] ≔               (1-RHO2) / PI / W1 × (1 + RRHO ×
              ARCCOS(-RRHO) / W3) / (1 - R2RHO2);
            if N =3 then SAMCORBIVNORDEN ≔ SB[3]
            else
            begin
               SB[4] ≔                  (1 - RHO2) × W2 / PI × (3 × RRHO +
                 (1 + 2 × R2RHO2) × ARCCOS(-RRHO) / W3)
                 / (1 - R2RHO2) / (1 - R2RHO2);
               if N = 4 then SAMCORBIVNORDEN ≔ SB[4]
               else
               begin for I ≔ 5 step 1 until N do
                       SB[I] ≔                        (2 × I - 5) / (I - 3) × RRHO × W1 × W2
                       / (1 - R2RHO2) × SB[I-1] +
                       (I - 3) / (I - 4) × (1 - RHO2) ×
                       (1 - R2) / (1 - R2RHO2) × SB[I-2];
                  SAMCORBIVNORDEN ≔ SB[N];
               end;
            end;
         end
         else
         begin
            Y1 ≔ (RRHO + 2) / 8;
            Y2 ≔ (3 × RRHO + 2) × (3 × RRHO + 2) / 128;
            Y3 ≔ (((15 × RRHO + 18) × RRHO - 4)× RRHO - 8) × 5 / 1024;
            Y4 ≔ ((((3675 × RRHO + 4200) × RRHO - 2520)× RRHO - 3360) × RRHO - 336) / 32768;
            SAMCORBIVNORDEN ≔               (N - 2) / SQRT(N - 1) × (1 - RHO2) × W2× (W1 × W2 / (1 - RRHO)) ⭡ N1 ×
              SQRT((1 - RRHO) / 2 / PI)
              / ((1 - R2) × W1 × (1 - RHO2) × W2)× ((((Y4 / N1 + Y3) / N1 + Y2) / N1 + Y1)
              / N1 + 1);
         end;
      end;
   end SAMCORBIVNORDEN;
   if ABS(RHO) ⩾ 1 then
     STATAL3 ERROR(“BINORCOR”, 2, RHO)
     else if N > ENTIER(N) ∨ N < 3 then
     STATAL3 ERROR(“BINORCOR”, 3, N)
     else if R ⩽ -1 then BINORCOR ≔ 0
     else if R ⩾ 1 then BINORCOR ≔ 1
     else if RHO = 0 then
     BINORCOR ≔      STUDENT(R × SQRT((N - 2) / (1 - R × R)), N - 2)
     else
   if N ⩽ 500 then
   begin real W1, W2, W3, PI, R2, RHO2, RHO3,
        RHO4, RRHO, R2RHO2;
      R2 ≔ R × R;
      RHO2 ≔ RHO × RHO;
      RHO3 ≔ RHO2 × RHO;
      RHO4 ≔ RHO2 × RHO2;
      RRHO ≔ R × RHO;
      R2RHO2 ≔ R2 × RHO2;
      W1 ≔ SQRT(1 - R2);
      W2 ≔ SQRT(1 - RHO2);
      W3 ≔ SQRT(1 - RHO2 × R2);
      PI ≔ ARCTAN(1) × 4;
      if N = 3 then
        BINORCOR ≔         (ARCCOS(-R) - RHO × W1 / W3 × ARCCOS(-RRHO)) / PI
        else if N = 4 then
        BINORCOR ≔         W1 × W2 × SAMCORBIVNORDEN(R, RHO, 3) / RHO -
        (W2 / RHO - ARCCOS(RHO)) / PI
        else if N = 5 then
        BINORCOR ≔         W1 × W2 × SAMCORBIVNORDEN(R, RHO, 4) / 2 / RHO
        - R × (1 - R2) / 2 × SAMCORBIVNORDENC(R, RHO, 3)
        - W1 × (1 + RHO2) / (2 × PI × RHO) × ARCCOS(-RRHO)
        / W3 + ARCCOS(-R) / PI
        else
      if N = 6 then
        BINORCOR ≔         W2 × (1 - 4 × RHO2) / (3 × PI × RHO3)
        + ARCCOS(RHO) / PI
        - (1 - RHO2) × W1 × W2 / 3 / RHO3 ×
        SAMCORBIVNORDEN(R, RHO, 3)
        + (1 - RHO2) × R / 3 / RHO2 ×
        SAMCORBIVNORDEN(R, RHO, 4)
        + W1 × W2 / 3 / RHO × SAMCORBIVNORDEN(R, RHO, 5)
        else if N = 7 then
        BINORCOR ≔         ARCCOS(-R) / PI - (3 + 6 × RHO2 - RHO4) ×
        ARCCOS(-RRHO) / W3 × W1 / (8 × PI × RHO)
        -R × (1 - R2) × (4 - 3 × RHO2 + 3 × RHO4) / 8 /
        RHO2 × SAMCORBIVNORDEN(R, RHO, 3)
        - R2 × W1 × W2 × (2 - RHO2) / 8 / RHO ×
        SAMCORBIVNORDEN(R, RHO, 4)
        + (1 - RHO2) × R / 4 / RHO2 ×
        SAMCORBIVNORDEN(R, RHO, 5)
        + W1 × W2 / 4 / RHO × SAMCORBIVNORDEN(R, RHO, 6)
        else if N = 8 then
        BINORCOR ≔ ARCCOS(RHO)
        / PI - W2 × (3 - 11 × RHO2 + 23 × RHO4)
        / 15 / PI / RHO4 / RHO
        + (W2 / RHO) ⭡ 5 × W1 / 5 ×
        SAMCORBIVNORDEN(R, RHO, 3)
        - R × (1-RHO2) × (1-RHO2) / 5 / RHO4 ×
        SAMCORBIVNORDEN(R, RHO, 4)
        + (3 × R2 - 1) × (1 - RHO2) × W2 / W1 / 15 / RHO3× SAMCORBIVNORDEN(R, RHO, 5)
        + (1 - RHO2) × R / 5 / RHO2 ×
        SAMCORBIVNORDEN(R, RHO, 6)
        + W1 × W2 / 5 / RHO × SAMCORBIVNORDENC(R, RHO, 7)
      else
      begin real array E[1:3]; real X;
         E[1] ≔ E[2] ≔ ⏨-6;
         BINORCOR ≔            STUDENT(-RHO × SQRT(N - 1) / W2, N - 1)
           + QADRAT(X, 0, R, SAMCORBIVNORDEN(X, RHO, N), E)
      end;
   end
   else
   begin real R2, RHO2, RHO3; integer N1, N2, N3;
      N1 ≔ N - 1; N2 ≔ N1 × N1; N3 ≔ N1 × N2;
      R2 ≔ R × R;
      RHO2 ≔ RHO × RHO;
      RHO3 ≔ RHO2 × RHO;
      BINORCOR ≔         if ABS(RHO) ⩽ ·7 then
        PHI((R × SQRT((N - 2·5) / (1 - R2)) -
        RHO × SQRT((N - 1·5) / (1 - RHO2)))
        / SQRT(1 + RHO2 / 2 / (1 - RHO2) + R2 /
        2 / (1 - R2)))
      else
        PHI((·5 × LN((1 + R) × (1 - RHO) / (1 - R) /
        (1 + RHO)) - RHO / 2/ N1 -
        (5 × RHO + RHO3) / 8 / N2 - (11 × RHO +
        (2 + RHO2) × 3 × RHO3) / 16 / N3)
        / SQRT(1 / N1 + (4 - RHO2) / 2 / N2 +
        (22 - (6 - 3 × RHO2) × RHO2) / 6 / N3));
   end;
end  BINORCOR;
eop
code 41571;
real procedure EXTVAL(X, LOC, SCALE);
   value X, LOC, SCALE; real X, LOC, SCALE;
begin
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“EXTVAL”, 3, SCALE);
   X ≔ -(X - LOC) / SCALE;
   EXTVAL ≔ if X > LN(-LN(MINREAL))
     then 0
   else EXP(-EXP(X));
end EXTVAL;
eop
code 41572;
real procedure EXTVALINV(PROB, LOC, SCALE);
   value PROB, LOC, SCALE; real PROB, LOC, SCALE;
begin
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“EXTVALINV”, 3, SCALE);
   if PROB ⩽ 0 ∨ PROB ⩾ 1 then
     STATAL3 ERROR(“EXTVALINV”, 1, PROB);
   EXTVALINV ≔ -SCALE × LN(-LN(PROB)) + LOC
end EXTVALINV;
eop
code 41751;
real procedure UNIFORMDENS(X, A, B);
   value X, A, B; real X,A,B;
begin
   if B ⩽ A
     then STATAL3ERROR(“UNIFORMDENS”, 2, B);
   UNIFORMDENS ≔ if X ⩽ A ∨ X > B
     then 0 else 1 / (B - A)
end UNIFORMDENS;
eop
code 41752;
real procedure PHIDENS(X); value X;
   PHIDENS ≔ ·39894228040143 × EXP(- X × X / 2);
eop
code 41753;
real procedure NORMALDENS(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
   NORMALDENS ≔ if SIGMA ⩽ 0
     then
     STATAL3 ERROR(“NORMALDENS”, 3, SIGMA)
   else EXP(-(((X - MU) / SIGMA) ⭡ 2) / 2)× ·39894228040143 / SIGMA;
eop
code 41754;
real procedure LOGNORMALDENS(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
   LOGNORMALDENS ≔ if SIGMA ⩽ 0
     then
     STATAL3 ERROR(“LOGNORMALDENS”, 3, SIGMA)
   else if X ⩽ 0 then 0
   else
     EXP(-(((LN(X) - MU) / SIGMA) ⭡ 2) / 2)× ·39894228040143 / X / SIGMA;
eop
code 41755;
real procedure EXPONDENS(X, LAMBDA); value X, LAMBDA;
   real X, LAMBDA;
   EXPONDENS ≔ if LAMBDA ⩽ 0
     then
     STATAL3 ERROR(“EXPONDENS”, 2, LAMBDA)
   else if X ⩽ 0 then 0
   else LAMBDA × EXP(- LAMBDA × X);
eop
code 41756;
real procedure GAMMADENS(X,ALPHA, SCALE);
   value X,ALPHA,SCALE; real X,ALPHA,SCALE;
   if X ⩽ 0 then GAMMADENS ≔ 0 else
   begin
      if ALPHA ⩽ 0
        then STATAL3 ERROR(“GAMMADENS”,2,ALPHA)
        else if SCALE ⩽ 0
        then STATAL3 ERROR(“GAMMADENS”, 35,SCALE);

      GAMMADENS ≔         EXP(- ALPHA × LN(SCALE) - LOGGAMMA(ALPHA) -
        X / SCALE + (ALPHA - 1) × LN(X))
   end GAMMADENS;
eop
code 41757;
real procedure ERLANGDENS(X,ALPHA,SCALE);
   value X,ALPHA,SCALE; real X,ALPHA,SCALE;
   if X < 0
     then STATAL3 ERROR(“ERLANGDENS”,1,X) else
   if ALPHA ⩽ 0 ∨ ENTIER(ALPHA) < ALPHA then
     STATAL3 ERROR(“ERLANGDENS”,2,ALPHA) else
   if SCALE ⩽ 0
     then STATAL3 ERROR(“ERLANGDENS”,3,SCALE)
   else ERLANGDENS ≔ if X = 0 then 0 else
     EXP(-ALPHA × LN(SCALE) - LOGGAMMA(ALPHA) - X / SCALE +
     (ALPHA - 1) × LN(X));
eop
code 41758;
real procedure CHISQDENS(X, DF);
   value X, DF; real X, DF;
   CHISQDENS ≔ if DF ⩽ 0
     then STATAL3ERROR(“CHISQDENS”, 2, DF)
   else if X ⩽ 0 then 0 else
     EXP((DF / 2 - 1) × LN(X) - X / 2 -
     DF × LN(2) / 2 - LOGGAMMA(DF / 2));
eop
code 41759;
real procedure WEIBULLDENS(X,LOC,SCALE,ALPHA);
   value X,LOC,SCALE,ALPHA; real X,LOC,SCALE,ALPHA;
begin
   if SCALE ⩽ 0
     then STATAL3 ERROR(“WEIBULLDENS”,3,SCALE) else
   if ALPHA ⩽ 0 
     then STATAL3 ERROR(“WEIBULLDENS”,4,ALPHA);

   WEIBULLDENS ≔ if X ⩽ LOC then 0 else
     (ALPHA / SCALE) × EXP((ALPHA - 1) ×
     LN((X - LOC) / SCALE) - ((X - LOC) / SCALE) ⭡ ALPHA)
end WEIBULLDENS;
eop
code 41760;
real procedure BETADENS(X,ALPHA1,ALPHA2);
   value X,ALPHA1,ALPHA2; real X,ALPHA1,ALPHA2;
begin real BET;

   if ALPHA1 ⩽ 0
     then STATAL3 ERROR(“BETADENS”,2,ALPHA1);
   if ALPHA2 ⩽ 0
     then STATAL3 ERROR(“BETADENS”,3,ALPHA2);

   if X ⩽ 0 ∨ X ⩾ 1 then BETADENS ≔ 0 else
   begin BET ≔ EXP(LOGGAMMA(ALPHA1 + ALPHA2) -
        LOGGAMMA(ALPHA1) - LOGGAMMA(ALPHA2));
      BETADENS ≔ BET × EXP((ALPHA1 - 1) × LN(X) +
        (ALPHA2 - 1 ) × LN(1 - X))
   end;
end BETADENS;
eop
code 41761;
real procedure FISHERDENS(X, DF1, DF2);
   value X, DF1, DF2;
   real X, DF1, DF2;
   FISHERDENS ≔ if DF1 ⩽ 0
     then STATAL3 ERROR(“FISHERDENS”, 2, DF1)
   else
     if DF2 ⩽ 0
     then STATAL3 ERROR(“FISHERDENS”, 3, DF2)
   else
     if X ⩽ 0 then 0 else
     EXP(LOGGAMMA((DF1 + DF2) / 2) -
     LOGGAMMA(DF1 / 2) - LOGGAMMA(DF2 / 2) +
     (DF1 × LN(DF1) + DF2 × LN(DF2)) / 2 +
     (DF1 / 2 - 1) × LN(X) - (DF1 + DF2) / 2 ×
     LN(DF1 × X + DF2));
eop
code 41762;
real procedure STUDENTDENS(X, DF);
   value X, DF; real X, DF;
   STUDENTDENS ≔ if DF ⩽ 0
     then STATAL3 ERROR(“STUDENTDENS”, 2, DF)
   else
     EXP(LOGGAMMA((DF + 1) / 2) - LOGGAMMA(DF / 2) -
     (DF + 1) / 2 × LN(1 + X × X / DF) -
     LN(DF) / 2 - ·57236494299247);
eop
code 41763;
real procedure CAUCHYDENS(X,LOC,SCALE);
   value X,LOC,SCALE; real X,LOC,SCALE;
begin real PI,Q;

   if SCALE ⩽ 0
     then STATAL3 ERROR(“CAUCHYDENS”,3,SCALE);
   PI ≔ 3·1415926535898;
   Q ≔ (X - LOC) / SCALE;
   CAUCHYDENS ≔ 1 / (PI × SCALE × (1 + Q × Q))
end CAUCHYDENS;
eop
code 41764;
real procedure LAPLACEDENS(X,LOC,SCALE);
   value X, LOC, SCALE; real X, LOC, SCALE;
begin
   if SCALE ⩽ 0
     then STATAL3 ERROR(“LAPLACEDENS”,3,SCALE);
   X ≔ (X - LOC) / SCALE;
   LAPLACEDENS ≔ ·5 / SCALE × EXP(-ABS(X));
end LAPLACEDENS;
eop
code 41765;
real procedure LOGISTICDENS(X, MU, SIGMA);
   value X, MU, SIGMA; real X, MU, SIGMA;
begin
   if SIGMA ⩽ 0
     then STATAL3 ERROR(“LOGISTICDENS”, 3, SIGMA);
   X ≔ EXP(-(X - MU) / SIGMA);
   LOGISTICDENS ≔ X / ((1 + X) × (1 + X) × SIGMA)
end LOGISTICDENS;
eop
code 41766;
real procedure EXTVALDENS(X, LOC, SCALE);
   value X, LOC, SCALE; real X, LOC, SCALE;
begin
   if SCALE ⩽ 0 then
     STATAL3 ERROR(“EXTVALDENS”, 3, SCALE);
   X ≔ (X - LOC) / SCALE;
   EXTVALDENS ≔ EXP(-(X + EXP(-X))) / SCALE
end EXTVALDENS;
eop
code 49999;
real procedure ANDERSON DARLING(X, L, U, SORTED);
   value L, U, SORTED;
   array X; integer L, U; Boolean SORTED;
begin integer I, N;
   real MU, SIGMA, XI, FACTOR, SUM, ESTIMATE;

   N ≔ U - L +1;
   if N ⩽ 1 then
     STATAL3 ERROR(“ANDERSON-DARLING”, 3, U);
   if ¬ SORTED then VECQSORT(X, L, U);
   if X[L] = X[U] then
     STATAL3 ERROR(“ANDERSON-DARLING”, 1, X[L]);

   comment FIRST THE ESTIMATION (IN THE USUAL WAY) OF
     EXPECTATION AND STANDARD DEVIATION OF THE NORMAL
     DISTRIBUTION. ;
   MU ≔ SIGMA ≔ 0; ESTIMATE ≔ (X[L] + X[U]) / 2;
   for I ≔ L step 1 until U do
      begin XI ≔ X[I] ≔ X[I] - ESTIMATE;
         MU ≔ MU + XI; SIGMA ≔ SIGMA + XI × XI;
      end;
   MU ≔ MU / N;
   SIGMA ≔ SQRT((SIGMA - N × MU × MU) / (N - 1));

   comment TRANSFORMATION OF THE OBSERVATIONS TO
     UNIFORM(0, 1)-DISTRIBUTED QUANTITIES.;
   for I ≔ L step 1 until U do
        X[I] ≔ HI((X[I] - MU) / SIGMA);

   comment ANDERSON-DARLING TEST QUANTITY;

   SUM ≔ 0; FACTOR ≔ -1;
   for I ≔ L step 1 until U do
      begin FACTOR ≔ FACTOR + 2;
         SUM ≔ SUM +
           FACTOR × (LN(X[I]) + LN(1 - X[L + U - I]))
      end;
   ANDERSON DARLING ≔      (1 + 4 / N - 25 / N / N) × (-SUM / N - N)
end OF ANDERSON DARLING;
eop