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