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 > 105 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