code 41027;
real procedure KENDALLINV(PROB, N, LEFT);
value PROB, N, LEFT; real PROB, N; Boolean LEFT;
begin integer S, G; real P, PCUM;
if PROB ≤ 0 ∨ PROB ≥ 1 then
STATAL3 ERROR(“KENDALLINV”, 1, PROB) else
if N < 0 ∨ ENTIER(N) < N then
STATAL3 ERROR(“KENDALLINV”, 2, N);
G:= N × (N - 1) / 2;
if N = 0 then
KENDALLINV:= (if LEFT then -1 else +1)
else if LEFT then
begin S:= PHINV(PROB) × SQRT(G × (N × 2 + 5) / 9);
S:= if ABS(S) > G then G × SIGN(S) else
G + ENTIER(-(G - S) / 2) × 2;
if PROB < KENDALLPROB(-G, N) then
KENDALLINV:= -G - 2
else
begin PCUM:= KENDALL(S, N);
if PCUM ≤ PROB then
begin for P:= KENDALLPROB(S + 2, N)
while PCUM + P ≤ PROB do
begin S:= S + 2; PCUM:= PCUM + P end
end else
begin for P:= KENDALLPROB(S, N)
while PCUM - P > PROB do
begin S:= S - 2; PCUM:= PCUM - P end;
S:=S-2
end; KENDALLINV:= S
end
end else
begin S:= PHINV(1 - PROB) × SQRT(G × (N × 2 + 5) / 9);
S:= if ABS(S) > G then G × SIGN(S) else
G - ENTIER((G - S) / 2) × 2;
if PROB < KENDALLPROB(G, N) then
KENDALLINV:= G + 2 else
begin PCUM:= 1 - KENDALL(S - 2, N);
if PCUM ≤ PROB then
begin for P:= KENDALLPROB(S - 2, N)
while PCUM + P ≤ PROB do
begin S:= S - 2; PCUM:= PCUM + P end
end else
begin for P:= KENDALLPROB(S, ND)
while PCUM - P > PROB do
begin S:= S + 2; PCUM:= PCUM - P end;
S:= S +2
end;
KENDALLINV:= S
end
end
end KENDALLINV;
eop