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