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