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