code 36022;
 procedure MINMAXPOL(N,M,Y,FY,CO,EM);
 value N,M;integer N,M;
 array Y,FY,CO,EM;
 comment MINMAXPOL CALCULATES THE COEFFICIENTS,
 CO[I],I=,.....N OF THE POLYNOMIAL
 P(Y)=CO[0]+CO[1]*Y+...+CO[N]*Y**N,
 THAT APPROXIMATES THE DISCRETE FUNCTION FY[I],I=0,...M,
 GIVEN FOR THE ARGUMENTS Y[I],I=0,...M,
 IN THE MINIMAX NORM.
 THE ARGUMENTS MUST BE GIVEN IN MONOTONE INCREASING ORDER.
 IN ARRAY EM[0:3], ONE MUST GIVE THE MAXIMUM ALLOWED NUMBER OF
 ITERATIONS,EM[2].
 MOREOVER,
 EM[0]:=THE DIFFERENCE OF THE GIVEN FUNCTION AND THE POLYNOMIAL
 IN THE FIRST APPROXIMATION POINT,
 EM[1]:=THE MAXIMUM OF ! P(Y[I])-FY[I]!  FOR I=0,...M,
 EM[3]:=THE NUMBER OF ITERATIONS PERFORMED.
 THE PROCEDURES ELMVEC,DUPVEC,POL,NEWTON,NEWGRN,
 INI,SNDREMEZ
 ARE USED.
 REFERENCE:MEINARDUS,G.(1964,CH.7),
 APPROXIMATION VON FUNKTIONEN UND IHRE NUMERISCHE BEHANDLUNG;
 begin integer NP1,K,POMK,COUNT,CNT,J,MI;
 real E,ABSE,ABSEH;
 NP1:=N+1;
 begin 
 integer array S[0:NP1];
 array X,B,COEF[0:NP1]
 ,G[0:M];

 procedure ERRPOL(N,M,E,CO,S,Y,FY,G);
 value N,M,E;integer N,M;
 real E;
 integer array S;array CO,Y,FY,G;
commentERRPOL DELIVERS THE VALUE OF
CO[0]+CO[1]*Y[I]+...+CO[N]*Y[I]**N - FY[I]
IN G[I] FOR I=0,1,...M AND I NOT EQUAL S[J],J=0,1,...N+1.
FOR J=0,1,...N+1 THEN G[S[J]]:=(-1)**J*E.
THE INTEGERS S[J],FOR J=0,1,...N+1 ARE A SUBSET OF 0,1,...M;
 begin integer J,K,NP1,SJM1,SJ,S0,UP;
 NP1:=N+1;S0:=SJM1:=S[0];
 G[S0]:=E;
 for J:=1 step 1 until NP1 do 
 begin SJ:=S[J];UP:=SJ-1;
 for K:= SJM1+1 step 1 until UP do 
    G[K]:=FY[K]-POL(N,Y[K],CO);
 G[SJ]:=E:=-E;
 SJM1:=SJ;
 end J;
 for K:= S0-1 step -1 until 0 do 
    G[K]:=FY[K]-POL(N,Y[K],CO);
 for K:= SJ+1 step 1 until M do 
    G[K]:=FY[K]-POL(N,Y[K],CO);
 end ERRPOL;

 INI(NP1,M,S);
 MI:=EM[2];
 ABSE:= 0;
 for COUNT:= 1, COUNT + 1 while COUNT <= MI & ABSE > ABSEH do 
 begin 
 POMK:=1;
 for K:= 0 step 1 until NP1 do 
 begin X[K]:= Y[S[K]]; COEF[K]:= FY[S[K]]; B[K]:= POMK;
     POMK:=-POMK end;
 NEWTON(NP1,X,COEF); NEWTON(NP1,X,B);
 EM[0]:=
 E:= COEF[NP1]/B[NP1];
 ELMVEC(0,N,0,COEF,B,-E);
 NEWGRN(N,X,COEF);
 ERRPOL(N,M,E,COEF,S,Y,FY,G);
 SNDREMEZ(NP1,M,S,G,EM);
    ABSEH:=ABSE;     ABSE:=ABS(E);
 CNT:=COUNT;
 end WHILE COUNT;
 EM[2]:=MI;
 EM[3]:=CNT;
 DUPVEC(0,N,0,CO,COEF);
 end;
 end MINMAXPOL

        eop