code 35086;
procedure ENX(X, N1, N2, A);
value X, N1, N2;
real X; integer N1, N2; array A;
if X<= 1.5 then
begin
real W, E; integer I;
W:= -EI(-X);
if N1=1 then A[1]:=W;
if N2>1 then E:= EXP(-X);
for I:=2 step 1 until N2 do
begin
W:= (E - X * W)/(I - 1);
if I>= N1 then A[I]:=W
end
end else
begin integer I, N; real W, E, AN;
N:=ENTIER(X+.5);
if N<=10 then
begin real F, W1, T, H;
real array P[2:19];
P[ 2]:=.37534261820491"-1; P[11]:=.135335283236613 ;
P[ 3]:=.89306465560228"-2; P[12]:=.497870683678639"-1;
P[ 4]:=.24233983686581"-2; P[13]:=.183156388887342"-1;
P[ 5]:=.70576069342458"-3; P[14]:=.673794699908547"-2;
P[ 6]:=.21480277819013"-3; P[15]:=.247875217666636"-2;
P[ 7]:=.67375807781018"-4; P[16]:=.911881965554516"-3;
P[ 8]:=.21600730159975"-4; P[17]:=.335462627902512"-3;
P[ 9]:=.70411579854292"-5; P[18]:=.123409804086680"-3;
P[10]:=.23253026570282"-5; P[19]:=.453999297624848"-4;
F:= W:= P[N];
E:= P[N+9];
W1:= T:= 1;
H:= X-N;
for I:=N-1, I-1 while ABS(W1)>"-15 * W do
begin
F:= (E - I * F)/N;
T:= -H * T / (N-I);
W1:= T * F; W:= W + W1
end
end else
begin
array B[N:N];
NONEXPENX(X, N, N, B);
W:= B[N] * EXP(-X)
end;
if N1=N2 & N1=N then A[N]:=W else
begin
E:= EXP(-X);
AN:=W;
if N<=N2 & N>=N1 then A[N]:=W;
for I:= N-1 step -1 until N1 do
begin
W:= (E - I * W)/X;
if I<= N2 then A[I]:= W
end;
W:=AN;
for I:=N+1 step 1 until N2 do
begin
W:= (E - X * W)/(I - 1);
if I>=N1 then A[I]:=W
end
end
end ENX
eop