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