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