code 36021;
procedure SNDREMEZ(N,M,S,G,EM);
value N,M;integer N,M;
integer array S; array G,EM;
comment SNDREMEZ EXCHANGES ATMOST N+1 NUMBERS ,GIVEN IN
INTEGER ARRAY S[0:N], WITH NUMBERS OUT OF THE
REFERENCE SET 0,...M, UNDER THE CONDITIONS:
I. THE ALTERNANCE PROPERTY OF THE FUNCTIONVALUES G[S[J]],
J=0,...N IS PRESERVED.
II. !G[S[J]]!>=!EM[0]!,J=0,...N.
III. THE FIRST INDEX K , WITH G[K]=INFINITY NORM OF G,
IS ONE OF THE RESULTING NUMBERS S[0],...S[N].
IN ARRAY G[0:M] ONE MUST GIVE ERROR FUNCTION VALUES.
MOREOVER,
EM[1]:=INFINITY NORM OF G,
THE PROCEDURE INFNRMVEC IS USED;
begin integer S0,SN,SJP1,I,J,K,UP,INDEXMAX,LOW,NM1;
real MAX,MSJP1,HI,HJ,HE,ABSE,H;
INDEX MAX:=S0:=SJP1:=S[0];
HE:=EM[0];LOW:=S0+1;
MAX:=MSJP1:=ABSE:=ABS(HE);
NM1:=N-1;
for J:= 0 step 1 until NM1 do
begin
UP:= S[J+1]-1;
H:= INFNRMVEC(LOW,UP,I,G);
if H > MAX then begin MAX:= H; INDEX MAX:= I end;
if H > ABSE then
begin if HE * G[I] > 0 then
begin S[J]:= if MSJP1 < H then I else SJP1;
SJP1:= S[J+1]; MSJP1:= ABSE
end else
begin S[J]:= SJP1; SJP1:= I; MSJP1:= H end
end else
begin S[J]:=SJP1; SJP1:=S[J+1]; MSJP1:= ABSE end;
HE:=-HE;LOW:=UP+2;
end FOR J; SN:= S[N]; S[N]:= SJP1;
HI:=INFNRMVEC(0,S0-1,I,G);
HJ:=INFNRMVEC(SN+1,M,J,G);
if J > M then J:=M;
if HI > HJ then
begin if HI > MAX then begin MAX:= HI; INDEXMAX:= I end;
if SIGN(G[I]) = SIGN(G[S[0]]) then
begin if HI > ABS(G[S[0]]) then
begin S[0]:= I;
if G[J]/G[S[N]] > 1 then S[N]:=J
end
end else
if HI > ABS(G[S[N]]) then
begin S[N]:= if G[J]/G[S[NM1]] > 1 then J else S[NM1];
for K:= NM1 step -1 until 1 do S[K]:= S[K-1];
S[0]:= I
end
end else
begin if HJ > MAX then begin MAX:= HJ; INDEXMAX:= J end;
if SIGN(G[J]) = SIGN(G[S[N]]) then
begin if HJ > ABS(G[S[N]]) then
begin S[N]:= J; if G[I]/G[S[0]] > 1 then S[0]:=I end
end else
if HJ > ABS(G[S[0]]) then
begin S[0]:= if G[I]/G[S[1]] > 1 then I else S[1];
for K:= 1 step 1 until NM 1 do S[K]:= S[K+1];
S[N]:= J
end
end RANDGEBIEDEN;
EM[1]:=MAX;
end SNDREMEZ;
eop