code 34210;
    procedure LINEMIN(N, X, D, ND, ALFA, G, FUNCT, F0, F1, DF0, DF1,
    EVLMAX, STRONGSEARCH, IN); value N, ND, F0, DF0, STRONGSEARCH;
    integer N, EVLMAX; boolean STRONGSEARCH;
    real ND, ALFA, F0, F1, DF0, DF1;
    array X, D, G, IN;
    real procedure FUNCT;
    begin integer I, EVL;
        boolean NOTININT;
        real F,OLDF,DF,OLDDF,MU,ALFA0,Q,W,Y,Z,RELTOL,ABSTOL
        ,EPS, AID;
        array X0[1:N];

        RELTOL:= IN[1]; ABSTOL:= IN[2]; MU:= IN[3]; EVL:= 0;
        ALFA0:= 0; OLDF:= F0; OLDDF:= DF0; Y:= ALFA; NOTININT:= true;
        DUPVEC(1, N, 0, X0, X);
        EPS:= (SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL) / ND;
        Q:= (F1 - F0) / (ALFA * DF0);
    INT: if NOTININT then NOTININT:= DF1 < 0 and Q > MU;
        AID:= ALFA; if DF1 >= 0 then 
        begin Z:= 3 * (OLDF - F1) / ALFA + OLDDF + DF1;
            W:= SQRT(Z ** 2 - OLDDF * DF1);
            ALFA:= ALFA * (1 - (DF1 + W - Z) / (DF1 - OLDDF + W * 2));
            if ALFA < EPS then ALFA:= EPS else 
            if AID - ALFA < EPS then ALFA:= AID - EPS
        end CUBIC INTERPOLATION
        else if NOTININT then 
        begin ALFA0:= ALFA:= Y; OLDDF:= DF1; OLDF:= F1 end 
        else ALFA:= 0.5 * ALFA; Y:= ALFA + ALFA0;
        DUPVEC(1, N, 0, X, X0); ELMVEC(1, N, 0, X, D, Y);
        EPS:= (SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL) / ND;
        F:= FUNCT(N, X, G); EVL:= EVL +1 ; DF:= VECVEC(1, N, 0, D, G);
        Q:= (F - F0) / (Y * DF0);
        if (if NOTININT or STRONGSEARCH then true else 
        Q < MU or Q > 1 - MU) and EVL < EVLMAX then 
        begin if NOTININT or DF > 0 or Q < MU then 
            begin DF1:= DF; F1:= F end 
            else 
            begin ALFA0:= Y; ALFA:= AID - ALFA; OLDDF:= DF; OLDF:= F
            end;
            if ALFA > EPS * 2 then goto INT
        end;
        ALFA:= Y; EVLMAX:= EVL; DF1:= DF; F1:= F
    end LINEMIN

        eop