code 41010; real procedure NEGBININV(PROB, K, P, LEFT); value PROB, K, P, LEFT; real PROB, K, P; Boolean LEFT; begin integer X; real PX, PCUM; if PROB ≤ 0 ∨ PROB ≥ 1 then STATAL3 ERROR(“NEGBININV”, 1, PROB) else if K > ENTIER(K) ∨ K < 0 then STATAL3 ERROR(“NEGBININV”, 2, K) else if P ≤ 0 ∨ P > 1 then STATAL3 ERROR(“NEGBININV”, 3, P); if P = 1 ∨ K = 0 then NEGBININV:= (if LEFT then K - 1 else K + 1) else if LEFT then begin X:= (PHINV(PROB) × SQRT(K × (1 - P)) + K - P / 2) / P; if X < K then X:= K; if PROB < P ⭡ K then NEGBININV:= K - 1 else begin PX:= NEGBINPROB(X, K, P); PCUM:= NEGBIN(X, K, P); if PCUM > PROB then begin for PCUM:= PCUM - PX while PCUM > PROB do begin PX:= PX × (X - K) / (1 - P) / (X - 1); X:= X - 1 end; X:= X - 1 end else begin for PX:= PX × (1- P) × X / (X - K + 1) while PCUM + PX < PROB do begin X:= X + 1; PCUM:= PCUM + PX end end; NEGBININV:= X end end else begin X:= (PHINV(1 - PROB) × SQRT(K × (1 - P)) + K + P / 2) / P; if X > K then X:= K; PCUM:= 1 - NEGBIN(X - 1, K, P); PX:= NEGBINPROB(X, K, P); if PCUM < PROB then begin for PX:= PX × (X - K) / (1 - P) / (X - 1) while PCUM + PX < PROB do begin X:= X - 1; PCUM:= PCUM + PX end end else begin for PCUM:= PCUM - PX while PCUM > PROB do begin PX:= PX × (1 - P) × X / (X - K + 1); X:= X + 1 end; X:= X + 1 end end; NEGBININV:= X end NEGBININV; eop