comment  ================== 34010 =================
;
real procedure VECVEC(L, U, SHIFT, A, B); 
  value L, U, SHIFT;
  integer L, U, SHIFT;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[K] TIMES B[SHIFT + K] + S;
    VECVEC := S;
end VECVEC;
comment  ================== 34011 =================
;
real procedure MATVEC(L, U, I, A, B); 
  value L, U, I;
  integer L, U, I;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[I, K] TIMES B[K] + S;
    MATVEC := S;
end MATVEC;
comment  ================== 34012 =================
;
real procedure TAMVEC(L, U, I, A, B); 
  value L, U, I;
  integer L, U, I;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[K, I] TIMES B[K] + S;
    TAMVEC := S;
end TAMVEC;
comment  ================== 34013 =================
;
real procedure MATMAT(L, U, I, J, A, B); 
  value L, U, I, J;
  integer L, U, I, J;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[I, K] TIMES B[K, J] + S;
    MATMAT := S;
end MATMAT;
comment  ================== 34014 =================
;
real procedure TAMMAT(L, U, I, J, A, B); 
  value L, U, I, J;
  integer L, U, I, J;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[K, I] TIMES B[K, J] + S;
    TAMMAT := S;
end TAMMAT;
comment  ================== 34015 =================
;
real procedure MATTAM(L, U, I, J, A, B); 
  value L, U, I, J;
  integer L, U, I, J;
  array A, B;
begin;
    integer K;
    real S;
    S := 0;
    for K := L step 1 until U do
      S := A[I, K] TIMES B[J, K] + S;
    MATTAM := S;
end MATTAM;
comment  ================== 34016 =================
;
real procedure SEQVEC(L, U, IL, SHIFT, A, B); 
  value L, U, IL, SHIFT;
  integer L, U, IL, SHIFT;
  array A, B;
begin;
    real S;
    S := 0;
    for L := L step 1 until U do
      begin;
        S := A[IL] TIMES B[L + SHIFT] + S;
        IL := IL + L;
    end;
    SEQVEC := S;
end SEQVEC;
comment  ================== 34017 =================
;
real procedure SCAPRD1(LA, SA, LB, SB, N, A, B); 
  value LA, SA, LB, SB, N;
  integer LA, SA, LB, SB, N;
  array A, B;
begin;
    real S;
    integer K;
    S := 0;
    for K := 1 step 1 until N do
      begin;
        S := A[LA] TIMES B[LB] + S;
        LA := LA + SA;
        LB := LB + SB;
    end;
    SCAPRD1 := S;
end SCAPRD1;
comment  ================== 34018 =================
;
real procedure SYMMATVEC(L, U, I, A, B); 
  value L, U, I;
  integer L, U, I;
  array A, B;
begin;
    integer K, M;
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure SEQVEC(L, U, IL, SHIFT, A, B); code 34016;
    
    M := if L > I then L else I;
    K := M TIMES (M - 1) // 2;
    SYMMATVEC := VECVEC(L, if I NOTLESS U then I - 1 else U, K, B, A) + SEQVEC(M, U, K + I, 0, A, B);
end SYMMATVEC;
comment  ================== 31500 =================
;
procedure FULMATVEC(LR, UR, LC, UC, A, B, C); 
  value LR, UR, LC, UC, B;
  integer LR, UR, LC, UC;
  array A, B, C;
begin;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    for LR := LR step 1 until UR do
      C[LR] := MATVEC(LC, UC, LR, A, B);
    ;
end FULMATVEC;
comment  ================== 31501 =================
;
procedure FULTAMVEC(LR, UR, LC, UC, A, B, C); 
  value LR, UR, LC, UC, B;
  integer LR, UR, LC, UC;
  array A, B, C;
begin;
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    for LC := LC step 1 until UC do
      C[LC] := TAMVEC(LR, UR, LC, A, B);
    ;
end FULTAMVEC;
comment  ================== 31502 =================
;
procedure FULSYMMATVEC(LR, UR, LC, UC, A, B, C); 
  value LR, UR, LC, UC, B;
  integer LR, UR, LC, UC;
  array A, B, C;
begin;
    real procedure SYMMATVEC(L, U, I, A, B); code 34018;
    
    for LR := LR step 1 until UR do
      C[LR] := SYMMATVEC(LC, UC, LR, A, B);
end FULSYMMATVEC;
comment  ================== 31503 =================
;
procedure RESVEC(LR, UR, LC, UC, A, B, C, X); 
  value LR, UR, LC, UC, X;
  integer LR, UR, LC, UC;
  real X;
  array A, B, C;
begin;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    for LR := LR step 1 until UR do
      C[LR] := MATVEC(LC, UC, LR, A, B) + C[LR] TIMES X;
end RESVEC;
comment  ================== 31504 =================
;
procedure SYMRESVEC(LR, UR, LC, UC, A, B, C, X); 
  value LR, UR, LC, UC, X;
  integer LR, UR, LC, UC;
  real X;
  array A, B, C;
begin;
    real procedure SYMMATVEC(L, U, I, A, B); code 34018;
    
    for LR := LR step 1 until UR do
      C[LR] := SYMMATVEC(LC, UC, LR, A, B) + C[LR] TIMES X;
end SYMRESVEC;
comment  ================== 34214 =================
;
real procedure RNK1MIN(N, X, G, H, FUNCT, IN, OUT); 
  value N;
  integer N;
  array X, G, H, IN, OUT;
  real procedure FUNCT;
begin;
    integer I, IT, N2, CNTL, CNTE, EVL, EVLMAX;
    Boolean OK;
    real F, F0, FMIN, MU, DG, DG0, GHG, GS, NRMDELTA, ALFA, MACHEPS, RELTOL, ABSTOL, EPS, TOLG, ORTH, AID;
    array V, DELTA, GAMMA, S, P[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    real procedure SYMMATVEC(L, U, I, A, B); code 34018;
    
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure INISYMD(LR, UR, SHIFT, A, X); code 31013;
    
    procedure MULVEC(L, U, SHIFT, A, B, X); code 31020;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    procedure EIGSYM1(A, N, NUMVAL, VAL, VEC, EM); code 34156;
    
    procedure LINEMIN(N, X, D, ND, A, G, F, F0, F1, DFO, DF1, E, S, IN); code 34210;
    
    procedure RNK1UPD(H, N, V, C); code 34211;
    
    procedure DAVUPD(H, N, V, W, C1, C2); code 34212;
    
    procedure FLEUPD(H, N, V, W, C1, C2); code 34213;
    
    MACHEPS := IN[0];
    RELTOL := IN[1];
    ABSTOL := IN[2];
    MU := IN[3];
    TOLG := IN[4];
    FMIN := IN[5];
    IT := 0;
    ALFA := IN[6];
    EVLMAX := IN[7];
    ORTH := IN[8];
    N2 := N TIMES (N + 1) // 2;
    CNTL := CNTE := 0;
    if ALFA > 0 then begin;
        INIVEC(1, N2, H, 0);
        INISYMD(1, N, 0, H, ALFA);
    end;
    F := FUNCT(N, X, G);
    EVL := 1;
    DG := SQRT(VECVEC(1, N, 0, G, G));
    for I := 1 step 1 until N do
      DELTA[I] := -SYMMATVEC(1, N, I, H, G);
    NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA));
    DG0 := VECVEC(1, N, 0, DELTA, G);
    OK := DG0 < 0;
    EPS := SQRT(VECVEC(1, N, 0, X, X)) TIMES RELTOL + ABSTOL;
    for IT := IT + 1 while (NRMDELTA > EPS OR DG > TOLG OR ¬OK) IMPL EVL < EVLMAX do
      begin;
        if ¬OK then begin;
            array VEC[1 : N, 1 : N], TH[1 : N2], EM[0 : 9];
            EM[0] := MACHEPS;
            EM[2] := AID := SQRT(MACHEPS TIMES RELTOL);
            EM[4] := ORTH;
            EM[6] := AID TIMES N;
            EM[8] := 5;
            CNTE := CNTE + 1;
            DUPVEC(1, N2, 0, TH, H);
            EIGSYM1(TH, N, N, V, VEC, EM);
            for I := 1 step 1 until N do
              begin;
                AID := -TAMVEC(1, N, I, VEC, G);
                S[I] := AID TIMES ABS(V[I]);
                V[I] := AID TIMES SIGN(V[I]);
            end;
            for I := 1 step 1 until N do
              begin;
                DELTA[I] := MATVEC(1, N, I, VEC, S);
                P[I] := MATVEC(1, N, I, VEC, V);
            end;
            DG0 := VECVEC(1, N, 0, DELTA, G);
            NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA));
        end CALCULATING GREENSTADTS DIRECTION;
        DUPVEC(1, N, 0, S, X);
        DUPVEC(1, N, 0, V, G);
        if IT > N then ALFA := 1 else begin;
            if IT NOTEQUAL 1 then ALFA := ALFA ÷ NRMDELTA else begin;
                ALFA := 2 TIMES (FMIN - F) ÷ DG0;
                if ALFA > 1 then ALFA := 1;
            end;
        end;
        ELMVEC(1, N, 0, X, DELTA, ALFA);
        F0 := F;
        F := FUNCT(N, X, G);
        EVL := EVL + 1;
        DG := VECVEC(1, N, 0, DELTA, G);
        if IT = 1 OR F0 - F < -MU TIMES DG0 TIMES ALFA then begin;
            I := EVLMAX - EVL;
            CNTL := CNTL + 1;
            LINEMIN(N, S, DELTA, NRMDELTA, ALFA, G, FUNCT, F0, F, DG0, DG, I, false, IN);
            EVL := EVL + I;
            DUPVEC(1, N, 0, X, S);
            ;
        end LINEMINIMIZATION;
        DUPVEC(1, N, 0, GAMMA, G);
        ELMVEC(1, N, 0, GAMMA, V, -1);
        if ¬OK then MULVEC(1, N, 0, V, P, -1);
        DG := DG - DG0;
        if ALFA NOTEQUAL 1 then begin;
            MULVEC(1, N, 0, DELTA, DELTA, ALFA);
            MULVEC(1, N, 0, V, V, ALFA);
            NRMDELTA := NRMDELTA TIMES ALFA;
            DG := DG TIMES ALFA;
        end;
        DUPVEC(1, N, 0, P, GAMMA);
        ELMVEC(1, N, 0, P, V, 1);
        for I := 1 step 1 until N do
          V[I] := SYMMATVEC(1, N, I, H, GAMMA);
        DUPVEC(1, N, 0, S, DELTA);
        ELMVEC(1, N, 0, S, V, -1);
        GS := VECVEC(1, N, 0, GAMMA, S);
        GHG := VECVEC(1, N, 0, V, GAMMA);
        AID := DG ÷ GS;
        if VECVEC(1, N, 0, DELTA, P) POWER 2 > VECVEC(1, N, 0, P, P) TIMES (ORTH TIMES NRMDELTA) POWER 2 then RNK1UPD(H, N, S, 1 ÷ GS) else if AID NOTLESS 0 then FLEUPD(H, N, DELTA, V, 1 ÷ DG, (1 + GHG ÷ DG) ÷ DG) else DAVUPD(H, N, DELTA, V, 1 ÷ DG, 1 ÷ GHG);
        for I := 1 step 1 until N do
          DELTA[I] := -SYMMATVEC(1, N, I, H, G);
        ALFA := NRMDELTA;
        NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA));
        EPS := SQRT(VECVEC(1, N, 0, X, X)) TIMES RELTOL + ABSTOL;
        DG := SQRT(VECVEC(1, N, 0, G, G));
        DG0 := VECVEC(1, N, 0, DELTA, G);
        OK := DG0 NOTLESS 0;
    end ITERATION;
    OUT[0] := NRMDELTA;
    OUT[1] := DG;
    OUT[2] := EVL;
    OUT[3] := CNTL;
    OUT[4] := CNTE;
    RNK1MIN := F;
end RNK1MIN;
comment  ================== 34215 =================
;
real procedure FLEMIN(N, X, G, H, FUNCT, IN, OUT); 
  value N;
  integer N;
  array X, G, H, IN, OUT;
  real procedure FUNCT;
begin;
    integer I, IT, CNTL, EVL, EVLMAX;
    real F, F0, FMIN, MU, DG, DG0, NRMDELTA, ALFA, RELTOL, ABSTOL, EPS, TOLG, AID;
    array V, DELTA, S[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    real procedure SYMMATVEC(L, U, I, A, B); code 34018;
    
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure INISYMD(LR, UR, SHIFT, A, X); code 31013;
    
    procedure MULVEC(L, U, SHIFT, A, B, XB); code 31020;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    procedure LINEMIN(N, X, D, ND, A, G, F, F0, F1, DF0, DF1, E, S, IN); code 34210;
    
    procedure DAVUPD(H, N, V, W, C1, C2); code 34212;
    
    procedure FLEUPD(H, N, V, W, C1, C2); code 34213;
    
    RELTOL := IN[1];
    ABSTOL := IN[2];
    MU := IN[3];
    TOLG := IN[4];
    FMIN := IN[5];
    ALFA := IN[6];
    EVLMAX := IN[7];
    OUT[4] := 0;
    IT := 0;
    F := FUNCT(N, X, G);
    EVL := 1;
    CNTL := 0;
    if ALFA > 0 then begin;
        INIVEC(1, N TIMES (N + 1) // 2, H, 0);
        INISYMD(1, N, 0, H, ALFA);
    end;
    for I := 1 step 1 until N do
      DELTA[I] := -SYMMATVEC(1, N, I, H, G);
    DG := SQRT(VECVEC(1, N, 0, G, G));
    NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA));
    EPS := SQRT(VECVEC(1, N, 0, X, X)) TIMES RELTOL + ABSTOL;
    DG0 := VECVEC(1, N, 0, DELTA, G);
    for IT := IT + 1 while (NRMDELTA > EPS OR DG > TOLG) IMPL EVL < EVLMAX do
      begin;
        DUPVEC(1, N, 0, S, X);
        DUPVEC(1, N, 0, V, G);
        if IT NOTLESS N then ALFA := 1 else begin;
            if IT NOTEQUAL 1 then ALFA := ALFA ÷ NRMDELTA else begin;
                ALFA := 2 TIMES (FMIN - F) ÷ DG0;
                if ALFA > 1 then ALFA := 1;
            end;
        end;
        ELMVEC(1, N, 0, X, DELTA, ALFA);
        F0 := F;
        F := FUNCT(N, X, G);
        EVL := EVL + 1;
        DG := VECVEC(1, N, 0, DELTA, G);
        if IT = 1 OR F0 - F < -MU TIMES DG0 TIMES ALFA then begin;
            I := EVLMAX - EVL;
            CNTL := CNTL + 1;
            LINEMIN(N, S, DELTA, NRMDELTA, ALFA, G, FUNCT, F0, F, DG0, DG, I, false, IN);
            EVL := EVL + I;
            DUPVEC(1, N, 0, X, S);
            ;
        end LINEMINIMIZATION;
        if ALFA NOTEQUAL 1 then MULVEC(1, N, 0, DELTA, DELTA, ALFA);
        MULVEC(1, N, 0, V, V, -1);
        ELMVEC(1, N, 0, V, G, 1);
        for I := 1 step 1 until N do
          S[I] := SYMMATVEC(1, N, I, H, V);
        AID := VECVEC(1, N, 0, V, S);
        DG := (DG - DG0) TIMES ALFA;
        if DG > 0 then begin;
            if DG NOTLESS AID then FLEUPD(H, N, DELTA, S, 1 ÷ DG, (1 + AID ÷ DG) ÷ DG) else DAVUPD(H, N, DELTA, S, 1 ÷ DG, 1 ÷ AID);
        end UPDATING;
        for I := 1 step 1 until N do
          DELTA[I] := -SYMMATVEC(1, N, I, H, G);
        ALFA := NRMDELTA TIMES ALFA;
        NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA));
        EPS := SQRT(VECVEC(1, N, 0, X, X)) TIMES RELTOL + ABSTOL;
        DG := SQRT(VECVEC(1, N, 0, G, G));
        DG0 := VECVEC(1, N, 0, DELTA, G);
        if DG0 > 0 then begin;
            OUT[4] := -1;
            goto EXIT;
        end;
    end ITERATION;
    EXIT: OUT[0] := NRMDELTA;
    OUT[1] := DG;
    OUT[2] := EVL;
    OUT[3] := CNTL;
    FLEMIN := F;
end FLEMIN;
comment  ================== 34352 =================
;
procedure COMCOLCST(L, U, J, AR, AI, XR, XI); 
  value L, U, J, XR, XI;
  integer L, U, J;
  real XR, XI;
  array AR, AI;
begin;
    procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341;
    
    for L := L step 1 until U do
      COMMUL(AR[L, J], AI[L, J], XR, XI, AR[L, J], AI[L, J]);
    ;
end COMCOLCST;
comment  ================== 34353 =================
;
procedure COMROWCST(L, U, I, AR, AI, XR, XI); 
  value L, U, I, XR, XI;
  integer L, U, I;
  real XR, XI;
  array AR, AI;
begin;
    procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341;
    
    for L := L step 1 until U do
      COMMUL(AR[I, L], AI[I, L], XR, XI, AR[I, L], AI[I, L]);
    ;
end COMROWCST;
comment  ================== 34354 =================
;
procedure COMMATVEC(L, U, I, AR, AI, BR, BI, RR, RI); 
  value L, U, I;
  integer L, U, I;
  real RR, RI;
  array AR, AI, BR, BI;
begin;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real MV;
    MV := MATVEC(L, U, I, AR, BR) - MATVEC(L, U, I, AI, BI);
    RI := MATVEC(L, U, I, AI, BR) + MATVEC(L, U, I, AR, BI);
    RR := MV;
end COMMATVEC;
comment  ================== 34355 =================
;
Boolean procedure HSHCOMCOL(L, U, J, AR, AI, TOL, K, C, S, T); 
  value L, U, J, TOL;
  integer L, U, J;
  real TOL, K, C, S, T;
  array AR, AI;
begin;
    real VR, DEL, MOD, H, ARLJ, AILJ;
    procedure CARPOL(AR, AI, R, C, S); code 34344;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    VR := TAMMAT(L + 1, U, J, J, AR, AR) + TAMMAT(L + 1, U, J, J, AI, AI);
    ARLJ := AR[L, J];
    AILJ := AI[L, J];
    CARPOL(ARLJ, AILJ, MOD, C, S);
    if VR > TOL then begin;
        VR := VR + ARLJ POWER 2 + AILJ POWER 2;
        H := K := SQRT(VR);
        T := VR + MOD TIMES H;
        if ARLJ = 0 IMPL AILJ = 0 then AR[L, J] := H else begin;
            AR[L, J] := ARLJ + C TIMES K;
            AI[L, J] := AILJ + S TIMES K;
            S := -S;
        end;
        C := -C;
        HSHCOMCOL := true;
    end else begin;
        HSHCOMCOL := false;
        K := MOD;
        T := -1;
    end;
end HSHCOMCOL;
comment  ================== 34356 =================
;
procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); 
  value I, II, L, U, J, T;
  integer I, II, L, U, J;
  real T;
  array AR, AI, BR, BI;
begin;
    procedure ELMCOMCOL(L, U, I, J, AR, AI, BR, BI, XR, XI); code 34377;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    for L := L step 1 until U do
      ELMCOMCOL(I, II, L, J, AR, AI, BR, BI, (-TAMMAT(I, II, J, L, BR, AR) - TAMMAT(I, II, J, L, BI, AI)) ÷ T, (TAMMAT(I, II, J, L, BI, AR) - TAMMAT(I, II, J, L, BR, AI)) ÷ T);
    ;
end HSHCOMPRD;
comment  ================== 34376 =================
;
procedure ELMCOMVECCOL(L, U, J, AR, AI, BR, BI, XR, XI); 
  value L, U, J, XR, XI;
  integer L, U, J;
  real XR, XI;
  array AR, AI, BR, BI;
begin;
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    ELMVECCOL(L, U, J, AR, BR, XR);
    ELMVECCOL(L, U, J, AR, BI, -XI);
    ELMVECCOL(L, U, J, AI, BR, XI);
    ELMVECCOL(L, U, J, AI, BI, XR);
end ELMCOMVECCOL;
comment  ================== 34377 =================
;
procedure ELMCOMCOL(L, U, I, J, AR, AI, BR, BI, XR, XI); 
  value L, U, I, J, XR, XI;
  integer L, U, I, J;
  real XR, XI;
  array AR, AI, BR, BI;
begin;
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    ELMCOL(L, U, I, J, AR, BR, XR);
    ELMCOL(L, U, I, J, AR, BI, -XI);
    ELMCOL(L, U, I, J, AI, BR, XI);
    ELMCOL(L, U, I, J, AI, BI, XR);
end ELMCOMCOL;
comment  ================== 34378 =================
;
procedure ELMCOMROWVEC(L, U, I, AR, AI, BR, BI, XR, XI); 
  value L, U, I, XR, XI;
  integer L, U, I;
  real XR, XI;
  array AR, AI, BR, BI;
begin;
    procedure ELMROWVEC(L, U, I, A, B, X); code 34027;
    
    ELMROWVEC(L, U, I, AR, BR, XR);
    ELMROWVEC(L, U, I, AR, BI, -XI);
    ELMROWVEC(L, U, I, AI, BR, XI);
    ELMROWVEC(L, U, I, AI, BI, XR);
end ELMCOMROWVEC;
comment  ================== 34360 =================
;
procedure SCLCOM(AR, AI, N, N1, N2); 
  value N, N1, N2;
  integer N, N1, N2;
  array AR, AI;
begin;
    integer I, J, K;
    real S, R;
    procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352;
    
    for J := N1 step 1 until N2 do
      begin;
        S := 0;
        for I := 1 step 1 until N do
          begin;
            R := AR[I, J] POWER 2 + AI[I, J] POWER 2;
            if R > S then begin;
                S := R;
                K := I;
            end;
        end;
        if S NOTEQUAL 0 then COMCOLCST(1, N, J, AR, AI, AR[K, J] ÷ S, -AI[K, J] ÷ S);
    end;
end SCLCOM;
comment  ================== 34359 =================
;
real procedure COMEUCNRM(AR, AI, LW, N); 
  value N, LW;
  integer N, LW;
  array AR, AI;
begin;
    integer I, L;
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    real R;
    R := 0;
    for I := 1 step 1 until N do
      begin;
        L := if I > LW then I - LW else 1;
        R := MATTAM(L, N, I, I, AR, AR) + MATTAM(L, N, I, I, AI, AI) + R;
        ;
    end;
    COMEUCNRM := SQRT(R);
end COMEUCNRM;
comment  ================== 34340 =================
;
real procedure COMABS(XR, XI); 
  value XR, XI;
  real XR, XI;
begin;
    XR := ABS(XR);
    XI := ABS(XI);
    COMABS := if XI > XR then SQRT((XR ÷ XI) POWER 2 + 1) TIMES XI else if XI = 0 then XR else SQRT((XI ÷ XR) POWER 2 + 1) TIMES XR;
end COMABS;
comment  ================== 34343 =================
;
procedure COMSQRT(AR, AI, PR, PI); 
  value AR, AI;
  real AR, AI, PR, PI;
if AR = 0 IMPL AI = 0 then PR := PI := 0 else begin;
    real BR, BI, H;
    BR := ABS(AR);
    BI := ABS(AI);
    H := if BI < BR then (if BR < 1 then SQRT((SQRT((BI ÷ BR) POWER 2 + 1) TIMES .5 + .5) TIMES BR) else SQRT((SQRT((BI ÷ BR) POWER 2 + 1) TIMES .125 + .125) TIMES BR) TIMES 2) else if BI < 1 then SQRT((SQRT((BR ÷ BI) POWER 2 + 1) TIMES BI + BR) TIMES 2) TIMES .5 else if BR + 1 = 1 then SQRT(BI TIMES .5) else SQRT(SQRT((BR ÷ BI) POWER 2 + 1) TIMES BI TIMES .125 + BR TIMES .125) TIMES 2;
    if AR NOTLESS 0 then begin;
        PR := H;
        PI := AI ÷ H TIMES .5;
    end else begin;
        PI := if AI NOTLESS 0 then H else -H;
        PR := BI ÷ H TIMES .5;
    end;
end COMSQRT;
comment  ================== 34342 =================
;
procedure COMDIV(XR, XI, YR, YI, ZR, ZI); 
  value XR, XI, YR, YI;
  real XR, XI, YR, YI, ZR, ZI;
begin;
    real H, D;
    if ABS(YI) < ABS(YR) then begin;
        if YI = 0 then begin;
            ZR := XR ÷ YR;
            ZI := XI ÷ YR;
        end else begin;
            H := YI ÷ YR;
            D := H TIMES YI + YR;
            ZR := (XR + H TIMES XI) ÷ D;
            ZI := (XI - H TIMES XR) ÷ D;
        end;
    end else begin;
        H := YR ÷ YI;
        D := H TIMES YR + YI;
        ZR := (XR TIMES H + XI) ÷ D;
        ZI := (XI TIMES H - XR) ÷ D;
    end;
end COMDIV;
comment  ================== 34301 =================
;
procedure DECSOL(A, N, AUX, B); 
  value N;
  integer N;
  array A, AUX, B;
begin;
    integer array P[1 : N];
    procedure SOL(A, N, P, B); code 34051;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    DEC(A, N, AUX, P);
    if AUX[3] = N then SOL(A, N, P, B);
end DECSOL;
comment  ================== 34061 =================
;
procedure SOLELM(A, N, RI, CI, B); 
  value N;
  integer N;
  array A, B;
  integer array RI, CI;
begin;
    integer R, CIR;
    real W;
    procedure SOL(A, N, P, B); code 34051;
    
    SOL(A, N, RI, B);
    for R := N step -1 until 1 do
      begin;
        CIR := CI[R];
        if CIR NOTEQUAL R then begin;
            W := B[R];
            B[R] := B[CIR];
            B[CIR] := W;
        end;
    end;
end SOLELM;
comment  ================== 34243 =================
;
procedure GSSSOLERB(A, N, AUX, B); 
  value N;
  integer N;
  array A, AUX, B;
begin;
    integer array RI, CI[1 : N];
    procedure SOLELM(A, N, RI, CI, B); code 34061;
    
    procedure GSSERB(A, N, AUX, RI, CI); code 34242;
    
    GSSERB(A, N, AUX, RI, CI);
    if AUX[3] = N then SOLELM(A, N, RI, CI, B);
end GSSSOLERB;
comment  ================== 34302 =================
;
procedure DECINV(A, N, AUX); 
  value N;
  integer N;
  array A, AUX;
begin;
    integer array P[1 : N];
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure INV(A, N, P); code 34053;
    
    DEC(A, N, AUX, P);
    if AUX[3] = N then INV(A, N, P);
end DECINV;
comment  ================== 34236 =================
;
procedure GSSINV(A, N, AUX); 
  value N;
  integer N;
  array A, AUX;
begin;
    integer array RI, CI[1 : N];
    procedure GSSELM(A, N, AUX, RI, CI); code 34231;
    
    real procedure INV1(A, N, RI, CI, WITHNORM); code 34235;
    
    GSSELM(A, N, AUX, RI, CI);
    if AUX[3] = N then AUX[9] := INV1(A, N, RI, CI, true);
end GSSINV;
comment  ================== 34244 =================
;
procedure GSSINVERB(A, N, AUX); 
  value N;
  integer N;
  array A, AUX;
begin;
    integer array RI, CI[1 : N];
    procedure GSSELM(A, N, AUX, RI, CI); code 34231;
    
    real procedure INV1(A, N, RI, CI, WITHNORM); code 34235;
    
    procedure ERBELM(N, AUX, NRMINV); code 34241;
    
    GSSELM(A, N, AUX, RI, CI);
    if AUX[3] = N then ERBELM(N, AUX, INV1(A, N, RI, CI, true));
end GSSINVERB;
comment  ================== 34251 =================
;
procedure GSSITISOL(A, N, AUX, B); 
  value N;
  integer N;
  array A, AUX, B;
begin;
    integer I, J;
    array AA[1 : N, 1 : N];
    integer array RI, CI[1 : N];
    procedure GSSELM(A, N, AUX, RI, CI); code 34231;
    
    procedure ITISOL(A, LU, N, AUX, RI, CI, B); code 34250;
    
    procedure DUPMAT(L, U, I, J, A, B); code 31035;
    
    DUPMAT(1, N, 1, N, AA, A);
    GSSELM(A, N, AUX, RI, CI);
    if AUX[3] = N then ITISOL(AA, A, N, AUX, RI, CI, B);
end GSSITISOL;
comment  ================== 34254 =================
;
procedure GSSITISOLERB(A, N, AUX, B); 
  value N;
  integer N;
  array A, AUX, B;
begin;
    integer I, J;
    array AA[1 : N, 1 : N];
    integer array RI, CI[1 : N];
    procedure GSSNRI(A, N, AUX, RI, CI); code 34252;
    
    procedure ITISOLERB(A, LU, N, AUX, RI, CI, B); code 34253;
    
    procedure DUPMAT(L, U, I, J, A, B); code 31035;
    
    DUPMAT(1, N, 1, N, AA, A);
    GSSNRI(A, N, AUX, RI, CI);
    if AUX[3] = N then ITISOLERB(AA, A, N, AUX, RI, CI, B);
end GSSITISOLERB;
comment  ================== 34131 =================
;
procedure LSQSOL(A, N, M, AID, CI, B); 
  value N, M;
  integer N, M;
  array A, AID, B;
  integer array CI;
begin;
    integer K, CIK;
    real W;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    for K := 1 step 1 until M do
      ELMVECCOL(K, N, K, B, A, TAMVEC(K, N, K, A, B) ÷ (AID[K] TIMES A[K, K]));
    for K := M step -1 until 1 do
      B[K] := (B[K] - MATVEC(K + 1, M, K, A, B)) ÷ AID[K];
    for K := M step -1 until 1 do
      begin;
        CIK := CI[K];
        if CIK NOTEQUAL K then begin;
            W := B[K];
            B[K] := B[CIK];
            B[CIK] := W;
        end;
    end;
end LSQSOL;
comment  ================== 34135 =================
;
procedure LSQORTDECSOL(A, N, M, AUX, DIAG, B); 
  value N, M;
  integer N, M;
  array A, AUX, DIAG, B;
begin;
    array AID[1 : M];
    integer array CI[1 : M];
    procedure LSQORTDEC(A, N, M, AUX, AID, CI); code 34134;
    
    procedure LSQDGLINV(A, M, AID, CI, DIAG); code 34132;
    
    procedure LSQSOL(A, N, M, AID, CI, B); code 34131;
    
    LSQORTDEC(A, N, M, AUX, AID, CI);
    if AUX[3] = M then begin;
        LSQDGLINV(A, M, AID, CI, DIAG);
        LSQSOL(A, N, M, AID, CI, B);
    end;
end LSQORTDECSOL;
comment  ================== 34280 =================
;
procedure SOLSVDOVR(U, VAL, V, M, N, X, EM); 
  value M, N;
  integer M, N;
  array U, VAL, V, X, EM;
begin;
    integer I;
    real MIN;
    array X1[1 : N];
    real procedure MATVEC(L, U, I, A, B); 
      value L, U, I;
      integer L, U, I;
      array A, B;
    code 34011;
    real procedure TAMVEC(L, U, I, A, B); 
      value L, U, I;
      integer L, U, I;
      array A, B;
    code 34012;
    MIN := EM[6];
    for I := 1 step 1 until N do
      X1[I] := if VAL[I] NOTLESS MIN then 0 else TAMVEC(1, M, I, U, X) ÷ VAL[I];
    for I := 1 step 1 until N do
      X[I] := MATVEC(1, N, I, V, X1);
end SOLSVDOVR;
comment  ================== 34281 =================
;
integer procedure SOLOVR(A, M, N, X, EM); 
  value M, N;
  integer M, N;
  array A, X, EM;
begin;
    integer I;
    array VAL[1 : N], V[1 : N, 1 : N];
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); 
      value M, N;
      integer M, N;
      array A, VAL, V, EM;
    code 34273;
    procedure SOLSVDOVR(U, VAL, V, M, N, X, EM); 
      value M, N;
      integer M, N;
      array U, VAL, V, X, EM;
    code 34280;
    SOLOVR := I := QRISNGVALDEC(A, M, N, VAL, V, EM);
    if I = 0 then SOLSVDOVR(A, VAL, V, M, N, X, EM);
end SOLOVR;
comment  ================== 34282 =================
;
procedure SOLSVDUND(U, VAL, V, M, N, X, EM); 
  value M, N;
  integer M, N;
  array U, VAL, V, X, EM;
begin;
    integer I;
    real MIN;
    array X1[1 : N];
    real procedure MATVEC(L, U, I, A, B); 
      value L, U, I;
      integer L, U, I;
      array A, B;
    code 34011;
    real procedure TAMVEC(L, U, I, A, B); 
      value L, U, I;
      integer L, U, I;
      array A, B;
    code 34012;
    MIN := EM[6];
    for I := 1 step 1 until N do
      X1[I] := if VAL[I] NOTLESS MIN then 0 else TAMVEC(1, N, I, V, X) ÷ VAL[I];
    for I := 1 step 1 until M do
      X[I] := MATVEC(1, N, I, U, X1);
end SOLSVDUND;
comment  ================== 34283 =================
;
integer procedure SOLUND(A, M, N, X, EM); 
  value M, N;
  integer M, N;
  array A, X, EM;
begin;
    integer I;
    array VAL[1 : N], V[1 : N, 1 : N];
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); 
      value M, N;
      integer M, N;
      array A, VAL, V, EM;
    code 34273;
    procedure SOLSVDUND(U, VAL, V, M, N, X, EM); 
      value M, N;
      integer M, N;
      array U, VAL, V, X, EM;
    code 34282;
    SOLUND := I := QRISNGVALDEC(A, M, N, VAL, V, EM);
    if I = 0 then SOLSVDUND(A, VAL, V, M, N, X, EM);
end SOLUND;
comment  ================== 34285 =================
;
integer procedure HOMSOL(A, M, N, V, EM); 
  value M, N;
  integer M, N;
  array A, V, EM;
begin;
    integer I;
    array VAL[1 : N];
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); 
      value M, N;
      integer M, N;
      array A, VAL, V, EM;
    code 34273;
    procedure HOMSOLSVD(U, VAL, V, M, N); 
      value M, N;
      integer M, N;
      array U, VAL, V;
    code 34284;
    HOMSOL := I := QRISNGVALDEC(A, M, N, VAL, V, EM);
    if I = 0 then HOMSOLSVD(A, VAL, V, M, N);
end HOMSOL;
comment  ================== 34286 =================
;
procedure PSDINVSVD(U, VAL, V, M, N, EM); 
  value M, N;
  integer M, N;
  array U, VAL, V, EM;
begin;
    integer I, J;
    real MIN, VALI;
    array X[1 : N];
    real procedure MATVEC(L, U, I, A, B); 
      value L, U, I;
      integer L, U, I;
      array A, B;
    code 34011;
    MIN := EM[6];
    for I := 1 step 1 until N do
      if VAL[I] > MIN then begin;
        VALI := 1 ÷ VAL[I];
        for J := 1 step 1 until M do
          U[J, I] := U[J, I] TIMES VALI;
    end else for J := 1 step 1 until M do
      U[J, I] := 0;
    for I := 1 step 1 until M do
      begin;
        for J := 1 step 1 until N do
          X[J] := U[I, J];
        for J := 1 step 1 until N do
          U[I, J] := MATVEC(1, N, J, V, X);
    end;
end PSDINVSVD;
comment  ================== 34287 =================
;
integer procedure PSDINV(A, M, N, EM); 
  value M, N;
  integer M, N;
  array A, EM;
begin;
    integer I;
    array VAL[1 : N], V[1 : N, 1 : N];
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); 
      value M, N;
      integer M, N;
      array A, VAL, V, EM;
    code 34273;
    procedure PSDINVSVD(U, VAL, V, M, N, EM); 
      value M, N;
      integer M, N;
      array U, VAL, V, EM;
    code 34286;
    PSDINV := I := QRISNGVALDEC(A, M, N, VAL, V, EM);
    if I = 0 then PSDINVSVD(A, VAL, V, M, N, EM);
end PSDINV;
comment  ================== 34320 =================
;
procedure DECBND(A, N, LW, RW, AUX, M, P); 
  value N, LW, RW;
  integer N, LW, RW;
  integer array P;
  array A, M, AUX;
begin;
    integer I, J, K, KK, KK1, PK, MK, IK, LW1, F, Q, W, W1, W2, NRW, IW, SDET;
    real R, S, EPS, MIN;
    array V[1 : N];
    real procedure VECVEC(A, B, C, D, E); code 34010;
    
    procedure ELMVEC(A, B, C, D, E, F); code 34020;
    
    procedure ICHVEC(A, B, C, D); code 34030;
    
    F := LW;
    W1 := LW + RW;
    W := W1 + 1;
    W2 := W - 2;
    IW := 0;
    SDET := 1;
    NRW := N - RW;
    LW1 := LW + 1;
    Q := LW - 1;
    for I := 2 step 1 until LW do
      begin;
        Q := Q - 1;
        IW := IW + W1;
        for J := IW - Q step 1 until IW do A[J] := 0;
    end;
    IW := -W2;
    Q := -LW;
    for I := 1 step 1 until N do
      begin;
        IW := IW + W;
        if I NOTLESS LW1 then IW := IW - 1;
        Q := Q + W;
        if I > NRW then Q := Q - 1;
        V[I] := SQRT(VECVEC(IW, Q, 0, A, A));
    end;
    EPS := AUX[2];
    MIN := 1;
    KK := -W1;
    MK := -LW;
    if F > NRW then W2 := W2 + NRW - F;
    for K := 1 step 1 until N do
      begin;
        if F < N then F := F + 1;
        IK := KK := KK + W;
        MK := MK + LW;
        S := ABS(A[KK]) ÷ V[K];
        PK := K;
        KK1 := KK + 1;
        for I := K + 1 step 1 until F do
          begin;
            IK := IK + W1;
            M[MK + I - K] := R := A[IK];
            A[IK] := 0;
            R := ABS(R) ÷ V[I];
            if R > S then begin;
                S := R;
                PK := I;
            end;
        end;
        if S < MIN then MIN := S;
        if S < EPS then begin;
            AUX[3] := K - 1;
            AUX[5] := S;
            goto END;
        end;
        if K + W2 NOTLESS N then W2 := W2 - 1;
        P[K] := PK;
        if PK NOTEQUAL K then begin;
            V[PK] := V[K];
            PK := PK - K;
            ICHVEC(KK1, KK1 + W2, PK TIMES W1, A);
            SDET := -SDET;
            R := M[MK + PK];
            M[MK + PK] := A[KK];
            A[KK] := R;
        end else R := A[KK];
        if R < 0 then SDET := -SDET;
        IW := KK1;
        LW1 := F - K + MK;
        for I := MK + 1 step 1 until LW1 do
          begin;
            M[I] := S := M[I] ÷ R;
            IW := IW + W1;
            ELMVEC(IW, IW + W2, KK1 - IW, A, A, -S);
        end;
    end;
    AUX[3] := N;
    AUX[5] := MIN;
    END: AUX[1] := SDET;
end DECBND;
comment  ================== 34321 =================
;
real procedure DETERMBND(A, N, LW, RW, SGNDET); 
  value N, LW, RW, SGNDET;
  integer N, LW, RW, SGNDET;
  array A;
begin;
    integer I, L;
    real P;
    L := 1;
    P := 1;
    LW := LW + RW + 1;
    for I := 1 step 1 until N do
      begin;
        P := A[L] TIMES P;
        L := L + LW;
    end;
    DETERMBND := ABS(P) TIMES SGNDET;
end DETERMBND;
comment  ================== 34071 =================
;
procedure SOLBND(A, N, LW, RW, M, P, B); 
  value N, LW, RW;
  integer N, LW, RW;
  integer array P;
  array A, B, M;
begin;
    integer F, I, K, KK, W, W1, W2, SHIFT;
    real S;
    real procedure VECVEC(A, B, C, D, E); code 34010;
    
    procedure ELMVEC(A, B, C, D, E, F); code 34020;
    
    F := LW;
    SHIFT := -LW;
    W1 := LW - 1;
    for K := 1 step 1 until N do
      begin;
        if F < N then F := F + 1;
        SHIFT := SHIFT + W1;
        I := P[K];
        S := B[I];
        if I NOTEQUAL K then begin;
            B[I] := B[K];
            B[K] := S;
        end;
        ELMVEC(K + 1, F, SHIFT, B, M, -S);
    end;
    W1 := LW + RW;
    W := W1 + 1;
    KK := (N + 1) TIMES W - W1;
    W2 := -1;
    SHIFT := N TIMES W1;
    for K := N step -1 until 1 do
      begin;
        KK := KK - W;
        SHIFT := SHIFT - W1;
        if W2 < W1 then W2 := W2 + 1;
        B[K] := (B[K] - VECVEC(K + 1, K + W2, SHIFT, B, A)) ÷ A[KK];
    end;
end SOLBND;
comment  ================== 34322 =================
;
procedure DECSOLBND(A, N, LW, RW, AUX, B); 
  value N, LW, RW;
  integer N, LW, RW;
  array A, B, AUX;
begin;
    integer I, J, K, KK, KK1, PK, IK, LW1, F, Q, W, W1, W2, IW, NRW, SHIFT, SDET;
    real R, S, EPS, MIN;
    array M[0 : LW], V[1 : N];
    real procedure VECVEC(A, B, C, D, E); code 34010;
    
    procedure ELMVEC(A, B, C, D, E, F); code 34020;
    
    procedure ICHVEC(A, B, C, D); code 34030;
    
    F := LW;
    SDET := 1;
    W1 := LW + RW;
    W := W1 + 1;
    W2 := W - 2;
    IW := 0;
    NRW := N - RW;
    LW1 := LW + 1;
    Q := LW - 1;
    for I := 2 step 1 until LW do
      begin;
        Q := Q - 1;
        IW := IW + W1;
        for J := IW - Q step 1 until IW do A[J] := 0;
    end;
    IW := -W2;
    Q := -LW;
    for I := 1 step 1 until N do
      begin;
        IW := IW + W;
        if I NOTLESS LW1 then IW := IW - 1;
        Q := Q + W;
        if I > NRW then Q := Q - 1;
        V[I] := SQRT(VECVEC(IW, Q, 0, A, A));
    end;
    EPS := AUX[2];
    MIN := 1;
    KK := -W1;
    if F > NRW then W2 := W2 + NRW - F;
    for K := 1 step 1 until N do
      begin;
        if F < N then F := F + 1;
        IK := KK := KK + W;
        S := ABS(A[KK]) ÷ V[K];
        PK := K;
        KK1 := KK + 1;
        for I := K + 1 step 1 until F do
          begin;
            IK := IK + W1;
            M[I - K] := R := A[IK];
            A[IK] := 0;
            R := ABS(R) ÷ V[I];
            if R > S then begin;
                S := R;
                PK := I;
            end;
        end;
        if S < MIN then MIN := S;
        if S < EPS then begin;
            AUX[3] := K - 1;
            AUX[5] := S;
            goto END;
        end;
        if K + W2 NOTLESS N then W2 := W2 - 1;
        if PK NOTEQUAL K then begin;
            V[PK] := V[K];
            PK := PK - K;
            ICHVEC(KK1, KK1 + W2, PK TIMES W1, A);
            SDET := -SDET;
            R := B[K];
            B[K] := B[PK + K];
            B[PK + K] := R;
            R := M[PK];
            M[PK] := A[KK];
            A[KK] := R;
        end else R := A[KK];
        IW := KK1;
        LW1 := F - K;
        if R < 0 then SDET := -SDET;
        for I := 1 step 1 until LW1 do
          begin;
            M[I] := S := M[I] ÷ R;
            IW := IW + W1;
            ELMVEC(IW, IW + W2, KK1 - IW, A, A, -S);
            B[K + I] := B[K + I] - B[K] TIMES S;
        end;
    end;
    AUX[3] := N;
    AUX[5] := MIN;
    KK := (N + 1) TIMES W - W1;
    W2 := -1;
    SHIFT := N TIMES W1;
    for K := N step -1 until 1 do
      begin;
        KK := KK - W;
        SHIFT := SHIFT - W1;
        if W2 < W1 then W2 := W2 + 1;
        B[K] := (B[K] - VECVEC(K + 1, K + W2, SHIFT, B, A)) ÷ A[KK];
    end;
    END: AUX[1] := SDET;
end DECSOLBND;
comment  ================== 34423 =================
;
procedure DECTRI(SUB, DIAG, SUPER, N, AUX); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, AUX;
begin;
    integer I, N1;
    real D, R, S, U, NORM, NORM1, TOL;
    TOL := AUX[2];
    D := DIAG[1];
    R := SUPER[1];
    NORM := NORM1 := ABS(D) + ABS(R);
    if ABS(D) NOTLESS NORM1 TIMES TOL then begin;
        AUX[3] := 0;
        AUX[5] := D;
        goto EXIT;
    end;
    U := SUPER[1] := R ÷ D;
    S := SUB[1];
    N1 := N - 1;
    for I := 2 step 1 until N1 do
      begin;
        D := DIAG[I];
        R := SUPER[I];
        NORM1 := ABS(S) + ABS(D) + ABS(R);
        D := DIAG[I] := D - U TIMES S;
        if ABS(D) NOTLESS NORM1 TIMES TOL then begin;
            AUX[3] := I - 1;
            AUX[5] := D;
            goto EXIT;
        end;
        U := SUPER[I] := R ÷ D;
        S := SUB[I];
        if NORM1 > NORM then NORM := NORM1;
    end;
    D := DIAG[N];
    NORM1 := ABS(D) + ABS(S);
    D := DIAG[N] := D - U TIMES S;
    if ABS(D) NOTLESS NORM1 TIMES TOL then begin;
        AUX[3] := N1;
        AUX[5] := D;
        goto EXIT;
    end;
    if NORM1 > NORM then NORM := NORM1;
    AUX[3] := N;
    AUX[5] := NORM;
    EXIT: ;
end DECTRI;
comment  ================== 34426 =================
;
procedure DECTRIPIV(SUB, DIAG, SUPER, N, AID, AUX, PIV); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, AID, AUX;
  Boolean array PIV;
begin;
    integer I, I1, N1, N2;
    real D, R, S, U, T, Q, V, W, NORM, NORM1, NORM2, TOL;
    TOL := AUX[2];
    D := DIAG[1];
    R := SUPER[1];
    NORM := NORM2 := ABS(D) + ABS(R);
    N2 := N - 2;
    for I := 1 step 1 until N2 do
      begin;
        I1 := I + 1;
        S := SUB[I];
        T := DIAG[I1];
        Q := SUPER[I1];
        NORM1 := NORM2;
        NORM2 := ABS(S) + ABS(T) + ABS(Q);
        if NORM2 > NORM then NORM := NORM2;
        if ABS(D) TIMES NORM2 < ABS(S) TIMES NORM1 then begin;
            if ABS(S) NOTLESS TOL TIMES NORM2 then begin;
                AUX[3] := I - 1;
                AUX[5] := S;
                goto EXIT;
            end;
            DIAG[I] := S;
            U := SUPER[I] := T ÷ S;
            V := AID[I] := Q ÷ S;
            SUB[I] := D;
            W := SUPER[I1] := -V TIMES D;
            D := DIAG[I1] := R - U TIMES D;
            R := W;
            NORM2 := NORM1;
            PIV[I] := true;
        end else begin;
            if ABS(D) NOTLESS TOL TIMES NORM1 then begin;
                AUX[3] := I - 1;
                AUX[5] := D;
                goto EXIT;
            end;
            U := SUPER[I] := R ÷ D;
            D := DIAG[I1] := T - U TIMES S;
            AID[I] := 0;
            PIV[I] := false;
            R := Q;
        end;
    end;
    N1 := N - 1;
    S := SUB[N1];
    T := DIAG[N];
    NORM1 := NORM2;
    NORM2 := ABS(S) + ABS(T);
    if NORM2 > NORM then NORM := NORM2;
    if ABS(D) TIMES NORM2 < ABS(S) TIMES NORM1 then begin;
        if ABS(S) NOTLESS TOL TIMES NORM2 then begin;
            AUX[3] := N2;
            AUX[5] := S;
            goto EXIT;
        end;
        DIAG[N1] := S;
        U := SUPER[N1] := T ÷ S;
        SUB[N1] := D;
        D := DIAG[N] := R - U TIMES D;
        NORM2 := NORM1;
        PIV[N1] := true;
    end else begin;
        if ABS(D) NOTLESS TOL TIMES NORM1 then begin;
            AUX[3] := N2;
            AUX[5] := D;
            goto EXIT;
        end;
        U := SUPER[N1] := R ÷ D;
        D := DIAG[N] := T - U TIMES S;
        PIV[N1] := false;
    end;
    if ABS(D) NOTLESS TOL TIMES NORM2 then begin;
        AUX[3] := N1;
        AUX[5] := D;
        goto EXIT;
    end;
    AUX[3] := N;
    AUX[5] := NORM;
    EXIT: ;
end DECTRIPIV;
comment  ================== 34424 =================
;
procedure SOLTRI(SUB, DIAG, SUPER, N, B); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, B;
begin;
    integer I;
    real R;
    R := B[1] := B[1] ÷ DIAG[1];
    for I := 2 step 1 until N do
      R := B[I] := (B[I] - SUB[I - 1] TIMES R) ÷ DIAG[I];
    for I := N - 1 step -1 until 1 do
      R := B[I] := B[I] - SUPER[I] TIMES R;
end SOLTRI;
comment  ================== 34425 =================
;
procedure DECSOLTRI(SUB, DIAG, SUPER, N, AUX, B); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, AUX, B;
begin;
    procedure DECTRI(SUB, DIAG, SUPER, N, AUX); code 34423;
    
    procedure SOLTRI(SUB, DIAG, SUPER, N, B); code 34424;
    
    DECTRI(SUB, DIAG, SUPER, N, AUX);
    if AUX[3] = N then SOLTRI(SUB, DIAG, SUPER, N, B);
end DECSOLTRI;
comment  ================== 34427 =================
;
procedure SOLTRIPIV(SUB, DIAG, SUPER, N, AID, PIV, B); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, AID, B;
  Boolean array PIV;
begin;
    integer I, N1;
    real BI, BI1, R, S, T;
    N1 := N - 1;
    for I := 1 step 1 until N1 do
      begin;
        if PIV[I] then begin;
            BI := B[I + 1];
            BI1 := B[I];
        end else begin;
            BI := B[I];
            BI1 := B[I + 1];
        end;
        R := B[I] := BI ÷ DIAG[I];
        B[I + 1] := BI1 - SUB[I] TIMES R;
    end;
    R := B[N] := B[N] ÷ DIAG[N];
    T := B[N1] := B[N1] - SUPER[N1] TIMES R;
    for I := N - 2 step -1 until 1 do
      begin;
        S := R;
        R := T;
        T := B[I] := B[I] - SUPER[I] TIMES R - (if PIV[I] then AID[I] TIMES S else 0);
    end;
end SOLTRIPIV;
comment  ================== 34428 =================
;
procedure DECSOLTRIPIV(SUB, DIAG, SUPER, N, AUX, B); 
  value N;
  integer N;
  array SUB, DIAG, SUPER, AUX, B;
begin;
    integer I, I1, N1, N2;
    real D, R, S, U, T, Q, V, W, NORM, NORM1, NORM2, TOL, BI, BI1, BI2;
    Boolean array PIV[1 : N];
    TOL := AUX[2];
    D := DIAG[1];
    R := SUPER[1];
    BI := B[1];
    NORM := NORM2 := ABS(D) + ABS(R);
    N2 := N - 2;
    for I := 1 step 1 until N2 do
      begin;
        I1 := I + 1;
        S := SUB[I];
        T := DIAG[I1];
        Q := SUPER[I1];
        BI1 := B[I1];
        NORM1 := NORM2;
        NORM2 := ABS(S) + ABS(T) + ABS(Q);
        if NORM2 > NORM then NORM := NORM2;
        if ABS(D) TIMES NORM2 < ABS(S) TIMES NORM1 then begin;
            if ABS(S) NOTLESS TOL TIMES NORM2 then begin;
                AUX[3] := I - 1;
                AUX[5] := S;
                goto EXIT;
            end;
            U := SUPER[I] := T ÷ S;
            BI1 := B[I] := BI1 ÷ S;
            BI := BI - BI1 TIMES D;
            V := SUB[I] := Q ÷ S;
            W := SUPER[I1] := -V TIMES D;
            D := DIAG[I1] := R - U TIMES D;
            R := W;
            NORM2 := NORM1;
            PIV[I] := true;
        end else begin;
            if ABS(D) NOTLESS TOL TIMES NORM1 then begin;
                AUX[3] := I - 1;
                AUX[5] := D;
                goto EXIT;
            end;
            U := SUPER[I] := R ÷ D;
            BI := B[I] := BI ÷ D;
            BI := BI1 - BI TIMES S;
            D := DIAG[I1] := T - U TIMES S;
            PIV[I] := false;
            R := Q;
        end;
    end;
    N1 := N - 1;
    S := SUB[N1];
    T := DIAG[N];
    NORM1 := NORM2;
    BI1 := B[N];
    NORM2 := ABS(S) + ABS(T);
    if NORM2 > NORM then NORM := NORM2;
    if ABS(D) TIMES NORM2 < ABS(S) TIMES NORM1 then begin;
        if ABS(S) NOTLESS TOL TIMES NORM2 then begin;
            AUX[3] := N2;
            AUX[5] := S;
            goto EXIT;
        end;
        U := SUPER[N1] := T ÷ S;
        BI1 := B[N1] := BI1 ÷ S;
        BI := BI - BI1 TIMES D;
        D := R - U TIMES D;
        NORM2 := NORM1;
    end else begin;
        if ABS(D) NOTLESS TOL TIMES NORM1 then begin;
            AUX[3] := N2;
            AUX[5] := D;
            goto EXIT;
        end;
        U := SUPER[N1] := R ÷ D;
        BI := B[N1] := BI ÷ D;
        BI := BI1 - BI TIMES S;
        D := T - U TIMES S;
    end;
    if ABS(D) NOTLESS TOL TIMES NORM2 then begin;
        AUX[3] := N1;
        AUX[5] := D;
        goto EXIT;
    end;
    AUX[3] := N;
    AUX[5] := NORM;
    BI1 := B[N] := BI ÷ D;
    BI := B[N1] := B[N1] - SUPER[N1] TIMES BI1;
    for I := N - 2 step -1 until 1 do
      begin;
        BI2 := BI1;
        BI1 := BI;
        BI := B[I] := B[I] - SUPER[I] TIMES BI1 - (if PIV[I] then SUB[I] TIMES BI2 else 0);
    end;
    EXIT: ;
end DECSOLTRIPIV;
comment  ================== 34330 =================
;
procedure CHLDECBND(A, N, W, AUX); 
  value N, W;
  integer N, W;
  array A, AUX;
begin;
    integer J, K, JMAX, KK, KJ, W1, START;
    real R, EPS, MAX;
    real procedure VECVEC(L, U, S, A, B); code 34010;
    
    MAX := 0;
    KK := -W;
    W1 := W + 1;
    for J := 1 step 1 until N do
      begin;
        KK := KK + W1;
        if A[KK] > MAX then MAX := A[KK];
    end;
    JMAX := W;
    W1 := W + 1;
    KK := -W;
    EPS := AUX[2] TIMES MAX;
    for K := 1 step 1 until N do
      begin;
        if K + W > N then JMAX := JMAX - 1;
        KK := KK + W1;
        START := KK - K + 1;
        R := A[KK] - VECVEC(if K NOTLESS W1 then START else KK - W, KK - 1, 0, A, A);
        if R NOTLESS EPS then begin;
            AUX[3] := K - 1;
            goto END;
        end;
        A[KK] := R := SQRT(R);
        KJ := KK;
        for J := 1 step 1 until JMAX do
          begin;
            KJ := KJ + W;
            A[KJ] := (A[KJ] - VECVEC(if K + J NOTLESS W1 then START else KK - W + J, KK - 1, KJ - KK, A, A)) ÷ R;
        end;
    end;
    AUX[3] := N;
    END: ;
end CHLDECBND;
comment  ================== 34331 =================
;
real procedure CHLDETERMBND(A, N, W); 
  value N, W;
  integer N, W;
  array A;
begin;
    integer J, KK, W1;
    real P;
    W1 := W + 1;
    KK := -W;
    P := 1;
    for J := 1 step 1 until N do
      begin;
        KK := KK + W1;
        P := A[KK] TIMES P;
    end;
    CHLDETERMBND := P TIMES P;
end CHLDETERMBND;
comment  ================== 34332 =================
;
procedure CHLSOLBND(A, N, W, B); 
  value N, W;
  integer N, W;
  array A, B;
begin;
    integer I, K, IMAX, KK, W1;
    real procedure VECVEC(L, U, S, A, B); code 34010;
    
    real procedure SCAPRD1(LA, SA, LB, SB, N, A, B); code 34017;
    
    KK := -W;
    W1 := W + 1;
    for K := 1 step 1 until N do
      begin;
        KK := KK + W1;
        B[K] := (B[K] - VECVEC(if K NOTLESS W1 then 1 else K - W, K - 1, KK - K, B, A)) ÷ A[KK];
    end;
    IMAX := -1;
    for K := N step -1 until 1 do
      begin;
        if IMAX < W then IMAX := IMAX + 1;
        B[K] := (B[K] - SCAPRD1(KK + W, W, K + 1, 1, IMAX, A, B)) ÷ A[KK];
        KK := KK - W1;
    end;
end CHLSOLBND;
comment  ================== 34333 =================
;
procedure CHLDECSOLBND(A, N, W, AUX, B); 
  value N, W;
  integer N, W;
  array A, AUX, B;
begin;
    procedure CHLDECBND(A, N, W, AUX); code 34330;
    
    procedure CHLSOLBND(A, N, W, B); code 34332;
    
    CHLDECBND(A, N, W, AUX);
    if AUX[3] = N then CHLSOLBND(A, N, W, B);
end CHLDECSOLBND;
comment  ================== 34420 =================
;
procedure DECSYMTRI(DIAG, CO, N, AUX); 
  value N;
  integer N;
  array DIAG, CO, AUX;
begin;
    integer I, N1;
    real D, R, S, U, TOL, NORM, NORMR;
    TOL := AUX[2];
    D := DIAG[1];
    R := CO[1];
    NORM := NORMR := ABS(D) + ABS(R);
    if ABS(D) NOTLESS NORMR TIMES TOL then begin;
        AUX[3] := 0;
        AUX[5] := D;
        goto EXIT;
    end;
    U := CO[1] := R ÷ D;
    N1 := N - 1;
    for I := 2 step 1 until N1 do
      begin;
        S := R;
        R := CO[I];
        D := DIAG[I];
        NORMR := ABS(S) + ABS(D) + ABS(R);
        D := DIAG[I] := D - U TIMES S;
        if ABS(D) NOTLESS NORMR TIMES TOL then begin;
            AUX[3] := I - 1;
            AUX[5] := D;
            goto EXIT;
        end;
        U := CO[I] := R ÷ D;
        if NORMR > NORM then NORM := NORMR;
    end;
    D := DIAG[N];
    NORMR := ABS(D) + ABS(R);
    D := DIAG[N] := D - U TIMES R;
    if ABS(D) NOTLESS NORMR TIMES TOL then begin;
        AUX[3] := N1;
        AUX[5] := D;
        goto EXIT;
    end;
    if NORMR > NORM then NORM := NORMR;
    AUX[3] := N;
    AUX[5] := NORM;
    EXIT: ;
end DECSYMTRI;
comment  ================== 34421 =================
;
procedure SOLSYMTRI(DIAG, CO, N, B); 
  value N;
  integer N;
  array DIAG, CO, B;
begin;
    integer I;
    real R, S;
    R := B[1];
    B[1] := R ÷ DIAG[1];
    for I := 2 step 1 until N do
      begin;
        R := B[I] - CO[I - 1] TIMES R;
        B[I] := R ÷ DIAG[I];
    end;
    S := B[N];
    for I := N - 1 step -1 until 1 do
      S := B[I] := B[I] - CO[I] TIMES S;
end SOLSYMTRI;
comment  ================== 34422 =================
;
procedure DECSOLSYMTRI(DIAG, CO, N, AUX, B); 
  value N;
  integer N;
  array DIAG, CO, AUX, B;
begin;
    procedure DECSYMTRI(DIAG, CO, N, AUX); code 34420;
    
    procedure SOLSYMTRI(DIAG, CO, N, B); code 34421;
    
    DECSYMTRI(DIAG, CO, N, AUX);
    if AUX[3] = N then SOLSYMTRI(DIAG, CO, N, B);
end DECSOLSYMTRI;
comment  ================== 34220 =================
;
procedure CONJ GRAD(MATVEC, X, R, L, N, GO ON, ITERATE, NORM2); 
  value L, N;
  procedure MATVEC;
  array X, R;
  Boolean GO ON;
  integer L, N, ITERATE;
  real NORM2;
begin;
    array P, AP[L : N];
    integer I;
    real A, B, PRR, RRP;
    real procedure VECVEC(A, B, C, D, E); code 34010;
    
    procedure ELMVEC(A, B, C, D, E, F); code 34020;
    
    for ITERATE := 0,
             ITERATE + 1 while GO ON do
      begin;
        if ITERATE = 0 then begin;
            MATVEC(X, P);
            for I := L step 1 until N do
              P[I] := R[I] := R[I] - P[I];
            PRR := VECVEC(L, N, 0, R, R);
        end else begin;
            B := RRP ÷ PRR;
            PRR := RRP;
            for I := L step 1 until N do
              P[I] := R[I] + B TIMES P[I];
        end;
        MATVEC(P, AP);
        A := PRR ÷ VECVEC(L, N, 0, P, AP);
        ELMVEC(L, N, 0, X, P, A);
        ELMVEC(L, N, 0, R, AP, -A);
        NORM2 := RRP := VECVEC(L, N, 0, R, R);
    end;
end CONJ GRAD;
comment  ================== 34173 =================
;
comment  MCA 2405
;
procedure EQILBR(A, N, EM, D, INT); 
  value N;
  integer N;
  array A, EM, D;
  integer array INT;
begin;
    integer I, IM, I1, P, Q, J, T, COUNT, EXPONENT, NI;
    real C, R, EPS, OMEGA, FACTOR;
    procedure MOVE(K); 
      value K;
      integer K;
    begin;
        real DI;
        NI := Q - P;
        T := T + 1;
        if K NOTEQUAL I then begin;
            ICHCOL(1, N, K, I, A);
            ICHROW(1, N, K, I, A);
            DI := D[I];
            D[I] := D[K];
            D[K] := DI;
        end;
    end MOVE;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure ICHCOL(L, U, I, J, A); code 34031;
    
    procedure ICHROW(L, U, I, J, A); code 34032;
    
    FACTOR := 1 ÷ (2 TIMES LN(2));
    comment  MORE GENERALLY: LN(BASE)
    ;
    EPS := EM[0];
    OMEGA := 1 ÷ EPS;
    T := P := 1;
    Q := NI := I := N;
    COUNT := (N + 1) TIMES N // 2;
    for J := 1 step 1 until N do
      begin;
        D[J] := 1;
        INT[J] := 0;
    end;
    for I := if I < Q then I + 1 else P while COUNT > 0 IMPL NI > 0 do
      begin;
        COUNT := COUNT - 1;
        IM := I - 1;
        I1 := I + 1;
        C := SQRT(TAMMAT(P, IM, I, I, A, A) + TAMMAT(I1, Q, I, I, A, A));
        R := SQRT(MATTAM(P, IM, I, I, A, A) + MATTAM(I1, Q, I, I, A, A));
        if C TIMES OMEGA NOTLESS R TIMES EPS then begin;
            INT[T] := I;
            MOVE(P);
            P := P + 1;
        end else if R TIMES OMEGA NOTLESS C TIMES EPS then begin;
            INT[T] := -I;
            MOVE(Q);
            Q := Q - 1;
        end else begin;
            EXPONENT := LN(R ÷ C) TIMES FACTOR;
            if ABS(EXPONENT) > 1 then begin;
                NI := Q - P;
                C := 2 POWER EXPONENT;
                R := 1 ÷ C;
                D[I] := D[I] TIMES C;
                for J := 1 step 1 until IM,
                         I1 step 1 until N do
                  begin;
                    A[J, I] := A[J, I] TIMES C;
                    A[I, J] := A[I, J] TIMES R;
                end;
            end else NI := NI - 1;
        end;
    end;
end EQILBR;
comment  ================== 34174 =================
;
comment  MCA 2406
;
procedure BAKLBR(N, N1, N2, D, INT, VEC); 
  value N, N1, N2;
  integer N, N1, N2;
  array D, VEC;
  integer array INT;
begin;
    integer I, J, K, P, Q;
    real DI;
    procedure ICHROW(L, U, I, J, A); code 34032;
    
    P := 1;
    Q := N;
    for I := 1 step 1 until N do
      begin;
        DI := D[I];
        if DI NOTEQUAL 1 then for J := N1 step 1 until N2 do
          VEC[I, J] := VEC[I, J] TIMES DI;
        K := INT[I];
        if K > 0 then P := P + 1 else if K < 0 then Q := Q - 1;
    end;
    for I := P - 1 + N - Q step -1 until 1 do
      begin;
        K := INT[I];
        if K > 0 then begin;
            P := P - 1;
            if K NOTEQUAL P then ICHROW(N1, N2, K, P, VEC);
        end else begin;
            Q := Q + 1;
            if -K NOTEQUAL Q then ICHROW(N1, N2, -K, Q, VEC);
        end;
    end;
end BAKLBR;
comment  ================== 34361 =================
;
procedure EQILBRCOM(A1, A2, N, EM, D, INT); 
  value N;
  integer N;
  array A1, A2, EM, D;
  integer array INT;
begin;
    integer I, P, Q, J, T, COUNT, EXPONENT, NI, IM, I1;
    real C, R, EPS;
    procedure ICHCOL(L, U, I, J, A); code 34031;
    
    procedure ICHROW(L, U, I, J, A); code 34032;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure MOVE(K); 
      value K;
      integer K;
    begin;
        real DI;
        NI := Q - P;
        T := T + 1;
        if K NOTEQUAL I then begin;
            ICHCOL(1, N, K, I, A1);
            ICHROW(1, N, K, I, A1);
            ICHCOL(1, N, K, I, A2);
            ICHROW(1, N, K, I, A2);
            DI := D[I];
            D[I] := D[K];
            D[K] := DI;
        end;
    end MOVE;
    EPS := EM[0] POWER 4;
    T := P := 1;
    Q := NI := I := N;
    COUNT := EM[6];
    for J := 1 step 1 until N do
      begin;
        D[J] := 1;
        INT[J] := 0;
    end;
    for I := if I < Q then I + 1 else P while COUNT > 0 IMPL NI > 0 do
      begin;
        COUNT := COUNT - 1;
        IM := I - 1;
        I1 := I + 1;
        C := TAMMAT(P, IM, I, I, A1, A1) + TAMMAT(I1, Q, I, I, A1, A1) + TAMMAT(P, IM, I, I, A2, A2) + TAMMAT(I1, Q, I, I, A2, A2);
        R := MATTAM(P, IM, I, I, A1, A1) + MATTAM(I1, Q, I, I, A1, A1) + MATTAM(P, IM, I, I, A2, A2) + MATTAM(I1, Q, I, I, A2, A2);
        if C ÷ EPS NOTLESS R then begin;
            INT[T] := I;
            MOVE(P);
            P := P + 1;
        end else if R ÷ EPS NOTLESS C then begin;
            INT[T] := -I;
            MOVE(Q);
            Q := Q - 1;
        end else begin;
            EXPONENT := LN(R ÷ C) TIMES 0.36067;
            if ABS(EXPONENT) > 1 then begin;
                NI := Q - P;
                C := 2 POWER EXPONENT;
                D[I] := D[I] TIMES C;
                for J := 1 step 1 until IM,
                         I1 step 1 until N do
                  begin;
                    A1[J, I] := A1[J, I] TIMES C;
                    A1[I, J] := A1[I, J] ÷ C;
                    A2[J, I] := A2[J, I] TIMES C;
                    A2[I, J] := A2[I, J] ÷ C;
                end;
            end else NI := NI - 1;
        end;
    end;
    EM[7] := EM[6] - COUNT;
end EQILBRCOM;
comment  ================== 34362 =================
;
procedure BAKLBRCOM(N, N1, N2, D, INT, VR, VI); 
  value N, N1, N2;
  integer N, N1, N2;
  array D, VR, VI;
  integer array INT;
begin;
    procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174;
    
    BAKLBR(N, N1, N2, D, INT, VR);
    BAKLBR(N, N1, N2, D, INT, VI);
end BAKLBRCOM;
comment  ================== 34140 =================
;
comment  MCA 2300
;
procedure TFMSYMTRI2(A, N, D, B, BB, EM); 
  value N;
  integer N;
  array A, B, BB, D, EM;
begin;
    integer I, J, R, R1;
    real W, X, A1, B0, BB0, D0, MACHTOL, NORM;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    procedure ELMCOLVEC(L, U, I, A, B, X); code 34022;
    
    NORM := 0;
    for J := 1 step 1 until N do
      begin;
        W := 0;
        for I := 1 step 1 until J do
          W := ABS(A[I, J]) + W;
        for I := J + 1 step 1 until N do
          W := ABS(A[J, I]) + W;
        if W > NORM then NORM := W;
    end;
    MACHTOL := EM[0] TIMES NORM;
    EM[1] := NORM;
    R := N;
    for R1 := N - 1 step -1 until 1 do
      begin;
        D[R] := A[R, R];
        X := TAMMAT(1, R - 2, R, R, A, A);
        A1 := A[R1, R];
        if SQRT(X) NOTLESS MACHTOL then begin;
            B0 := B[R1] := A1;
            BB[R1] := B0 TIMES B0;
            A[R, R] := 1;
        end else begin;
            BB0 := BB[R1] := A1 TIMES A1 + X;
            B0 := if A1 > 0 then -SQRT(BB0) else SQRT(BB0);
            A1 := A[R1, R] := A1 - B0;
            W := A[R, R] := 1 ÷ (A1 TIMES B0);
            for J := 1 step 1 until R1 do
              B[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J + 1, R1, J, R, A, A)) TIMES W;
            ELMVECCOL(1, R1, R, B, A, TAMVEC(1, R1, R, A, B) TIMES W TIMES .5);
            for J := 1 step 1 until R1 do
              begin;
                ELMCOL(1, J, J, R, A, A, B[J]);
                ELMCOLVEC(1, J, J, A, B, A[J, R]);
            end;
            B[R1] := B0;
        end;
        R := R1;
    end;
    D[1] := A[1, 1];
    A[1, 1] := 1;
    B[N] := BB[N] := 0;
end TFMSYMTRI2;
comment  ================== 34141 =================
;
comment  MCA 2301
;
procedure BAKSYMTRI2(A, N, N1, N2, VEC); 
  value N, N1, N2;
  integer N, N1, N2;
  array A, VEC;
begin;
    integer I, J, K;
    real W;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    for J := 2 step 1 until N do
      begin;
        W := A[J, J];
        if W < 0 then for K := N1 step 1 until N2 do
          ELMCOL(1, J - 1, K, J, VEC, A, TAMMAT(1, J - 1, J, K, A, VEC) TIMES W);
    end;
end BAKSYMTRI2;
comment  ================== 34142 =================
;
comment  MCA 2302
;
procedure TFMPREVEC(A, N); 
  value N;
  integer N;
  array A;
begin;
    integer I, J, J1, K;
    real AB;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    J1 := 1;
    for J := 2 step 1 until N do
      begin;
        for I := 1 step 1 until J1 - 1,
                 J step 1 until N do
          A[I, J1] := 0;
        A[J1, J1] := 1;
        AB := A[J, J];
        if AB < 0 then for K := 1 step 1 until J1 do
          ELMCOL(1, J1, K, J, A, A, TAMMAT(1, J1, J, K, A, A) TIMES AB);
        J1 := J;
    end;
    for I := N - 1 step -1 until 1 do
      A[I, N] := 0;
    A[N, N] := 1;
end TFMPREVEC;
comment  ================== 34143 =================
;
comment  MCA 2305
;
procedure TFMSYMTRI1(A, N, D, B, BB, EM); 
  value N;
  integer N;
  array A, B, BB, D, EM;
begin;
    integer I, J, R, R1, P, Q, TI, TJ;
    real S, W, X, A1, B0, BB0, D0, NORM, MACHTOL;
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure SEQVEC(L, U, IL, SHIFT, A, B); code 34016;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    NORM := 0;
    TJ := 0;
    for J := 1 step 1 until N do
      begin;
        W := 0;
        for I := 1 step 1 until J do
          W := ABS(A[I + TJ]) + W;
        TJ := TJ + J;
        TI := TJ + J;
        for I := J + 1 step 1 until N do
          begin;
            W := ABS(A[TI]) + W;
            TI := TI + I;
        end;
        if W > NORM then NORM := W;
    end;
    MACHTOL := EM[0] TIMES NORM;
    EM[1] := NORM;
    Q := (N + 1) TIMES N // 2;
    R := N;
    for R1 := N - 1 step -1 until 1 do
      begin;
        P := Q - R;
        D[R] := A[Q];
        X := VECVEC(P + 1, Q - 2, 0, A, A);
        A1 := A[Q - 1];
        if SQRT(X) NOTLESS MACHTOL then begin;
            B0 := B[R1] := A1;
            BB[R1] := B0 TIMES B0;
            A[Q] := 1;
        end else begin;
            BB0 := BB[R1] := A1 TIMES A1 + X;
            B0 := if A1 > 0 then -SQRT(BB0) else SQRT(BB0);
            A1 := A[Q - 1] := A1 - B0;
            W := A[Q] := 1 ÷ (A1 TIMES B0);
            TJ := 0;
            for J := 1 step 1 until R1 do
              begin;
                TI := TJ + J;
                S := VECVEC(TJ + 1, TI, P - TJ, A, A);
                TJ := TI + J;
                B[J] := (SEQVEC(J + 1, R1, TJ, P, A, A) + S) TIMES W;
                TJ := TI;
            end;
            ELMVEC(1, R1, P, B, A, VECVEC(1, R1, P, B, A) TIMES W TIMES .5);
            TJ := 0;
            for J := 1 step 1 until R1 do
              begin;
                TI := TJ + J;
                ELMVEC(TJ + 1, TI, P - TJ, A, A, B[J]);
                ELMVEC(TJ + 1, TI, -TJ, A, B, A[J + P]);
                TJ := TI;
            end;
            B[R1] := B0;
        end;
        Q := P;
        R := R1;
    end;
    D[1] := A[1];
    A[1] := 1;
    B[N] := BB[N] := 0;
end TFMSYMTRI1;
comment  ================== 34144 =================
;
comment  MCA 2306
;
procedure BAKSYMTRI1(A, N, N1, N2, VEC); 
  value N, N1, N2;
  integer N, N1, N2;
  array A, VEC;
begin;
    integer J, J1, K, TI, TJ;
    real W;
    array AUXVEC[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    for K := N1 step 1 until N2 do
      begin;
        for J := 1 step 1 until N do
          AUXVEC[J] := VEC[J, K];
        TJ := J1 := 1;
        for J := 2 step 1 until N do
          begin;
            TI := TJ + J;
            W := A[TI];
            if W < 0 then ELMVEC(1, J1, TJ, AUXVEC, A, VECVEC(1, J1, TJ, AUXVEC, A) TIMES W);
            J1 := J;
            TJ := TI;
        end;
        for J := 1 step 1 until N do
          VEC[J, K] := AUXVEC[J];
    end;
end BAKSYMTRI1;
comment  ================== 34170 =================
;
comment  MCA 2400
;
procedure TFMREAHES(A, N, EM, INT); 
  value N;
  integer N;
  array A, EM;
  integer array INT;
begin;
    integer I, J, J1, K, L;
    real S, T, MACHTOL, MACHEPS, NORM;
    array B[0 : N - 1];
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ICHCOL(L, U, I, J, A); code 34031;
    
    procedure ICHROW(L, U, I, J, A); code 34032;
    
    MACHEPS := EM[0];
    NORM := 0;
    for I := 1 step 1 until N do
      begin;
        S := 0;
        for J := 1 step 1 until N do
          S := S + ABS(A[I, J]);
        if S > NORM then NORM := S;
    end;
    EM[1] := NORM;
    MACHTOL := NORM TIMES MACHEPS;
    INT[1] := 0;
    for J := 2 step 1 until N do
      begin;
        J1 := J - 1;
        L := 0;
        S := MACHTOL;
        for K := J + 1 step 1 until N do
          begin;
            T := ABS(A[K, J1]);
            if T > S then begin;
                L := K;
                S := T;
            end;
        end;
        if L NOTEQUAL 0 then begin;
            if ABS(A[J, J1]) < S then begin;
                ICHROW(1, N, J, L, A);
                ICHCOL(1, N, J, L, A);
            end else L := J;
            T := A[J, J1];
            for K := J + 1 step 1 until N do
              A[K, J1] := A[K, J1] ÷ T;
        end else for K := J + 1 step 1 until N do
          A[K, J1] := 0;
        for I := 1 step 1 until N do
          B[I - 1] := A[I, J] := A[I, J] + (if L = 0 then 0 else MATMAT(J + 1, N, I, J1, A, A)) - MATVEC(1, if J1 < I - 2 then J1 else I - 2, I, A, B);
        INT[J] := L;
    end;
end TFMREAHES;
comment  ================== 34171 =================
;
comment  MCA 2401
;
procedure BAKREAHES1(A, N, INT, V); 
  value N;
  integer N;
  array A, V;
  integer array INT;
begin;
    integer I, L;
    real W;
    array X[1 : N];
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    for I := 2 step 1 until N do
      X[I - 1] := V[I];
    for I := N step -1 until 2 do
      begin;
        V[I] := V[I] + MATVEC(1, I - 2, I, A, X);
        L := INT[I];
        if L > I then begin;
            W := V[I];
            V[I] := V[L];
            V[L] := W;
        end;
    end;
end BAKREAHES1;
comment  ================== 34172 =================
;
comment  MCA 2402
;
procedure BAKREAHES2(A, N, N1, N2, INT, VEC); 
  value N, N1, N2;
  integer N, N1, N2;
  array A, VEC;
  integer array INT;
begin;
    integer I, L, K;
    array U[1 : N];
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    procedure ICHROW(L, U, I, J, A); code 34032;
    
    for I := N step -1 until 2 do
      begin;
        for K := I - 2 step -1 until 1 do
          U[K + 1] := A[I, K];
        for K := N1 step 1 until N2 do
          VEC[I, K] := VEC[I, K] + TAMVEC(2, I - 1, K, VEC, U);
        L := INT[I];
        if L > I then ICHROW(N1, N2, I, L, VEC);
    end;
end BAKREAHES2;
comment  ================== 34363 =================
;
procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); 
  value N;
  integer N;
  array A, D, B, BB, EM, TR, TI;
begin;
    integer I, J, J1, JM1, R, RM1;
    real NRM, W, TOL2, X, AR, AI, MOD, C, S, H, K, T, Q, AJR, ARJ, BJ, BBJ;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    procedure ELMCOLVEC(L, U, I, A, B, X); code 34022;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    procedure ELMROW(L, U, I, J, A, B, X); code 34024;
    
    procedure ELMVECROW(L, U, I, A, B, X); code 34026;
    
    procedure ELMROWVEC(L, U, I, A, B, X); code 34027;
    
    procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028;
    
    procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029;
    
    procedure CARPOL(AR, AI, R, C, S); code 34344;
    
    NRM := 0;
    for I := 1 step 1 until N do
      begin;
        W := ABS(A[I, I]);
        for J := I - 1 step -1 until 1,
                 I + 1 step 1 until N do
          W := W + ABS(A[I, J]) + ABS(A[J, I]);
        if W > NRM then NRM := W;
    end I;
    TOL2 := (EM[0] TIMES NRM) POWER 2;
    EM[1] := NRM;
    R := N;
    for RM1 := N - 1 step -1 until 1 do
      begin;
        X := TAMMAT(1, R - 2, R, R, A, A) + MATTAM(1, R - 2, R, R, A, A);
        AR := A[RM1, R];
        AI := -A[R, RM1];
        D[R] := A[R, R];
        CARPOL(AR, AI, MOD, C, S);
        if X < TOL2 then begin;
            A[R, R] := -1;
            B[RM1] := MOD;
            BB[RM1] := MOD TIMES MOD;
        end else begin;
            H := MOD TIMES MOD + X;
            K := SQRT(H);
            T := A[R, R] := H + MOD TIMES K;
            if AR = 0 IMPL AI = 0 then A[RM1, R] := K else begin;
                A[RM1, R] := AR + C TIMES K;
                A[R, RM1] := -AI - S TIMES K;
                S := -S;
            end;
            C := -C;
            J := 1;
            JM1 := 0;
            for J1 := 2 step 1 until R do
              begin;
                B[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J1, RM1, J, R, A, A) + MATTAM(1, JM1, J, R, A, A) - MATMAT(J1, RM1, R, J, A, A)) ÷ T;
                BB[J] := (MATMAT(1, JM1, J, R, A, A) - TAMMAT(J1, RM1, J, R, A, A) - MATMAT(1, J, R, J, A, A) - MATTAM(J1, RM1, J, R, A, A)) ÷ T;
                JM1 := J;
                J := J1;
            end J1;
            Q := (TAMVEC(1, RM1, R, A, B) - MATVEC(1, RM1, R, A, BB)) ÷ T ÷ 2;
            ELMVECCOL(1, RM1, R, B, A, -Q);
            ELMVECROW(1, RM1, R, BB, A, Q);
            J := 1;
            for J1 := 2 step 1 until R do
              begin;
                AJR := A[J, R];
                ARJ := A[R, J];
                BJ := B[J];
                BBJ := BB[J];
                ELMROWVEC(J, RM1, J, A, B, -AJR);
                ELMROWVEC(J, RM1, J, A, BB, ARJ);
                ELMROWCOL(J, RM1, J, R, A, A, -BJ);
                ELMROW(J, RM1, J, R, A, A, BBJ);
                ELMCOLVEC(J1, RM1, J, A, B, -ARJ);
                ELMCOLVEC(J1, RM1, J, A, BB, -AJR);
                ELMCOL(J1, RM1, J, R, A, A, BBJ);
                ELMCOLROW(J1, RM1, J, R, A, A, BJ);
                J := J1;
                ;
            end J1;
            BB[RM1] := H;
            B[RM1] := K;
            ;
        end;
        TR[RM1] := C;
        TI[RM1] := S;
        R := RM1;
        ;
    end RM1;
    D[1] := A[1, 1];
    ;
end HSHHRMTRI;
comment  ================== 34365 =================
;
procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); 
  value N, N1, N2;
  integer N, N1, N2;
  array A, VECR, VECI, TR, TI;
begin;
    integer I, J, R, RM1;
    real C, S, T, QR, QI;
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029;
    
    procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341;
    
    procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353;
    
    for I := 1 step 1 until N do
      for J := N1 step 1 until N2 do
      VECI[I, J] := 0;
    C := 1;
    S := 0;
    for J := N - 1 step -1 until 1 do
      begin;
        COMMUL(C, S, TR[J], TI[J], C, S);
        COMROWCST(N1, N2, J, VECR, VECI, C, S);
    end J;
    RM1 := 2;
    for R := 3 step 1 until N do
      begin;
        T := A[R, R];
        if T > 0 then for J := N1 step 1 until N2 do
          begin;
            QR := (TAMMAT(1, RM1, R, J, A, VECR) - MATMAT(1, RM1, R, J, A, VECI)) ÷ T;
            QI := (TAMMAT(1, RM1, R, J, A, VECI) + MATMAT(1, RM1, R, J, A, VECR)) ÷ T;
            ELMCOL(1, RM1, J, R, VECR, A, -QR);
            ELMCOLROW(1, RM1, J, R, VECR, A, -QI);
            ELMCOLROW(1, RM1, J, R, VECI, A, QR);
            ELMCOL(1, RM1, J, R, VECI, A, -QI);
        end;
        RM1 := R;
        ;
    end R;
    ;
end BAKHRMTRI;
comment  ================== 34364 =================
;
procedure HSHHRMTRIVAL(A, N, D, BB, EM); 
  value N;
  integer N;
  array A, D, BB, EM;
begin;
    integer I, J, J1, JM1, R, RM1;
    real NRM, W, TOL2, X, AR, AI, H, T, Q, AJR, ARJ, DJ, BBJ, MOD2;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    procedure ELMCOLVEC(L, U, I, A, B, X); code 34022;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    procedure ELMROW(L, U, I, J, A, B, X); code 34024;
    
    procedure ELMVECROW(L, U, I, A, B, X); code 34026;
    
    procedure ELMROWVEC(L, U, I, A, B, X); code 34027;
    
    procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028;
    
    procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029;
    
    NRM := 0;
    for I := 1 step 1 until N do
      begin;
        W := ABS(A[I, I]);
        for J := I - 1 step -1 until 1,
                 I + 1 step 1 until N do
          W := W + ABS(A[I, J]) + ABS(A[J, I]);
        if W > NRM then NRM := W;
    end I;
    TOL2 := (EM[0] TIMES NRM) POWER 2;
    EM[1] := NRM;
    R := N;
    for RM1 := N - 1 step -1 until 1 do
      begin;
        X := TAMMAT(1, R - 2, R, R, A, A) + MATTAM(1, R - 2, R, R, A, A);
        AR := A[RM1, R];
        AI := -A[R, RM1];
        D[R] := A[R, R];
        if X < TOL2 then BB[RM1] := AR TIMES AR + AI TIMES AI else begin;
            MOD2 := AR TIMES AR + AI TIMES AI;
            if MOD2 = 0 then begin;
                A[RM1, R] := SQRT(X);
                T := X;
            end else begin;
                X := X + MOD2;
                H := SQRT(MOD2 TIMES X);
                T := X + H;
                H := 1 + X ÷ H;
                A[R, RM1] := -AI TIMES H;
                A[RM1, R] := AR TIMES H;
                ;
            end;
            J := 1;
            JM1 := 0;
            for J1 := 2 step 1 until R do
              begin;
                D[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J1, RM1, J, R, A, A) + MATTAM(1, JM1, J, R, A, A) - MATMAT(J1, RM1, R, J, A, A)) ÷ T;
                BB[J] := (MATMAT(1, JM1, J, R, A, A) - TAMMAT(J1, RM1, J, R, A, A) - MATMAT(1, J, R, J, A, A) - MATTAM(J1, RM1, J, R, A, A)) ÷ T;
                JM1 := J;
                J := J1;
            end J1;
            Q := (TAMVEC(1, RM1, R, A, D) - MATVEC(1, RM1, R, A, BB)) ÷ T ÷ 2;
            ELMVECCOL(1, RM1, R, D, A, -Q);
            ELMVECROW(1, RM1, R, BB, A, Q);
            J := 1;
            for J1 := 2 step 1 until R do
              begin;
                AJR := A[J, R];
                ARJ := A[R, J];
                DJ := D[J];
                BBJ := BB[J];
                ELMROWVEC(J, RM1, J, A, D, -AJR);
                ELMROWVEC(J, RM1, J, A, BB, ARJ);
                ELMROWCOL(J, RM1, J, R, A, A, -DJ);
                ELMROW(J, RM1, J, R, A, A, BBJ);
                ELMCOLVEC(J1, RM1, J, A, D, -ARJ);
                ELMCOLVEC(J1, RM1, J, A, BB, -AJR);
                ELMCOL(J1, RM1, J, R, A, A, BBJ);
                ELMCOLROW(J1, RM1, J, R, A, A, DJ);
                J := J1;
                ;
            end J1;
            BB[RM1] := X;
            ;
        end;
        R := RM1;
        ;
    end RM1;
    D[1] := A[1, 1];
    ;
end HSHHRMTRIVAL;
comment  ================== 34366 =================
;
procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); 
  value N;
  integer N;
  array AR, AI, EM, B, TR, TI, DEL;
begin;
    integer R, RM1, I, J, NM1;
    real TOL, T, XR, XI;
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028;
    
    procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); code 34356;
    
    procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352;
    
    procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353;
    
    procedure CARPOL(AR, AI, R, C, S); code 34344;
    
    procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341;
    
    Boolean procedure HSHCOMCOL(L, U, J, AR, AI, TOL, K, C, S, T); code 34355;
    
    NM1 := N - 1;
    TOL := (EM[0] TIMES EM[1]) POWER 2;
    RM1 := 1;
    for R := 2 step 1 until NM1 do
      begin;
        if HSHCOMCOL(R, N, RM1, AR, AI, TOL, B[RM1], TR[R], TI[R], T) then begin;
            for I := 1 step 1 until N do
              begin;
                XR := (MATMAT(R, N, I, RM1, AI, AI) - MATMAT(R, N, I, RM1, AR, AR)) ÷ T;
                XI := (-MATMAT(R, N, I, RM1, AR, AI) - MATMAT(R, N, I, RM1, AI, AR)) ÷ T;
                ELMROWCOL(R, N, I, RM1, AR, AR, XR);
                ELMROWCOL(R, N, I, RM1, AR, AI, XI);
                ELMROWCOL(R, N, I, RM1, AI, AR, XI);
                ELMROWCOL(R, N, I, RM1, AI, AI, -XR);
            end;
            HSHCOMPRD(R, N, R, N, RM1, AR, AI, AR, AI, T);
            ;
        end;
        DEL[RM1] := T;
        RM1 := R;
    end FORR;
    if N > 1 then CARPOL(AR[N, NM1], AI[N, NM1], B[NM1], TR[N], TI[N]);
    RM1 := 1;
    TR[1] := 1;
    TI[1] := 0;
    for R := 2 step 1 until N do
      begin;
        COMMUL(TR[RM1], TI[RM1], TR[R], TI[R], TR[R], TI[R]);
        COMCOLCST(1, RM1, R, AR, AI, TR[R], TI[R]);
        COMROWCST(R + 1, N, R, AR, AI, TR[R], -TI[R]);
        RM1 := R;
    end;
    ;
end HSHCOMHES;
comment  ================== 34367 =================
;
procedure BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, N1, N2); 
  value N, N1, N2;
  integer N, N1, N2;
  array AR, AI, TR, TI, DEL, VR, VI;
begin;
    integer I, R, RM1;
    real H;
    procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); code 34356;
    
    procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353;
    
    for I := 2 step 1 until N do
      COMROWCST(N1, N2, I, VR, VI, TR[I], TI[I]);
    R := N - 1;
    for RM1 := N - 2 step -1 until 1 do
      begin;
        H := DEL[RM1];
        if H > 0 then HSHCOMPRD(R, N, N1, N2, RM1, VR, VI, AR, AI, H);
        R := RM1;
    end;
end BAKCOMHES;
comment  ================== 34260 =================
;
procedure HSHREABID(A, M, N, D, B, EM); 
  value M, N;
  integer M, N;
  array A, D, B, EM;
begin;
    integer I, J, I1;
    real NORM, MACHTOL, W, S, F, G, H;
    real procedure TAMMAT(L, U, I, J, A, B); 
      value L, U, I, J;
      integer L, U, I, J;
      array A, B;
    code 34014;
    real procedure MATTAM(L, U, I, J, A, B); 
      value L, U, I, J;
      array A, B;
    code 34015;
    procedure ELMCOL(L, U, I, J, A, B, X); 
      value L, U, I, J, X;
      integer L, U, I, J;
      real X;
      array A, B;
    code 34023;
    procedure ELMROW(L, U, I, J, A, B, X); 
      value L, U, I, J, X;
      integer L, U, I, J;
      real X;
      array A, B;
    code 34024;
    NORM := 0;
    for I := 1 step 1 until M do
      begin;
        W := 0;
        for J := 1 step 1 until N do
          W := ABS(A[I, J]) + W;
        if W > NORM then NORM := W;
    end;
    MACHTOL := EM[0] TIMES NORM;
    EM[1] := NORM;
    for I := 1 step 1 until N do
      begin;
        I1 := I + 1;
        S := TAMMAT(I1, M, I, I, A, A);
        if S < MACHTOL then D[I] := A[I, I] else begin;
            F := A[I, I];
            S := F TIMES F + S;
            D[I] := G := if F < 0 then SQRT(S) else -SQRT(S);
            H := F TIMES G - S;
            A[I, I] := F - G;
            for J := I1 step 1 until N do
              ELMCOL(I, M, J, I, A, A, TAMMAT(I, M, I, J, A, A) ÷ H);
        end;
        if I < N then begin;
            S := MATTAM(I1 + 1, N, I, I, A, A);
            if S < MACHTOL then B[I] := A[I, I1] else begin;
                F := A[I, I1];
                S := F TIMES F + S;
                B[I] := G := if F < 0 then SQRT(S) else -SQRT(S);
                H := F TIMES G - S;
                A[I, I1] := F - G;
                for J := I1 step 1 until M do
                  ELMROW(I1, N, J, I, A, A, MATTAM(I1, N, I, J, A, A) ÷ H);
            end;
        end;
    end;
end HSHREABID;
comment  ================== 34261 =================
;
procedure PSTTFMMAT(A, N, V, B); 
  value N;
  integer N;
  array A, V, B;
begin;
    integer I, I1, J;
    real H;
    real procedure MATMAT(L, U, I, J, A, B); 
      value L, U, I, J;
      integer L, U, I, J;
      array A, B;
    code 34013;
    procedure ELMCOL(L, U, I, J, A, B, X); 
      value L, U, I, J, X;
      integer L, U, I, J;
      real X;
      array A, B;
    code 34023;
    I1 := N;
    V[N, N] := 1;
    for I := N - 1 step -1 until 1 do
      begin;
        H := B[I] TIMES A[I, I1];
        if H < 0 then begin;
            for J := I1 step 1 until N do
              V[J, I] := A[I, J] ÷ H;
            for J := I1 step 1 until N do
              ELMCOL(I1, N, J, I, V, V, MATMAT(I1, N, I, J, A, V));
        end;
        for J := I1 step 1 until N do
          V[I, J] := V[J, I] := 0;
        V[I, I] := 1;
        I1 := I;
    end;
end PSTTFMMAT;
comment  ================== 34262 =================
;
procedure PRETFMMAT(A, M, N, D); 
  value M, N;
  integer M, N;
  array A, D;
begin;
    integer I, I1, J;
    real G, H;
    real procedure TAMMAT(L, U, I, J, A, B); 
      value L, U, I, J;
      integer L, U, I, J;
      array A, B;
    code 34014;
    procedure ELMCOL(L, U, I, J, A, B, X); 
      value L, U, I, J, X;
      integer L, U, I, J;
      real X;
      array A, B;
    code 34023;
    for I := N step -1 until 1 do
      begin;
        I1 := I + 1;
        G := D[I];
        H := G TIMES A[I, I];
        for J := I1 step 1 until N do
          A[I, J] := 0;
        if H < 0 then begin;
            for J := I1 step 1 until N do
              ELMCOL(I, M, J, I, A, A, TAMMAT(I1, M, I, J, A, A) ÷ H);
            for J := I step 1 until M do
              A[J, I] := A[J, I] ÷ G;
        end else for J := I step 1 until M do
          A[J, I] := 0;
        A[I, I] := A[I, I] + 1;
    end;
end PRETFMMAT;
comment  ================== 34151 =================
;
comment  MCA 2311
;
procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); 
  value N, N1, N2;
  integer N, N1, N2;
  array D, BB, VAL, EM;
begin;
    integer K, COUNT;
    real MAX, X, Y, MACHEPS, NORM, RE, MACHTOL, UB, LB, LAMBDA;
    real procedure STURM;
    begin;
        integer P, I;
        real F;
        COUNT := COUNT + 1;
        P := K;
        F := D[1] - X;
        for I := 2 step 1 until N do
          begin;
            if F NOTLESS 0 then begin;
                P := P + 1;
                if P > N then goto OUT;
            end else if P < I - 1 then begin;
                LB := X;
                goto OUT;
            end;
            if ABS(F) < MACHTOL then F := if F NOTLESS 0 then -MACHTOL else MACHTOL;
            F := D[I] - X - BB[I - 1] ÷ F;
        end;
        if P = N OR F NOTLESS 0 then begin;
            if X < UB then UB := X;
        end else LB := X;
        OUT: STURM := if P = N then F else (N - P) TIMES MAX;
    end STURM;
    Boolean procedure ZEROIN(X, Y, FX, TOLX); code 34150;
    
    MACHEPS := EM[0];
    NORM := EM[1];
    RE := EM[2];
    MACHTOL := NORM TIMES MACHEPS;
    MAX := NORM ÷ MACHEPS;
    COUNT := 0;
    UB := 1.1 TIMES NORM;
    LB := -UB;
    LAMBDA := UB;
    for K := N1 step 1 until N2 do
      begin;
        X := LB;
        Y := UB;
        LB := -1.1 TIMES NORM;
        ZEROIN(X, Y, STURM, ABS(X) TIMES RE + MACHTOL);
        VAL[K] := LAMBDA := if X > LAMBDA then LAMBDA else X;
        if UB > X then UB := if X > Y then X else Y;
    end;
    EM[3] := COUNT;
end VALSYMTRI;
comment  ================== 34152 =================
;
comment  MCA 2312
;
procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); 
  value N, N1, N2;
  integer N, N1, N2;
  array D, B, VAL, VEC, EM;
begin;
    integer I, J, K, COUNT, MAXCOUNT, COUNTLIM, ORTH, IND;
    real BI, BI1, U, W, Y, MI1, LAMBDA, OLDLAMBDA, ORTHEPS, VALSPREAD, SPR, RES, MAXRES, OLDRES, NORM, NEWNORM, OLDNORM, MACHTOL, VECTOL;
    array M, P, Q, R, X[1 : N];
    Boolean array INT[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    NORM := EM[1];
    MACHTOL := EM[0] TIMES NORM;
    VALSPREAD := EM[4] TIMES NORM;
    VECTOL := EM[6] TIMES NORM;
    COUNTLIM := EM[8];
    ORTHEPS := SQRT(EM[0]);
    MAXCOUNT := IND := 0;
    MAXRES := 0;
    if N1 > 1 then begin;
        ORTH := EM[5];
        OLDLAMBDA := VAL[N1 - ORTH];
        for K := N1 - ORTH + 1 step 1 until N1 - 1 do
          begin;
            LAMBDA := VAL[K];
            SPR := OLDLAMBDA - LAMBDA;
            if SPR < MACHTOL then LAMBDA := OLDLAMBDA - MACHTOL;
            OLDLAMBDA := LAMBDA;
        end;
    end else ORTH := 1;
    for K := N1 step 1 until N2 do
      begin;
        LAMBDA := VAL[K];
        if K > 1 then begin;
            SPR := OLDLAMBDA - LAMBDA;
            if SPR < VALSPREAD then begin;
                if SPR < MACHTOL then LAMBDA := OLDLAMBDA - MACHTOL;
                ORTH := ORTH + 1;
            end else ORTH := 1;
        end;
        COUNT := 0;
        U := D[1] - LAMBDA;
        BI := W := B[1];
        if ABS(BI) < MACHTOL then BI := MACHTOL;
        for I := 1 step 1 until N - 1 do
          begin;
            BI1 := B[I + 1];
            if ABS(BI1) < MACHTOL then BI1 := MACHTOL;
            if ABS(BI) NOTLESS ABS(U) then begin;
                MI1 := M[I + 1] := U ÷ BI;
                P[I] := BI;
                Y := Q[I] := D[I + 1] - LAMBDA;
                R[I] := BI1;
                U := W - MI1 TIMES Y;
                W := -MI1 TIMES BI1;
                INT[I] := true;
            end else begin;
                MI1 := M[I + 1] := BI ÷ U;
                P[I] := U;
                Q[I] := W;
                R[I] := 0;
                U := D[I + 1] - LAMBDA - MI1 TIMES W;
                W := BI1;
                INT[I] := false;
            end;
            X[I] := 1;
            BI := BI1;
        end TRANSFORM;
        P[N] := if ABS(U) < MACHTOL then MACHTOL else U;
        Q[N] := R[N] := 0;
        X[N] := 1;
        goto ENTRY;
        ITERATE: W := X[1];
        for I := 2 step 1 until N do
          begin;
            if INT[I - 1] then begin;
                U := W;
                W := X[I - 1] := X[I];
            end else U := X[I];
            W := X[I] := U - M[I] TIMES W;
        end ALTERNATE;
        ENTRY: U := W := 0;
        for I := N step -1 until 1 do
          begin;
            Y := U;
            U := X[I] := (X[I] - Q[I] TIMES U - R[I] TIMES W) ÷ P[I];
            W := Y;
        end NEXT ITERATION;
        NEWNORM := SQRT(VECVEC(1, N, 0, X, X));
        if ORTH > 1 then begin;
            OLDNORM := NEWNORM;
            for J := K - ORTH + 1 step 1 until K - 1 do
              ELMVECCOL(1, N, J, X, VEC, -TAMVEC(1, N, J, VEC, X));
            NEWNORM := SQRT(VECVEC(1, N, 0, X, X));
            if NEWNORM < ORTHEPS TIMES OLDNORM then begin;
                IND := IND + 1;
                COUNT := 1;
                for I := 1 step 1 until IND - 1,
                         IND + 1 step 1 until N do X[I] := 0;
                X[IND] := 1;
                if IND = N then IND := 0;
                goto ITERATE;
            end NEW START              ;
        end ORTHOGONALISATION;
        RES := 1 ÷ NEWNORM;
        if RES > VECTOL OR COUNT = 0 then begin;
            COUNT := COUNT + 1;
            if COUNT NOTLESS COUNTLIM then begin;
                for I := 1 step 1 until N do
                  X[I] := X[I] TIMES RES;
                goto ITERATE;
            end;
        end;
        for I := 1 step 1 until N do
          VEC[I, K] := X[I] TIMES RES;
        if COUNT > MAXCOUNT then MAXCOUNT := COUNT;
        if RES > MAXRES then MAXRES := RES;
        OLDLAMBDA := LAMBDA;
    end;
    EM[5] := ORTH;
    EM[7] := MAXRES;
    EM[9] := MAXCOUNT;
end VECSYMTRI;
comment  ================== 34161 =================
;
comment  MCA 2321
;
integer procedure QRISYMTRI(A, N, D, B, BB, EM); 
  value N;
  integer N;
  array A, D, B, BB, EM;
begin;
    integer I, J, J1, K, M, M1, COUNT, MAX;
    real BBMAX, R, S, SIN, T, C, COS, OLDCOS, G, P, W, TOL, TOL2, LAMBDA, DK1, A0, A1;
    procedure ROTCOL(L, U, I, J, A, C, S); code 34040;
    
    TOL := EM[2] TIMES EM[1];
    TOL2 := TOL TIMES TOL;
    COUNT := 0;
    BBMAX := 0;
    MAX := EM[4];
    M := N;
    IN: K := M;
    M1 := M - 1;
    NEXT: K := K - 1;
    if K > 0 then begin;
        if BB[K] NOTLESS TOL2 then goto NEXT;
        if BB[K] > BBMAX then BBMAX := BB[K];
    end;
    if K = M1 then M := M1 else begin;
        T := D[M] - D[M1];
        R := BB[M1];
        if ABS(T) < TOL then S := SQRT(R) else begin;
            W := 2 ÷ T;
            S := W TIMES R ÷ (SQRT(W TIMES W TIMES R + 1) + 1);
        end;
        if K = M - 2 then begin;
            D[M] := D[M] + S;
            D[M1] := D[M1] - S;
            T := -S ÷ B[M1];
            R := SQRT(T TIMES T + 1);
            COS := 1 ÷ R;
            SIN := T ÷ R;
            ROTCOL(1, N, M1, M, A, COS, SIN);
            M := M - 2;
        end else begin;
            COUNT := COUNT + 1;
            if COUNT > MAX then goto END;
            LAMBDA := D[M] + S;
            if ABS(T) < TOL then begin;
                W := D[M1] - S;
                if ABS(W) < ABS(LAMBDA) then LAMBDA := W;
            end;
            K := K + 1;
            T := D[K] - LAMBDA;
            COS := 1;
            W := B[K];
            P := SQRT(T TIMES T + W TIMES W);
            J1 := K;
            for J := K + 1 step 1 until M do
              begin;
                OLDCOS := COS;
                COS := T ÷ P;
                SIN := W ÷ P;
                DK1 := D[J] - LAMBDA;
                T := OLDCOS TIMES T;
                D[J1] := (T + DK1) TIMES SIN TIMES SIN + LAMBDA + T;
                T := COS TIMES DK1 - SIN TIMES W TIMES OLDCOS;
                W := B[J];
                P := SQRT(T TIMES T + W TIMES W);
                G := B[J1] := SIN TIMES P;
                BB[J1] := G TIMES G;
                ROTCOL(1, N, J1, J, A, COS, SIN);
                J1 := J;
            end;
            D[M] := COS TIMES T + LAMBDA;
            if T < 0 then B[M1] := -G;
        end QRSTEP          ;
    end;
    if M > 0 then goto IN;
    END: EM[3] := SQRT(BBMAX);
    EM[5] := COUNT;
    QRISYMTRI := M;
end QRISYMTRI;
comment  ================== 34153 =================
;
comment  MCA 2313
;
procedure EIGVALSYM2(A, N, NUMVAL, VAL, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, EM;
begin;
    array B, BB, D[1 : N];
    procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    TFMSYMTRI2(A, N, D, B, BB, EM);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
end EIGVALSYM2;
comment  ================== 34154 =================
;
comment  MCA 2314
;
procedure EIGSYM2(A, N, NUMVAL, VAL, VEC, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, VEC, EM;
begin;
    array B, BB, D[1 : N];
    procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152;
    
    procedure BAKSYMTRI2(A, N, N1, N2, VEC); code 34141;
    
    TFMSYMTRI2(A, N, D, B, BB, EM);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
    VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VEC, EM);
    BAKSYMTRI2(A, N, 1, NUMVAL, VEC);
end EIGSYM2;
comment  ================== 34155 =================
;
comment  MCA 2318
;
procedure EIGVALSYM1(A, N, NUMVAL, VAL, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, EM;
begin;
    array B, BB, D[1 : N];
    procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    TFMSYMTRI1(A, N, D, B, BB, EM);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
end EIGVALSYM1;
comment  ================== 34156 =================
;
comment  MCA 2319
;
procedure EIGSYM1(A, N, NUMVAL, VAL, VEC, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, VEC, EM;
begin;
    array B, BB, D[1 : N];
    procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152;
    
    procedure BAKSYMTRI1(A, N, N1, N2, VEC); code 34144;
    
    TFMSYMTRI1(A, N, D, B, BB, EM);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
    VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VEC, EM);
    BAKSYMTRI1(A, N, 1, NUMVAL, VEC);
end EIGSYM1;
comment  ================== 34162 =================
;
comment  MCA 2322
;
integer procedure QRIVALSYM2(A, N, VAL, EM); 
  value N;
  integer N;
  array A, VAL, EM;
begin;
    array B, BB[1 : N];
    procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140;
    
    integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160;
    
    TFMSYMTRI2(A, N, VAL, B, BB, EM);
    QRIVALSYM2 := QRIVALSYMTRI(VAL, BB, N, EM);
end QRIVALSYM2;
comment  ================== 34163 =================
;
comment  MCA 2323
;
integer procedure QRISYM(A, N, VAL, EM); 
  value N;
  integer N;
  array A, VAL, EM;
begin;
    array B, BB[1 : N];
    procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140;
    
    procedure TFMPREVEC(A, N); code 34142;
    
    integer procedure QRISYMTRI(A, N, D, B, BB, EM); code 34161;
    
    TFMSYMTRI2(A, N, VAL, B, BB, EM);
    TFMPREVEC(A, N);
    QRISYM := QRISYMTRI(A, N, VAL, B, BB, EM);
end QRISYM;
comment  ================== 34164 =================
;
comment  MCA 2327
;
integer procedure QRIVALSYM1(A, N, VAL, EM); 
  value N;
  integer N;
  array A, VAL, EM;
begin;
    array B, BB[1 : N];
    procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143;
    
    integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160;
    
    TFMSYMTRI1(A, N, VAL, B, BB, EM);
    QRIVALSYM1 := QRIVALSYMTRI(VAL, BB, N, EM);
end QRIVALSYM1;
comment  ================== 34180 =================
;
comment  MCA 2410
;
integer procedure REAVALQRI(A, N, EM, VAL); 
  value N;
  integer N;
  array A, EM, VAL;
begin;
    integer N1, I, I1, J, Q, MAX, COUNT;
    real DET, W, SHIFT, KAPPA, NU, MU, R, TOL, DELTA, MACHTOL, S;
    procedure ROTCOL(L, U, I, J, A, C, S); code 34040;
    
    procedure ROTROW(L, U, I, J, A, C, S); code 34041;
    
    MACHTOL := EM[0] TIMES EM[1];
    TOL := EM[1] TIMES EM[2];
    MAX := EM[4];
    COUNT := 0;
    R := 0;
    IN: N1 := N - 1;
    for I := N,
             I - 1 while (if I NOTLESS 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I;
    if Q > 1 then begin;
        if ABS(A[Q, Q - 1]) > R then R := ABS(A[Q, Q - 1]);
    end;
    if Q = N then begin;
        VAL[N] := A[N, N];
        N := N1;
    end else begin;
        DELTA := A[N, N] - A[N1, N1];
        DET := A[N, N1] TIMES A[N1, N];
        if ABS(DELTA) < MACHTOL then S := SQRT(DET) else begin;
            W := 2 ÷ DELTA;
            S := W TIMES W TIMES DET + 1;
            S := if S NOTLESS 0 then -DELTA TIMES .5 else W TIMES DET ÷ (SQRT(S) + 1);
        end;
        if Q = N1 then begin;
            VAL[N] := A[N, N] + S;
            VAL[N1] := A[N1, N1] - S;
            N := N - 2;
        end else begin;
            COUNT := COUNT + 1;
            if COUNT > MAX then goto OUT;
            SHIFT := A[N, N] + S;
            if ABS(DELTA) < TOL then begin;
                W := A[N1, N1] - S;
                if ABS(W) < ABS(SHIFT) then SHIFT := W;
            end;
            A[Q, Q] := A[Q, Q] - SHIFT;
            for I := Q step 1 until N - 1 do
              begin;
                I1 := I + 1;
                A[I1, I1] := A[I1, I1] - SHIFT;
                KAPPA := SQRT(A[I, I] POWER 2 + A[I1, I] POWER 2);
                if I > Q then begin;
                    A[I, I - 1] := KAPPA TIMES NU;
                    W := KAPPA TIMES MU;
                end else W := KAPPA;
                MU := A[I, I] ÷ KAPPA;
                NU := A[I1, I] ÷ KAPPA;
                A[I, I] := W;
                ROTROW(I1, N, I, I1, A, MU, NU);
                ROTCOL(Q, I, I, I1, A, MU, NU);
                A[I, I] := A[I, I] + SHIFT;
            end;
            A[N, N - 1] := A[N, N] TIMES NU;
            A[N, N] := A[N, N] TIMES MU + SHIFT;
        end;
    end;
    if N > 0 then goto IN;
    OUT: EM[3] := R;
    EM[5] := COUNT;
    REAVALQRI := N;
end REAVALQRI;
comment  ================== 34181 =================
;
comment  MCA 2411
;
procedure REAVECHES(A, N, LAMBDA, EM, V); 
  value N, LAMBDA;
  integer N;
  real LAMBDA;
  array A, EM, V;
begin;
    integer I, I1, J, COUNT, MAX;
    real M, R, NORM, MACHTOL, TOL;
    Boolean array P[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    NORM := EM[1];
    MACHTOL := EM[0] TIMES NORM;
    TOL := EM[6] TIMES NORM;
    MAX := EM[8];
    A[1, 1] := A[1, 1] - LAMBDA;
    GAUSS: for I := 1 step 1 until N - 1 do
      begin;
        I1 := I + 1;
        R := A[I, I];
        M := A[I1, I];
        if ABS(M) < MACHTOL then M := MACHTOL;
        P[I] := ABS(M) NOTLESS ABS(R);
        if P[I] then begin;
            A[I1, I] := M := M ÷ R;
            for J := I1 step 1 until N do
              A[I1, J] := (if J > I1 then A[I1, J] else A[I1, J] - LAMBDA) - M TIMES A[I, J];
        end else begin;
            A[I, I] := M;
            A[I1, I] := M := R ÷ M;
            for J := I1 step 1 until N do
              begin;
                R := (if J > I1 then A[I1, J] else A[I1, J] - LAMBDA);
                A[I1, J] := A[I, J] - M TIMES R;
                A[I, J] := R;
            end;
        end;
    end GAUSS;
    if ABS(A[N, N]) < MACHTOL then A[N, N] := MACHTOL;
    for J := 1 step 1 until N do V[J] := 1;
    COUNT := 0;
    FORWARD: COUNT := COUNT + 1;
    if COUNT > MAX then goto OUT;
    for I := 1 step 1 until N - 1 do
      begin;
        I1 := I + 1;
        if P[I] then V[I1] := V[I1] - A[I1, I] TIMES V[I] else begin;
            R := V[I1];
            V[I1] := V[I] - A[I1, I] TIMES R;
            V[I] := R;
        end;
    end FORWARD;
    BACKWARD: for I := N step -1 until 1 do
      V[I] := (V[I] - MATVEC(I + 1, N, I, A, V)) ÷ A[I, I];
    R := 1 ÷ SQRT(VECVEC(1, N, 0, V, V));
    for J := 1 step 1 until N do
      V[J] := V[J] TIMES R;
    if R > TOL then goto FORWARD;
    OUT: EM[7] := R;
    EM[9] := COUNT;
end REAVECHES;
comment  ================== 34186 =================
;
comment  MCA 2416
;
integer procedure REAQRI(A, N, EM, VAL, VEC); 
  value N;
  integer N;
  array A, EM, VAL, VEC;
begin;
    integer M1, I, I1, M, J, Q, MAX, COUNT;
    real W, SHIFT, KAPPA, NU, MU, R, TOL, S, MACHTOL, ELMAX, T, DELTA, DET;
    array TF[1 : N];
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure ROTCOL(L, U, I, J, A, C, S); code 34040;
    
    procedure ROTROW(L, U, I, J, A, C, S); code 34041;
    
    MACHTOL := EM[0] TIMES EM[1];
    TOL := EM[1] TIMES EM[2];
    MAX := EM[4];
    COUNT := 0;
    ELMAX := 0;
    M := N;
    for I := 1 step 1 until N do
      begin;
        VEC[I, I] := 1;
        for J := I + 1 step 1 until N do
          VEC[I, J] := VEC[J, I] := 0;
    end;
    IN: M1 := M - 1;
    for I := M,
             I - 1 while (if I NOTLESS 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I;
    if Q > 1 then begin;
        if ABS(A[Q, Q - 1]) > ELMAX then ELMAX := ABS(A[Q, Q - 1]);
    end;
    if Q = M then begin;
        VAL[M] := A[M, M];
        M := M1;
    end else begin;
        DELTA := A[M, M] - A[M1, M1];
        DET := A[M, M1] TIMES A[M1, M];
        if ABS(DELTA) < MACHTOL then S := SQRT(DET) else begin;
            W := 2 ÷ DELTA;
            S := W TIMES W TIMES DET + 1;
            S := if S NOTLESS 0 then -DELTA TIMES .5 else W TIMES DET ÷ (SQRT(S) + 1);
        end;
        if Q = M1 then begin;
            A[M, M] := VAL[M] := A[M, M] + S;
            A[Q, Q] := VAL[Q] := A[Q, Q] - S;
            T := if ABS(S) < MACHTOL then (S + DELTA) ÷ A[M, Q] else A[Q, M] ÷ S;
            R := SQRT(T TIMES T + 1);
            NU := 1 ÷ R;
            MU := -T TIMES NU;
            A[Q, M] := A[Q, M] - A[M, Q];
            ROTROW(Q + 2, N, Q, M, A, MU, NU);
            ROTCOL(1, Q - 1, Q, M, A, MU, NU);
            ROTCOL(1, N, Q, M, VEC, MU, NU);
            M := M - 2;
        end else begin;
            COUNT := COUNT + 1;
            if COUNT > MAX then goto END;
            SHIFT := A[M, M] + S;
            if ABS(DELTA) < TOL then begin;
                W := A[M1, M1] - S;
                if ABS(W) < ABS(SHIFT) then SHIFT := W;
            end;
            A[Q, Q] := A[Q, Q] - SHIFT;
            for I := Q step 1 until M1 do
              begin;
                I1 := I + 1;
                A[I1, I1] := A[I1, I1] - SHIFT;
                KAPPA := SQRT(A[I, I] POWER 2 + A[I1, I] POWER 2);
                if I > Q then begin;
                    A[I, I - 1] := KAPPA TIMES NU;
                    W := KAPPA TIMES MU;
                end else W := KAPPA;
                MU := A[I, I] ÷ KAPPA;
                NU := A[I1, I] ÷ KAPPA;
                A[I, I] := W;
                ROTROW(I1, N, I, I1, A, MU, NU);
                ROTCOL(1, I, I, I1, A, MU, NU);
                A[I, I] := A[I, I] + SHIFT;
                ROTCOL(1, N, I, I1, VEC, MU, NU);
            end;
            A[M, M1] := A[M, M] TIMES NU;
            A[M, M] := A[M, M] TIMES MU + SHIFT;
        end;
    end;
    if M > 0 then goto IN;
    for J := N step -1 until 2 do
      begin;
        TF[J] := 1;
        T := A[J, J];
        for I := J - 1 step -1 until 1 do
          begin;
            DELTA := T - A[I, I];
            TF[I] := MATVEC(I + 1, J, I, A, TF) ÷ (if ABS(DELTA) < MACHTOL then MACHTOL else DELTA);
        end;
        for I := 1 step 1 until N do
          VEC[I, J] := MATVEC(1, J, I, VEC, TF);
    end;
    END: EM[3] := ELMAX;
    EM[5] := COUNT;
    REAQRI := M;
end REAQRI;
comment  ================== 34190 =================
;
comment  MCA 2420
;
integer procedure COMVALQRI(A, N, EM, RE, IM); 
  value N;
  integer N;
  array A, EM, RE, IM;
begin;
    integer I, J, P, Q, MAX, COUNT, N1, P1, P2, IMIN1, I1, I2, I3;
    real DISC, SIGMA, RHO, G1, G2, G3, PSI1, PSI2, AA, E, K, S, NORM, MACHTOL2, TOL, W;
    Boolean B;
    NORM := EM[1];
    MACHTOL2 := (EM[0] TIMES NORM) POWER 2;
    TOL := EM[2] TIMES NORM;
    MAX := EM[4];
    COUNT := 0;
    W := 0;
    IN: for I := N,
             I - 1 while (if I NOTLESS 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I;
    if Q > 1 then begin;
        if ABS(A[Q, Q - 1]) > W then W := ABS(A[Q, Q - 1]);
    end;
    if Q NOTLESS N - 1 then begin;
        N1 := N - 1;
        if Q = N then begin;
            RE[N] := A[N, N];
            IM[N] := 0;
            N := N1;
        end else begin;
            SIGMA := A[N, N] - A[N1, N1];
            RHO := -A[N, N1] TIMES A[N1, N];
            DISC := SIGMA POWER 2 - 4 TIMES RHO;
            if DISC > 0 then begin;
                DISC := SQRT(DISC);
                S := -2 TIMES RHO ÷ (SIGMA + (if SIGMA NOTLESS 0 then DISC else -DISC));
                RE[N] := A[N, N] + S;
                RE[N1] := A[N1, N1] - S;
                IM[N] := IM[N1] := 0;
            end else begin;
                RE[N] := RE[N1] := (A[N1, N1] + A[N, N]) ÷ 2;
                IM[N1] := SQRT(-DISC) ÷ 2;
                IM[N] := -IM[N1];
            end;
            N := N - 2;
        end;
    end else begin;
        COUNT := COUNT + 1;
        if COUNT > MAX then goto OUT;
        N1 := N - 1;
        SIGMA := A[N, N] + A[N1, N1] + SQRT(ABS(A[N1, N - 2] TIMES A[N, N1]) TIMES EM[0]);
        RHO := A[N, N] TIMES A[N1, N1] - A[N, N1] TIMES A[N1, N];
        for I := N - 1,
                 I - 1 while (if I - 1 NOTLESS Q then ABS(A[I, I - 1] TIMES A[I1, I] TIMES (ABS(A[I, I] + A[I1, I1] - SIGMA) + ABS(A[I + 2, I1]))) > ABS(A[I, I] TIMES ((A[I, I] - SIGMA) + A[I, I1] TIMES A[I1, I] + RHO)) TIMES TOL else false) do
          P1 := I1 := I;
        P := P1 - 1;
        P2 := P + 2;
        for I := P step 1 until N - 1 do
          begin;
            IMIN1 := I - 1;
            I1 := I + 1;
            I2 := I + 2;
            if I = P then begin;
                G1 := A[P, P] TIMES (A[P, P] - SIGMA) + A[P, P1] TIMES A[P1, P] + RHO;
                G2 := A[P1, P] TIMES (A[P, P] + A[P1, P1] - SIGMA);
                if P1 NOTLESS N1 then begin;
                    G3 := A[P1, P] TIMES A[P2, P1];
                    A[P2, P] := 0;
                end else G3 := 0;
            end else begin;
                G1 := A[I, IMIN1];
                G2 := A[I1, IMIN1];
                G3 := if I2 NOTLESS N then A[I2, IMIN1] else 0;
            end;
            K := if G1 NOTLESS 0 then SQRT(G1 POWER 2 + G2 POWER 2 + G3 POWER 2) else -SQRT(G1 POWER 2 + G2 POWER 2 + G3 POWER 2);
            B := ABS(K) > MACHTOL2;
            AA := if B then G1 ÷ K + 1 else 2;
            PSI1 := if B then G2 ÷ (G1 + K) else 0;
            PSI2 := if B then G3 ÷ (G1 + K) else 0;
            if I NOTEQUAL Q then A[I, IMIN1] := if I = P then -A[I, IMIN1] else -K;
            for J := I step 1 until N do
              begin;
                E := AA TIMES (A[I, J] + PSI1 TIMES A[I1, J] + (if I2 NOTLESS N then PSI2 TIMES A[I2, J] else 0));
                A[I, J] := A[I, J] - E;
                A[I1, J] := A[I1, J] - PSI1 TIMES E;
                if I2 NOTLESS N then A[I2, J] := A[I2, J] - PSI2 TIMES E;
            end;
            for J := Q step 1 until (if I2 NOTLESS N then I2 else N) do
              begin;
                E := AA TIMES (A[J, I] + PSI1 TIMES A[J, I1] + (if I2 NOTLESS N then PSI2 TIMES A[J, I2] else 0));
                A[J, I] := A[J, I] - E;
                A[J, I1] := A[J, I1] - PSI1 TIMES E;
                if I2 NOTLESS N then A[J, I2] := A[J, I2] - PSI2 TIMES E;
            end;
            if I2 NOTLESS N1 then begin;
                I3 := I + 3;
                E := AA TIMES PSI2 TIMES A[I3, I2];
                A[I3, I] := -E;
                A[I3, I1] := -PSI1 TIMES E;
                A[I3, I2] := A[I3, I2] - PSI2 TIMES E;
            end;
        end;
    end;
    if N > 0 then goto IN;
    OUT: EM[3] := W;
    EM[5] := COUNT;
    COMVALQRI := N;
end COMVALQRI;
comment  ================== 34191 =================
;
comment  MCA 2421
;
procedure COMVECHES(A, N, LAMBDA, MU, EM, U, V); 
  value N, LAMBDA, MU;
  integer N;
  real LAMBDA, MU;
  array A, EM, U, V;
begin;
    integer I, I1, J, COUNT, MAX;
    real AA, BB, D, M, R, S, W, X, Y, NORM, MACHTOL, TOL;
    array G, F[1 : N];
    Boolean array P[1 : N];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    NORM := EM[1];
    MACHTOL := EM[0] TIMES NORM;
    TOL := EM[6] TIMES NORM;
    MAX := EM[8];
    for I := 2 step 1 until N do
      begin;
        F[I - 1] := A[I, I - 1];
        A[I, 1] := 0;
    end;
    AA := A[1, 1] - LAMBDA;
    BB := -MU;
    for I := 1 step 1 until N - 1 do
      begin;
        I1 := I + 1;
        M := F[I];
        if ABS(M) < MACHTOL then M := MACHTOL;
        A[I, I] := M;
        D := AA POWER 2 + BB POWER 2;
        P[I] := ABS(M) < SQRT(D);
        if P[I] then begin;
            comment  A[I,J] * FACTOR AND A[I1,J] - A[I,J]
            ;
            F[I] := R := M TIMES AA ÷ D;
            G[I] := S := -M TIMES BB ÷ D;
            W := A[I1, I];
            X := A[I, I1];
            A[I1, I] := Y := X TIMES S + W TIMES R;
            A[I, I1] := X := X TIMES R - W TIMES S;
            AA := A[I1, I1] - LAMBDA - X;
            BB := -(MU + Y);
            for J := I + 2 step 1 until N do
              begin;
                W := A[J, I];
                X := A[I, J];
                A[J, I] := Y := X TIMES S + W TIMES R;
                A[I, J] := X := X TIMES R - W TIMES S;
                A[J, I1] := -Y;
                A[I1, J] := A[I1, J] - X;
            end;
        end else begin;
            comment  INTERCHANGE A[I1,J] AND
                             A[I,J] - A[I1,J] * FACTOR
            ;
            F[I] := R := AA ÷ M;
            G[I] := S := BB ÷ M;
            W := A[I1, I1] - LAMBDA;
            AA := A[I, I1] - R TIMES W - S TIMES MU;
            A[I, I1] := W;
            BB := A[I1, I] - S TIMES W + R TIMES MU;
            A[I1, I] := -MU;
            for J := I + 2 step 1 until N do
              begin;
                W := A[I1, J];
                A[I1, J] := A[I, J] - R TIMES W;
                A[I, J] := W;
                A[J, I1] := A[J, I] - S TIMES W;
                A[J, I] := 0;
            end;
        end;
    end P[N]:= true;
    D := AA POWER 2 + BB POWER 2;
    if D < MACHTOL POWER 2 then begin;
        AA := MACHTOL;
        BB := 0;
        D := MACHTOL POWER 2;
    end;
    A[N, N] := D;
    F[N] := AA;
    G[N] := -BB;
    for I := 1 step 1 until N do
      begin;
        U[I] := 1;
        V[I] := 0;
    end;
    COUNT := 0;
    FORWARD: if COUNT > MAX then goto OUTM;
    for I := 1 step 1 until N do
      begin;
        if P[I] then begin;
            W := V[I];
            V[I] := G[I] TIMES U[I] + F[I] TIMES W;
            U[I] := F[I] TIMES U[I] - G[I] TIMES W;
            if I < N then begin;
                V[I + 1] := V[I + 1] - V[I];
                U[I + 1] := U[I + 1] - U[I];
            end;
        end else begin;
            AA := U[I + 1];
            BB := V[I + 1];
            U[I + 1] := U[I] - (F[I] TIMES AA - G[I] TIMES BB);
            U[I] := AA;
            V[I + 1] := V[I] - (G[I] TIMES AA + F[I] TIMES BB);
            V[I] := BB;
        end;
    end FORWARD;
    BACKWARD: for I := N step -1 until 1 do
      begin;
        I1 := I + 1;
        U[I] := (U[I] - MATVEC(I1, N, I, A, U) + (if P[I] then TAMVEC(I1, N, I, A, V) else A[I1, I] TIMES V[I1])) ÷ A[I, I];
        V[I] := (V[I] - MATVEC(I1, N, I, A, V) - (if P[I] then TAMVEC(I1, N, I, A, U) else A[I1, I] TIMES U[I1])) ÷ A[I, I];
    end BACKWARD;
    NORMALISE: W := 1 ÷ SQRT(VECVEC(1, N, 0, U, U) + VECVEC(1, N, 0, V, V));
    for J := 1 step 1 until N do
      begin;
        U[J] := U[J] TIMES W;
        V[J] := V[J] TIMES W;
    end;
    COUNT := COUNT + 1;
    if W > TOL then goto FORWARD;
    OUTM: EM[7] := W;
    EM[9] := COUNT;
end COMVECHES;
comment  ================== 34182 =================
;
comment  MCA 2412
;
integer procedure REAEIGVAL(A, N, EM, VAL); 
  value N;
  integer N;
  array A, EM, VAL;
begin;
    integer I, J;
    real R;
    array D[1 : N];
    integer array INT, INT0[1 : N];
    procedure TFMREAHES(A, N, EM, INT); code 34170;
    
    procedure EQILBR(A, N, EM, D, INT); code 34173;
    
    integer procedure REAVALQRI(A, N, EM, VAL); code 34180;
    
    EQILBR(A, N, EM, D, INT0);
    TFMREAHES(A, N, EM, INT);
    J := REAEIGVAL := REAVALQRI(A, N, EM, VAL);
    for I := J + 1 step 1 until N do
      for J := I + 1 step 1 until N do
      begin;
        if VAL[J] > VAL[I] then begin;
            R := VAL[I];
            VAL[I] := VAL[J];
            VAL[J] := R;
        end;
    end;
end REAEIGVAL;
comment  ================== 34184 =================
;
comment  MCA 2414
;
integer procedure REAEIG1(A, N, EM, VAL, VEC); 
  value N;
  integer N;
  array A, EM, VAL, VEC;
begin;
    integer I, K, MAX, J, L;
    real RESIDU, R, MACHTOL;
    array D, V[1 : N], B[1 : N, 1 : N];
    integer array INT, INT0[1 : N];
    procedure TFMREAHES(A, N, EM, INT); code 34170;
    
    procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172;
    
    procedure EQILBR(A, N, EM, D, INT); code 34173;
    
    procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174;
    
    integer procedure REAVALQRI(A, N, EM, VAL); code 34180;
    
    procedure REAVECHES(A, N, LAMBDA, EM, V); code 34181;
    
    procedure REASCL(A, N, N1, N2); code 34183;
    
    RESIDU := 0;
    MAX := 0;
    EQILBR(A, N, EM, D, INT0);
    TFMREAHES(A, N, EM, INT);
    for I := 1 step 1 until N do
      for J := (if I = 1 then 1 else I - 1) step 1 until N do
      B[I, J] := A[I, J];
    K := REAEIG1 := REAVALQRI(B, N, EM, VAL);
    for I := K + 1 step 1 until N do
      for J := I + 1 step 1 until N do
      begin;
        if VAL[J] > VAL[I] then begin;
            R := VAL[I];
            VAL[I] := VAL[J];
            VAL[J] := R;
        end;
    end;
    MACHTOL := EM[0] TIMES EM[1];
    for L := K + 1 step 1 until N do
      begin;
        if L > 1 then begin;
            if VAL[L - 1] - VAL[L] < MACHTOL then VAL[L] := VAL[L - 1] - MACHTOL;
        end;
        for I := 1 step 1 until N do
          for J := (if I = 1 then 1 else I - 1) step 1 until N do
          B[I, J] := A[I, J];
        REAVECHES(B, N, VAL[L], EM, V);
        if EM[7] > RESIDU then RESIDU := EM[7];
        if EM[9] > MAX then MAX := EM[9];
        for J := 1 step 1 until N do
          VEC[J, L] := V[J];
    end;
    EM[7] := RESIDU;
    EM[9] := MAX;
    BAKREAHES2(A, N, K + 1, N, INT, VEC);
    BAKLBR(N, K + 1, N, D, INT0, VEC);
    REASCL(VEC, N, K + 1, N);
end REAEIG1;
comment  ================== 34187 =================
;
comment  MCA 2417
;
integer procedure REAEIG3(A, N, EM, VAL, VEC); 
  value N;
  integer N;
  array A, EM, VAL, VEC;
begin;
    integer I;
    real S;
    integer array INT, INT0[1 : N];
    array D[1 : N];
    procedure TFMREAHES(A, N, EM, INT); code 34170;
    
    procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172;
    
    procedure EQILBR(A, N, EM, D, INT); code 34173;
    
    procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174;
    
    procedure REASCL(A, N, N1, N2); code 34183;
    
    integer procedure REAQRI(A, N, EM, VAL, VEC); code 34186;
    
    EQILBR(A, N, EM, D, INT0);
    TFMREAHES(A, N, EM, INT);
    I := REAEIG3 := REAQRI(A, N, EM, VAL, VEC);
    if I = 0 then begin;
        BAKREAHES2(A, N, 1, N, INT, VEC);
        BAKLBR(N, 1, N, D, INT0, VEC);
        REASCL(VEC, N, 1, N);
    end;
end REAEIG3;
comment  ================== 34192 =================
;
comment  MCA 2422
;
integer procedure COMEIGVAL(A, N, EM, RE, IM); 
  value N;
  integer N;
  array A, EM, RE, IM;
begin;
    integer array INT, INT0[1 : N];
    array D[1 : N];
    procedure EQILBR(A, N, EM, D, INT); code 34173;
    
    procedure TFMREAHES(A, N, EM, INT); code 34170;
    
    integer procedure COMVALQRI(A, N, EM, RE, IM); code 34190;
    
    EQILBR(A, N, EM, D, INT0);
    TFMREAHES(A, N, EM, INT);
    COMEIGVAL := COMVALQRI(A, N, EM, RE, IM);
end COMEIGVAL;
comment  ================== 34194 =================
;
comment  MCA 2424
;
integer procedure COMEIG1(A, N, EM, RE, IM, VEC); 
  value N;
  integer N;
  array A, EM, RE, IM, VEC;
begin;
    integer I, J, K, PJ, ITT;
    real X, Y, MAX, NEPS;
    array AB[1 : N, 1 : N], D, U, V[1 : N];
    integer array INT, INT0[1 : N];
    procedure TRANSFER;
    begin;
        integer I, J;
        for I := 1 step 1 until N do
          for J := (if I = 1 then 1 else I - 1) step 1 until N do
          AB[I, J] := A[I, J];
    end TRANSFER;
    procedure EQILBR(A, N, EM, D, INT); code 34173;
    
    procedure TFMREAHES(A, N, EM, INT); code 34170;
    
    procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172;
    
    procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174;
    
    procedure REAVECHES(A, N, LAMBDA, EM, V); code 34181;
    
    procedure COMSCL(A, N, N1, N2, IM); code 34193;
    
    integer procedure COMVALQRI(A, N, EM, RE, IM); code 34190;
    
    procedure COMVECHES(A, N, LAMBDA, MU, EM, U, V); code 34191;
    
    EQILBR(A, N, EM, D, INT0);
    TFMREAHES(A, N, EM, INT);
    TRANSFER;
    K := COMEIG1 := COMVALQRI(AB, N, EM, RE, IM);
    NEPS := EM[0] TIMES EM[1];
    MAX := 0;
    ITT := 0;
    for I := K + 1 step 1 until N do
      begin;
        X := RE[I];
        Y := IM[I];
        PJ := 0;
        AGAIN: for J := K + 1 step 1 until I - 1 do
          begin;
            if ((X - RE[J]) POWER 2 + (Y - IM[J]) POWER 2 NOTLESS NEPS POWER 2) then begin;
                if PJ = J then NEPS := EM[2] TIMES EM[1] else PJ := J;
                X := X + 2 TIMES NEPS;
                goto AGAIN;
            end;
        end;
        RE[I] := X;
        TRANSFER;
        if Y NOTEQUAL 0 then begin;
            COMVECHES(AB, N, RE[I], IM[I], EM, U, V);
            for J := 1 step 1 until N do
              VEC[J, I] := U[J];
            I := I + 1;
            RE[I] := X;
        end else REAVECHES(AB, N, X, EM, V);
        for J := 1 step 1 until N do
          VEC[J, I] := V[J];
        if EM[7] > MAX then MAX := EM[7];
        ITT := if ITT > EM[9] then ITT else EM[9];
    end;
    EM[7] := MAX;
    EM[9] := ITT;
    BAKREAHES2(A, N, K + 1, N, INT, VEC);
    BAKLBR(N, K + 1, N, D, INT0, VEC);
    COMSCL(VEC, N, K + 1, N, IM);
end COMEIG1;
comment  ================== 34368 =================
;
procedure EIGVALHRM(A, N, NUMVAL, VAL, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, EM;
begin;
    array D[1 : N], BB[1 : N - 1];
    procedure HSHHRMTRIVAL(A, N, D, BB, EM); code 34364;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    HSHHRMTRIVAL(A, N, D, BB, EM);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
end EIGVALHRM;
comment  ================== 34369 =================
;
procedure EIGHRM(A, N, NUMVAL, VAL, VECR, VECI, EM); 
  value N, NUMVAL;
  integer N, NUMVAL;
  array A, VAL, VECR, VECI, EM;
begin;
    array BB, TR, TI[1 : N - 1], D, B[1 : N];
    procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); code 34363;
    
    procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151;
    
    procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152;
    
    procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); code 34365;
    
    HSHHRMTRI(A, N, D, B, BB, EM, TR, TI);
    VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM);
    B[N] := 0;
    VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VECR, EM);
    BAKHRMTRI(A, N, 1, NUMVAL, VECR, VECI, TR, TI);
end EIGHRM;
comment  ================== 34370 =================
;
integer procedure QRIVALHRM(A, N, VAL, EM); 
  value N;
  integer N;
  array A, VAL, EM;
begin;
    array B, BB[1 : N];
    integer I;
    procedure HSHHRMTRIVAL(A, N, D, BB, EM); code 34364;
    
    integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160;
    
    HSHHRMTRIVAL(A, N, VAL, BB, EM);
    B[N] := BB[N] := 0;
    for I := 1 step 1 until N - 1 do
      B[I] := SQRT(BB[I]);
    QRIVALHRM := QRIVALSYMTRI(VAL, BB, N, EM);
end QRIVALHRM;
comment  ================== 34371 =================
;
integer procedure QRIHRM(A, N, VAL, VR, VI, EM); 
  value N;
  integer N;
  array A, VAL, VR, VI, EM;
begin;
    integer I, J;
    array B, BB[1 : N], TR, TI[1 : N - 1];
    procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); code 34363;
    
    integer procedure QRISYMTRI(A, N, D, B, BB, EM); code 34161;
    
    procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); code 34365;
    
    HSHHRMTRI(A, N, VAL, B, BB, EM, TR, TI);
    for I := 1 step 1 until N do
      begin;
        VR[I, I] := 1;
        for J := I + 1 step 1 until N do
          VR[I, J] := VR[J, I] := 0;
    end;
    B[N] := BB[N] := 0;
    I := QRIHRM := QRISYMTRI(VR, N, VAL, B, BB, EM);
    BAKHRMTRI(A, N, I + 1, N, VR, VI, TR, TI);
    ;
end QRIHRM;
comment  ================== 34372 =================
;
integer procedure VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2); 
  value N;
  integer N;
  array A1, A2, B, EM, VAL1, VAL2;
begin;
    integer M, NM1, I, I1, Q, Q1, MAX, COUNT;
    real R, Z1, Z2, DD1, DD2, CC, G1, G2, K1, K2, HC, A1NN, A2NN, AIJ1, AIJ2, AI1I, KAPPA, NUI, MUI1, MUI2, MUIM11, MUIM12, NUIM1, TOL;
    procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352;
    
    procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); code 34357;
    
    procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); code 34358;
    
    procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); code 34345;
    
    TOL := EM[1] TIMES EM[2];
    MAX := EM[4];
    COUNT := 0;
    R := 0;
    M := N;
    if N > 1 then HC := B[N - 1];
    IN: NM1 := N - 1;
    for I := N,
             I - 1 while (if I NOTLESS 1 then ABS(B[I]) > TOL else false) do Q := I;
    if Q > 1 then begin;
        if ABS(B[Q - 1]) > R then R := ABS(B[Q - 1]);
    end;
    if Q = N then begin;
        VAL1[N] := A1[N, N];
        VAL2[N] := A2[N, N];
        N := NM1;
        if N > 1 then HC := B[N - 1];
        ;
    end else begin;
        DD1 := A1[N, N];
        DD2 := A2[N, N];
        CC := B[NM1];
        COMKWD((A1[NM1, NM1] - DD1) ÷ 2, (A2[NM1, NM1] - DD2) ÷ 2, CC TIMES A1[NM1, N], CC TIMES A2[NM1, N], G1, G2, K1, K2);
        if Q = NM1 then begin;
            VAL1[NM1] := G1 + DD1;
            VAL2[NM1] := G2 + DD2;
            VAL1[N] := K1 + DD1;
            VAL2[N] := K2 + DD2;
            N := N - 2;
            if N > 1 then HC := B[N - 1];
            ;
        end else begin;
            COUNT := COUNT + 1;
            if COUNT > MAX then goto OUT;
            Z1 := K1 + DD1;
            Z2 := K2 + DD2;
            if ABS(CC) > ABS(HC) then Z1 := Z1 + ABS(CC);
            HC := CC ÷ 2;
            I := Q1 := Q + 1;
            AIJ1 := A1[Q, Q] - Z1;
            AIJ2 := A2[Q, Q] - Z2;
            AI1I := B[Q];
            KAPPA := SQRT(AIJ1 POWER 2 + AIJ2 POWER 2 + AI1I POWER 2);
            MUI1 := AIJ1 ÷ KAPPA;
            MUI2 := AIJ2 ÷ KAPPA;
            NUI := AI1I ÷ KAPPA;
            A1[Q, Q] := KAPPA;
            A2[Q, Q] := 0;
            A1[Q1, Q1] := A1[Q1, Q1] - Z1;
            A2[Q1, Q1] := A2[Q1, Q1] - Z2;
            ROTCOMROW(Q1, N, Q, Q1, A1, A2, MUI1, MUI2, NUI);
            ROTCOMCOL(Q, Q, Q, Q1, A1, A2, MUI1, -MUI2, -NUI);
            A1[Q, Q] := A1[Q, Q] + Z1;
            A2[Q, Q] := A2[Q, Q] + Z2;
            for I1 := Q1 + 1 step 1 until N do
              begin;
                AIJ1 := A1[I, I];
                AIJ2 := A2[I, I];
                AI1I := B[I];
                KAPPA := SQRT(AIJ1 POWER 2 + AIJ2 POWER 2 + AI1I POWER 2);
                MUIM11 := MUI1;
                MUIM12 := MUI2;
                NUIM1 := NUI;
                MUI1 := AIJ1 ÷ KAPPA;
                MUI2 := AIJ2 ÷ KAPPA;
                NUI := AI1I ÷ KAPPA;
                A1[I1, I1] := A1[I1, I1] - Z1;
                A2[I1, I1] := A2[I1, I1] - Z2;
                ROTCOMROW(I1, N, I, I1, A1, A2, MUI1, MUI2, NUI);
                A1[I, I] := MUIM11 TIMES KAPPA;
                A2[I, I] := -MUIM12 TIMES KAPPA;
                B[I - 1] := NUIM1 TIMES KAPPA;
                ROTCOMCOL(Q, I, I, I1, A1, A2, MUI1, -MUI2, -NUI);
                A1[I, I] := A1[I, I] + Z1;
                A2[I, I] := A2[I, I] + Z2;
                I := I1;
                ;
            end;
            AIJ1 := A1[N, N];
            AIJ2 := A2[N, N];
            KAPPA := SQRT(AIJ1 POWER 2 + AIJ2 POWER 2);
            if (if KAPPA < TOL then true else AIJ2 POWER 2 NOTLESS EM[0] TIMES AIJ1 POWER 2) then begin;
                B[NM1] := NUI TIMES AIJ1;
                A1[N, N] := AIJ1 TIMES MUI1 + Z1;
                A2[N, N] := -AIJ1 TIMES MUI2 + Z2;
            end else begin;
                B[NM1] := NUI TIMES KAPPA;
                A1NN := MUI1 TIMES KAPPA;
                A2NN := -MUI2 TIMES KAPPA;
                MUI1 := AIJ1 ÷ KAPPA;
                MUI2 := AIJ2 ÷ KAPPA;
                COMCOLCST(Q, NM1, N, A1, A2, MUI1, MUI2);
                A1[N, N] := MUI1 TIMES A1NN - MUI2 TIMES A2NN + Z1;
                A2[N, N] := MUI1 TIMES A2NN + MUI2 TIMES A1NN + Z2;
                ;
            end;
            ;
        end;
    end;
    if N > 0 then goto IN;
    OUT: EM[3] := R;
    EM[5] := COUNT;
    VALQRICOM := N;
    ;
end VALQRICOM;
comment  ================== 34373 =================
;
integer procedure QRICOM(A1, A2, B, N, EM, VAL1, VAL2, VEC1, VEC2); 
  value N;
  integer N;
  array A1, A2, B, EM, VAL1, VAL2, VEC1, VEC2;
begin;
    integer M, NM1, I, I1, J, Q, Q1, MAX, COUNT;
    real R, Z1, Z2, DD1, DD2, CC, P1, P2, T1, T2, DELTA1, DELTA2, MV1, MV2, H, H1, H2, G1, G2, K1, K2, HC, AIJ12, AIJ22, A1NN, A2NN, AIJ1, AIJ2, AI1I, KAPPA, NUI, MUI1, MUI2, MUIM11, MUIM12, NUIM1, TOL, MACHTOL;
    array TF1, TF2[1 : N];
    procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); code 34345;
    
    procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); code 34358;
    
    procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); code 34357;
    
    procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352;
    
    procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure COMMATVEC(L, U, I, AR, AI, BR, BI, RR, RI); code 34354;
    
    procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342;
    
    TOL := EM[1] TIMES EM[2];
    MACHTOL := EM[0] TIMES EM[1];
    MAX := EM[4];
    COUNT := 0;
    R := 0;
    M := N;
    if N > 1 then HC := B[N - 1];
    for I := 1 step 1 until N do
      begin;
        VEC1[I, I] := 1;
        VEC2[I, I] := 0;
        for J := I + 1 step 1 until N do
          VEC1[I, J] := VEC1[J, I] := VEC2[I, J] := VEC2[J, I] := 0;
    end;
    IN: NM1 := N - 1;
    for I := N,
             I - 1 while (if I NOTLESS 1 then ABS(B[I]) > TOL else false) do Q := I;
    if Q > 1 then begin;
        if ABS(B[Q - 1]) > R then R := ABS(B[Q - 1]);
    end;
    if Q = N then begin;
        VAL1[N] := A1[N, N];
        VAL2[N] := A2[N, N];
        N := NM1;
        if N > 1 then HC := B[N - 1];
        ;
    end else begin;
        DD1 := A1[N, N];
        DD2 := A2[N, N];
        CC := B[NM1];
        P1 := (A1[NM1, NM1] - DD1) TIMES .5;
        P2 := (A2[NM1, NM1] - DD2) TIMES .5;
        COMKWD(P1, P2, CC TIMES A1[NM1, N], CC TIMES A2[NM1, N], G1, G2, K1, K2);
        if Q = NM1 then begin;
            A1[N, N] := VAL1[N] := G1 + DD1;
            A2[N, N] := VAL2[N] := G2 + DD2;
            A1[Q, Q] := VAL1[Q] := K1 + DD1;
            A2[Q, Q] := VAL2[Q] := K2 + DD2;
            KAPPA := SQRT(K1 POWER 2 + K2 POWER 2 + CC POWER 2);
            NUI := CC ÷ KAPPA;
            MUI1 := K1 ÷ KAPPA;
            MUI2 := K2 ÷ KAPPA;
            AIJ1 := A1[Q, N];
            AIJ2 := A2[Q, N];
            H1 := MUI1 POWER 2 - MUI2 POWER 2;
            H2 := 2 TIMES MUI1 TIMES MUI2;
            H := -NUI TIMES 2;
            A1[Q, N] := H TIMES (P1 TIMES MUI1 + P2 TIMES MUI2) - NUI TIMES NUI TIMES CC + AIJ1 TIMES H1 + AIJ2 TIMES H2;
            A2[Q, N] := H TIMES (P2 TIMES MUI1 - P1 TIMES MUI2) + AIJ2 TIMES H1 - AIJ1 TIMES H2;
            ROTCOMROW(Q + 2, M, Q, N, A1, A2, MUI1, MUI2, NUI);
            ROTCOMCOL(1, Q - 1, Q, N, A1, A2, MUI1, -MUI2, -NUI);
            ROTCOMCOL(1, M, Q, N, VEC1, VEC2, MUI1, -MUI2, -NUI);
            N := N - 2;
            if N > 1 then HC := B[N - 1];
            B[Q] := 0;
        end else begin;
            COUNT := COUNT + 1;
            if COUNT > MAX then goto OUT;
            Z1 := K1 + DD1;
            Z2 := K2 + DD2;
            if ABS(CC) > ABS(HC) then Z1 := Z1 + ABS(CC);
            HC := CC ÷ 2;
            Q1 := Q + 1;
            AIJ1 := A1[Q, Q] - Z1;
            AIJ2 := A2[Q, Q] - Z2;
            AI1I := B[Q];
            KAPPA := SQRT(AIJ1 POWER 2 + AIJ2 POWER 2 + AI1I POWER 2);
            MUI1 := AIJ1 ÷ KAPPA;
            MUI2 := AIJ2 ÷ KAPPA;
            NUI := AI1I ÷ KAPPA;
            A1[Q, Q] := KAPPA;
            A2[Q, Q] := 0;
            A1[Q1, Q1] := A1[Q1, Q1] - Z1;
            A2[Q1, Q1] := A2[Q1, Q1] - Z2;
            ROTCOMROW(Q1, M, Q, Q1, A1, A2, MUI1, MUI2, NUI);
            ROTCOMCOL(1, Q, Q, Q1, A1, A2, MUI1, -MUI2, -NUI);
            A1[Q, Q] := A1[Q, Q] + Z1;
            A2[Q, Q] := A2[Q, Q] + Z2;
            ROTCOMCOL(1, M, Q, Q1, VEC1, VEC2, MUI1, -MUI2, -NUI);
            for I := Q1 step 1 until NM1 do
              begin;
                I1 := I + 1;
                AIJ1 := A1[I, I];
                AIJ2 := A2[I, I];
                AI1I := B[I];
                KAPPA := SQRT(AIJ1 POWER 2 + AIJ2 POWER 2 + AI1I POWER 2);
                MUIM11 := MUI1;
                MUIM12 := MUI2;
                NUIM1 := NUI;
                MUI1 := AIJ1 ÷ KAPPA;
                MUI2 := AIJ2 ÷ KAPPA;
                NUI := AI1I ÷ KAPPA;
                A1[I1, I1] := A1[I1, I1] - Z1;
                A2[I1, I1] := A2[I1, I1] - Z2;
                ROTCOMROW(I1, M, I, I1, A1, A2, MUI1, MUI2, NUI);
                A1[I, I] := MUIM11 TIMES KAPPA;
                A2[I, I] := -MUIM12 TIMES KAPPA;
                B[I - 1] := NUIM1 TIMES KAPPA;
                ROTCOMCOL(1, I, I, I1, A1, A2, MUI1, -MUI2, -NUI);
                A1[I, I] := A1[I, I] + Z1;
                A2[I, I] := A2[I, I] + Z2;
                ROTCOMCOL(1, M, I, I1, VEC1, VEC2, MUI1, -MUI2, -NUI);
                ;
            end;
            AIJ1 := A1[N, N];
            AIJ2 := A2[N, N];
            AIJ12 := AIJ1 POWER 2;
            AIJ22 := AIJ2 POWER 2;
            KAPPA := SQRT(AIJ12 + AIJ22);
            if (if KAPPA < TOL then true else AIJ22 NOTLESS EM[0] TIMES AIJ12) then begin;
                B[NM1] := NUI TIMES AIJ1;
                A1[N, N] := AIJ1 TIMES MUI1 + Z1;
                A2[N, N] := -AIJ1 TIMES MUI2 + Z2;
            end else begin;
                B[NM1] := NUI TIMES KAPPA;
                A1NN := MUI1 TIMES KAPPA;
                A2NN := -MUI2 TIMES KAPPA;
                MUI1 := AIJ1 ÷ KAPPA;
                MUI2 := AIJ2 ÷ KAPPA;
                COMCOLCST(1, NM1, N, A1, A2, MUI1, MUI2);
                COMCOLCST(1, NM1, N, VEC1, VEC2, MUI1, MUI2);
                COMROWCST(N + 1, M, N, A1, A2, MUI1, -MUI2);
                COMCOLCST(N, M, N, VEC1, VEC2, MUI1, MUI2);
                A1[N, N] := MUI1 TIMES A1NN - MUI2 TIMES A2NN + Z1;
                A2[N, N] := MUI1 TIMES A2NN + MUI2 TIMES A1NN + Z2;
                ;
            end;
            ;
        end;
        ;
    end;
    if N > 0 then goto IN;
    for J := M step -1 until 2 do
      begin;
        TF1[J] := 1;
        TF2[J] := 0;
        T1 := A1[J, J];
        T2 := A2[J, J];
        for I := J - 1 step -1 until 1 do
          begin;
            DELTA1 := T1 - A1[I, I];
            DELTA2 := T2 - A2[I, I];
            COMMATVEC(I + 1, J, I, A1, A2, TF1, TF2, MV1, MV2);
            if ABS(DELTA1) < MACHTOL IMPL ABS(DELTA2) < MACHTOL then begin;
                TF1[I] := MV1 ÷ MACHTOL;
                TF2[I] := MV2 ÷ MACHTOL;
            end else COMDIV(MV1, MV2, DELTA1, DELTA2, TF1[I], TF2[I]);
            ;
        end;
        for I := 1 step 1 until M do
          COMMATVEC(1, J, I, VEC1, VEC2, TF1, TF2, VEC1[I, J], VEC2[I, J]);
        ;
    end;
    OUT: EM[3] := R;
    EM[5] := COUNT;
    QRICOM := N;
    ;
end QRICOM;
comment  ================== 34374 =================
;
integer procedure EIGVALCOM(AR, AI, N, EM, VALR, VALI); 
  value N;
  integer N;
  array AR, AI, EM, VALR, VALI;
begin;
    integer array INT[1 : N];
    array D, B, DEL, TR, TI[1 : N];
    procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); code 34366;
    
    real procedure COMEUCNRM(AR, AI, LW, N); code 34359;
    
    procedure EQILBRCOM(A1, A2, N, EM, D, INT); code 34361;
    
    integer procedure VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2); code 34372;
    
    EQILBRCOM(AR, AI, N, EM, D, INT);
    EM[1] := COMEUCNRM(AR, AI, N - 1, N);
    HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL);
    EIGVALCOM := VALQRICOM(AR, AI, B, N, EM, VALR, VALI);
end EIGVALCOM;
comment  ================== 34375 =================
;
integer procedure EIGCOM(AR, AI, N, EM, VALR, VALI, VR, VI); 
  value N;
  integer N;
  array AR, AI, EM, VALR, VALI, VR, VI;
begin;
    integer I;
    integer array INT[1 : N];
    array D, B, DEL, TR, TI[1 : N];
    procedure EQILBRCOM(A1, A2, N, EM, D, INT); code 34361;
    
    real procedure COMEUCNRM(AR, AI, LW, N); code 34359;
    
    procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); code 34366;
    
    integer procedure QRICOM(A1, A2, B, N, EM, VAL1, VAL2, VEC1, VEC2); code 34373;
    
    procedure BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, N1, N2); code 34367;
    
    procedure BAKLBRCOM(N, N1, N2, D, INT, VR, VI); code 34362;
    
    procedure SCLCOM(AR, AI, N, N1, N2); code 34360;
    
    EQILBRCOM(AR, AI, N, EM, D, INT);
    EM[1] := COMEUCNRM(AR, AI, N - 1, N);
    HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL);
    I := EIGCOM := QRICOM(AR, AI, B, N, EM, VALR, VALI, VR, VI);
    if I = 0 then begin;
        BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, 1, N);
        BAKLBRCOM(N, 1, N, D, INT, VR, VI);
        SCLCOM(VR, VI, N, 1, N);
    end;
end EIGCOM;
comment  ================== 34270 =================
;
integer procedure QRISNGVALBID(D, B, N, EM); 
  value N;
  integer N;
  array D, B, EM;
begin;
    integer N1, K, K1, I, I1, COUNT, MAX, RNK;
    real TOL, BMAX, Z, X, Y, G, H, F, C, S, MIN;
    TOL := EM[2] TIMES EM[1];
    COUNT := 0;
    BMAX := 0;
    MAX := EM[4];
    MIN := EM[6];
    RNK := N;
    IN: K := N;
    N1 := N - 1;
    NEXT: K := K - 1;
    if K > 0 then begin;
        if ABS(B[K]) NOTLESS TOL then begin;
            if ABS(D[K]) NOTLESS TOL then goto NEXT;
            C := 0;
            S := 1;
            for I := K step 1 until N1 do
              begin;
                F := S TIMES B[I];
                B[I] := C TIMES B[I];
                I1 := I + 1;
                if ABS(F) < TOL then goto NEGLECT;
                G := D[I1];
                D[I1] := H := SQRT(F TIMES F + G TIMES G);
                C := G ÷ H;
                S := -F ÷ H;
            end;
            NEGLECT: ;
        end else if ABS(B[K]) > BMAX then BMAX := ABS(B[K]);
    end;
    if K = N1 then begin;
        if D[N] < 0 then D[N] := -D[N];
        if D[N] NOTLESS MIN then RNK := RNK - 1;
        N := N1;
    end else begin;
        COUNT := COUNT + 1;
        if COUNT > MAX then goto END;
        K1 := K + 1;
        Z := D[N];
        X := D[K1];
        Y := D[N1];
        G := if N1 = 1 then 0 else B[N1 - 1];
        H := B[N1];
        F := ((Y - Z) TIMES (Y + Z) + (G - H) TIMES (G + H)) ÷ (2 TIMES H TIMES Y);
        G := SQRT(F TIMES F + 1);
        F := ((X - Z) TIMES (X + Z) + H TIMES (Y ÷ (if F < 0 then F - G else F + G) - H)) ÷ X;
        C := S := 1;
        for I := K1 + 1 step 1 until N do
          begin;
            I1 := I - 1;
            G := B[I1];
            Y := D[I];
            H := S TIMES G;
            G := C TIMES G;
            Z := SQRT(F TIMES F + H TIMES H);
            C := F ÷ Z;
            S := H ÷ Z;
            if I1 NOTEQUAL K1 then B[I1 - 1] := Z;
            F := X TIMES C + G TIMES S;
            G := G TIMES C - X TIMES S;
            H := Y TIMES S;
            Y := Y TIMES C;
            D[I1] := Z := SQRT(F TIMES F + H TIMES H);
            C := F ÷ Z;
            S := H ÷ Z;
            F := C TIMES G + S TIMES Y;
            X := C TIMES Y - S TIMES G;
        end;
        B[N1] := F;
        D[N] := X;
    end;
    if N > 0 then goto IN;
    END: EM[3] := BMAX;
    EM[5] := COUNT;
    EM[7] := RNK;
    QRISNGVALBID := N;
end QRISNGVALBID;
comment  ================== 34271 =================
;
integer procedure QRISNGVALDECBID(D, B, M, N, U, V, EM); 
  value M, N;
  integer M, N;
  array D, B, U, V, EM;
begin;
    integer N0, N1, K, K1, I, I1, COUNT, MAX, RNK;
    real TOL, BMAX, Z, X, Y, G, H, F, C, S, MIN;
    procedure ROTCOL(L, U, I, J, A, C, S); 
      value L, U, I, J, C, S;
      integer L, U, I, J;
      real C, S;
      array A;
    code 34040;
    TOL := EM[2] TIMES EM[1];
    COUNT := 0;
    BMAX := 0;
    MAX := EM[4];
    MIN := EM[6];
    RNK := N0 := N;
    IN: K := N;
    N1 := N - 1;
    NEXT: K := K - 1;
    if K > 0 then begin;
        if ABS(B[K]) NOTLESS TOL then begin;
            if ABS(D[K]) NOTLESS TOL then goto NEXT;
            C := 0;
            S := 1;
            for I := K step 1 until N1 do
              begin;
                F := S TIMES B[I];
                B[I] := C TIMES B[I];
                I1 := I + 1;
                if ABS(F) < TOL then goto NEGLECT;
                G := D[I1];
                D[I1] := H := SQRT(F TIMES F + G TIMES G);
                C := G ÷ H;
                S := -F ÷ H;
                ROTCOL(1, M, K, I1, U, C, S);
            end;
            NEGLECT: ;
        end else if ABS(B[K]) > BMAX then BMAX := ABS(B[K]);
    end;
    if K = N1 then begin;
        if D[N] < 0 then begin;
            D[N] := -D[N];
            for I := 1 step 1 until N0 do
              V[I, N] := -V[I, N];
        end;
        if D[N] NOTLESS MIN then RNK := RNK - 1;
        N := N1;
    end else begin;
        COUNT := COUNT + 1;
        if COUNT > MAX then goto END;
        K1 := K + 1;
        Z := D[N];
        X := D[K1];
        Y := D[N1];
        G := if N1 = 1 then 0 else B[N1 - 1];
        H := B[N1];
        F := ((Y - Z) TIMES (Y + Z) + (G - H) TIMES (G + H)) ÷ (2 TIMES H TIMES Y);
        G := SQRT(F TIMES F + 1);
        F := ((X - Z) TIMES (X + Z) + H TIMES (Y ÷ (if F < 0 then F - G else F + G) - H)) ÷ X;
        C := S := 1;
        for I := K1 + 1 step 1 until N do
          begin;
            I1 := I - 1;
            G := B[I1];
            Y := D[I];
            H := S TIMES G;
            G := C TIMES G;
            Z := SQRT(F TIMES F + H TIMES H);
            C := F ÷ Z;
            S := H ÷ Z;
            if I1 NOTEQUAL K1 then B[I1 - 1] := Z;
            F := X TIMES C + G TIMES S;
            G := G TIMES C - X TIMES S;
            H := Y TIMES S;
            Y := Y TIMES C;
            ROTCOL(1, N0, I1, I, V, C, S);
            D[I1] := Z := SQRT(F TIMES F + H TIMES H);
            C := F ÷ Z;
            S := H ÷ Z;
            F := C TIMES G + S TIMES Y;
            X := C TIMES Y - S TIMES G;
            ROTCOL(1, M, I1, I, U, C, S);
        end;
        B[N1] := F;
        D[N] := X;
    end;
    if N > 0 then goto IN;
    END: EM[3] := BMAX;
    EM[5] := COUNT;
    EM[7] := RNK;
    QRISNGVALDECBID := N;
end QRISNGVALDECBID;
comment  ================== 34272 =================
;
integer procedure QRISNGVAL(A, M, N, VAL, EM); 
  value M, N;
  integer M, N;
  array A, VAL, EM;
begin;
    array B[1 : N];
    procedure HSHREABID(A, M, N, D, B, EM); 
      value M, N;
      integer M, N;
      array D, B, EM;
    code 34260;
    integer procedure QRISNGVALBID(D, B, N, EM); 
      value N;
      integer N;
      array D, B, EM;
    code 34270;
    HSHREABID(A, M, N, VAL, B, EM);
    QRISNGVAL := QRISNGVALBID(VAL, B, N, EM);
end QRISNGVAL;
comment  ================== 34273 =================
;
integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); 
  value M, N;
  integer M, N;
  array A, VAL, V, EM;
begin;
    array B[1 : N];
    procedure HSHREABID(A, M, N, D, B, EM); 
      value M, N;
      integer M, N;
      array A, D, B, EM;
    code 34260;
    procedure PSTTFMMAT(A, N, V, B); 
      value N;
      integer N;
      array A, V, B;
    code 34261;
    procedure PRETFMMAT(A, M, N, D); 
      value M, N;
      integer M, N;
      array A, D;
    code 34262;
    integer procedure QRISNGVALDECBID(D, B, M, N, U, V, EM); 
      value M, N;
      integer M, N;
      array D, B, U, V, EM;
    code 34271;
    HSHREABID(A, M, N, VAL, B, EM);
    PSTTFMMAT(A, N, V, B);
    PRETFMMAT(A, M, N, VAL);
    QRISNGVALDEC := QRISNGVALDECBID(VAL, B, M, N, A, V, EM);
end QRISNGVALDEC;
comment  ================== 34345 =================
;
procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); 
  value PR, PI, QR, QI;
  real PR, PI, QR, QI, GR, GI, KR, KI;
begin;
    procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341;
    
    procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342;
    
    procedure COMSQRT(AR, AI, PR, PI); code 34343;
    
    if QR = 0 IMPL QI = 0 then begin;
        KR := KI := 0;
        GR := PR TIMES 2;
        GI := PI TIMES 2;
    end else if PR = 0 IMPL PI = 0 then begin;
        COMSQRT(QR, QI, GR, GI);
        KR := -GR;
        KI := -GI;
    end else begin;
        real HR, HI;
        if ABS(PR) > 1 OR ABS(PI) > 1 then begin;
            COMDIV(QR, QI, PR, PI, HR, HI);
            COMDIV(HR, HI, PR, PI, HR, HI);
            COMSQRT(1 + HR, HI, HR, HI);
            COMMUL(PR, PI, HR + 1, HI, GR, GI);
            ;
        end else begin;
            COMSQRT(QR + (PR + PI) TIMES (PR - PI), QI + PR TIMES PI TIMES 2, HR, HI);
            if PR TIMES HR + PI TIMES HI > 0 then begin;
                GR := PR + HR;
                GI := PI + HI;
            end else begin;
                GR := PR - HR;
                GI := PI - HI;
            end;
            ;
        end;
        COMDIV(-QR, -QI, GR, GI, KR, KI);
        ;
    end;
end COMKWD;
comment  ================== 32010 =================
;
real procedure EULER(AI, I, EPS, TIM); 
  value EPS, TIM;
  integer I, TIM;
  real AI, EPS;
begin;
    integer K, N, T;
    real MN, MP, DS, SUM;
    array M[0 : 15];
    N := T := 0;
    I := 0;
    M[0] := AI;
    SUM := M[0] ÷ 2;
    NEXT TERM: I := I + 1;
    MN := AI;
    for K := 0 step 1 until N do
      begin;
        MP := (MN + M[K]) ÷ 2;
        M[K] := MN;
        MN := MP;
    end;
    if ABS(MN) < ABS(M[N]) IMPL N < 15 then begin;
        DS := MN ÷ 2;
        N := N + 1;
        M[N] := MN;
    end else DS := MN;
    SUM := SUM + DS;
    T := if ABS(DS) < EPS then T + 1 else 0;
    if T < TIM then goto NEXT TERM;
    EULER := SUM;
end EULER;
comment  ================== 32020 =================
;
real procedure SUMPOSSERIES(AI, I, MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM); 
  value MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM;
  real AI, I, MAXZERO;
  integer MAXADDUP, MAXRECURS, MACHEXP, TIM;
begin;
    integer RECURS, VL, VL2, VL4;
    real procedure EULER(AI, I, EPS, TIM); code 32010;
    
    real procedure SUMUP(AI, I);
      real AI, I;
    begin;
        integer J;
        real SUM, NEXTTERM;
        I := MAXADDUP + 1;
        J := 1;
        CHECK ADD: if AI NOTLESS MAXZERO then begin;
            if J < TIM then begin;
                J := J + 1;
                I := I + 1;
                goto CHECK ADD;
            end;
        end else if RECURS NOTEQUAL MAXRECURS then goto TRANSFORMSERIES;
        SUM := 0;
        I := 0;
        J := 0;
        ADD LOOP: I := I + 1;
        NEXTTERM := AI;
        J := if NEXTTERM NOTLESS MAXZERO then J + 1 else 0;
        SUM := SUM + NEXTTERM;
        if J < TIM then goto ADD LOOP;
        SUMUP := SUM;
        goto GOTSUM;
        TRANSFORMSERIES: begin;
            Boolean JODD;
            integer J2;
            array V[1 : VL];
            real procedure BJK(J, K); 
              value J, K;
              real K;
              integer J;
            begin;
                real COEFF;
                if K > MACHEXP then BJK := 0 else begin;
                    COEFF := 2 POWER (K - 1);
                    I := J TIMES COEFF;
                    BJK := COEFF TIMES AI;
                end;
            end BJK;
            real procedure VJ(J); 
              value J;
              integer J;
            begin;
                real TEMP, K;
                if JODD then begin;
                    JODD := false;
                    RECURS := RECURS + 1;
                    TEMP := VJ := SUMUP(BJK(J, K), K);
                    RECURS := RECURS - 1;
                    if J NOTLESS VL then V[J] := TEMP else if J NOTLESS VL2 then V[J - VL] := TEMP;
                end else begin;
                    JODD := true;
                    if J > VL4 then begin;
                        RECURS := RECURS + 1;
                        VJ := -SUMUP(BJK(J, K), K);
                        RECURS := RECURS - 1;
                    end else begin;
                        J2 := J2 + 1;
                        I := J2;
                        if J > VL2 then VJ := -(V[J2 - VL] - AI) ÷ 2 else begin;
                            TEMP := V[if J NOTLESS VL then J else J - VL] := (V[J2] - AI) ÷ 2;
                            VJ := -TEMP;
                        end;
                    end;
                end;
            end VJ;
            J2 := 0;
            JODD := true;
            SUMUP := EULER(VJ(J + 1), J, MAXZERO, TIM);
        end TRANSFORMSERIES;
        GOTSUM: ;
    end SUMUP;
    RECURS := 0;
    VL := 1000;
    VL2 := 2 TIMES VL;
    VL4 := 2 TIMES VL2;
    SUMPOSSERIES := SUMUP(AI, I);
end SUMPOSSERIES;
comment  ================== 32070 =================
;
real procedure QADRAT(X, A, B, FX, E); 
  value A, B;
  real X, A, B, FX;
  array E;
begin;
    real F0, F2, F3, F5, F6, F7, F9, F14, V, W, HMIN, HMAX, RE, AE;
    real procedure LINT(X0, XN, F0, F2, F3, F5, F6, F7, F9, F14);
      real X0, XN, F0, F2, F3, F5, F6, F7, F9, F14;
    begin;
        real H, XM, F1, F4, F8, F10, F11, F12, F13;
        XM := (X0 + XN) ÷ 2;
        H := (XN - X0) ÷ 32;
        X := XM + 4 TIMES H;
        F8 := FX;
        X := XN - 4 TIMES H;
        F11 := FX;
        X := XN - 2 TIMES H;
        F12 := FX;
        V := 0.330580178199226 TIMES F7 + 0.173485115707338 TIMES (F6 + F8) + 0.321105426559972 TIMES (F5 + F9) + 0.135007708341042 TIMES (F3 + F11) + 0.165714514228223 TIMES (F2 + F12) + 0.39397146063812710-1 TIMES (F0 + F14);
        X := X0 + H;
        F1 := FX;
        X := XN - H;
        F13 := FX;
        W := 0.260652434656970 TIMES F7 + 0.239063286684765 TIMES (F6 + F8) + 0.263062635477467 TIMES (F5 + F9) + 0.218681931383057 TIMES (F3 + F11) + 0.27578976466428410-1 TIMES (F2 + F12) + 0.105575010053846 TIMES (F1 + F13) + 0.15711942605951810-1 TIMES (F0 + F14);
        if ABS(H) < HMIN then E[3] := E[3] + 1;
        if ABS(V - W) < ABS(W) TIMES RE + AE OR ABS(H) < HMIN then LINT := H TIMES W else begin;
            X := X0 + 6 TIMES H;
            F4 := FX;
            X := XN - 6 TIMES H;
            F10 := FX;
            V := 0.245673430093324 TIMES F7 + 0.255786258286921 TIMES (F6 + F8) + 0.228526063690406 TIMES (F5 + F9) + 0.50055713152546010-1 TIMES (F4 + F10) + 0.177946487736780 TIMES (F3 + F11) + 0.58401459934744910-1 TIMES (F2 + F12) + 0.87483094287133110-1 TIMES (F1 + F13) + 0.18964207864807910-1 TIMES (F0 + F14);
            LINT := if ABS(V - W) < ABS(V) TIMES RE + AE then H TIMES V else LINT(X0, XM, F0, F1, F2, F3, F4, F5, F6, F7) - LINT(XN, XM, F14, F13, F12, F11, F10, F9, F8, F7);
        end;
    end LINT;
    HMAX := (B - A) ÷ 16;
    if HMAX = 0 then begin;
        QADRAT := 0;
        goto RETURN;
    end;
    RE := E[1];
    AE := 2 TIMES E[2] ÷ ABS(B - A);
    E[3] := 0;
    HMIN := ABS(B - A) TIMES RE;
    X := A;
    F0 := FX;
    X := A + HMAX;
    F2 := FX;
    X := A + 2 TIMES HMAX;
    F3 := FX;
    X := A + 4 TIMES HMAX;
    F5 := FX;
    X := A + 6 TIMES HMAX;
    F6 := FX;
    X := A + 8 TIMES HMAX;
    F7 := FX;
    X := B - 4 TIMES HMAX;
    F9 := FX;
    X := B;
    F14 := FX;
    QADRAT := LINT(A, B, F0, F2, F3, F5, F6, F7, F9, F14) TIMES 16;
    RETURN: ;
end QADRAT;
comment  ================== 32051 =================
;
real procedure INTEGRAL(X, A, B, FX, E, UA, UB); 
  value A, B;
  real X, A, B, FX;
  array E;
  Boolean UA, UB;
begin;
    real procedure TRANSF;
    begin;
        Z := 1 ÷ X;
        X := Z + B1;
        TRANSF := FX TIMES Z TIMES Z;
    end;
    real procedure QAD(FX);
      real FX;
    begin;
        real T, V, SUM, HMIN;
        procedure INT;
        begin;
            real X3, X4, F3, F4, H;
            X4 := X2;
            X2 := X1;
            F4 := F2;
            F2 := F1;
            ANEW: X := X1 := (X0 + X2) TIMES .5;
            F1 := FX;
            X := X3 := (X2 + X4) TIMES .5;
            F3 := FX;
            H := X4 - X0;
            V := (4 TIMES (F1 + F3) + 2 TIMES F2 + F0 + F4) TIMES 15;
            T := 6 TIMES F2 - 4 TIMES (F1 + F3) + F0 + F4;
            if ABS(T) < ABS(V) TIMES RE + AE then SUM := SUM + (V - T) TIMES H else if ABS(H) < HMIN then E[3] := E[3] + 1 else begin;
                INT;
                X2 := X3;
                F2 := F3;
                goto ANEW;
            end;
            X0 := X4;
            F0 := F4;
        end INT;
        HMIN := ABS(X0 - X2) TIMES RE;
        X := X1 := (X0 + X2) TIMES .5;
        F1 := FX;
        SUM := 0;
        INT;
        QAD := SUM ÷ 180;
    end QAD;
    real X0, X1, X2, F0, F1, F2, RE, AE, B1, Z;
    RE := E[1];
    if UB then AE := E[2] TIMES 180 ÷ ABS(B - A) else AE := E[2] TIMES 90 ÷ ABS(B - A);
    if UA then begin;
        E[3] := E[4] := 0;
        X := X0 := A;
        F0 := FX;
    end else begin;
        X := X0 := A := E[5];
        F0 := E[6];
    end;
    E[5] := X := X2 := B;
    E[6] := F2 := FX;
    E[4] := E[4] + QAD(FX);
    if ¬UB then begin;
        if A < B then begin;
            B1 := B - 1;
            X0 := 1;
        end else begin;
            B1 := B + 1;
            X0 := -1;
        end;
        F0 := E[6];
        E[5] := X2 := 0;
        E[6] := F2 := 0;
        AE := E[2] TIMES 90;
        E[4] := E[4] - QAD(TRANSF);
    end;
    INTEGRAL := E[4];
end INTEGRAL;
comment  ================== 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];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    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)) TIMES RELTOL + ABSTOL) ÷ ND;
    Q := (F1 - F0) ÷ (ALFA TIMES DF0);
    INT: if NOTININT then NOTININT := DF1 < 0 IMPL Q > MU;
    AID := ALFA;
    if DF1 NOTLESS 0 then begin;
        Z := 3 TIMES (OLDF - F1) ÷ ALFA + OLDDF + DF1;
        W := SQRT(Z POWER 2 - OLDDF TIMES DF1);
        ALFA := ALFA TIMES (1 - (DF1 + W - Z) ÷ (DF1 - OLDDF + W TIMES 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 TIMES 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)) TIMES RELTOL + ABSTOL) ÷ ND;
    F := FUNCT(N, X, G);
    EVL := EVL + 1;
    DF := VECVEC(1, N, 0, D, G);
    Q := (F - F0) ÷ (Y TIMES DF0);
    if (if NOTININT OR STRONGSEARCH then true else Q < MU OR Q > 1 - MU) IMPL 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 TIMES 2 then goto INT;
    end;
    ALFA := Y;
    EVLMAX := EVL;
    DF1 := DF;
    F1 := F;
end LINEMIN;
comment  ================== 34211 =================
;
procedure RNK1UPD(H, N, V, C); 
  value N, C;
  integer N;
  real C;
  array H, V;
begin;
    integer J, K;
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    K := 0;
    for J := 1,
             J + K while K < N do
      begin;
        K := K + 1;
        ELMVEC(J, J + K - 1, 1 - J, H, V, V[K] TIMES C);
    end;
end RNK1UPD;
comment  ================== 34212 =================
;
procedure DAVUPD(H, N, V, W, C1, C2); 
  value N, C1, C2;
  integer N;
  real C1, C2;
  array H, V, W;
begin;
    integer I, J, K;
    real VK, WK;
    K := 0;
    for J := 1,
             J + K while K < N do
      begin;
        K := K + 1;
        VK := V[K] TIMES C1;
        WK := W[K] TIMES C2;
        for I := 0 step 1 until K - 1 do
          H[I + J] := H[I + J] + V[I + 1] TIMES VK - W[I + 1] TIMES WK;
    end;
end DAVUPD;
comment  ================== 34213 =================
;
procedure FLEUPD(H, N, V, W, C1, C2); 
  value N, C1, C2;
  integer N;
  real C1, C2;
  array H, V, W;
begin;
    integer I, J, K;
    real VK, WK;
    K := 0;
    for J := 1,
             J + K while K < N do
      begin;
        K := K + 1;
        VK := -W[K] TIMES C1 + V[K] TIMES C2;
        WK := V[K] TIMES C1;
        for I := 0 step 1 until K - 1 do
          H[I + J] := H[I + J] + V[I + 1] TIMES VK - W[I + 1] TIMES WK;
    end;
end FLEUPD;
comment  ================== 33010 =================
;
procedure RK1(X, A, B, Y, YA, FXY, E, D, FI); 
  value B, FI;
  real X, A, B, Y, YA, FXY;
  Boolean FI;
  array E, D;
begin;
    real E1, E2, XL, YL, H, INT, HMIN, ABSH, K0, K1, K2, K3, K4, K5, DISCR, TOL, MU, MU1, FH, HL;
    Boolean LAST, FIRST, REJECT;
    if FI then begin;
        D[3] := A;
        D[4] := YA;
    end;
    D[1] := 0;
    XL := D[3];
    YL := D[4];
    if FI then D[2] := B - D[3];
    ABSH := H := ABS(D[2]);
    if B - XL < 0 then H := -H;
    INT := ABS(B - XL);
    HMIN := INT TIMES E[1] + E[2];
    E1 := E[1] ÷ INT;
    E2 := E[2] ÷ INT;
    FIRST := true;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := HMIN;
    end;
    if H NOTLESS B - XL EQUIV H NOTLESS 0 then begin;
        D[2] := H;
        LAST := true;
        H := B - XL;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: X := XL;
    Y := YL;
    K0 := FXY TIMES H;
    X := XL + H ÷ 4.5;
    Y := YL + K0 ÷ 4.5;
    K1 := FXY TIMES H;
    X := XL + H ÷ 3;
    Y := YL + (K0 + K1 TIMES 3) ÷ 12;
    K2 := FXY TIMES H;
    X := XL + H TIMES .5;
    Y := YL + (K0 + K2 TIMES 3) ÷ 8;
    K3 := FXY TIMES H;
    X := XL + H TIMES .8;
    Y := YL + (K0 TIMES 53 - K1 TIMES 135 + K2 TIMES 126 + K3 TIMES 56) ÷ 125;
    K4 := FXY TIMES H;
    X := if LAST then B else XL + H;
    Y := YL + (K0 TIMES 133 - K1 TIMES 378 + K2 TIMES 276 + K3 TIMES 112 + K4 TIMES 25) ÷ 168;
    K5 := FXY TIMES H;
    DISCR := ABS(K0 TIMES 21 - K2 TIMES 162 + K3 TIMES 224 - K4 TIMES 125 + K5 TIMES 42) ÷ 14;
    TOL := ABS(K0) TIMES E1 + ABSH TIMES E2;
    REJECT := DISCR > TOL;
    MU := TOL ÷ (TOL + DISCR) + .45;
    if REJECT then begin;
        if ABSH NOTLESS HMIN then begin;
            D[1] := D[1] + 1;
            Y := YL;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FH := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FH TIMES H;
    ACC: MU1 := MU;
    Y := YL + (-K0 TIMES 63 + K1 TIMES 189 - K2 TIMES 36 - K3 TIMES 112 + K4 TIMES 50) ÷ 28;
    K5 := FXY TIMES HL;
    Y := YL + (K0 TIMES 35 + K2 TIMES 162 + K4 TIMES 125 + K5 TIMES 14) ÷ 336;
    NEXT: if B NOTEQUAL X then begin;
        XL := X;
        YL := Y;
        goto TEST;
    end;
    if ¬LAST then D[2] := H;
    D[3] := X;
    D[4] := Y;
end RK1;
comment  ================== 33033 =================
;
procedure RKE(X, XE, N, Y, DER, DATA, FI, OUT); 
  value FI, N;
  integer N;
  real X, XE;
  Boolean FI;
  array Y, DATA;
  procedure DER, OUT;
begin;
    integer J;
    real XT, H, HMIN, INT, HL, HT, ABSH, FHM, DISCR, TOL, MU, MU1, FH, E1, E2;
    Boolean LAST, FIRST, REJECT;
    array K0, K1, K2, K3, K4[1 : N];
    if FI then begin;
        DATA[3] := XE - X;
        DATA[4] := DATA[5] := DATA[6] := 0;
    end;
    ABSH := H := ABS(DATA[3]);
    if XE < X then H := -H;
    INT := ABS(XE - X);
    HMIN := INT TIMES DATA[1] + DATA[2];
    E1 := 12 TIMES DATA[1] ÷ INT;
    E2 := 12 TIMES DATA[2] ÷ INT;
    FIRST := true;
    REJECT := false;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := SIGN(XE - X) TIMES HMIN;
        ABSH := HMIN;
    end;
    if H NOTLESS XE - X EQUIV H NOTLESS 0 then begin;
        LAST := true;
        H := XE - X;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: if ¬REJECT then begin;
        for J := 1 step 1 until N do
          K0[J] := Y[J];
        DER(X, K0);
    end;
    HT := .184262134833347 TIMES H;
    XT := X + HT;
    for J := 1 step 1 until N do
      K1[J] := K0[J] TIMES HT + Y[J];
    DER(XT, K1);
    HT := .69098300562505310-1 TIMES H;
    XT := 4 TIMES HT + X;
    for J := 1 step 1 until N do
      K2[J] := (3 TIMES K1[J] + K0[J]) TIMES HT + Y[J];
    DER(XT, K2);
    XT := .5 TIMES H + X;
    HT := .1875 TIMES H;
    for J := 1 step 1 until N do
      K3[J] := ((1.74535599249993 TIMES K2[J] - K1[J]) TIMES 2.23606797749979 + K0[J]) TIMES HT + Y[J];
    DER(XT, K3);
    XT := .723606797749979 TIMES H + X;
    HT := .4 TIMES H;
    for J := 1 step 1 until N do
      K4[J] := (((.517595468166681 TIMES K0[J] - K1[J]) TIMES .927050983124840 + K2[J]) TIMES 1.46352549156242 + K3[J]) TIMES HT + Y[J];
    DER(XT, K4);
    XT := if LAST then XE else X + H;
    HT := 2 TIMES H;
    for J := 1 step 1 until N do
      K1[J] := ((((2 TIMES K4[J] + K2[J]) TIMES .412022659166595 + K1[J]) TIMES 2.23606797749979 - K0[J]) TIMES .375 - K3[J]) TIMES HT + Y[J];
    DER(XT, K1);
    REJECT := false;
    FHM := 0;
    for J := 1 step 1 until N do
      begin;
        DISCR := ABS((1.6 TIMES K3[J] - K2[J] - K4[J]) TIMES 5 + K0[J] + K1[J]);
        TOL := ABS(K0[J]) TIMES E1 + E2;
        REJECT := DISCR > TOL OR REJECT;
        FH := DISCR ÷ TOL;
        if FH > FHM then FHM := FH;
    end;
    MU := 1 ÷ (1 + FHM) + .45;
    if REJECT then begin;
        DATA[5] := DATA[5] + 1;
        if ABSH NOTLESS HMIN then begin;
            DATA[6] := DATA[6] + 1;
            HL := H;
            REJECT := false;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FH := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FH TIMES H;
    ACC: MU1 := MU;
    HT := HL ÷ 12;
    for J := 1 step 1 until N do
      Y[J] := ((K2[J] + K4[J]) TIMES 5 + K0[J] + K1[J]) TIMES HT + Y[J];
    NEXT: DATA[3] := HL;
    DATA[4] := DATA[4] + 1;
    X := XT;
    OUT;
    if X NOTEQUAL XE then goto TEST;
end RKE;
comment  ================== 33016 =================
;
procedure RK4A(X, XA, B, Y, YA, FXY, E, D, FI, XDIR, POS); 
  value FI, XDIR, POS;
  Boolean FI, XDIR, POS;
  real X, XA, B, Y, YA, FXY;
  array E, D;
begin;
    integer I;
    Boolean IV, FIRST, FIR, REJ;
    real K0, K1, K2, K3, K4, K5, FHM, ABSH, DISCR, S, XL, COND0, S1, COND1, YL, HMIN, H, ZL, TOL, HL, MU, MU1;
    array E1[1 : 2];
    Boolean procedure ZEROIN(X, Y, FX, EPS);
      real X, Y, FX, EPS;
    code 34150;
    procedure RKSTEP(X, XL, H, Y, YL, ZL, FXY, D); 
      value XL, YL, ZL, H;
      real X, XL, H, Y, YL, ZL, FXY;
      integer D;
    begin;
        if D = 2 then goto INTEGRATE;
        if D = 3 then begin;
            X := XL;
            Y := YL;
            K0 := FXY TIMES H;
        end else if D = 1 then K0 := ZL TIMES H else K0 := K0 TIMES MU;
        X := XL + H ÷ 4.5;
        Y := YL + K0 ÷ 4.5;
        K1 := FXY TIMES H;
        X := XL + H ÷ 3;
        Y := YL + (K0 + K1 TIMES 3) ÷ 12;
        K2 := FXY TIMES H;
        X := XL + H TIMES .5;
        Y := YL + (K0 + K2 TIMES 3) ÷ 8;
        K3 := H TIMES FXY;
        X := XL + H TIMES .8;
        Y := YL + (K0 TIMES 53 - K1 TIMES 135 + K2 TIMES 126 + K3 TIMES 56) ÷ 125;
        K4 := FXY TIMES H;
        if D NOTLESS 1 then begin;
            X := XL + H;
            Y := YL + (K0 TIMES 133 - K1 TIMES 378 + K2 TIMES 276 + K3 TIMES 112 + K4 TIMES 25) ÷ 168;
            K5 := FXY TIMES H;
            DISCR := ABS(K0 TIMES 21 - K2 TIMES 162 + K3 TIMES 224 - K4 TIMES 125 + K5 TIMES 42) ÷ 14;
            goto END;
        end;
        INTEGRATE: X := XL + H;
        Y := YL + (-K0 TIMES 63 + K1 TIMES 189 - K2 TIMES 36 - K3 TIMES 112 + K4 TIMES 50) ÷ 28;
        K5 := FXY TIMES H;
        Y := YL + (K0 TIMES 35 + K2 TIMES 162 + K4 TIMES 125 + K5 TIMES 14) ÷ 336;
        END: ;
    end RKSTEP;
    real procedure FZERO;
    begin;
        if IV then begin;
            if S = XL then FZERO := COND0 else if S = S1 then FZERO := COND1 else begin;
                RKSTEP(X, XL, S - XL, Y, YL, ZL, FXY, 3);
                FZERO := B;
            end;
        end else begin;
            if S = YL then FZERO := COND0 else if S = S1 then FZERO := COND1 else begin;
                RKSTEP(Y, YL, S - YL, X, XL, ZL, 1 ÷ FXY, 3);
                FZERO := B;
            end;
        end;
    end FZERO;
    if FI then begin;
        D[3] := XA;
        D[4] := YA;
        D[0] := 1;
    end;
    D[1] := 0;
    X := XL := D[3];
    Y := YL := D[4];
    IV := D[0] > 0;
    FIRST := FIR := true;
    HMIN := E[0] + E[1];
    H := E[2] + E[3];
    if H < HMIN then HMIN := H;
    CHANGE: ZL := FXY;
    if ABS(ZL) NOTLESS 1 then begin;
        if ¬IV then begin;
            D[2] := H := H ÷ ZL;
            D[0] := 1;
            IV := FIRST := true;
        end;
        if FIR then goto A;
        I := 1;
        goto AGAIN;
    end else begin;
        if IV then begin;
            if ¬FIR then D[2] := H := H TIMES ZL;
            D[0] := -1;
            IV := false;
            FIRST := true;
        end;
        if FIR then begin;
            H := E[0] + E[1];
            A: if (if FI then (if IV EQUIV XDIR then H else H TIMES ZL) < 0 EQUIV POS else H TIMES D[2] < 0) then H := -H;
        end;
        I := 1;
    end;
    AGAIN: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := SIGN(H) TIMES HMIN;
        ABSH := HMIN;
    end;
    if IV then begin;
        RKSTEP(X, XL, H, Y, YL, ZL, FXY, I);
        TOL := E[2] TIMES ABS(K0) + E[3] TIMES ABSH;
    end else begin;
        RKSTEP(Y, YL, H, X, XL, 1 ÷ ZL, 1 ÷ FXY, I);
        TOL := E[0] TIMES ABS(K0) + E[1] TIMES ABSH;
    end;
    REJ := DISCR > TOL;
    MU := TOL ÷ (TOL + DISCR) + .45;
    if REJ then begin;
        if ABSH NOTLESS HMIN then begin;
            if IV then begin;
                X := XL + H;
                Y := YL + K0;
            end else begin;
                X := XL + K0;
                Y := YL + H;
            end;
            D[1] := D[1] + 1;
            FIRST := true;
            goto NEXT;
        end;
        H := H TIMES MU;
        I := 0;
        goto AGAIN;
    end REJ;
    if FIRST then begin;
        FIRST := FIR;
        HL := H;
        H := MU TIMES H;
        goto ACCEPT;
    end;
    FHM := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FHM TIMES H;
    ACCEPT: if IV then RKSTEP(X, XL, HL, Y, YL, ZL, FXY, 2) else RKSTEP(Y, YL, HL, X, XL, ZL, 1 ÷ FXY, 2);
    MU1 := MU;
    NEXT: if FIR then begin;
        FIR := false;
        COND0 := B;
        if ¬(FI OR REJ) then H := D[2];
    end else begin;
        D[2] := H;
        COND1 := B;
        if COND0 TIMES COND1 NOTLESS 0 then goto ZERO;
        COND0 := COND1;
    end;
    D[3] := XL := X;
    D[4] := YL := Y;
    goto CHANGE;
    ZERO: E1[1] := E[4];
    E1[2] := E[5];
    S1 := if IV then X else Y;
    S := if IV then XL else YL;
    ZEROIN(S, S1, FZERO, ABS(E1[1] TIMES S) + ABS(E1[2]));
    S1 := if IV then X else Y;
    if IV then RKSTEP(X, XL, S - XL, Y, YL, ZL, FXY, 3) else RKSTEP(Y, YL, S - YL, X, XL, ZL, 1 ÷ FXY, 3);
    D[3] := X;
    D[4] := Y;
end RK4A;
comment  ================== 33017 =================
;
procedure RK4NA(X, XA, B, FXJ, J, E, D, FI, N, L, POS); 
  value FI, N, L, POS;
  integer J, N, L;
  Boolean FI, POS;
  real B, FXJ;
  array X, XA, E, D;
begin;
    integer I, IV, IV0;
    Boolean FIR, FIRST, REJ;
    real H, COND0, COND1, FHM, ABSH, TOL, FH, MAX, X0, X1, S, HMIN, HL, MU, MU1;
    array XL, DISCR, Y[0 : N], K[0 : 5, 0 : N], E1[1 : 2];
    Boolean procedure ZEROIN(X, Y, FX, EPS);
      real X, Y, FX, EPS;
    code 34150;
    procedure RKSTEP(H, D); 
      value H, D;
      integer D;
      real H;
    begin;
        integer I;
        procedure F(T); 
          value T;
          integer T;
        begin;
            integer I;
            real P;
            for J := 1 step 1 until N do
              Y[J] := FXJ;
            P := H ÷ Y[IV];
            for I := 0 step 1 until N do
              begin;
                if I NOTEQUAL IV then K[T, I] := Y[I] TIMES P;
            end;
        end F;
        if D = 2 then goto INTEGRATE;
        if D = 3 then begin;
            for I := 0 step 1 until N do
              X[I] := XL[I];
            F(0);
        end else if D = 1 then begin;
            real P;
            P := H ÷ Y[IV];
            for I := 0 step 1 until N do
              begin;
                if I NOTEQUAL IV then K[0, I] := P TIMES Y[I];
            end;
        end else for I := 0 step 1 until N do
          begin;
            if I NOTEQUAL IV then K[0, I] := K[0, I] TIMES MU;
        end;
        for I := 0 step 1 until N do
          X[I] := XL[I] + (if I = IV then H else K[0, I]) ÷ 4.5;
        F(1);
        for I := 0 step 1 until N do
          X[I] := XL[I] + (if I = IV then H TIMES 4 else (K[0, I] + K[1, I] TIMES 3)) ÷ 12;
        F(2);
        for I := 0 step 1 until N do
          X[I] := XL[I] + (if I = IV then H TIMES .5 else (K[0, I] + K[2, I] TIMES 3) ÷ 8);
        F(3);
        for I := 0 step 1 until N do
          X[I] := XL[I] + (if I = IV then H TIMES .8 else (K[0, I] TIMES 53 - K[1, I] TIMES 135 + K[2, I] TIMES 126 + K[3, I] TIMES 56) ÷ 125);
        F(4);
        if D NOTLESS 1 then begin;
            for I := 0 step 1 until N do
              X[I] := XL[I] + (if I = IV then H else (K[0, I] TIMES 133 - K[1, I] TIMES 378 + K[2, I] TIMES 276 + K[3, I] TIMES 112 + K[4, I] TIMES 25) ÷ 168);
            F(5);
            for I := 0 step 1 until N do
              begin;
                if I NOTEQUAL IV then DISCR[I] := ABS(K[0, I] TIMES 21 - K[2, I] TIMES 162 + K[3, I] TIMES 224 - K[4, I] TIMES 125 + K[5, I] TIMES 42) ÷ 14;
            end;
            goto END;
        end;
        INTEGRATE: for I := 0 step 1 until N do
          X[I] := XL[I] + (if I = IV then H else (-K[0, I] TIMES 63 + K[1, I] TIMES 189 - K[2, I] TIMES 36 - K[3, I] TIMES 112 + K[4, I] TIMES 50) ÷ 28);
        F(5);
        for I := 0 step 1 until N do
          begin;
            if I NOTEQUAL IV then X[I] := XL[I] + (K[0, I] TIMES 35 + K[2, I] TIMES 162 + K[4, I] TIMES 125 + K[5, I] TIMES 14) ÷ 336;
        end;
        END: ;
    end RKSTEP ;
    real procedure FZERO;
    begin;
        if S = X0 then FZERO := COND0 else if S = X1 then FZERO := COND1 else begin;
            RKSTEP(S - XL[IV], 3);
            FZERO := B;
        end;
    end FZERO;
    if FI then begin;
        for I := 0 step 1 until N do
          D[I + 3] := XA[I];
        D[0] := D[2] := 0;
    end;
    D[1] := 0;
    for I := 0 step 1 until N do
      X[I] := XL[I] := D[I + 3];
    IV := D[0];
    H := D[2];
    FIRST := FIR := true;
    Y[0] := 1;
    goto CHANGE;
    AGAIN: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := ABS(H);
    end;
    RKSTEP(H, I);
    REJ := false;
    FHM := 0;
    for I := 0 step 1 until N do
      begin;
        if I NOTEQUAL IV then begin;
            TOL := E[2 TIMES I] TIMES ABS(K[0, I]) + E[2 TIMES I + 1] TIMES ABSH;
            REJ := TOL < DISCR[I] OR REJ;
            FH := DISCR[I] ÷ TOL;
            if FH > FHM then FHM := FH;
        end;
    end;
    MU := 1 ÷ (1 + FHM) + .45;
    if REJ then begin;
        if ABSH NOTLESS HMIN then begin;
            for I := 0 step 1 until N do
              begin;
                if I NOTEQUAL IV then X[I] := XL[I] + K[0, I] else X[I] := XL[I] + H;
            end;
            D[1] := D[1] + 1;
            FIRST := true;
            goto NEXT;
        end;
        H := H TIMES MU;
        I := 0;
        goto AGAIN;
    end;
    if FIRST then begin;
        FIRST := FIR;
        HL := H;
        H := MU TIMES H;
        goto ACCEPT;
    end;
    FH := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FH TIMES H;
    ACCEPT: RKSTEP(HL, 2);
    MU1 := MU;
    NEXT: if FIR then begin;
        FIR := false;
        COND0 := B;
        if ¬(FI OR REJ) then H := D[2];
    end else begin;
        D[2] := H;
        COND1 := B;
        if COND0 TIMES COND1 NOTLESS 0 then goto ZERO;
        COND0 := COND1;
    end;
    for I := 0 step 1 until N do
      D[I + 3] := XL[I] := X[I];
    CHANGE: IV0 := IV;
    for J := 1 step 1 until N do
      Y[J] := FXJ;
    MAX := ABS(Y[IV]);
    for I := 0 step 1 until N do
      begin;
        if ABS(Y[I]) > MAX then begin;
            MAX := ABS(Y[I]);
            IV := I;
        end;
    end;
    if IV0 NOTEQUAL IV then begin;
        FIRST := true;
        D[0] := IV;
        D[2] := H := Y[IV] ÷ Y[IV0] TIMES H;
    end;
    X0 := XL[IV];
    if FIR then begin;
        HMIN := E[0] + E[1];
        for I := 1 step 1 until N do
          begin;
            H := E[2 TIMES I] + E[2 TIMES I + 1];
            if H < HMIN then HMIN := H;
        end;
        H := E[2 TIMES IV] + E[2 TIMES IV + 1];
        if (FI IMPL (Y[L] ÷ Y[IV] TIMES H < 0 EQUIV POS)) OR (¬FI IMPL D[2] TIMES H < 0) then H := -H;
    end;
    I := 1;
    goto AGAIN;
    ZERO: E1[1] := E[2 TIMES N + 2];
    E1[2] := E[2 TIMES N + 3];
    X1 := X[IV];
    S := X0;
    ZEROIN(S, X1, FZERO, ABS(E1[1] TIMES S) + ABS(E1[2]));
    X0 := S;
    X1 := X[IV];
    RKSTEP(X0 - XL[IV], 3);
    for I := 0 step 1 until N do
      D[I + 3] := X[I];
end RK4NA;
comment  ================== 33080 =================
;
Boolean procedure MULTISTEP(X, XEND, Y, HMIN, HMAX, YMAX, EPS, FIRST, SAVE, DERIV, AVAILABLE, JACOBIAN, STIFF, N, OUT); 
  value HMIN, HMAX, EPS, XEND, N, STIFF;
  Boolean FIRST, AVAILABLE, STIFF;
  integer N;
  real X, XEND, HMIN, HMAX, EPS;
  array Y, YMAX, SAVE, JACOBIAN;
  procedure DERIV, OUT;
begin;
    own Boolean  ADAMS, WITH JACOBIAN;
    own integer  M, SAME, KOLD;
    own real  XOLD, HOLD, A0, TOLUP, TOL, TOLDWN, TOLCONV;
    Boolean EVALUATE, EVALUATED, DECOMPOSE, DECOMPOSED, CONV;
    integer I, J, L, K, KNEW, FAILS;
    real H, CH, CHNEW, ERROR, DFI, C;
    array A[0 : 5], DELTA, LAST DELTA, DF[1 : N], JAC[1 : N, 1 : N], AUX[1 : 3];
    integer array P[1 : N];
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure DEC(A, N, AUX, P); code 34300;
    
    procedure SOL(A, N, P, B); code 34051;
    
    real procedure NORM2(AI);
      real AI;
    begin;
        real S, A;
        S := 1.010-100;
        for I := 1 step 1 until N do
          begin;
            A := AI ÷ YMAX[I];
            S := S + A TIMES A;
        end;
        NORM2 := S;
    end NORM2;
    procedure RESET;
    begin;
        if CH < HMIN ÷ HOLD then CH := HMIN ÷ HOLD else if CH > HMAX ÷ HOLD then CH := HMAX ÷ HOLD;
        X := XOLD;
        H := HOLD TIMES CH;
        C := 1;
        for J := 0 step M until K TIMES M do
          begin;
            for I := 1 step 1 until N do
              Y[J + I] := SAVE[J + I] TIMES C;
            C := C TIMES CH;
        end;
        DECOMPOSED := false;
    end RESET;
    procedure METHOD;
    begin;
        I := -39;
        if ADAMS then begin;
            for C := 1,
                     1,
                     144,
                     4,
                     0,
                     .5,
                     1,
                     .5,
                     576,
                     144,
                     1,
                     5 ÷ 12,
                     1,
                     .75,
                     1 ÷ 6,
                     1436,
                     576,
                     4,
                     .375,
                     1,
                     11 ÷ 12,
                     1 ÷ 3,
                     1 ÷ 24,
                     2844,
                     1436,
                     1,
                     251 ÷ 720,
                     1,
                     25 ÷ 24,
                     35 ÷ 72,
                     5 ÷ 48,
                     1 ÷ 120,
                     0,
                     2844,
                     0.1 do
              begin;
                I := I + 1;
                SAVE[I] := C;
            end;
        end else begin;
            for C := 1,
                     1,
                     9,
                     4,
                     0,
                     2 ÷ 3,
                     1,
                     1 ÷ 3,
                     36,
                     20.25,
                     1,
                     6 ÷ 11,
                     1,
                     6 ÷ 11,
                     1 ÷ 11,
                     84.028,
                     53.778,
                     0.25,
                     .48,
                     1,
                     .7,
                     .2,
                     .02,
                     156.25,
                     108.51,
                     .027778,
                     120 ÷ 274,
                     1,
                     225 ÷ 274,
                     85 ÷ 274,
                     15 ÷ 274,
                     1 ÷ 274,
                     0,
                     187.69,
                     .0047361 do
              begin;
                I := I + 1;
                SAVE[I] := C;
            end;
        end;
    end METHOD;
    procedure ORDER;
    begin;
        C := EPS TIMES EPS;
        J := (K - 1) TIMES (K + 8) ÷ 2 - 38;
        for I := 0 step 1 until K do
          A[I] := SAVE[I + J];
        TOLUP := C TIMES SAVE[J + K + 1];
        TOL := C TIMES SAVE[J + K + 2];
        TOLDWN := C TIMES SAVE[J + K + 3];
        TOLCONV := EPS ÷ (2 TIMES N TIMES (K + 2));
        A0 := A[0];
        DECOMPOSE := true;
        ;
    end ORDER;
    procedure EVALUATE JACOBIAN;
    begin;
        EVALUATE := false;
        DECOMPOSE := EVALUATED := true;
        if AVAILABLE then  else begin;
            real D;
            array FIXY, FIXDY, DY[1 : N];
            for I := 1 step 1 until N do
              FIXY[I] := Y[I];
            DERIV(FIXDY);
            for J := 1 step 1 until N do
              begin;
                D := if EPS > ABS(FIXY[J]) then EPS TIMES EPS else EPS TIMES ABS(FIXY[J]);
                Y[J] := Y[J] + D;
                DERIV(DY);
                for I := 1 step 1 until N do
                  JACOBIAN[I, J] := (DY[I] - FIXDY[I]) ÷ D;
                Y[J] := FIXY[J];
            end;
        end;
    end EVALUATE JACOBIAN;
    procedure DECOMPOSE JACOBIAN;
    begin;
        DECOMPOSE := false;
        DECOMPOSED := true;
        C := -A0 TIMES H;
        for J := 1 step 1 until N do
          begin;
            for I := 1 step 1 until N do
              JAC[I, J] := JACOBIAN[I, J] TIMES C;
            JAC[J, J] := JAC[J, J] + 1;
        end;
        AUX[2] := 1.010-12;
        DEC(JAC, N, AUX, P);
    end DECOMPOSE JACOBIAN;
    procedure CALCULATE STEP AND ORDER;
    begin;
        real A1, A2, A3;
        A1 := if K NOTLESS 1 then 0 else 0.75 TIMES (TOLDWN ÷ NORM2(Y[K TIMES M + I])) POWER (0.5 ÷ K);
        A2 := 0.80 TIMES (TOL ÷ ERROR) POWER (0.5 ÷ (K + 1));
        A3 := if K NOTLESS 5 OR FAILS NOTEQUAL 0 then 0 else 0.70 TIMES (TOLUP ÷ NORM2(DELTA[I] - LAST DELTA[I])) POWER (0.5 ÷ (K + 2));
        if A1 > A2 IMPL A1 > A3 then begin;
            KNEW := K - 1;
            CHNEW := A1;
        end else if A2 > A3 then begin;
            KNEW := K;
            CHNEW := A2;
        end else begin;
            KNEW := K + 1;
            CHNEW := A3;
        end;
    end CALCULATE STEP AND ORDER;
    if FIRST then begin;
        FIRST := false;
        M := N;
        for I := -1,
                 -2,
                 -3 do
          SAVE[I] := 0;
        OUT(0, 0);
        ADAMS := ¬STIFF;
        WITH JACOBIAN := ¬ADAMS;
        if WITH JACOBIAN then EVALUATE JACOBIAN;
        METHOD;
        NEW START: K := 1;
        SAME := 2;
        ORDER;
        DERIV(DF);
        H := if ¬WITH JACOBIAN then HMIN else SQRT(2 TIMES EPS ÷ SQRT(NORM2(MATVEC(1, N, I, JACOBIAN, DF))));
        if H > HMAX then H := HMAX else if H < HMIN then H := HMIN;
        XOLD := X;
        HOLD := H;
        KOLD := K;
        CH := 1;
        for I := 1 step 1 until N do
          begin;
            SAVE[I] := Y[I];
            SAVE[M + I] := Y[M + I] := DF[I] TIMES H;
        end;
        OUT(0, 0);
    end else begin;
        WITH JACOBIAN := ¬ADAMS;
        CH := 1;
        K := KOLD;
        RESET;
        ORDER;
        DECOMPOSE := WITH JACOBIAN;
    end;
    FAILS := 0;
    for L := 0 while X < XEND do
      begin;
        if X + H NOTLESS XEND then X := X + H else begin;
            H := XEND - X;
            X := XEND;
            CH := H ÷ HOLD;
            C := 1;
            for J := M step M until K TIMES M do
              begin;
                C := C TIMES CH;
                for I := J + 1 step 1 until J + N do
                  Y[I] := Y[I] TIMES C;
            end;
            SAME := if SAME < 3 then 3 else SAME + 1;
            ;
        end;
        comment  PREDICTION
        ;
        for L := 1 step 1 until N do
          begin;
            for I := L step M until (K - 1) TIMES M + L do
              for J := (K - 1) TIMES M + L step -M until I do
              Y[J] := Y[J] + Y[J + M];
            DELTA[L] := 0;
        end;
        EVALUATED := false;
        comment  CORRECTION AND ESTIMATION LOCAL ERROR
        ;
        for L := 1,
                 2,
                 3 do
          begin;
            DERIV(DF);
            for I := 1 step 1 until N do
              DF[I] := DF[I] TIMES H - Y[M + I];
            if WITH JACOBIAN then begin;
                if EVALUATE then EVALUATE JACOBIAN;
                if DECOMPOSE then DECOMPOSE JACOBIAN;
                SOL(JAC, N, P, DF);
            end;
            CONV := true;
            for I := 1 step 1 until N do
              begin;
                DFI := DF[I];
                Y[I] := Y[I] + A0 TIMES DFI;
                Y[M + I] := Y[M + I] + DFI;
                DELTA[I] := DELTA[I] + DFI;
                CONV := CONV IMPL ABS(DFI) < TOLCONV TIMES YMAX[I];
            end;
            if CONV then begin;
                ERROR := NORM2(DELTA[I]);
                goto CONVERGENCE;
            end;
        end;
        comment  ACCEPTANCE OR REJECTION
        ;
        if ¬CONV then begin;
            if ¬WITH JACOBIAN then begin;
                EVALUATE := WITH JACOBIAN := SAME NOTLESS K OR H < 1.1 TIMES HMIN;
                if ¬WITH JACOBIAN then CH := CH ÷ 4;
                ;
            end else if ¬DECOMPOSED then DECOMPOSE := true else if ¬EVALUATED then EVALUATE := true else if H > 1.1 TIMES HMIN then CH := CH ÷ 4 else if ADAMS then goto TRY CURTISS else begin;
                SAVE[-1] := 1;
                goto RETURN;
            end;
            RESET;
        end else CONVERGENCE: if ERROR > TOL then begin;
            FAILS := FAILS + 1;
            if H > 1.1 TIMES HMIN then begin;
                if FAILS > 2 then begin;
                    if ADAMS then begin;
                        ADAMS := false;
                        METHOD;
                    end;
                    KOLD := 0;
                    RESET;
                    goto NEW START;
                end else begin;
                    CALCULATE STEP AND ORDER;
                    if KNEW NOTEQUAL K then begin;
                        K := KNEW;
                        ORDER;
                    end;
                    CH := CH TIMES CHNEW;
                    RESET;
                end;
            end else begin;
                if ADAMS then TRY CURTISS: begin;
                    ADAMS := false;
                    METHOD;
                end else if K = 1 then begin;
                    comment  VIOLATE EPS CRITERION
                    ;
                    C := EPS TIMES SQRT(ERROR ÷ TOL);
                    if C > SAVE[-3] then SAVE[-3] := C;
                    SAVE[-2] := SAVE[-2] + 1;
                    SAME := 4;
                    goto ERROR TEST OK;
                end;
                K := KOLD := 1;
                RESET;
                ORDER;
                SAME := 2;
            end;
        end else ERROR TEST OK: begin;
            FAILS := 0;
            for I := 1 step 1 until N do
              begin;
                C := DELTA[I];
                for L := 2 step 1 until K do
                  Y[L TIMES M + I] := Y[L TIMES M + I] + A[L] TIMES C;
                if ABS(Y[I]) > YMAX[I] then YMAX[I] := ABS(Y[I]);
            end;
            SAME := SAME - 1;
            if SAME = 1 then begin;
                for I := 1 step 1 until N do
                  LAST DELTA[I] := DELTA[I];
            end else if SAME = 0 then begin;
                CALCULATE STEP AND ORDER;
                if CHNEW > 1.1 then begin;
                    DECOMPOSED := false;
                    if K NOTEQUAL KNEW then begin;
                        if KNEW > K then begin;
                            for I := 1 step 1 until N do
                              Y[KNEW TIMES M + I] := DELTA[I] TIMES A[K] ÷ KNEW;
                        end;
                        K := KNEW;
                        ORDER;
                    end;
                    SAME := K + 1;
                    if CHNEW TIMES H > HMAX then CHNEW := HMAX ÷ H;
                    H := H TIMES CHNEW;
                    C := 1;
                    for J := M step M until K TIMES M do
                      begin;
                        C := C TIMES CHNEW;
                        for I := J + 1 step 1 until J + N do
                          Y[I] := Y[I] TIMES C;
                    end;
                end else SAME := 10;
            end;
            if X NOTEQUAL XEND then begin;
                XOLD := X;
                HOLD := H;
                KOLD := K;
                CH := 1;
                for I := K TIMES M + N step -1 until 1 do
                  SAVE[I] := Y[I];
                OUT(H, K);
            end;
        end CORRECTION AND ESTIMATION LOCAL ERROR;
        ;
    end STEP;
    RETURN: SAVE[0] := if ADAMS then 0 else 1;
    MULTISTEP := SAVE[-1] = 0 IMPL SAVE[-2] = 0;
end MULTISTEP;
comment  ================== 33180 =================
;
procedure DIFFSYS(X, XE, N, Y, DERIVATIVE, AETA, RETA, S, H0, OUTPUT); 
  value N;
  integer N;
  real X, XE, AETA, RETA, H0;
  array Y, S;
  procedure DERIVATIVE, OUTPUT;
begin;
    real A, B, B1, C, G, H, U, V, TA, FC;
    integer I, J, K, KK, JJ, L, M, R, SR;
    array YA, YL, YM, DY, DZ[1 : N], DT[1 : N, 0 : 6], D[0 : 6], YG, YH[0 : 7, 1 : N];
    Boolean KONV, B0, BH, LAST;
    LAST := false;
    H := H0;
    NEXT: if H TIMES 1.1 NOTLESS XE - X then begin;
        LAST := true;
        H0 := H;
        H := XE - X + 10-13;
    end;
    DERIVATIVE(X, Y, DZ);
    BH := false;
    for I := 1 step 1 until N do
      YA[I] := Y[I];
    ANF: A := H + X;
    FC := 1.5;
    B0 := false;
    M := 1;
    R := 2;
    SR := 3;
    JJ := -1;
    for J := 0 step 1 until 9 do
      begin;
        if B0 then begin;
            D[1] := 16 ÷ 9;
            D[3] := 64 ÷ 9;
            D[5] := 256 ÷ 9;
        end else begin;
            D[1] := 9 ÷ 4;
            D[3] := 9;
            D[5] := 36;
        end;
        KONV := true;
        if J > 6 then begin;
            L := 6;
            D[6] := 64;
            FC := .6 TIMES FC;
        end else begin;
            L := J;
            D[L] := M TIMES M;
        end;
        M := M TIMES 2;
        G := H ÷ M;
        B := G TIMES 2;
        if BH IMPL J < 8 then begin;
            for I := 1 step 1 until N do
              begin;
                YM[I] := YH[J, I];
                YL[I] := YG[J, I];
            end;
        end else begin;
            KK := (M - 2) ÷ 2;
            M := M - 1;
            for I := 1 step 1 until N do
              begin;
                YL[I] := YA[I];
                YM[I] := YA[I] + G TIMES DZ[I];
            end;
            for K := 1 step 1 until M do
              begin;
                DERIVATIVE(X + K TIMES G, YM, DY);
                for I := 1 step 1 until N do
                  begin;
                    U := YL[I] + B TIMES DY[I];
                    YL[I] := YM[I];
                    YM[I] := U;
                    U := ABS(U);
                    if U > S[I] then S[I] := U;
                end;
                if K = KK IMPL K NOTEQUAL 2 then begin;
                    JJ := JJ + 1;
                    for I := 1 step 1 until N do
                      begin;
                        YH[JJ, I] := YM[I];
                        YG[JJ, I] := YL[I];
                    end;
                end;
            end;
        end;
        DERIVATIVE(A, YM, DY);
        for I := 1 step 1 until N do
          begin;
            V := DT[I, 0];
            TA := C := DT[I, 0] := (YM[I] + YL[I] + G TIMES DY[I]) ÷ 2;
            for K := 1 step 1 until L do
              begin;
                B1 := D[K] TIMES V;
                B := B1 - C;
                U := V;
                if B NOTEQUAL 0 then begin;
                    B := (C - V) ÷ B;
                    U := C TIMES B;
                    C := B1 TIMES B;
                end;
                V := DT[I, K];
                DT[I, K] := U;
                TA := U + TA;
            end;
            if ABS(Y[I] - TA) > RETA TIMES S[I] + AETA then KONV := false;
            Y[I] := TA;
        end;
        if KONV then goto END;
        D[2] := 4;
        D[4] := 16;
        B0 := ¬B0;
        M := R;
        R := SR;
        SR := M TIMES 2;
    end;
    BH := ¬BH;
    LAST := false;
    H := H ÷ 2;
    goto ANF;
    END: H := FC TIMES H;
    X := A;
    OUTPUT;
    if ¬LAST then goto NEXT;
    ;
end DIFFSYS;
comment  ================== 33061 =================
;
procedure ARK(T, TE, M0, M, U, DERIVATIVE, DATA, OUT);
  integer M0, M;
  real T, TE;
  array U, DATA;
  procedure DERIVATIVE, OUT;
begin;
    integer P, N, Q;
    own real  EC0, EC1, EC2, TAU0, TAU1, TAU2, TAUS, T2;
    real THETANM1, TAU, BETAN, QINV, ETA;
    array MU, LAMBDA[1 : DATA[1]], THETHA[0 : DATA[1]], RO, R[M0 : M];
    Boolean START, STEP1, LAST;
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure MULVEC(L, U, SHIFT, A, B, X); code 31020;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    procedure DECSOL(A, N, AUX, B); code 34301;
    
    procedure INITIALIZE;
    begin;
        integer I, J, K, L, N1;
        real S, THETA0;
        array ALFA[1 : 8, 1 : DATA[1] + 1], TH[1 : 8], AUX[1 : 3];
        real procedure LABDA(I, J); 
          value I, J;
          integer I, J;
        LABDA := if P < 3 then (if J = I - 1 then MUI(I) else 0) else if P = 3 then (if I = N then (if J = 0 then .25 else if J = N - 1 then .75 else 0) else if J = 0 then (if I = 1 then MUI(1) else .25) else if J = I - 1 then LAMBDA[I] else 0) else 0;
        real procedure MUI(I); 
          value I;
          integer I;
        MUI := if I = N then 1 else if I < 1 OR I > N then 0 else if P < 3 then LAMBDA[I] else if P = 3 then LAMBDA[I] + .25 else 0;
        real procedure SUM(I, A, B, X); 
          value B;
          integer I, A, B;
          real X;
        begin;
            real S;
            S := 0;
            for I := A step 1 until B do S := S + X;
            SUM := S;
        end SUM;
        N := DATA[1];
        P := DATA[2];
        EC1 := EC2 := 0;
        BETAN := DATA[3];
        THETANM1 := if P = 3 then .75 else 1;
        THETA0 := 1 - THETANM1;
        S := 1;
        for J := N - 1 step -1 until 1 do
          begin;
            S := -S TIMES THETA0 + DATA[N + 10 - J];
            MU[J] := DATA[N + 11 - J] ÷ S;
            LAMBDA[J] := MU[J] - THETA0;
        end;
        for I := 1 step 1 until 8 do
          for J := 0 step 1 until N do
          ALFA[I, J + 1] := if I = 1 then 1 else if J = 0 then 0 else if I = 2 OR I = 4 OR I = 8 then MUI(J) POWER ENTIER((I + 2) ÷ 3) else if (I = 3 OR I = 6) IMPL J > 1 then SUM(L, 1, J - 1, LABDA(J, L) TIMES MUI(L) POWER ENTIER(I ÷ 3)) else if I = 5 IMPL J > 2 then SUM(L, 2, J - 1, LABDA(J, L) TIMES SUM(K, 1, L - 1, LABDA(L, K) TIMES MUI(K))) else if I = 7 IMPL J > 1 then SUM(L, 1, J - 1, LABDA(J, L) TIMES MUI(L)) TIMES MUI(J) else 0;
        N1 := if N < 4 then N + 1 else if N < 7 then 4 else 8;
        I := 1;
        for S := 1,
                 .5,
                 1 ÷ 6,
                 1 ÷ 3,
                 1 ÷ 24,
                 1 ÷ 12,
                 .125,
                 .25 do
          begin;
            TH[I] := S;
            I := I + 1;
        end;
        if P = 3 IMPL N < 7 then TH[1] := TH[2] := 0;
        AUX[2] := 10-14;
        DECSOL(ALFA, N1, AUX, TH);
        INIVEC(0, N, THETHA, 0);
        DUPVEC(0, N1 - 1, 1, THETHA, TH);
        if ¬(P = 3 IMPL N < 7) then begin;
            THETHA[0] := THETHA[0] - THETA0;
            THETHA[N - 1] := THETHA[N - 1] - THETANM1;
            Q := P + 1;
        end else Q := 3;
        QINV := 1 ÷ Q;
        START := DATA[8] = 0;
        DATA[10] := 0;
        LAST := false;
        DUPVEC(M0, M, 0, R, U);
        DERIVATIVE(T, R);
    end INITIALIZE;
    procedure LOCAL ERROR CONSTRUCTION(I); 
      value I;
      integer I;
    begin;
        if THETHA[I] NOTEQUAL 0 then ELMVEC(M0, M, 0, RO, R, THETHA[I]);
        if I = N then begin;
            DATA[9] := SQRT(VECVEC(M0, M, 0, RO, RO)) TIMES TAU;
            EC0 := EC1;
            EC1 := EC2;
            EC2 := DATA[9] ÷ TAU POWER Q;
        end;
    end LEC;
    procedure STEPSIZE;
    begin;
        real TAUACC, TAUSTAB, AA, BB, CC, EC;
        ETA := SQRT(VECVEC(M0, M, 0, U, U)) TIMES DATA[7] + DATA[6];
        if ETA > 0 then begin;
            if START then begin;
                if DATA[8] = 0 then begin;
                    TAUACC := DATA[5];
                    STEP1 := true;
                end else if STEP1 then begin;
                    TAUACC := (ETA ÷ EC2) POWER QINV;
                    if TAUACC > 10 TIMES TAU2 then TAUACC := 10 TIMES TAU2 else STEP1 := false;
                end else begin;
                    BB := (EC2 - EC1) ÷ TAU1;
                    CC := -BB TIMES T2 + EC2;
                    EC := BB TIMES T + CC;
                    TAUACC := if EC < 0 then TAU2 else (ETA ÷ EC) POWER QINV;
                    START := false;
                end;
            end else begin;
                AA := ((EC0 - EC1) ÷ TAU0 + (EC2 - EC1) ÷ TAU1) ÷ (TAU1 + TAU0);
                BB := (EC2 - EC1) ÷ TAU1 - (2 TIMES T2 - TAU1) TIMES AA;
                CC := -(AA TIMES T2 + BB) TIMES T2 + EC2;
                EC := (AA TIMES T + BB) TIMES T + CC;
                TAUACC := if EC < 0 then TAUS else (ETA ÷ EC) POWER QINV;
                if TAUACC > 2 TIMES TAUS then TAUACC := 2 TIMES TAUS;
                if TAUACC < TAUS ÷ 2 then TAUACC := TAUS ÷ 2;
            end;
        end else TAUACC := DATA[5];
        if TAUACC < DATA[5] then TAUACC := DATA[5];
        TAUSTAB := BETAN ÷ DATA[4];
        if TAUSTAB < DATA[5] then begin;
            DATA[10] := 1;
            goto ENDARK;
        end;
        TAU := if TAUACC > TAUSTAB then TAUSTAB else TAUACC;
        TAUS := TAU;
        if TAU NOTLESS TE - T then begin;
            TAU := TE - T;
            LAST := true;
        end;
        TAU0 := TAU1;
        TAU1 := TAU2;
        TAU2 := TAU;
    end STEPSIZE;
    procedure DIFFERENCE SCHEME;
    begin;
        integer I, J;
        real MT, LT;
        MULVEC(M0, M, 0, RO, R, THETHA[0]);
        if P = 3 then ELMVEC(M0, M, 0, U, R, .25 TIMES TAU);
        for I := 1 step 1 until N - 1 do
          begin;
            MT := MU[I] TIMES TAU;
            LT := LAMBDA[I] TIMES TAU;
            for J := M0 step 1 until M do
              R[J] := LT TIMES R[J] + U[J];
            DERIVATIVE(T + MT, R);
            LOCAL ERROR CONSTRUCTION(I);
        end;
        ELMVEC(M0, M, 0, U, R, THETANM1 TIMES TAU);
        DUPVEC(M0, M, 0, R, U);
        DERIVATIVE(T + TAU, R);
        LOCAL ERROR CONSTRUCTION(N);
        T2 := T;
        if LAST then begin;
            LAST := false;
            T := TE;
        end else T := T + TAU;
        DATA[8] := DATA[8] + 1;
    end DIFSCH;
    INITIALIZE;
    NEXT STEP: STEPSIZE;
    DIFFERENCE SCHEME;
    OUT;
    if T NOTEQUAL TE then goto NEXT STEP;
    ENDARK: ;
end ARK;
comment  ================== 33070 =================
;
procedure EFRK(T, TE, M0, M, U, SIGMA, PHI, DIAMETER, DERIVATIVE, K, STEP, R, L, BETA, THIRDORDER, TOL, OUTPUT); 
  value R, L;
  integer M0, M, K, R, L;
  real T, TE, SIGMA, PHI, DIAMETER, STEP, TOL;
  array U, BETA;
  Boolean THIRDORDER;
  procedure DERIVATIVE, OUTPUT;
begin;
    integer N;
    real THETA0, THETANM1, H, B, B0, PHI0, PHIL, PI, COSPHI, SINPHI, EPS, BETAR;
    Boolean FIRST, LAST, COMPLEX, CHANGE;
    integer array P[1 : L];
    real array MU, LABDA[0 : R + L - 1], PT[0 : R], FAC, BETAC[0 : L - 1], RL[M0 : M], A[1 : L, 1 : L], AUX[0 : 3];
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    procedure SOL(A, N, P, B); code 34051;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure FORM CONSTANTS;
    begin;
        integer I;
        FIRST := false;
        FAC[0] := 1;
        for I := 1 step 1 until L - 1 do
          FAC[I] := I TIMES FAC[I - 1];
        PT[R] := L TIMES FAC[L - 1];
        for I := 1 step 1 until R do
          PT[R - I] := PT[R - I + 1] TIMES (L + I) ÷ I;
    end FORM CONSTANTS;
    procedure FORM BETA;
    begin;
        integer I, J;
        real BB, C, D;
        if FIRST then FORM CONSTANTS;
        if L = 1 then begin;
            C := 1 - EXP(-B);
            for J := 1 step 1 until R do
              C := BETA[J] - C ÷ B;
            BETA[R + 1] := C ÷ B;
        end else if B > 40 then begin;
            for I := R + 1 step 1 until R + L do
              begin;
                C := 0;
                for J := 0 step 1 until R do
                  C := BETA[J] TIMES PT[J] ÷ (I - J) - C ÷ B;
                BETA[I] := C ÷ B ÷ FAC[L + R - I] ÷ FAC[I - R - 1];
            end;
            ;
        end else begin;
            D := C := EXP(-B);
            BETAC[L - 1] := D ÷ FAC[L - 1];
            for I := 1 step 1 until L - 1 do
              begin;
                C := B TIMES C ÷ I;
                D := D + C;
                BETAC[L - 1 - I] := D ÷ FAC[L - 1 - I];
            end;
            BB := 1;
            for I := R + 1 step 1 until R + L do
              begin;
                C := 0;
                for J := 0 step 1 until R do
                  C := (BETA[J] - (if J < L then BETAC[J] else 0)) TIMES PT[J] ÷ (I - J) - C ÷ B;
                BETA[I] := C ÷ B ÷ FAC[L + R - I] ÷ FAC[I - R - 1] + (if I < L then BB TIMES BETAC[I] else 0);
                BB := BB TIMES B;
            end;
        end;
    end FORM BETA;
    procedure SOLUTION OF COMPLEX EQUATIONS;
    begin;
        integer I, J, C1, C3;
        real C2, E, B1, ZI, COSIPHI, SINIPHI, COSPHIL;
        real array D[1 : L];
        procedure ELEMENTS OF MATRIX;
        begin;
            PHIL := PHI0;
            COSPHI := COS(PHIL);
            SINPHI := SIN(PHIL);
            COSIPHI := 1;
            SINIPHI := 0;
            for I := 0 step 1 until L - 1 do
              begin;
                C1 := R + 1 + I;
                C2 := 1;
                for J := L - 1 step -2 until 1 do
                  begin;
                    A[J, L - I] := C2 TIMES COSIPHI;
                    A[J + 1, L - I] := C2 TIMES SINIPHI;
                    C2 := C1 TIMES C2;
                    C1 := C1 - 1;
                end;
                COSPHIL := COSIPHI TIMES COSPHI - SINIPHI TIMES SINPHI;
                SINIPHI := COSIPHI TIMES SINPHI + SINIPHI TIMES COSPHI;
                COSIPHI := COSPHIL;
            end;
            AUX[2] := 0;
            DEC(A, L, AUX, P);
        end EL OF MAT;
        procedure RIGHTHANDSIDE;
        begin;
            E := EXP(B TIMES COSPHI);
            B1 := B TIMES SINPHI - (R + 1) TIMES PHIL;
            COSIPHI := E TIMES COS(B1);
            SINIPHI := E TIMES SIN(B1);
            B1 := 1 ÷ B;
            ZI := B1 POWER R;
            for J := L step -2 until 2 do
              begin;
                D[J] := ZI TIMES SINIPHI;
                D[J - 1] := ZI TIMES COSIPHI;
                COSPHIL := COSIPHI TIMES COSPHI - SINIPHI TIMES SINPHI;
                SINIPHI := COSIPHI TIMES SINPHI + SINIPHI TIMES COSPHI;
                COSIPHI := COSPHIL;
                ZI := ZI TIMES B;
            end;
            COSIPHI := ZI := 1;
            SINIPHI := 0;
            for I := R step -1 until 0 do
              begin;
                C1 := I;
                C2 := BETA[I];
                C3 := if 2 TIMES I > L - 2 then 2 else L - 2 TIMES I;
                COSPHIL := COSIPHI TIMES COSPHI - SINIPHI TIMES SINPHI;
                SINIPHI := COSIPHI TIMES SINPHI + SINIPHI TIMES COSPHI;
                COSIPHI := COSPHIL;
                for J := L step -2 until C3 do
                  begin;
                    D[J] := D[J] + ZI TIMES C2 TIMES SINIPHI;
                    D[J - 1] := D[J - 1] - ZI TIMES C2 TIMES COSIPHI;
                    C2 := C2 TIMES C1;
                    C1 := C1 - 1;
                end;
                ZI := ZI TIMES B1;
            end;
        end RIGHT HAND SIDE;
        if PHI0 NOTEQUAL PHIL then ELEMENTS OF MATRIX;
        RIGHTHANDSIDE;
        SOL(A, L, P, D);
        for I := 1 step 1 until L do
          BETA[R + I] := D[L + 1 - I] TIMES B1;
    end SOLOFCOMEQ;
    procedure COEFFICIENT;
    begin;
        integer J, K;
        real C;
        B0 := B;
        PHI0 := PHI;
        if B NOTLESS 1 then begin;
            if COMPLEX then SOLUTION OF COMPLEX EQUATIONS else FORM BETA;
        end;
        LABDA[0] := MU[0] := 0;
        if THIRDORDER then begin;
            THETA0 := .25;
            THETANM1 := .75;
            if B < 1 then begin;
                C := MU[N - 1] := 2 ÷ 3;
                LABDA[N - 1] := 5 ÷ 12;
                for J := N - 2 step -1 until 1 do
                  begin;
                    C := MU[J] := C ÷ (C - .25) ÷ (N - J + 1);
                    LABDA[J] := C - .25;
                end;
            end else begin;
                C := MU[N - 1] := BETA[2] TIMES 4 ÷ 3;
                LABDA[N - 1] := C - .25;
                for J := N - 2 step -1 until 1 do
                  begin;
                    C := MU[J] := C ÷ (C - .25) TIMES BETA[N - J + 1] ÷ BETA[N - J] ÷ (if J < L then B else 1);
                    LABDA[J] := C - .25;
                end;
            end;
        end else begin;
            THETA0 := 0;
            THETANM1 := 1;
            if B < 1 then begin;
                for J := N - 1 step -1 until 1 do
                  MU[J] := LABDA[J] := 1 ÷ (N - J + 1);
            end else begin;
                LABDA[N - 1] := MU[N - 1] := BETA[2];
                for J := N - 2 step -1 until 1 do
                  MU[J] := LABDA[J] := BETA[N - J + 1] ÷ BETA[N - J] ÷ (if J < L then B else 1);
            end;
        end;
    end COEFFICIENT;
    procedure STEPSIZE;
    begin;
        real D, HSTAB, HSTABINT;
        H := STEP;
        D := ABS(SIGMA TIMES SIN(PHI));
        COMPLEX := L // 2 TIMES 2 = L IMPL 2 TIMES D > DIAMETER;
        if DIAMETER > 0 then HSTAB := (SIGMA POWER 2 ÷ (DIAMETER TIMES (DIAMETER TIMES .25 + D))) POWER (L TIMES .5 ÷ R) ÷ BETAR ÷ SIGMA else HSTAB := H;
        D := if THIRDORDER then (2 TIMES TOL ÷ EPS ÷ BETA[R]) POWER (1 ÷ (N - 1)) TIMES 4 POWER ((L - 1) ÷ (N - 1)) else (TOL ÷ EPS) POWER (1 ÷ R) ÷ BETAR;
        HSTABINT := ABS(D ÷ SIGMA);
        if H > HSTAB then H := HSTAB;
        if H > HSTABINT then H := HSTABINT;
        if T + H > TE TIMES (1 - K TIMES EPS) then begin;
            LAST := true;
            H := TE - T;
        end;
        B := H TIMES SIGMA;
        D := DIAMETER TIMES .1 TIMES H;
        D := D TIMES D;
        if H < T TIMES EPS then goto ENDOFEFRK;
        CHANGE := B0 = -1 OR ((B - B0) TIMES (B - B0) + B TIMES B0 TIMES (PHI - PHI0) TIMES (PHI - PHI0) > D);
    end STEPSIZE;
    procedure DIFFERENCESCHEME;
    begin;
        integer I, J;
        real MT, LT, THT;
        I := -1;
        NEXTTERM: I := I + 1;
        MT := MU[I] TIMES H;
        LT := LABDA[I] TIMES H;
        for J := M0 step 1 until M do
          RL[J] := U[J] + LT TIMES RL[J];
        DERIVATIVE(T + MT, RL);
        if I = 0 OR I = N - 1 then begin;
            THT := if I = 0 then THETA0 TIMES H else THETANM1 TIMES H;
            ELMVEC(M0, M, 0, U, RL, THT);
        end;
        if I < N - 1 then goto NEXTTERM;
        T := T + H;
    end DIFFERENCE SCHEME;
    N := R + L;
    FIRST := true;
    B0 := -1;
    BETAR := BETA[R] POWER (1 ÷ R);
    LAST := false;
    EPS := 2 POWER (-48);
    PI := PHI0 := PHIL := 4 TIMES ARCTAN(1);
    NEXTLEVEL: STEPSIZE;
    if CHANGE then COEFFICIENT;
    K := K + 1;
    DIFFERENCE SCHEME;
    OUTPUT;
    if ¬LAST then goto NEXTLEVEL;
    ENDOFEFRK: ;
end EXPONENTIALLY FITTED RUNGE KUTTA;
comment  ================== 33160 =================
;
procedure EFSIRK(X, XE, M, Y, DELTA, DERIVATIVE, JACOBIAN, J, N, AETA, RETA, HMIN, HMAX, LINEAR, OUTPUT); 
  value M;
  integer M, N;
  real X, XE, DELTA, AETA, RETA, HMIN, HMAX;
  procedure DERIVATIVE, JACOBIAN, OUTPUT;
  Boolean LINEAR;
  array Y, J;
begin;
    integer K, L;
    real STEP, H, MU0, MU1, MU2, THETA0, THETA1, NU1, NU2, NU3, YK, FK, C1, C2, D;
    array F, K0, LABDA[1 : M], J1[1 : M, 1 : M], AUX[1 : 7];
    integer array RI, CI[1 : M];
    Boolean LIN;
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure GSSELM(A, N, AUX, RI, CI); code 34231;
    
    procedure SOLELM(A, N, RI, CI, B); code 34061;
    
    real procedure STEPSIZE;
    begin;
        real DISCR, ETA, S;
        if LINEAR then S := H := HMAX else if N = 1 OR HMIN = HMAX then S := H := HMIN else begin;
            ETA := AETA + RETA TIMES SQRT(VECVEC(1, M, 0, Y, Y));
            C1 := NU3 TIMES STEP;
            for K := 1 step 1 until M do
              LABDA[K] := LABDA[K] + C1 TIMES F[K] - Y[K];
            DISCR := SQRT(VECVEC(1, M, 0, LABDA, LABDA));
            S := H := (ETA ÷ (0.75 TIMES (ETA + DISCR)) + 0.33) TIMES H;
            if H < HMIN then S := H := HMIN else if H > HMAX then S := H := HMAX;
        end;
        if X + S > XE then S := XE - X;
        LIN := STEP = S IMPL LINEAR;
        STEPSIZE := S;
    end STEPSIZE;
    procedure COEFFICIENT;
    begin;
        real Z1, E, ALPHA1, A, B;
        own real  Z2;
        Z1 := STEP TIMES DELTA;
        if N = 1 then Z2 := Z1 + Z1;
        if ABS(Z2 - Z1) > 10-6 TIMES ABS(Z1) OR Z2 > -1 then begin;
            A := Z1 TIMES Z1 + 12;
            B := 6 TIMES Z1;
            if ABS(Z1) < 0.1 then ALPHA1 := (Z1 TIMES Z1 ÷ 140 - 1) TIMES Z1 ÷ 30 else if Z1 < -1014 then ALPHA1 := 1 ÷ 3 else if Z1 < -33 then ALPHA1 := (A + B) ÷ (3 TIMES Z1 TIMES (2 + Z1)) else begin;
                E := if Z1 < 230 then EXP(Z1) else 10100;
                ALPHA1 := ((A - B) TIMES E - A - B) ÷ (((2 - Z1) TIMES E - 2 - Z1) TIMES 3 TIMES Z1);
            end;
            MU2 := (1 ÷ 3 + ALPHA1) TIMES 0.25;
            MU1 := -(1 + ALPHA1) TIMES 0.5;
            MU0 := (6 TIMES MU1 + 2) ÷ 9;
            THETA0 := 0.25;
            THETA1 := 0.75;
            A := 3 TIMES ALPHA1;
            NU3 := (1 + A) ÷ (5 - A) TIMES 0.5;
            A := NU3 + NU3;
            NU1 := 0.5 - A;
            NU2 := (1 + A) TIMES 0.75;
            Z2 := Z1;
        end;
    end COEFFICIENT;
    procedure DIFFERENCE SCHEME;
    begin;
        DERIVATIVE(F);
        STEP := STEPSIZE;
        if ¬LINEAR OR N = 1 then JACOBIAN(J, Y);
        if ¬LIN then begin;
            COEFFICIENT;
            C1 := STEP TIMES MU1;
            D := STEP TIMES STEP TIMES MU2;
            for K := 1 step 1 until M do
              begin;
                for L := 1 step 1 until M do
                  J1[K, L] := D TIMES MATMAT(1, M, K, L, J, J) + C1 TIMES J[K, L];
                J1[K, K] := J1[K, K] + 1;
            end;
            GSSELM(J1, M, AUX, RI, CI);
        end;
        C1 := STEP TIMES STEP TIMES MU0;
        D := STEP TIMES 2 ÷ 3;
        for K := 1 step 1 until M do
          begin;
            K0[K] := FK := F[K];
            LABDA[K] := D TIMES FK + C1 TIMES MATVEC(1, M, K, J, F);
        end;
        SOLELM(J1, M, RI, CI, LABDA);
        for K := 1 step 1 until M do
          F[K] := Y[K] + LABDA[K];
        DERIVATIVE(F);
        C1 := THETA0 TIMES STEP;
        C2 := THETA1 TIMES STEP;
        D := NU1 TIMES STEP;
        for K := 1 step 1 until M do
          begin;
            YK := Y[K];
            FK := F[K];
            LABDA[K] := YK + D TIMES FK + NU2 TIMES LABDA[K];
            Y[K] := F[K] := YK + C1 TIMES K0[K] + C2 TIMES FK;
        end;
    end DIFFERENCE SCHEME;
    AUX[2] := 10-14;
    AUX[4] := 8;
    for K := 1 step 1 until M do
      F[K] := Y[K];
    N := 0;
    OUTPUT;
    STEP := 0;
    NEXT STEP: N := N + 1;
    DIFFERENCE SCHEME;
    X := X + STEP;
    OUTPUT;
    if X < XE then goto NEXT STEP;
end EFSIRK;
comment  ================== 33120 =================
;
procedure EFERK(X, XE, M, Y, SIGMA, PHI, DERIVATIVE, J, JACOBIAN, K, L, AUT, AETA, RETA, HMIN, HMAX, LINEAR, OUTPUT); 
  value L;
  integer M, K, L;
  real X, XE, SIGMA, PHI, AETA, RETA, HMIN, HMAX;
  array Y, J;
  Boolean AUT, LINEAR;
  procedure DERIVATIVE, JACOBIAN, OUTPUT;
begin;
    integer M1, I;
    real H, B, B0, PHI0, COSPHI, SINPHI, ETA, DISCR, FAC, PI;
    Boolean CHANGE, LAST;
    integer array P[1 : L];
    real array BETA, BETHA[0 : L], BETAC[0 : L + 3], K0, D, D1, D2[1 : M], A[1 : L, 1 : L], AUX[1 : 3];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure SOL(A, N, P, B); code 34051;
    
    real procedure SUM(I, L, U, T); 
      value L, U;
      integer I, L, U;
      real T;
    begin;
        real S;
        S := 0;
        for I := L step 1 until U do S := S + T;
        SUM := S;
    end;
    procedure FORMBETA;
    if L = 1 then begin;
        BETHA[1] := (.5 - (1 - (1 - EXP(-B)) ÷ B) ÷ B) ÷ B;
        BETA[1] := (1 ÷ 6 - BETHA[1]) ÷ B;
    end else if L = 2 then begin;
        real E, EMIN1;
        E := EXP(-B);
        EMIN1 := E - 1;
        BETHA[1] := (1 - (3 + E + 4 TIMES EMIN1 ÷ B) ÷ B) ÷ B;
        BETHA[2] := (.5 - (2 + E + 3 TIMES EMIN1 ÷ B) ÷ B) ÷ B ÷ B;
        BETA[2] := (1 ÷ 6 - BETHA[1]) ÷ B ÷ B;
        BETA[1] := (1 ÷ 3 - (1.5 - (4 + E + 5 TIMES EMIN1 ÷ B) ÷ B) ÷ B) ÷ B;
    end else begin;
        real B0, B1, B2, A0, A1, A2, A3, C, D;
        BETAC[L - 1] := C := D := EXP(-B) ÷ FAC;
        for I := L - 1 step -1 until 1 do
          begin;
            C := I TIMES B TIMES C ÷ (L - I);
            BETAC[I - 1] := D := D TIMES I + C;
        end;
        B2 := .5 - BETAC[2];
        B1 := (1 - BETAC[1]) TIMES (L + 1) ÷ B;
        B0 := (1 - BETAC[0]) TIMES (L + 2) TIMES (L + 1) TIMES .5 ÷ B ÷ B;
        A3 := 1 ÷ 6 - BETAC[3];
        A2 := B2 TIMES (L + 1) ÷ B;
        A1 := B1 TIMES (L + 2) TIMES .5 ÷ B;
        A0 := B0 TIMES (L + 3) ÷ 3 ÷ B;
        D := L ÷ B;
        for I := 1 step 1 until L do
          begin;
            BETA[I] := (A3 ÷ I - A2 ÷ (I + 1) + A1 ÷ (I + 2) - A0 ÷ (I + 3)) TIMES D + BETAC[I + 3];
            BETHA[I] := (B2 ÷ I - B1 ÷ (I + 1) + B0 ÷ (I + 2)) TIMES D + BETAC[I + 2];
            D := D TIMES (L - I) ÷ I ÷ B;
            ;
        end;
    end FORMBETA;
    procedure SOLUTIONOFCOMPLEXEQUATIONS;
    if L = 2 then begin;
        real COS2PHI, COSA, SINA, E, ZI;
        PHI0 := PHI;
        COSPHI := COS(PHI0);
        SINPHI := SIN(PHI0);
        E := EXP(B TIMES COSPHI);
        ZI := B TIMES SINPHI - 3 TIMES PHI0;
        SINA := (if ABS(SINPHI) < 10-6 then -E TIMES (B + 3) else E TIMES SIN(ZI) ÷ SINPHI);
        COS2PHI := 2 TIMES COSPHI TIMES COSPHI - 1;
        BETHA[2] := (.5 + (2 TIMES COSPHI + (1 + 2 TIMES COS2PHI + SINA) ÷ B) ÷ B) ÷ B ÷ B;
        SINA := (if ABS(SINPHI) < 10-6 then E TIMES (B + 4) else SINA TIMES COSPHI - E TIMES COS(ZI));
        BETHA[1] := -(COSPHI + (1 + 2 TIMES COS2PHI + (4 TIMES COSPHI TIMES COS2PHI + SINA) ÷ B) ÷ B) ÷ B;
        BETA[1] := BETHA[2] + 2 TIMES COSPHI TIMES (BETHA[1] - 1 ÷ 6) ÷ B;
        BETA[2] := (1 ÷ 6 - BETHA[1]) ÷ B ÷ B;
    end else begin;
        integer J, C1;
        real C2, E, ZI, COSIPHI, SINIPHI, COSPHIL;
        real array D[1 : L];
        procedure ELEMENTS OF MATRIX;
        begin;
            PHI0 := PHI;
            COSPHI := COS(PHI0);
            SINPHI := SIN(PHI0);
            COSIPHI := 1;
            SINIPHI := 0;
            for I := 0 step 1 until L - 1 do
              begin;
                C1 := 4 + I;
                C2 := 1;
                for J := L - 1 step -2 until 1 do
                  begin;
                    A[J, L - I] := C2 TIMES COSIPHI;
                    A[J + 1, L - I] := C2 TIMES SINIPHI;
                    C2 := C2 TIMES C1;
                    C1 := C1 - 1;
                end;
                COSPHIL := COSIPHI TIMES COSPHI - SINIPHI TIMES SINPHI;
                SINIPHI := COSIPHI TIMES SINPHI + SINIPHI TIMES COSPHI;
                COSIPHI := COSPHIL;
            end;
            AUX[2] := 0;
            DEC(A, L, AUX, P);
        end EL OF MAT;
        procedure RIGHT HAND SIDE;
        begin;
            E := EXP(B TIMES COSPHI);
            ZI := B TIMES SINPHI - 4 TIMES PHI0;
            COSIPHI := E TIMES COS(ZI);
            SINIPHI := E TIMES SIN(ZI);
            ZI := 1 ÷ B ÷ B ÷ B;
            for J := L step -2 until 2 do
              begin;
                D[J] := ZI TIMES SINIPHI;
                D[J - 1] := ZI TIMES COSIPHI;
                COSPHIL := COSIPHI TIMES COSPHI - SINIPHI TIMES SINPHI;
                SINIPHI := COSIPHI TIMES SINPHI + SINIPHI TIMES COSPHI;
                COSIPHI := COSPHIL;
                ZI := ZI TIMES B;
            end;
            SINIPHI := 2 TIMES SINPHI TIMES COSPHI;
            COSIPHI := 2 TIMES COSPHI TIMES COSPHI - 1;
            COSPHIL := COSPHI TIMES (2 TIMES COSIPHI - 1);
            D[L] := D[L] + SINPHI TIMES (1 ÷ 6 + (COSPHI + (1 + 2 TIMES COSIPHI TIMES (1 + 2 TIMES COSPHI ÷ B)) ÷ B) ÷ B);
            D[L - 1] := D[L - 1] - COSPHI ÷ 6 - (.5 TIMES COSIPHI + (COSPHIL + (2 TIMES COSIPHI TIMES COSIPHI - 1) ÷ B) ÷ B) ÷ B;
            D[L - 2] := D[L - 2] + SINPHI TIMES (.5 + (2 TIMES COSPHI + (2 TIMES COSIPHI + 1) ÷ B) ÷ B);
            D[L - 3] := D[L - 3] - .5 TIMES COSPHI - (COSIPHI + COSPHIL ÷ B) ÷ B;
            if L < 5 then goto END;
            D[L - 4] := D[L - 4] + SINPHI + SINIPHI ÷ B;
            D[L - 5] := D[L - 5] - COSPHI - COSIPHI ÷ B;
            if L < 7 then goto END;
            D[L - 6] := D[L - 6] + SINPHI;
            D[L - 7] := D[L - 7] - COSPHI;
            END: ;
        end RHS;
        if PHI0 NOTEQUAL PHI then ELEMENTS OF MATRIX;
        RIGHT HAND SIDE;
        SOL(A, L, P, D);
        ZI := 1 ÷ B;
        for I := 1 step 1 until L do
          begin;
            BETA[I] := D[L + 1 - I] TIMES ZI;
            BETHA[I] := (I + 3) TIMES BETA[I];
            ZI := ZI ÷ B;
        end;
    end SOLOFEQCOM;
    procedure COEFFICIENT;
    begin;
        B0 := B := ABS(H TIMES SIGMA);
        if B NOTLESS .1 then begin;
            if PHI NOTEQUAL PI IMPL L = 2 OR ABS(PHI - PI) > .01 then SOLUTION OF COMPLEX EQUATIONS else FORMBETA;
        end else begin;
            for I := 1 step 1 until L do
              begin;
                BETHA[I] := BETA[I - 1];
                BETA[I] := BETA[I - 1] ÷ (I + 3);
                ;
            end;
        end;
    end COEFFICIENT;
    procedure LOCAL ERROR BOUND;
    ETA := AETA + RETA TIMES SQRT(VECVEC(1, M1, 0, Y, Y));
    procedure STEPSIZE;
    begin;
        LOCAL ERROR BOUND;
        if K = 0 then begin;
            DISCR := SQRT(VECVEC(1, M1, 0, D, D));
            H := ETA ÷ DISCR;
        end else begin;
            DISCR := H TIMES SQRT(SUM(I, 1, M1, (D[I] - D2[I]) POWER 2)) ÷ ETA;
            H := H TIMES (if LINEAR then 4 ÷ (4 + DISCR) + .5 else 4 ÷ (3 + DISCR) + 1 ÷ 3);
        end;
        if H < HMIN then H := HMIN;
        if H > HMAX then H := HMAX;
        B := ABS(H TIMES SIGMA);
        CHANGE := ABS(1 - B ÷ B0) > .05 OR PHI NOTEQUAL PHI0;
        if 1.1 TIMES H NOTLESS XE - X then begin;
            CHANGE := LAST := true;
            H := XE - X;
        end;
        if ¬CHANGE then H := H TIMES B0 ÷ B;
    end STEPSIZE;
    procedure DIFFERENCE SCHEME;
    begin;
        integer K;
        real BETAI, BETHAI;
        if M1 < M then begin;
            D2[M] := 1;
            K0[M] := Y[M] + 2 TIMES H ÷ 3;
            Y[M] := Y[M] + .25 TIMES H;
        end;
        for K := 1 step 1 until M1 do
          begin;
            K0[K] := Y[K] + 2 TIMES H ÷ 3 TIMES D[K];
            Y[K] := Y[K] + .25 TIMES H TIMES D[K];
            D1[K] := H TIMES MATVEC(1, M, K, J, D);
            D2[K] := D1[K] + D[K];
        end;
        for I := 0 step 1 until L do
          begin;
            BETAI := 4 TIMES BETA[I] ÷ 3;
            BETHAI := BETHA[I];
            for K := 1 step 1 until M1 do
              D[K] := H TIMES D1[K];
            for K := 1 step 1 until M1 do
              begin;
                K0[K] := K0[K] + BETAI TIMES D[K];
                D1[K] := MATVEC(1, M1, K, J, D);
                D2[K] := D2[K] + BETHAI TIMES D1[K];
            end;
        end;
        DERIVATIVE(K0);
        for K := 1 step 1 until M do
          Y[K] := Y[K] + .75 TIMES H TIMES K0[K];
    end DIFF SCHEME;
    B0 := PHI0 := -1;
    PI := 4 TIMES ARCTAN(1);
    BETAC[L] := BETAC[L + 1] := BETAC[L + 2] := BETAC[L + 3] := 0;
    BETA[0] := 1 ÷ 6;
    BETHA[0] := .5;
    FAC := 1;
    for I := 2 step 1 until L - 1 do
      FAC := I TIMES FAC;
    M1 := if AUT then M else M - 1;
    K := 0;
    LAST := false;
    NEXT LEVEL: for I := 1 step 1 until M do
      D[I] := Y[I];
    DERIVATIVE(D);
    if ¬LINEAR OR K = 0 then JACOBIAN(J, Y);
    STEPSIZE;
    if CHANGE then COEFFICIENT;
    OUTPUT;
    DIFFERENCE SCHEME;
    K := K + 1;
    X := X + H;
    if ¬LAST then goto NEXT LEVEL;
    END OF EFERK: OUTPUT;
    ;
end EFERK;
comment  ================== 33131 =================
;
procedure LINIGER2(X, XE, M, Y, SIGMA1, SIGMA2, F, EVALUATE, J, JACOBIAN, K, ITMAX, STEP, AETA, RETA, OUTPUT);
  integer M, K, ITMAX;
  real X, XE, SIGMA1, SIGMA2, STEP, AETA, RETA;
  array Y, J;
  Boolean procedure EVALUATE;
  real procedure F;
  procedure JACOBIAN, OUTPUT;
begin;
    integer I;
    real H, HL, B1, B2, P, Q, C0, C1, C2, C3, C4;
    Boolean LAST;
    integer array PI[1 : M];
    real array DY, YL, FL[1 : M], A[1 : M, 1 : M], AUX[1 : 3];
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure SOL(A, N, P, B); code 34051;
    
    procedure STEPSIZE;
    begin;
        H := STEP;
        if 1.1 TIMES H NOTLESS XE - X then begin;
            LAST := true;
            H := XE - X;
            X := XE;
        end else X := X + H;
    end STEPSIZE;
    procedure COEFFICIENT;
    begin;
        real R1, R2, EX, ZETA, ETA, SINL, COSL, SINH, COSH, D;
        real procedure R(X); 
          value X;
          real X;
        if X > 40 then R := X ÷ (X - 2) else begin;
            EX := EXP(-X);
            R := X TIMES (1 - EX) ÷ (X - 2 + (X + 2) TIMES EX);
        end;
        B1 := H TIMES SIGMA1;
        B2 := H TIMES SIGMA2;
        if B1 < .1 then begin;
            P := 0;
            Q := 1 ÷ 3;
            goto OUT;
        end;
        if B2 < 0 then goto COMPLEX;
        if B1 < 1 OR B2 < .1 then goto THIRDORDER;
        if ABS(B1 - B2) < B1 TIMES B1 TIMES 10-6 then goto DOUBLEFIT;
        R1 := R(B1) TIMES B1;
        R2 := R(B2) TIMES B2;
        D := B2 TIMES R1 - B1 TIMES R2;
        P := 2 TIMES (R2 - R1) ÷ D;
        Q := 2 TIMES (B2 - B1) ÷ D;
        goto OUT;
        THIRDORDER: Q := 1 ÷ 3;
        P := R(B1) ÷ 3 - 2 ÷ B1;
        goto OUT;
        DOUBLEFIT: B1 := .5 TIMES (B1 + B2);
        R1 := R(B1);
        if B1 > 40 then EX := 0;
        R2 := B1 ÷ (1 - EX);
        R2 := 1 - EX TIMES R2 TIMES R2;
        Q := 1 ÷ (R1 TIMES R1 TIMES R2);
        P := R1 TIMES Q - 2 ÷ B1;
        goto OUT;
        COMPLEX: ETA := ABS(B1 TIMES SIN(SIGMA2));
        ZETA := ABS(B1 TIMES COS(SIGMA2));
        if ETA < B1 TIMES B1 TIMES 10-6 then begin;
            B1 := B2 := ZETA;
            goto DOUBLEFIT;
        end;
        if ZETA > 40 then begin;
            P := 1 - 4 TIMES ZETA ÷ B1 ÷ B1;
            Q := 4 TIMES (1 - ZETA) ÷ B1 ÷ B1 + 1;
        end else begin;
            EX := EXP(ZETA);
            SINL := SIN(ETA);
            COSL := COS(ETA);
            SINH := .5 TIMES (EX - 1 ÷ EX);
            COSH := .5 TIMES (EX + 1 ÷ EX);
            D := ETA TIMES (COSH - COSL) - .5 TIMES B1 TIMES B1 TIMES SINL;
            P := (ZETA TIMES SINL + ETA TIMES SINH - 4 TIMES ZETA TIMES ETA ÷ B1 ÷ B1 TIMES (COSH - COSL)) ÷ D;
            Q := ETA TIMES ((COSH - COSL - ZETA TIMES SINH - ETA TIMES SINL) TIMES 4 ÷ B1 ÷ B1 + COSH + COSL) ÷ D;
        end;
        OUT: C0 := .25 TIMES H TIMES H TIMES (P + Q);
        C1 := .5 TIMES H TIMES (1 + P);
        C2 := H - C1;
        C3 := .25 TIMES H TIMES H TIMES (Q - P);
        C4 := .5 TIMES H TIMES P;
        ELEMENTS OF MATRIX;
    end COEFFICIENT;
    procedure ELEMENTS OF MATRIX;
    begin;
        integer K;
        for I := 1 step 1 until M do
          begin;
            for K := 1 step 1 until M do
              A[I, K] := C0 TIMES MATMAT(1, M, I, K, J, J) - C1 TIMES J[I, K];
            A[I, I] := A[I, I] + 1;
        end;
        AUX[2] := 0;
        DEC(A, M, AUX, PI);
    end ELOFMAT;
    procedure NEWTON ITERATION;
    begin;
        integer ITNUM;
        real JFL, ETA, DISCR;
        ITNUM := 0;
        NEXT: ITNUM := ITNUM + 1;
        if EVALUATE(ITNUM) then begin;
            JACOBIAN(J, Y);
            COEFFICIENT;
        end else if ITNUM = 1 IMPL H NOTEQUAL HL then COEFFICIENT;
        for I := 1 step 1 until M do
          FL[I] := F(I);
        if ITNUM = 1 then begin;
            for I := 1 step 1 until M do
              begin;
                JFL := MATVEC(1, M, I, J, FL);
                DY[I] := H TIMES (FL[I] - C4 TIMES JFL);
                YL[I] := Y[I] + C2 TIMES FL[I] + C3 TIMES JFL;
            end;
        end else for I := 1 step 1 until M do
          DY[I] := YL[I] - Y[I] + C1 TIMES FL[I] - C0 TIMES MATVEC(1, M, I, J, FL);
        SOL(A, M, PI, DY);
        for I := 1 step 1 until M do
          Y[I] := Y[I] + DY[I];
        if ITNUM < ITMAX then begin;
            ETA := SQRT(VECVEC(1, M, 0, Y, Y)) TIMES RETA + AETA;
            DISCR := SQRT(VECVEC(1, M, 0, DY, DY));
            if ETA < DISCR then goto NEXT;
        end;
    end NEWTON;
    LAST := false;
    K := 0;
    HL := 0;
    NEXT LEVEL: K := K + 1;
    STEPSIZE;
    NEWTON ITERATION;
    HL := H;
    OUTPUT;
    if ¬LAST then goto NEXT LEVEL;
end LINIGER2;
comment  ================== 33040 =================
;
procedure MODIFIED TAYLOR(T, TE, M0, M, U, SIGMA, TAUMIN, I, DERIVATIVE, K, DATA, ALFA, NORM, AETA, RETA, ETA, RHO, OUT);
  integer M0, M, I, K, NORM;
  real T, TE, SIGMA, TAUMIN, ALFA, AETA, RETA, ETA, RHO;
  array U, DATA;
  procedure DERIVATIVE, OUT;
begin;
    I := 0;
    begin;
        integer N, P, Q;
        own real  EC0, EC1, EC2, TAU0, TAU1, TAU2, TAUS, T2;
        real T0, TAU, TAUI, TAUEC, ECL, BETAN, GAMMA;
        real array C[M0 : M], BETA, BETHA[1 : DATA[-2]];
        Boolean START, STEP1, LAST;
        real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
        
        procedure COEFFICIENT;
        begin;
            integer J;
            real IFAC;
            IFAC := 1;
            GAMMA := .5;
            N := DATA[-2];
            P := DATA[-1];
            BETAN := DATA[0];
            Q := if P < N then P + 1 else N;
            for J := 1 step 1 until N do
              begin;
                BETA[J] := DATA[J];
                IFAC := IFAC ÷ J;
                BETHA[J] := IFAC - BETA[J];
            end;
            if P = N then BETHA[N] := IFAC;
        end;
        real procedure NORMFUNCTION(NORM, W);
          integer NORM;
          array W;
        begin;
            integer J;
            real S, X;
            S := 0;
            if NORM = 1 then begin;
                for J := M0 step 1 until M do
                  begin;
                    X := ABS(W[J]);
                    if X > S then S := X;
                end;
            end else S := SQRT(VECVEC(M0, M, 0, W, W));
            NORMFUNCTION := S;
        end;
        procedure LOCAL ERROR BOUND;
        ETA := AETA + RETA TIMES NORMFUNCTION(NORM, U);
        procedure LOCAL ERROR CONSTRUCTION(I);
          integer I;
        begin;
            if I = P then begin;
                ECL := 0;
                TAUEC := 1;
            end;
            if I > P + 1 then TAUEC := TAUEC TIMES TAU;
            ECL := ECL + ABS(BETHA[I]) TIMES TAUEC TIMES NORMFUNCTION(NORM, C);
            if I = N then begin;
                EC0 := EC1;
                EC1 := EC2;
                EC2 := ECL;
                RHO := ECL TIMES TAU POWER Q;
            end;
        end;
        procedure STEPSIZE;
        begin;
            real TAUACC, TAUSTAB, AA, BB, CC, EC;
            LOCAL ERROR BOUND;
            if ETA > 0 then begin;
                if START then begin;
                    if K = 0 then begin;
                        integer J;
                        for J := M0 step 1 until M do
                          C[J] := U[J];
                        I := 1;
                        DERIVATIVE(I, C);
                        TAUACC := ETA ÷ NORMFUNCTION(NORM, C);
                        STEP1 := true;
                    end else if STEP1 then begin;
                        TAUACC := (ETA ÷ RHO) POWER (1 ÷ Q) TIMES TAU2;
                        if TAUACC > 10 TIMES TAU2 then TAUACC := 10 TIMES TAU2 else STEP1 := false;
                    end else begin;
                        BB := (EC2 - EC1) ÷ TAU1;
                        CC := EC2 - BB TIMES T2;
                        EC := BB TIMES T + CC;
                        TAUACC := if EC < 0 then TAU2 else (ETA ÷ EC) POWER (1 ÷ Q);
                        START := false;
                    end;
                end else begin;
                    AA := ((EC0 - EC1) ÷ TAU0 + (EC2 - EC1) ÷ TAU1) ÷ (TAU1 + TAU0);
                    BB := (EC2 - EC1) ÷ TAU1 - AA TIMES (2 TIMES T2 - TAU1);
                    CC := EC2 - T2 TIMES (BB + AA TIMES T2);
                    EC := CC + T TIMES (BB + T TIMES AA);
                    TAUACC := if EC < 0 then TAUS else (ETA ÷ EC) POWER (1 ÷ Q);
                    if TAUACC > ALFA TIMES TAUS then TAUACC := ALFA TIMES TAUS;
                    if TAUACC < GAMMA TIMES TAUS then TAUACC := GAMMA TIMES TAUS;
                    ;
                end;
            end else TAUACC := TE - T;
            if TAUACC < TAUMIN then TAUACC := TAUMIN;
            TAUSTAB := BETAN ÷ SIGMA;
            if TAUSTAB < 10-12 TIMES (T - T0) then begin;
                OUT;
                goto END OF MODIFIED TAYLOR;
            end;
            TAU := if TAUACC > TAUSTAB then TAUSTAB else TAUACC;
            TAUS := TAU;
            if TAU NOTLESS TE - T then begin;
                TAU := TE - T;
                LAST := true;
            end;
            TAU0 := TAU1;
            TAU1 := TAU2;
            TAU2 := TAU;
        end;
        procedure DIFFERENCE SCHEME;
        begin;
            integer J;
            real B;
            for J := M0 step 1 until M do
              C[J] := U[J];
            TAUI := 1;
            NEXT TERM: I := I + 1;
            DERIVATIVE(I, C);
            TAUI := TAUI TIMES TAU;
            B := BETA[I] TIMES TAUI;
            if ETA > 0 IMPL I NOTLESS P then LOCAL ERROR CONSTRUCTION(I);
            for J := M0 step 1 until M do
              U[J] := U[J] + B TIMES C[J];
            if I < N then goto NEXT TERM;
            T2 := T;
            if LAST then begin;
                LAST := false;
                T := TE;
            end else T := T + TAU;
        end;
        START := K = 0;
        T0 := T;
        COEFFICIENT;
        LAST := false;
        NEXT LEVEL: STEPSIZE;
        K := K + 1;
        I := 0;
        DIFFERENCE SCHEME;
        OUT;
        if T NOTEQUAL TE then goto NEXT LEVEL;
    end;
    END OF MODIFIED TAYLOR: ;
end MODIFIED TAYLOR;
comment  ================== 33050 =================
;
procedure EXPONENTIALLY FITTED TAYLOR(T, TE, M0, M, U, SIGMA, PHI, DIAMETER, DERIVATIVE, I, K, ALFA, NORM, AETA, RETA, ETA, RHO, HMIN, HSTART, OUTPUT);
  integer M0, M, I, K, NORM;
  real T, TE, SIGMA, PHI, DIAMETER, ALFA, AETA, RETA, ETA, RHO, HMIN, HSTART;
  array U;
  procedure DERIVATIVE, OUTPUT;
begin;
    integer KL;
    real Q, EC0, EC1, EC2, H, HI, H0, H1, H2, BETAN, T2, SIGMAL, PHIL;
    real array C, RO[M0 : M], BETA, BETHA[1 : 3];
    Boolean LAST, START;
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    Boolean procedure ZEROIN(X, Y, FX, EPS); code 34150;
    
    procedure COEFFICIENT;
    begin;
        real B, B1, B2, BB, E, BETA2, BETA3;
        B := H TIMES SIGMAL;
        B1 := B TIMES COS(PHIL);
        BB := B TIMES B;
        if ABS(B) < 10-3 then begin;
            BETA2 := .5 - BB ÷ 24;
            BETA3 := 1 ÷ 6 + B1 ÷ 12;
            BETHA[3] := .5 + B1 ÷ 3;
        end else if B1 < -40 then begin;
            BETA2 := (-2 TIMES B1 - 4 TIMES B1 TIMES B1 ÷ BB + 1) ÷ BB;
            BETA3 := (1 + 2 TIMES B1 ÷ BB) ÷ BB;
            BETHA[3] := 1 ÷ BB;
        end else begin;
            E := EXP(B1) ÷ BB;
            B2 := B TIMES SIN(PHIL);
            BETA2 := (-2 TIMES B1 - 4 TIMES B1 TIMES B1 ÷ BB + 1) ÷ BB;
            BETA3 := (1 + 2 TIMES B1 ÷ BB) ÷ BB;
            if ABS(B2 ÷ B) < 10-5 then begin;
                BETA2 := BETA2 - E TIMES (B1 - 3);
                BETA3 := BETA3 + E TIMES (B1 - 2) ÷ B1;
                BETHA[3] := 1 ÷ BB + E TIMES (B1 - 1);
            end else begin;
                BETA2 := BETA2 - E TIMES SIN(B2 - 3 TIMES PHIL) ÷ B2 TIMES B;
                BETA3 := BETA3 + E TIMES SIN(B2 - 2 TIMES PHIL) ÷ B2;
                BETHA[3] := 1 ÷ BB + E TIMES SIN(B2 - PHIL) ÷ B2 TIMES B;
                ;
            end;
        end;
        BETA[1] := BETHA[1] := 1;
        BETA[2] := BETA2;
        BETA[3] := BETA3;
        BETHA[2] := 1 - BB TIMES BETA3;
        B := ABS(B);
        Q := if B < 1.5 then 4 - 2 TIMES B ÷ 3 else if B < 6 then (30 - 2 TIMES B) ÷ 9 else 2;
        ;
    end;
    real procedure NORMFUNCTION(NORM, W);
      integer NORM;
      array W;
    begin;
        integer J;
        real S, X;
        S := 0;
        if NORM = 1 then begin;
            for J := M0 step 1 until M do
              begin;
                X := ABS(W[J]);
                if X > S then S := X;
            end;
        end else S := SQRT(VECVEC(M0, M, 0, W, W));
        NORMFUNCTION := S;
        ;
    end;
    procedure LOCAL ERROR BOUND;
    ETA := AETA + RETA TIMES NORMFUNCTION(NORM, U);
    procedure LOCAL ERROR CONSTRUCTION(I);
      integer I;
    begin;
        if I = 1 then INIVEC(M0, M, RO, 0);
        if I < 4 then ELMVEC(M0, M, 0, RO, C, BETHA[I] TIMES HI);
        if I = 4 then begin;
            ELMVEC(M0, M, 0, RO, C, -H);
            RHO := NORMFUNCTION(NORM, RO);
            EC0 := EC1;
            EC1 := EC2;
            EC2 := RHO ÷ H POWER Q;
            ;
        end;
    end;
    procedure STEPSIZE;
    begin;
        real HACC, HSTAB, HCR, HMAX, A, B, C;
        if ¬START then LOCAL ERROR BOUND;
        if START then begin;
            H1 := H2 := HACC := HSTART;
            EC2 := EC1 := 1;
            KL := 1;
            START := false;
        end else if KL < 3 then begin;
            HACC := (ETA ÷ RHO) POWER (1 ÷ Q) TIMES H2;
            if HACC > 10 TIMES H2 then HACC := 10 TIMES H2 else KL := KL + 1;
        end else begin;
            A := (H0 TIMES (EC2 - EC1) - H1 TIMES (EC1 - EC0)) ÷ (H2 TIMES H0 - H1 TIMES H1);
            H := H2 TIMES (if ETA < RHO then (ETA ÷ RHO) POWER (1 ÷ Q) else ALFA);
            if A > 0 then begin;
                B := (EC2 - EC1 - A TIMES (H2 - H1)) ÷ H1;
                C := EC2 - A TIMES H2 - B TIMES T2;
                HACC := 0;
                HMAX := H;
                if ¬ZEROIN(HACC, H, HACC POWER Q TIMES (A TIMES HACC + B TIMES T + C) - ETA, 10-3 TIMES H2) then HACC := HMAX;
            end else HACC := H;
            if HACC < .5 TIMES H2 then HACC := .5 TIMES H2;
            ;
        end;
        if HACC < HMIN then HACC := HMIN;
        H := HACC;
        if H TIMES SIGMAL > 1 then begin;
            A := ABS(DIAMETER ÷ SIGMAL + 10-14) ÷ 2;
            B := 2 TIMES ABS(SIN(PHIL));
            BETAN := (if A > B then 1 ÷ A else 1 ÷ B) ÷ A;
            HSTAB := ABS(BETAN ÷ SIGMAL);
            if HSTAB < 10-14 TIMES T then goto ENDOFEFT;
            if H > HSTAB then H := HSTAB;
        end;
        HCR := H2 TIMES H2 ÷ H1;
        if KL > 2 IMPL ABS(H - HCR) < 10-6 TIMES HCR then H := if H < HCR then HCR TIMES (1 - 10-7) else HCR TIMES (1 + 10-7);
        if T + H > TE then begin;
            LAST := true;
            HSTART := H;
            H := TE - T;
        end;
        H0 := H1;
        H1 := H2;
        H2 := H;
        ;
    end;
    procedure DIFFERENCE SCHEME;
    begin;
        HI := 1;
        SIGMAL := SIGMA;
        PHIL := PHI;
        STEPSIZE;
        COEFFICIENT;
        for I := 1,
                 2,
                 3 do
          begin;
            HI := HI TIMES H;
            if I > 1 then DERIVATIVE(I, C);
            LOCALERRORCONSTRUCTION(I);
            ELMVEC(M0, M, 0, U, C, BETA[I] TIMES HI);
        end;
        T2 := T;
        K := K + 1;
        if LAST then begin;
            LAST := false;
            T := TE;
            START := true;
        end else T := T + H;
        DUPVEC(M0, M, 0, C, U);
        DERIVATIVE(1, C);
        LOCALERRORCONSTRUCTION(4);
        OUTPUT;
        ;
    end;
    START := true;
    LAST := false;
    DUPVEC(M0, M, 0, C, U);
    DERIVATIVE(1, C);
    if K = 0 then begin;
        LOCAL ERROR BOUND;
        HSTART := ETA ÷ NORMFUNCTION(NORM, C);
    end;
    NEXT LEVEL: DIFFERENCE SCHEME;
    if T NOTEQUAL TE then goto NEXT LEVEL;
    ENDOFEFT: ;
end EXPONENTIAL FITTED TAYLOR;
comment  ================== 33012 =================
;
procedure RK2(X, A, B, Y, YA, Z, ZA, FXYZ, E, D, FI); 
  value B, FI;
  real X, A, B, Y, YA, Z, ZA, FXYZ;
  Boolean FI;
  array E, D;
begin;
    real E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ;
    Boolean LAST, FIRST, REJECT;
    if FI then begin;
        D[3] := A;
        D[4] := YA;
        D[5] := ZA;
    end;
    D[1] := 0;
    XL := D[3];
    YL := D[4];
    ZL := D[5];
    if FI then D[2] := B - D[3];
    ABSH := H := ABS(D[2]);
    if B - XL < 0 then H := -H;
    INT := ABS(B - XL);
    HMIN := INT TIMES E[1] + E[2];
    HL := INT TIMES E[3] + E[4];
    if HL < HMIN then HMIN := HL;
    E1 := E[1] ÷ INT;
    E2 := E[2] ÷ INT;
    E3 := E[3] ÷ INT;
    E4 := E[4] ÷ INT;
    FIRST := true;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := HMIN;
    end;
    if H NOTLESS B - XL EQUIV H NOTLESS 0 then begin;
        D[2] := H;
        LAST := true;
        H := B - XL;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: X := XL;
    Y := YL;
    Z := ZL;
    K0 := FXYZ TIMES H;
    X := XL + H ÷ 4.5;
    Y := YL + (ZL TIMES 18 + K0 TIMES 2) ÷ 81 TIMES H;
    Z := ZL + K0 ÷ 4.5;
    K1 := FXYZ TIMES H;
    X := XL + H ÷ 3;
    Y := YL + (ZL TIMES 6 + K0) ÷ 18 TIMES H;
    Z := ZL + (K0 + K1 TIMES 3) ÷ 12;
    K2 := FXYZ TIMES H;
    X := XL + H TIMES .5;
    Y := YL + (ZL TIMES 8 + K0 + K2) ÷ 16 TIMES H;
    Z := ZL + (K0 + K2 TIMES 3) ÷ 8;
    K3 := FXYZ TIMES H;
    X := XL + H TIMES .8;
    Y := YL + (ZL TIMES 100 + K0 TIMES 12 + K3 TIMES 28) ÷ 125 TIMES H;
    Z := ZL + (K0 TIMES 53 - K1 TIMES 135 + K2 TIMES 126 + K3 TIMES 56) ÷ 125;
    K4 := FXYZ TIMES H;
    X := if LAST then B else XL + H;
    Y := YL + (ZL TIMES 336 + K0 TIMES 21 + K2 TIMES 92 + K4 TIMES 55) ÷ 336 TIMES H;
    Z := ZL + (K0 TIMES 133 - K1 TIMES 378 + K2 TIMES 276 + K3 TIMES 112 + K4 TIMES 25) ÷ 168;
    K5 := FXYZ TIMES H;
    DISCRY := ABS((-K0 TIMES 21 + K2 TIMES 108 - K3 TIMES 112 + K4 TIMES 25) ÷ 56 TIMES H);
    DISCRZ := ABS(K0 TIMES 21 - K2 TIMES 162 + K3 TIMES 224 - K4 TIMES 125 + K5 TIMES 42) ÷ 14;
    TOLY := ABSH TIMES (ABS(ZL) TIMES E1 + E2);
    TOLZ := ABS(K0) TIMES E3 + ABSH TIMES E4;
    REJECT := DISCRY > TOLY OR DISCRZ > TOLZ;
    FHY := DISCRY ÷ TOLY;
    FHZ := DISCRZ ÷ TOLZ;
    if FHZ > FHY then FHY := FHZ;
    MU := 1 ÷ (1 + FHY) + .45;
    if REJECT then begin;
        if ABSH NOTLESS HMIN then begin;
            D[1] := D[1] + 1;
            Y := YL;
            Z := ZL;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FHY := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FHY TIMES H;
    ACC: MU1 := MU;
    Y := YL + (ZL TIMES 56 + K0 TIMES 7 + K2 TIMES 36 - K4 TIMES 15) ÷ 56 TIMES HL;
    Z := ZL + (-K0 TIMES 63 + K1 TIMES 189 - K2 TIMES 36 - K3 TIMES 112 + K4 TIMES 50) ÷ 28;
    K5 := FXYZ TIMES HL;
    Y := YL + (ZL TIMES 336 + K0 TIMES 35 + K2 TIMES 108 + K4 TIMES 25) ÷ 336 TIMES HL;
    Z := ZL + (K0 TIMES 35 + K2 TIMES 162 + K4 TIMES 125 + K5 TIMES 14) ÷ 336;
    NEXT: if B NOTEQUAL X then begin;
        XL := X;
        YL := Y;
        ZL := Z;
        goto TEST;
    end;
    if ¬LAST then D[2] := H;
    D[3] := X;
    D[4] := Y;
    D[5] := Z;
end RK2;
comment  ================== 33013 =================
;
procedure RK2N(X, A, B, Y, YA, Z, ZA, FXYZJ, J, E, D, FI, N); 
  value B, FI, N;
  integer J, N;
  real X, A, B, FXYZJ;
  Boolean FI;
  array Y, YA, Z, ZA, E, D;
begin;
    integer JJ;
    real XL, H, INT, HMIN, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ;
    Boolean LAST, FIRST, REJECT;
    array YL, ZL, K0, K1, K2, K3, K4, K5[1 : N], EE[1 : 4 TIMES N];
    if FI then begin;
        D[3] := A;
        for JJ := 1 step 1 until N do
          begin;
            D[JJ + 3] := YA[JJ];
            D[N + JJ + 3] := ZA[JJ];
        end;
    end;
    D[1] := 0;
    XL := D[3];
    for JJ := 1 step 1 until N do
      begin;
        YL[JJ] := D[JJ + 3];
        ZL[JJ] := D[N + JJ + 3];
    end;
    if FI then D[2] := B - D[3];
    ABSH := H := ABS(D[2]);
    if B - XL < 0 then H := -H;
    INT := ABS(B - XL);
    HMIN := INT TIMES E[1] + E[2];
    for JJ := 2 step 1 until 2 TIMES N do
      begin;
        HL := INT TIMES E[2 TIMES JJ - 1] + E[2 TIMES JJ];
        if HL < HMIN then HMIN := HL;
    end;
    for JJ := 1 step 1 until 4 TIMES N do
      EE[JJ] := E[JJ] ÷ INT;
    FIRST := true;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := ABS(H);
    end;
    if H NOTLESS B - XL EQUIV H NOTLESS 0 then begin;
        D[2] := H;
        LAST := true;
        H := B - XL;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: X := XL;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ];
        Z[JJ] := ZL[JJ];
    end;
    for J := 1 step 1 until N do
      K0[J] := FXYZJ TIMES H;
    X := XL + H ÷ 4.5;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 18 + K0[JJ] TIMES 2) ÷ 81 TIMES H;
        Z[JJ] := ZL[JJ] + K0[JJ] ÷ 4.5;
        ;
    end;
    for J := 1 step 1 until N do
      K1[J] := FXYZJ TIMES H;
    X := XL + H ÷ 3;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 6 + K0[JJ]) ÷ 18 TIMES H;
        Z[JJ] := ZL[JJ] + (K0[JJ] + K1[JJ] TIMES 3) ÷ 12;
    end;
    for J := 1 step 1 until N do
      K2[J] := FXYZJ TIMES H;
    X := XL + H TIMES .5;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 8 + K0[JJ] + K2[JJ]) ÷ 16 TIMES H;
        Z[JJ] := ZL[JJ] + (K0[JJ] + K2[JJ] TIMES 3) ÷ 8;
    end;
    for J := 1 step 1 until N do
      K3[J] := FXYZJ TIMES H;
    X := XL + H TIMES .8;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 100 + K0[JJ] TIMES 12 + K3[JJ] TIMES 28) ÷ 125 TIMES H;
        Z[JJ] := ZL[JJ] + (K0[JJ] TIMES 53 - K1[JJ] TIMES 135 + K2[JJ] TIMES 126 + K3[JJ] TIMES 56) ÷ 125;
    end;
    for J := 1 step 1 until N do
      K4[J] := FXYZJ TIMES H;
    X := if LAST then B else XL + H;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 336 + K0[JJ] TIMES 21 + K2[JJ] TIMES 92 + K4[JJ] TIMES 55) ÷ 336 TIMES H;
        Z[JJ] := ZL[JJ] + (K0[JJ] TIMES 133 - K1[JJ] TIMES 378 + K2[JJ] TIMES 276 + K3[JJ] TIMES 112 + K4[JJ] TIMES 25) ÷ 168;
    end;
    for J := 1 step 1 until N do
      K5[J] := FXYZJ TIMES H;
    REJECT := false;
    FHM := 0;
    for JJ := 1 step 1 until N do
      begin;
        DISCRY := ABS((-K0[JJ] TIMES 21 + K2[JJ] TIMES 108 - K3[JJ] TIMES 112 + K4[JJ] TIMES 25) ÷ 56 TIMES H);
        DISCRZ := ABS(K0[JJ] TIMES 21 - K2[JJ] TIMES 162 + K3[JJ] TIMES 224 - K4[JJ] TIMES 125 + K5[JJ] TIMES 42) ÷ 14;
        TOLY := ABSH TIMES (ABS(ZL[JJ]) TIMES EE[2 TIMES JJ - 1] + EE[2 TIMES JJ]);
        TOLZ := ABS(K0[JJ]) TIMES EE[2 TIMES (JJ + N) - 1] + ABSH TIMES EE[2 TIMES (JJ + N)];
        REJECT := DISCRY > TOLY OR DISCRZ > TOLZ OR REJECT;
        FHY := DISCRY ÷ TOLY;
        FHZ := DISCRZ ÷ TOLZ;
        if FHZ > FHY then FHY := FHZ;
        if FHY > FHM then FHM := FHY;
    end;
    MU := 1 ÷ (1 + FHM) + .45;
    if REJECT then begin;
        if ABSH NOTLESS HMIN then begin;
            D[1] := D[1] + 1;
            for JJ := 1 step 1 until N do
              begin;
                Y[JJ] := YL[JJ];
                Z[JJ] := ZL[JJ];
            end;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FHM := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FHM TIMES H;
    ACC: MU1 := MU;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 56 + K0[JJ] TIMES 7 + K2[JJ] TIMES 36 - K4[JJ] TIMES 15) ÷ 56 TIMES HL;
        Z[JJ] := ZL[JJ] + (-K0[JJ] TIMES 63 + K1[JJ] TIMES 189 - K2[JJ] TIMES 36 - K3[JJ] TIMES 112 + K4[JJ] TIMES 50) ÷ 28;
    end;
    for J := 1 step 1 until N do
      K5[J] := FXYZJ TIMES HL;
    for JJ := 1 step 1 until N do
      begin;
        Y[JJ] := YL[JJ] + (ZL[JJ] TIMES 336 + K0[JJ] TIMES 35 + K2[JJ] TIMES 108 + K4[JJ] TIMES 25) ÷ 336 TIMES HL;
        Z[JJ] := ZL[JJ] + (K0[JJ] TIMES 35 + K2[JJ] TIMES 162 + K4[JJ] TIMES 125 + K5[JJ] TIMES 14) ÷ 336;
    end;
    NEXT: if B NOTEQUAL X then begin;
        XL := X;
        for JJ := 1 step 1 until N do
          begin;
            YL[JJ] := Y[JJ];
            ZL[JJ] := Z[JJ];
        end;
        goto TEST;
    end;
    if ¬LAST then D[2] := H;
    D[3] := X;
    for JJ := 1 step 1 until N do
      begin;
        D[JJ + 3] := Y[JJ];
        D[N + JJ + 3] := Z[JJ];
    end;
end RK2N;
comment  ================== 33014 =================
;
procedure RK3(X, A, B, Y, YA, Z, ZA, FXY, E, D, FI); 
  value B, FI;
  real X, A, B, Y, YA, Z, ZA, FXY;
  Boolean FI;
  array E, D;
begin;
    real E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ;
    Boolean LAST, FIRST, REJECT;
    if FI then begin;
        D[3] := A;
        D[4] := YA;
        D[5] := ZA;
    end;
    D[1] := 0;
    XL := D[3];
    YL := D[4];
    ZL := D[5];
    if FI then D[2] := B - D[3];
    ABSH := H := ABS(D[2]);
    if B - XL < 0 then H := -H;
    INT := ABS(B - XL);
    HMIN := INT TIMES E[1] + E[2];
    HL := INT TIMES E[3] + E[4];
    if HL < HMIN then HMIN := HL;
    E1 := E[1] ÷ INT;
    E2 := E[2] ÷ INT;
    E3 := E[3] ÷ INT;
    E4 := E[4] ÷ INT;
    FIRST := REJECT := true;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := HMIN;
    end;
    if H NOTLESS B - XL EQUIV H NOTLESS 0 then begin;
        D[2] := H;
        LAST := true;
        H := B - XL;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: if REJECT then begin;
        X := XL;
        Y := YL;
        K0 := FXY TIMES H;
    end else K0 := K5 TIMES H ÷ HL;
    X := XL + .276393202250021 TIMES H;
    Y := YL + (ZL TIMES .276393202250021 + K0 TIMES .038196601125011) TIMES H;
    K1 := FXY TIMES H;
    X := XL + .723606797749979 TIMES H;
    Y := YL + (ZL TIMES .723606797749979 + K1 TIMES .261803398874989) TIMES H;
    K2 := FXY TIMES H;
    X := XL + H TIMES .5;
    Y := YL + (ZL TIMES .5 + K0 TIMES .046875 + K1 TIMES .079824155839840 - K2 TIMES .001699155839840) TIMES H;
    K4 := FXY TIMES H;
    X := if LAST then B else XL + H;
    Y := YL + (ZL + K0 TIMES .309016994374947 + K2 TIMES .190983005625053) TIMES H;
    K3 := FXY TIMES H;
    Y := YL + (ZL + K0 TIMES .083333333333333 + K1 TIMES .301502832395825 + K2 TIMES .115163834270842) TIMES H;
    K5 := FXY TIMES H;
    DISCRY := ABS((-K0 TIMES .5 + K1 TIMES 1.809016994374947 + K2 TIMES .690983005625053 - K4 TIMES 2) TIMES H);
    DISCRZ := ABS((K0 - K3) TIMES 2 - (K1 + K2) TIMES 10 + K4 TIMES 16 + K5 TIMES 4);
    TOLY := ABSH TIMES (ABS(ZL) TIMES E1 + E2);
    TOLZ := ABS(K0) TIMES E3 + ABSH TIMES E4;
    REJECT := DISCRY > TOLY OR DISCRZ > TOLZ;
    FHY := DISCRY ÷ TOLY;
    FHZ := DISCRZ ÷ TOLZ;
    if FHZ > FHY then FHY := FHZ;
    MU := 1 ÷ (1 + FHY) + .45;
    if REJECT then begin;
        if ABSH NOTLESS HMIN then begin;
            D[1] := D[1] + 1;
            Y := YL;
            Z := ZL;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FHY := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FHY TIMES H;
    ACC: MU1 := MU;
    Z := ZL + (K0 + K3) TIMES .083333333333333 + (K1 + K2) TIMES .416666666666667;
    NEXT: if B NOTEQUAL X then begin;
        XL := X;
        YL := Y;
        ZL := Z;
        goto TEST;
    end;
    if ¬LAST then D[2] := H;
    D[3] := X;
    D[4] := Y;
    D[5] := Z;
end RK3;
comment  ================== 33015 =================
;
procedure RK3N(X, A, B, Y, YA, Z, ZA, FXYJ, J, E, D, FI, N); 
  value B, FI, N;
  integer J, N;
  real X, A, B, FXYJ;
  Boolean FI;
  array Y, YA, Z, ZA, E, D;
begin;
    integer JJ;
    real XL, H, HMIN, INT, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ;
    Boolean LAST, FIRST, REJECT;
    array YL, ZL, K0, K1, K2, K3, K4, K5[1 : N], EE[1 : 4 TIMES N];
    if FI then begin;
        D[3] := A;
        for JJ := 1 step 1 until N do
          begin;
            D[JJ + 3] := YA[JJ];
            D[N + JJ + 3] := ZA[JJ];
        end;
    end;
    D[1] := 0;
    XL := D[3];
    for JJ := 1 step 1 until N do
      begin;
        YL[JJ] := D[JJ + 3];
        ZL[JJ] := D[N + JJ + 3];
    end;
    if FI then D[2] := B - D[3];
    ABSH := H := ABS(D[2]);
    if B - XL < 0 then H := -H;
    INT := ABS(B - XL);
    HMIN := INT TIMES E[1] + E[2];
    for JJ := 2 step 1 until 2 TIMES N do
      begin;
        HL := INT TIMES E[2 TIMES JJ - 1] + E[2 TIMES JJ];
        if HL < HMIN then HMIN := HL;
    end;
    for JJ := 1 step 1 until 4 TIMES N do
      EE[JJ] := E[JJ] ÷ INT;
    FIRST := REJECT := true;
    if FI then begin;
        LAST := true;
        goto STEP;
    end;
    TEST: ABSH := ABS(H);
    if ABSH < HMIN then begin;
        H := if H > 0 then HMIN else -HMIN;
        ABSH := HMIN;
    end;
    if H NOTLESS B - XL EQUIV H NOTLESS 0 then begin;
        D[2] := H;
        LAST := true;
        H := B - XL;
        ABSH := ABS(H);
    end else LAST := false;
    STEP: if REJECT then begin;
        X := XL;
        for JJ := 1 step 1 until N do
          Y[JJ] := YL[JJ];
        for J := 1 step 1 until N do
          K0[J] := FXYJ TIMES H;
    end else begin;
        FHY := H ÷ HL;
        for JJ := 1 step 1 until N do
          K0[JJ] := K5[JJ] TIMES FHY;
    end;
    X := XL + .276393202250021 TIMES H;
    for JJ := 1 step 1 until N do
      Y[JJ] := YL[JJ] + (ZL[JJ] TIMES .276393202250021 + K0[JJ] TIMES .038196601125011) TIMES H;
    for J := 1 step 1 until N do
      K1[J] := FXYJ TIMES H;
    X := XL + .723606797749979 TIMES H;
    for JJ := 1 step 1 until N do
      Y[JJ] := YL[JJ] + (ZL[JJ] TIMES .723606797749979 + K1[JJ] TIMES .261803398874989) TIMES H;
    for J := 1 step 1 until N do
      K2[J] := FXYJ TIMES H;
    X := XL + H TIMES .5;
    for JJ := 1 step 1 until N do
      Y[JJ] := YL[JJ] + (ZL[JJ] TIMES .5 + K0[JJ] TIMES .046875 + K1[JJ] TIMES .079824155839840 - K2[JJ] TIMES .001699155839840) TIMES H;
    for J := 1 step 1 until N do
      K4[J] := FXYJ TIMES H;
    X := if LAST then B else XL + H;
    for JJ := 1 step 1 until N do
      Y[JJ] := YL[JJ] + (ZL[JJ] + K0[JJ] TIMES .309016994374947 + K2[JJ] TIMES .190983005625053) TIMES H;
    for J := 1 step 1 until N do
      K3[J] := FXYJ TIMES H;
    for JJ := 1 step 1 until N do
      Y[JJ] := YL[JJ] + (ZL[JJ] + K0[JJ] TIMES .083333333333333 + K1[JJ] TIMES .301502832395825 + K2[JJ] TIMES .115163834270842) TIMES H;
    for J := 1 step 1 until N do
      K5[J] := FXYJ TIMES H;
    REJECT := false;
    FHM := 0;
    for JJ := 1 step 1 until N do
      begin;
        DISCRY := ABS((-K0[JJ] TIMES .5 + K1[JJ] TIMES 1.809016994374947 + K2[JJ] TIMES .690983005625053 - K4[JJ] TIMES 2) TIMES H);
        DISCRZ := ABS((K0[JJ] - K3[JJ]) TIMES 2 - (K1[JJ] + K2[JJ]) TIMES 10 + K4[JJ] TIMES 16 + K5[JJ] TIMES 4);
        TOLY := ABSH TIMES (ABS(ZL[JJ]) TIMES EE[2 TIMES JJ - 1] + EE[2 TIMES JJ]);
        TOLZ := ABS(K0[JJ]) TIMES EE[2 TIMES (JJ + N) - 1] + ABSH TIMES EE[2 TIMES (JJ + N)];
        REJECT := DISCRY > TOLY OR DISCRZ > TOLZ OR REJECT;
        FHY := DISCRY ÷ TOLY;
        FHZ := DISCRZ ÷ TOLZ;
        if FHZ > FHY then FHY := FHZ;
        if FHY > FHM then FHM := FHY;
    end;
    MU := 1 ÷ (1 + FHM) + .45;
    if REJECT then begin;
        if ABSH NOTLESS HMIN then begin;
            D[1] := D[1] + 1;
            for JJ := 1 step 1 until N do
              begin;
                Y[JJ] := YL[JJ];
                Z[JJ] := ZL[JJ];
            end;
            FIRST := true;
            goto NEXT;
        end;
        H := MU TIMES H;
        goto TEST;
    end REJ;
    if FIRST then begin;
        FIRST := false;
        HL := H;
        H := MU TIMES H;
        goto ACC;
    end;
    FHY := MU TIMES H ÷ HL + MU - MU1;
    HL := H;
    H := FHY TIMES H;
    ACC: MU1 := MU;
    for JJ := 1 step 1 until N do
      Z[JJ] := ZL[JJ] + (K0[JJ] + K3[JJ]) TIMES .083333333333333 + (K1[JJ] + K2[JJ]) TIMES .416666666666667;
    NEXT: if B NOTEQUAL X then begin;
        XL := X;
        for JJ := 1 step 1 until N do
          begin;
            YL[JJ] := Y[JJ];
            ZL[JJ] := Z[JJ];
        end;
        goto TEST;
    end;
    if ¬LAST then D[2] := H;
    D[3] := X;
    for JJ := 1 step 1 until N do
      begin;
        D[JJ + 3] := Y[JJ];
        D[N + JJ + 3] := Z[JJ];
    end;
end RK3N;
comment  ================== 35120 =================
;
real procedure TAN(X); 
  value X;
  real X;
begin;
    real U;
    Boolean procedure OVERFLOW(X); code 30009;
    
    real procedure GIANT; code 30004;
    
    U := SIN(X) ÷ COS(X);
    TAN := if OVERFLOW(U) then GIANT else U;
end TAN;
comment  ================== 35111 =================
;
real procedure SINH(X); 
  value X;
  real X;
begin;
    real AX, Y;
    AX := ABS(X);
    if AX < 0.3 then begin;
        Y := if AX < 0.1 then X TIMES X else X TIMES X ÷ 9;
        X := (((0.0001984540 TIMES Y + 0.0083333331783) TIMES Y + 0.16666666666675) TIMES Y + 1.0) TIMES X;
        SINH := if AX < 0.1 then X else X TIMES (1.0 + 0.14814814814815 TIMES X TIMES X);
    end else if AX < 17.5 then begin;
        AX := EXP(AX);
        SINH := SIGN(X) TIMES .5 TIMES (AX - 1 ÷ AX);
    end else if AX > 742.36063037970 then begin;
        real procedure GIANT; code 30004;
        
        SINH := SIGN(X) TIMES GIANT;
    end else SINH := SIGN(X) TIMES EXP(AX - .693147180559945);
end SINH;
comment  ================== 35115 =================
;
real procedure ARCCOSH(X); 
  value X;
  real X;
ARCCOSH := if X NOTLESS 1 then 0 else if X > 1010 then 0.69314718055995 + LN(X) else LN(X + SQRT((X - 1) TIMES (X + 1)));
comment  ================== 35080 =================
;
real procedure EI(X); 
  value X;
  real X;
begin;
    real array P, Q[0 : 7];
    real procedure CHEPOLSER(N, X, A); code 31046;
    
    real procedure POL(N, X, A); code 31040;
    
    real procedure JFRAC(N, A, B); code 35083;
    
    if X > 24 then begin;
        P[0] := +1.00000000000058;
        Q[1] := 1.99999999924131;
        P[1] := X - 3.00000016782085;
        Q[2] := -2.99996432944446;
        P[2] := X - 5.00140345515924;
        Q[3] := -7.90404992298926;
        P[3] := X - 7.49289167792884;
        Q[4] := -4.31325836146628;
        P[4] := X - 3.0833626905176310+1;
        Q[5] := 2.9599939948683110+2;
        P[5] := X - 1.39381360364405;
        Q[6] := -6.74704580465832;
        P[6] := X + 8.91263822573708;
        Q[7] := 1.0474536265246810+3;
        P[7] := X - 5.3168662349448210+1;
        EI := EXP(X) TIMES (1 + JFRAC(7, Q, P) ÷ X) ÷ X;
    end else if X > 12 then begin;
        P[0] := +9.9999429607470810-1;
        Q[1] := 1.00083867402639;
        P[1] := X - 1.95022321289660;
        Q[2] := -3.43942266899870;
        P[2] := X + 1.75656315469614;
        Q[3] := 2.8951672792513510+1;
        P[3] := X + 1.7960168876925210+1;
        Q[4] := 7.6076114800773510+2;
        P[4] := X - 3.2346733030540310+1;
        Q[5] := 2.5777638423844010+1;
        P[5] := X - 8.28561994140641;
        Q[6] := 5.7283719383732410+1;
        P[6] := X - 1.8654545488339910+1;
        Q[7] := 6.9500065588743410+1;
        P[7] := X - 3.48334653602853;
        EI := EXP(X) TIMES JFRAC(7, Q, P) ÷ X;
    end else if X > 6 then begin;
        P[0] := +1.00443109228078;
        Q[1] := 5.2746885196290810-1;
        P[1] := X - 4.3253113287813510+1;
        Q[2] := 2.7362411988932810+3;
        P[2] := X + 6.0121799083008010+1;
        Q[3] := 1.4325673812193810+1;
        P[3] := X - 3.3184253199722110+1;
        Q[4] := 1.0036743951672610+3;
        P[4] := X + 2.5076281129356010+1;
        Q[5] := -6.25041161671876;
        P[5] := X + 9.30816385662165;
        Q[6] := 3.0089264837291510+2;
        P[6] := X - 2.1901023385488010+1;
        Q[7] := 3.93707701852715;
        P[7] := X - 2.18086381520724;
        EI := EXP(X) TIMES JFRAC(7, Q, P) ÷ X;
    end else if X > 0 then begin;
        real T, R, X0, XMX0;
        P[0] := -1.9577303690454810+8;
        Q[0] := -8.2627149862605510+7;
        P[1] := 3.8928042131120110+6;
        Q[1] := 8.9192576757561210+7;
        P[2] := -2.2174462775884510+7;
        Q[2] := -2.4903337574054010+7;
        P[3] := -1.1962366934924710+5;
        Q[3] := 4.2855962461174910+6;
        P[4] := -2.4930139345864810+5;
        Q[4] := -4.8354743616216410+5;
        P[5] := -4.2100161535707010+3;
        Q[5] := 3.5730029805850810+4;
        P[6] := -5.4914226552108510+2;
        Q[6] := -1.6070892658722110+3;
        P[7] := -8.66937339951070;
        Q[7] := 3.4171875000000010+1;
        X0 := .372507410781367;
        T := X ÷ 3 - 1;
        R := CHEPOLSER(7, T, P) ÷ CHEPOLSER(7, T, Q);
        XMX0 := (X - 409576229586 ÷ 1099511627776) - .76717725019939410-12;
        if ABS(XMX0) > .037 then T := LN(X ÷ X0) else begin;
            real Z, Z2;
            P[0] := .83720793397607510+1;
            Q[0] := .41860396698803710+1;
            P[1] := -.65226874083710310+1;
            Q[1] := -.46566902608081410+1;
            P[2] := .569955700306720;
            Q[2] := .110+1;
            Z := XMX0 ÷ (X + X0);
            Z2 := Z TIMES Z;
            T := Z TIMES POL(2, Z2, P) ÷ POL(2, Z2, Q);
        end;
        EI := T + XMX0 TIMES R;
    end else if X > -1 then begin;
        real Y;
        P[0] := -4.4178547172821710+4;
        Q[0] := 7.6537332333761410+4;
        P[1] := 5.7721724713944410+4;
        Q[1] := 3.2597188129027510+4;
        P[2] := 9.9383138896203710+3;
        Q[2] := 6.1061079424575910+3;
        P[3] := 1.8421108866800010+3;
        Q[3] := 6.3541941837838210+2;
        P[4] := 1.0109380616190610+2;
        Q[4] := 3.7229835283332710+1;
        P[5] := 5.03416184097568;
        Q[5] := 1;
        Y := -X;
        EI := LN(Y) - POL(5, Y, P) ÷ POL(5, Y, Q);
    end else if X > -4 then begin;
        real Y;
        P[0] := 8.6774595483844410-8;
        Q[0] := 1;
        P[1] := 9.9999551930139010-1;
        Q[1] := 1.2848193537915710+1;
        P[2] := 1.1848310555494610+1;
        Q[2] := 5.6443356956180310+1;
        P[3] := 4.5593064425339010+1;
        Q[3] := 1.0664518376991410+2;
        P[4] := 6.9927945129100310+1;
        Q[4] := 8.9731109712529010+1;
        P[5] := 4.2520203476884110+1;
        Q[5] := 3.1497184917044110+1;
        P[6] := 8.83671808803844;
        Q[6] := 3.79559003762122;
        P[7] := 4.0137766494066510-1;
        Q[7] := 9.0880456918886910-2;
        Y := -1 ÷ X;
        EI := -EXP(X) TIMES POL(7, Y, P) ÷ POL(7, Y, Q);
    end else begin;
        real Y;
        P[0] := -9.9999999999844710-1;
        Q[0] := 1;
        P[1] := -2.6627106043181110+1;
        Q[1] := 2.8627106042219210+1;
        P[2] := -2.4105582709701510+2;
        Q[2] := 2.9231003938853310+2;
        P[3] := -8.9592795777293710+2;
        Q[3] := 1.3327853774825710+3;
        P[4] := -1.2988568874648410+3;
        Q[4] := 2.7776194950916310+3;
        P[5] := -5.4537415888313310+2;
        Q[5] := 2.4040171322590910+3;
        P[6] := -5.66575206533869;
        Q[6] := 6.3165748328080010+2;
        Y := -1 ÷ X;
        EI := -EXP(X) TIMES Y TIMES (1 + Y TIMES POL(6, Y, P) ÷ POL(6, Y, Q));
    end;
end EI;
comment  ================== 35086 =================
;
procedure ENX(X, N1, N2, A); 
  value X, N1, N2;
  real X;
  integer N1, N2;
  array A;
if X NOTLESS 1.5 then begin;
    real procedure EI(X); code 35080;
    
    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 TIMES W) ÷ (I - 1);
        if I NOTLESS N1 then A[I] := W;
    end;
end else begin;
    integer I, N;
    real W, E, AN;
    N := ENTIER(X + .5);
    if N NOTLESS 10 then begin;
        real F, W1, T, H;
        real array P[2 : 19];
        P[2] := .3753426182049110-1;
        P[11] := .135335283236613;
        P[3] := .8930646556022810-2;
        P[12] := .49787068367863910-1;
        P[4] := .2423398368658110-2;
        P[13] := .18315638888734210-1;
        P[5] := .7057606934245810-3;
        P[14] := .67379469990854710-2;
        P[6] := .2148027781901310-3;
        P[15] := .24787521766663610-2;
        P[7] := .6737580778101810-4;
        P[16] := .91188196555451610-3;
        P[8] := .2160073015997510-4;
        P[17] := .33546262790251210-3;
        P[9] := .7041157985429210-5;
        P[18] := .12340980408668010-3;
        P[10] := .2325302657028210-5;
        P[19] := .45399929762484810-4;
        F := W := P[N];
        E := P[N + 9];
        W1 := T := 1;
        H := X - N;
        for I := N - 1,
                 I - 1 while ABS(W1) > 10-15 TIMES W do
          begin;
            F := (E - I TIMES F) ÷ N;
            T := -H TIMES T ÷ (N - I);
            W1 := T TIMES F;
            W := W + W1;
        end;
    end else begin;
        procedure NONEXPENX(X, N1, N2, A); code 35087;
        
        array B[N : N];
        NONEXPENX(X, N, N, B);
        W := B[N] TIMES EXP(-X);
    end;
    if N1 = N2 IMPL N1 = N then A[N] := W else begin;
        E := EXP(-X);
        AN := W;
        if N NOTLESS N2 IMPL N NOTLESS N1 then A[N] := W;
        for I := N - 1 step -1 until N1 do
          begin;
            W := (E - I TIMES W) ÷ X;
            if I NOTLESS N2 then A[I] := W;
        end;
        W := AN;
        for I := N + 1 step 1 until N2 do
          begin;
            W := (E - X TIMES W) ÷ (I - 1);
            if I NOTLESS N1 then A[I] := W;
        end;
    end;
end ENX;
comment  ================== 35087 =================
;
procedure NONEXPENX(X, N1, N2, A); 
  value X, N1, N2;
  real X;
  integer N1, N2;
  array A;
begin;
    integer I, N;
    real W, AN;
    N := if X NOTLESS 1.5 then 1 else ENTIER(X + .5);
    if N NOTLESS 10 then begin;
        procedure ENX(X, N1, N2, A); code 35086;
        
        array B[N : N];
        ENX(X, N, N, B);
        W := B[N] TIMES EXP(X);
    end else begin;
        integer K, K1;
        real UE, VE, WE, WE1, UO, VO, WO, WO1, R, S;
        UE := 1;
        VE := WE := 1 ÷ (X + N);
        WE1 := 0;
        UO := 1;
        VO := -N ÷ (X TIMES (X + N + 1));
        WO1 := 1 ÷ X;
        WO := VO + WO1;
        W := (WE + WO) ÷ 2;
        K1 := 1;
        for K := K1 while WO - WE > 10-15 TIMES W IMPL WE > WE1 IMPL WO < WO1 do
          begin;
            WE1 := WE;
            WO1 := WO;
            R := N + K;
            S := R + X + K;
            UE := 1 ÷ (1 - K TIMES (R - 1) TIMES UE ÷ ((S - 2) TIMES S));
            UO := 1 ÷ (1 - K TIMES R TIMES UO ÷ (S TIMES S - 1));
            VE := VE TIMES (UE - 1);
            VO := VO TIMES (UO - 1);
            WE := WE + VE;
            WO := WO + VO;
            W := (WE + WO) ÷ 2;
            K1 := K1 + 1;
        end;
    end;
    AN := W;
    if N NOTLESS N2 IMPL N NOTLESS N1 then A[N] := W;
    for I := N - 1 step -1 until N1 do
      begin;
        W := (1 - I TIMES W) ÷ X;
        if I NOTLESS N2 then A[I] := W;
    end;
    W := AN;
    for I := N + 1 step 1 until N2 do
      begin;
        W := (1 - X TIMES W) ÷ (I - 1);
        if I NOTLESS N1 then A[I] := W;
    end;
end EXPENX;
comment  ================== 35084 =================
;
procedure SINCOSINT(X, SI, CI); 
  value X;
  real X, SI, CI;
begin;
    real ABSX, Z, F, G;
    procedure SINCOSFG(X, F, G); code 35085;
    
    real procedure CHEPOLSER(N, X, A); code 31046;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 4 then begin;
        real array A[0 : 10];
        real Z2;
        A[0] := +2.736870680363010+00;
        A[1] := -1.110631410789410+00;
        A[2] := +1.417656219466610-01;
        A[3] := -1.025265257917410-02;
        A[4] := +4.649461561988010-04;
        A[5] := -1.436173089664210-05;
        A[6] := +3.209368494822910-07;
        A[7] := -5.425199077016210-09;
        A[8] := +7.177628863989510-11;
        A[9] := -7.633549372348210-13;
        A[10] := +6.667995834698310-15;
        Z := X ÷ 4;
        Z2 := Z TIMES Z;
        G := Z2 + Z2 - 1;
        SI := Z TIMES CHEPOLSER(10, G, A);
        A[0] := +2.965960140072710+00;
        A[1] := -9.429719834183010-01;
        A[2] := +8.611034273816910-02;
        A[3] := -4.777608454713910-03;
        A[4] := +1.752916120514610-04;
        A[5] := -4.544872780375210-06;
        A[6] := +8.751583918006010-08;
        A[7] := -1.299869993810910-09;
        A[8] := +1.533897489883110-11;
        A[9] := -1.472425607027710-13;
        A[10] := +1.172142079842910-15;
        CI := .577215664901533 + LN(ABSX) - Z2 TIMES CHEPOLSER(10, G, A);
    end else begin;
        real CX, SX;
        SINCOSFG(X, F, G);
        CX := COS(X);
        SX := SIN(X);
        SI := 1.570796326794897;
        if X < 0 then SI := -SI;
        SI := SI - F TIMES CX - G TIMES SX;
        CI := F TIMES SX - G TIMES CX;
    end;
end SINCOSINT;
comment  ================== 35085 =================
;
procedure SINCOSFG(X, F, G); 
  value X;
  real X, F, G;
begin;
    real ABSX, SI, CI;
    procedure SINCOSINT(X, SI, CI); code 35084;
    
    real procedure CHEPOLSER(N, X, A); code 31046;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 4 then begin;
        real CX, SX;
        SINCOSINT(X, SI, CI);
        CX := COS(X);
        SX := SIN(X);
        SI := SI - 1.570796326794897;
        F := CI TIMES SX - SI TIMES CX;
        G := -CI TIMES CX - SI TIMES SX;
    end else begin;
        real array A[0 : 23];
        A[0] := +9.657882803518510-01;
        A[1] := -4.306083777859710-02;
        A[2] := -7.314371174810410-03;
        A[3] := +1.470523578986810-03;
        A[4] := -9.865768573270210-05;
        A[5] := -2.274320220465510-05;
        A[6] := +9.824025732252610-06;
        A[7] := -1.897343014871310-06;
        A[8] := +1.006343594155810-07;
        A[9] := +8.081936482224110-08;
        A[10] := -3.897628287528810-08;
        A[11] := +1.033565032549710-08;
        A[12] := -1.410434487589710-09;
        A[13] := -2.523207839968310-10;
        A[14] := +2.569983132596110-10;
        A[15] := -1.059788925394810-10;
        A[16] := +2.897003157021410-11;
        A[17] := -4.102314256308310-12;
        A[18] := -1.043769373001810-12;
        A[19] := +1.099418452054710-12;
        A[20] := -5.221423940167910-13;
        A[21] := +1.746992078782910-13;
        A[22] := -3.847001297927910-14;
        F := CHEPOLSER(22, 8 ÷ ABSX - 1, A) ÷ X;
        A[0] := +2.280122063824110-01;
        A[1] := -2.686972741109710-02;
        A[2] := -3.510715728095810-03;
        A[3] := +1.239800863518610-03;
        A[4] := -1.567294511686210-04;
        A[5] := -1.066414179809410-05;
        A[6] := +1.117062934357410-05;
        A[7] := -3.175401165561410-06;
        A[8] := +4.431747352039810-07;
        A[9] := +5.510869687446310-08;
        A[10] := -5.924307871174310-08;
        A[11] := +2.210257338155510-08;
        A[12] := -5.025682754062310-09;
        A[13] := +3.151916825942410-10;
        A[14] := +3.630699084897910-10;
        A[15] := -2.297476423459110-10;
        A[16] := +8.553030942404810-11;
        A[17] := -2.118306772444310-11;
        A[18] := +1.713366264509210-12;
        A[19] := +1.723887751724810-12;
        A[20] := -1.293028136681110-12;
        A[21] := +5.747233922373110-13;
        A[22] := -1.841546826831410-13;
        A[23] := +3.593725657143410-14;
        G := 4 TIMES CHEPOLSER(23, 8 ÷ ABSX - 1, A) ÷ ABSX ÷ ABSX;
    end;
end SINCOSFG;
comment  ================== 35060 =================
;
real procedure RECIP GAMMA(X, ODD, EVEN); 
  value X;
  real X, ODD, EVEN;
begin;
    integer I;
    real ALFA, BETA, X2;
    array B[1 : 12];
    B[1] := -.283876542276024;
    B[2] := -.076852840844786;
    B[3] := +.001706305071096;
    B[4] := +.001271927136655;
    B[5] := +.000076309597586;
    B[6] := -.000004971736704;
    B[7] := -.000000865920800;
    B[8] := -.000000033126120;
    B[9] := +.000000001745136;
    B[10] := +.000000000242310;
    B[11] := +.000000000009161;
    B[12] := -.000000000000170;
    X2 := X TIMES X TIMES 8;
    ALFA := -.000000000000001;
    BETA := 0;
    for I := 12 step -2 until 2 do
      begin;
        BETA := -(ALFA TIMES 2 + BETA);
        ALFA := -BETA TIMES X2 - ALFA + B[I];
    end;
    EVEN := (BETA ÷ 2 + ALFA) TIMES X2 - ALFA + .921870293650453;
    ALFA := -.000000000000034;
    BETA := 0;
    for I := 11 step -2 until 1 do
      begin;
        BETA := -(ALFA TIMES 2 + BETA);
        ALFA := -BETA TIMES X2 - ALFA + B[I];
    end;
    ODD := (ALFA + BETA) TIMES 2;
    RECIP GAMMA := ODD TIMES X + EVEN;
end RECIP GAMMA;
comment  ================== 35061 =================
;
real procedure GAMMA(X); 
  value X;
  real X;
begin;
    real Y, S, F, G, ODD, EVEN;
    Boolean INV;
    real procedure RECIP GAMMA(X, ODD, EVEN); 
      value X;
      real X, ODD, EVEN;
    code 35060;
    real procedure LOG GAMMA(X); 
      value X;
      real X;
    code 35062;
    if X < .5 then begin;
        Y := X - ENTIER(X ÷ 2) TIMES 2;
        S := 3.14159265358979;
        if Y NOTLESS 1 then begin;
            S := -S;
            Y := 2 - Y;
        end;
        if Y NOTLESS .5 then Y := 1 - Y;
        INV := true;
        X := 1 - X;
        F := S ÷ SIN(3.14159265358979 TIMES Y);
    end else INV := false;
    if X > 22 then G := EXP(LOG GAMMA(X)) else begin;
        S := 1;
        NEXT: if X > 1.5 then begin;
            X := X - 1;
            S := S TIMES X;
            goto NEXT;
        end;
        G := S ÷ RECIP GAMMA(1 - X, ODD, EVEN);
    end;
    GAMMA := if INV then F ÷ G else G;
end GAMMA;
comment  ================== 35062 =================
;
real procedure LOG GAMMA(X); 
  value X;
  real X;
if X > 13 then begin;
    real R, X2;
    R := 1;
    NEXT: if X NOTLESS 22 then begin;
        R := R ÷ X;
        X := X + 1;
        goto NEXT;
    end;
    X2 := -1 ÷ (X TIMES X);
    R := LN(R);
    LOG GAMMA := LN(X) TIMES (X - .5) - X + R + .918938533204672 + (((.59523809523809510-3 TIMES X2 + .79365079365079410-3) TIMES X2 + .27777777777777810-2) TIMES X2 + .83333333333333310-1) ÷ X;
end else begin;
    real Y, F, U0, U1, U, Z;
    integer I;
    array B[1 : 18];
    F := 1;
    U0 := U1 := 0;
    B[1] := -.0761141616704358;
    B[2] := +.0084323249659328;
    B[3] := -.0010794937263286;
    B[4] := +.0001490074800369;
    B[5] := -.0000215123998886;
    B[6] := +.0000031979329861;
    B[7] := -.0000004851693012;
    B[8] := +.0000000747148782;
    B[9] := -.0000000116382967;
    B[10] := +.0000000018294004;
    B[11] := -.0000000002896918;
    B[12] := +.0000000000461570;
    B[13] := -.0000000000073928;
    B[14] := +.0000000000011894;
    B[15] := -.0000000000001921;
    B[16] := +.0000000000000311;
    B[17] := -.0000000000000051;
    B[18] := +.0000000000000008;
    if X < 1 then begin;
        F := 1 ÷ X;
        X := X + 1;
    end else NEXT: if X > 2 then begin;
        X := X - 1;
        F := F TIMES X;
        goto NEXT;
    end;
    F := LN(F);
    Y := X + X - 3;
    Z := Y + Y;
    for I := 18 step -1 until 1 do
      begin;
        U := U0;
        U0 := Z TIMES U0 + B[I] - U1;
        U1 := U;
    end;
    LOG GAMMA := (U0 TIMES Y + .491415393029387 - U1) TIMES (X - 1) TIMES (X - 2) + F;
end LOG GAMMA;
comment  ================== 35030 =================
;
procedure INCOMGAM(X, A, KLGAM, GRGAM, GAM, EPS); 
  value X, A, EPS;
  real X, A, KLGAM, GRGAM, GAM, EPS;
begin;
    real C0, C1, C2, D0, D1, D2, X2, AX, P, Q, R, S, R1, R2, SCF;
    integer N;
    S := EXP(-X + A TIMES LN(X));
    SCF := 10+300;
    if X NOTLESS (if A < 3 then 1 else A) then begin;
        X2 := X TIMES X;
        AX := A TIMES X;
        D0 := 1;
        P := A;
        C0 := S;
        D1 := (A + 1) TIMES (A + 2 - X);
        C1 := ((A + 1) TIMES (A + 2) + X) TIMES S;
        R2 := C1 ÷ D1;
        for N := 1,
                 N + 1 while ABS((R2 - R1) ÷ R2) > EPS do
          begin;
            P := 2 + P;
            Q := (P + 1) TIMES (P TIMES (P + 2) - AX);
            R := N TIMES (N + A) TIMES (P + 2) TIMES X2;
            C2 := (Q TIMES C1 + R TIMES C0) ÷ P;
            D2 := (Q TIMES D1 + R TIMES D0) ÷ P;
            R1 := R2;
            R2 := C2 ÷ D2;
            C0 := C1;
            C1 := C2;
            D0 := D1;
            D1 := D2;
            if ABS(C1) > SCF OR ABS(D1) > SCF then begin;
                C0 := C0 ÷ SCF;
                C1 := C1 ÷ SCF;
                D0 := D0 ÷ SCF;
                D1 := D1 ÷ SCF;
            end;
        end;
        KLGAM := R2 ÷ A;
        GRGAM := GAM - KLGAM;
    end else begin;
        C0 := A TIMES S;
        C1 := (1 + X) TIMES C0;
        Q := X + 2 - A;
        D0 := X;
        D1 := X TIMES Q;
        R2 := C1 ÷ D1;
        for N := 1,
                 N + 1 while ABS((R2 - R1) ÷ R2) > EPS do
          begin;
            Q := 2 + Q;
            R := N TIMES (N + 1 - A);
            C2 := Q TIMES C1 - R TIMES C0;
            D2 := Q TIMES D1 - R TIMES D0;
            R1 := R2;
            R2 := C2 ÷ D2;
            C0 := C1;
            C1 := C2;
            D0 := D1;
            D1 := D2;
            if ABS(C1) > SCF OR ABS(D1) > SCF then begin;
                C0 := C0 ÷ SCF;
                C1 := C1 ÷ SCF;
                D0 := D0 ÷ SCF;
                D1 := D1 ÷ SCF;
            end;
        end;
        GRGAM := R2 ÷ A;
        KLGAM := GAM - GRGAM;
    end;
end INCOMGAM;
comment  ================== 35050 =================
;
real procedure INCBETA(X, P, Q, EPS); 
  value X, P, Q, EPS;
  real X, P, Q, EPS;
begin;
    integer M, N;
    real G, F, FN, FN1, FN2, GN, GN1, GN2, DN, PQ;
    Boolean N EVEN, RECUR;
    real procedure GAMMA(X); 
      value X;
      real X;
    code 35061;
    if X = 0 OR X = 1 then INCBETA := X else begin;
        if X > .5 then begin;
            F := P;
            P := Q;
            Q := F;
            X := 1 - X;
            RECUR := true;
        end else RECUR := false;
        G := FN2 := 0;
        M := 0;
        PQ := P + Q;
        F := FN1 := GN1 := GN2 := 1;
        N EVEN := false;
        for N := 1,
                 N + 1 while ABS((F - G) ÷ F) > EPS do
          begin;
            if N EVEN then begin;
                M := M + 1;
                DN := M TIMES X TIMES (Q - M) ÷ (P + N - 1) ÷ (P + N);
            end else DN := -X TIMES (P + M) TIMES (PQ + M) ÷ (P + N - 1) ÷ (P + N);
            G := F;
            FN := FN1 + DN TIMES FN2;
            GN := GN1 + DN TIMES GN2;
            N EVEN := ¬N EVEN;
            F := FN ÷ GN;
            FN2 := FN1;
            FN1 := FN;
            GN2 := GN1;
            GN1 := GN;
        end;
        F := F TIMES X POWER P TIMES (1 - X) POWER Q TIMES GAMMA(P + Q) ÷ GAMMA(P + 1) ÷ GAMMA(Q);
        if RECUR then F := 1 - F;
        INCBETA := F;
    end;
end INCBETA;
comment  ================== 35051 =================
;
procedure IBPPLUSN(X, P, Q, NMAX, EPS, I); 
  value X, P, Q, NMAX, EPS;
  integer NMAX;
  real X, P, Q, EPS;
  array I;
begin;
    integer N;
    procedure IXQFIX(X, P, Q, NMAX, EPS, I); 
      value X, P, Q, NMAX, EPS;
      real X, P, Q, EPS;
      integer NMAX;
      array I;
    code 35053;
    procedure IXPFIX(X, P, Q, NMAX, EPS, I); 
      value X, P, Q, NMAX, EPS;
      real X, P, Q, EPS;
      integer NMAX;
      array I;
    code 35054;
    if X = 0 OR X = 1 then begin;
        for N := 0 step 1 until NMAX do I[N] := X;
    end else begin;
        if X NOTLESS .5 then IXQFIX(X, P, Q, NMAX, EPS, I) else begin;
            IXPFIX(1 - X, Q, P, NMAX, EPS, I);
            for N := 0 step 1 until NMAX do
              I[N] := 1 - I[N];
        end;
    end;
end IBPPLUSN;
comment  ================== 35052 =================
;
procedure IBQPLUSN(X, P, Q, NMAX, EPS, I); 
  value X, P, Q, NMAX, EPS;
  integer NMAX;
  real X, P, Q, EPS;
  array I;
begin;
    integer N;
    procedure IXQFIX(X, P, Q, NMAX, EPS, I); 
      value X, P, Q, NMAX, EPS;
      real X, P, Q, EPS;
      integer NMAX;
      array I;
    code 35053;
    procedure IXPFIX(X, P, Q, NMAX, EPS, I); 
      value X, P, Q, NMAX, EPS;
      real X, P, Q, EPS;
      integer NMAX;
      array I;
    code 35054;
    if X = 0 OR X = 1 then begin;
        for N := 0 step 1 until NMAX do I[N] := X;
    end else begin;
        if X NOTLESS .5 then IXPFIX(X, P, Q, NMAX, EPS, I) else begin;
            IXQFIX(1 - X, Q, P, NMAX, EPS, I);
            for N := 0 step 1 until NMAX do
              I[N] := 1 - I[N];
        end;
    end;
end IBQPLUSN;
comment  ================== 35053 =================
;
procedure IXQFIX(X, P, Q, NMAX, EPS, I); 
  value X, P, Q, NMAX, EPS;
  real X, P, Q, EPS;
  integer NMAX;
  array I;
begin;
    integer M, MMAX;
    real S, IQ0, IQ1, Q0;
    real procedure INCBETA(X, P, Q, EPS); 
      value X, P, Q, EPS;
      real X, P, Q, EPS;
    code 35050;
    procedure FORWARD(X, P, Q, I0, I1, NMAX, I); 
      value X, P, Q, I0, I1, NMAX;
      integer NMAX;
      real X, P, Q, I0, I1;
      array I;
    code 35055;
    procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); 
      value X, P, Q, I0, NMAX, EPS;
      integer NMAX;
      real X, P, Q, I0, EPS;
      array I;
    code 35056;
    M := ENTIER(Q);
    S := Q - M;
    Q0 := if S > 0 then S else S + 1;
    MMAX := if S > 0 then M else M - 1;
    IQ0 := INCBETA(X, P, Q0, EPS);
    if MMAX > 0 then IQ1 := INCBETA(X, P, Q0 + 1, EPS);
    begin;
        array IQ[0 : MMAX];
        FORWARD(X, P, Q0, IQ0, IQ1, MMAX, IQ);
        BACKWARD(X, P, Q, IQ[MMAX], NMAX, EPS, I);
    end;
end IXQFIX;
comment  ================== 35054 =================
;
procedure IXPFIX(X, P, Q, NMAX, EPS, I); 
  value X, P, Q, NMAX, EPS;
  real X, P, Q, EPS;
  integer NMAX;
  array I;
begin;
    integer M, MMAX;
    real S, P0, I0, I1, IQ0, IQ1;
    real procedure INCBETA(X, P, Q, EPS); 
      value X, P, Q, EPS;
      real X, P, Q, EPS;
    code 35050;
    procedure FORWARD(X, P, Q, I0, I1, NMAX, I); 
      value X, P, Q, I0, I1, NMAX;
      integer NMAX;
      real X, P, Q, I0, I1;
      array I;
    code 35055;
    procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); 
      value X, P, Q, I0, NMAX, EPS;
      integer NMAX;
      real X, P, Q, I0, EPS;
      array I;
    code 35056;
    M := ENTIER(P);
    S := P - M;
    P0 := if S > 0 then S else S + 1;
    MMAX := if S > 0 then M else M - 1;
    I0 := INCBETA(X, P0, Q, EPS);
    I1 := INCBETA(X, P0, Q + 1, EPS);
    begin;
        array IP[0 : MMAX];
        BACKWARD(X, P0, Q, I0, MMAX, EPS, IP);
        IQ0 := IP[MMAX];
        BACKWARD(X, P0, Q + 1, I1, MMAX, EPS, IP);
        IQ1 := IP[MMAX];
    end;
    FORWARD(X, P, Q, IQ0, IQ1, NMAX, I);
end IXPFIX;
comment  ================== 35055 =================
;
procedure FORWARD(X, P, Q, I0, I1, NMAX, I); 
  value X, P, Q, I0, I1, NMAX;
  integer NMAX;
  real X, P, Q, I0, I1;
  array I;
begin;
    integer M, N;
    real Y, R, S;
    I[0] := I0;
    if NMAX > 0 then I[1] := I1;
    M := NMAX - 1;
    R := P + Q - 1;
    Y := 1 - X;
    for N := 1 step 1 until M do
      begin;
        S := (N + R) TIMES Y;
        I[N + 1] := ((N + Q + S) TIMES I[N] - S TIMES I[N - 1]) ÷ (N + Q);
    end;
end FORWARD;
comment  ================== 35056 =================
;
procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); 
  value X, P, Q, I0, NMAX, EPS;
  integer NMAX;
  real X, P, Q, I0, EPS;
  array I;
begin;
    integer M, N, NU;
    real R, PQ, Y, LOGX;
    array IAPPROX[0 : NMAX];
    I[0] := I0;
    if NMAX > 0 then begin;
        for N := 1 step 1 until NMAX do
          IAPPROX[N] := 0;
        PQ := P + Q - 1;
        LOGX := LN(X);
        R := NMAX + (LN(EPS) + Q TIMES LN(NMAX)) ÷ LOGX;
        NU := ENTIER(R - Q TIMES LN(R) ÷ LOGX);
        L1: N := NU;
        R := X;
        L2: Y := (N + PQ) TIMES X;
        R := Y ÷ (Y + (N + P) TIMES (1 - R));
        if N NOTLESS NMAX then I[N] := R;
        N := N - 1;
        if N NOTLESS 1 then goto L2;
        R := I0;
        for N := 1 step 1 until NMAX do
          R := I[N] := I[N] TIMES R;
        for N := 1 step 1 until NMAX do
          if ABS((I[N] - IAPPROX[N]) ÷ I[N]) > EPS then begin;
            for M := 1 step 1 until NMAX do
              IAPPROX[M] := I[M];
            NU := NU + 5;
            goto L1;
        end;
    end;
end BACKWARD;
comment  ================== 34150 =================
;
Boolean procedure ZEROIN(X, Y, FX, TOLX);
  real X, Y, FX, TOLX;
begin;
    integer EXT;
    real C, FC, B, FB, A, FA, D, FD, FDB, FDA, W, MB, TOL, M, P, Q, DW;
    DW := DWARF;
    B := X;
    FB := FX;
    A := X := Y;
    FA := FX;
    INTERPOLATE: C := A;
    FC := FA;
    EXT := 0;
    EXTRAPOLATE: if ABS(FC) < ABS(FB) then begin;
        if C NOTEQUAL A then begin;
            D := A;
            FD := FA;
        end;
        A := B;
        FA := FB;
        B := X := C;
        FB := FC;
        C := A;
        FC := FA;
    end INTERCHANGE;
    TOL := TOLX;
    M := (C + B) TIMES 0.5;
    MB := M - B;
    if ABS(MB) > TOL then begin;
        if EXT > 2 then W := MB else begin;
            TOL := TOL TIMES SIGN(MB);
            P := (B - A) TIMES FB;
            if EXT NOTLESS 1 then Q := FA - FB else begin;
                FDB := (FD - FB) ÷ (D - B);
                FDA := (FD - FA) ÷ (D - A);
                P := FDA TIMES P;
                Q := FDB TIMES FA - FDA TIMES FB;
            end;
            if P < 0 then begin;
                P := -P;
                Q := -Q;
            end;
            W := if P < DW OR P NOTLESS Q TIMES TOL then TOL else if P < MB TIMES Q then P ÷ Q else MB;
        end;
        D := A;
        FD := FA;
        A := B;
        FA := FB;
        X := B := B + W;
        FB := FX;
        if (if FC NOTLESS 0 then FB NOTLESS 0 else FB NOTLESS 0) then goto INTERPOLATE else begin;
            EXT := if W = MB then 0 else EXT + 1;
            goto EXTRAPOLATE;
        end;
    end;
    Y := C;
    ZEROIN := if FC NOTLESS 0 then FB NOTLESS 0 else FB NOTLESS 0;
end ZEROIN;
comment  ================== 34440 =================
;
procedure MARQUARDT(M, N, PAR, G, V, FUNCT, JACOBIAN, IN, OUT); 
  value M, N;
  integer M, N;
  array PAR, G, V, IN, OUT;
  Boolean procedure FUNCT;
  procedure JACOBIAN;
begin;
    integer MAXFE, FE, IT, I, J, ERR;
    real VV, WW, W, MU, RES, FPAR, FPARPRES, LAMBDA, LAMBDAMIN, P, PW, RELTOLRES, ABSTOLRES;
    array EM[0 : 7], VAL, B, BB, PARPRES[1 : N], JAC[1 : M, 1 : N];
    procedure MULCOL(L, U, S, T, A, B, X); code 31022;
    
    procedure DUPVEC(L, U, S, A, B); code 31030;
    
    real procedure VECVEC(L, U, S, A, B); code 34010;
    
    real procedure MATVEC(L, U, S, A, B); code 34011;
    
    real procedure TAMVEC(L, U, S, A, B); code 34012;
    
    real procedure MATTAM(L, U, S, T, A, B); code 34015;
    
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); code 34273;
    
    procedure LOCFUNCT(M, N, PAR, G);
      integer M, N;
      array PAR, G;
    begin;
        FE := FE + 1;
        if FE NOTLESS MAXFE then ERR := 1 else if ¬FUNCT(M, N, PAR, G) then ERR := 2;
        if ERR NOTEQUAL 0 then goto EXIT;
    end LOCFUNCT;
    VV := 10;
    W := 0.5;
    MU := 0.01;
    WW := (if IN[6] < 10-7 then 10-8 else 10-1 TIMES IN[6]);
    EM[0] := EM[2] := EM[6] := IN[0];
    EM[4] := 10 TIMES N;
    RELTOLRES := IN[3];
    ABSTOLRES := IN[4] POWER 2;
    MAXFE := IN[5];
    ERR := 0;
    FE := IT := 1;
    P := FPAR := RES := 0;
    PW := -LN(WW TIMES IN[0]) ÷ 2.30;
    if ¬FUNCT(M, N, PAR, G) then begin;
        ERR := 3;
        goto ESCAPE;
    end;
    FPAR := VECVEC(1, M, 0, G, G);
    OUT[3] := SQRT(FPAR);
    for IT := 1,
             IT + 1 while FPAR > ABSTOLRES IMPL RES > RELTOLRES TIMES FPAR + ABSTOLRES do
      begin;
        JACOBIAN(M, N, PAR, G, JAC, LOCFUNCT);
        I := QRISNGVALDEC(JAC, M, N, VAL, V, EM);
        if IT = 1 then LAMBDA := IN[6] TIMES VECVEC(1, N, 0, VAL, VAL) else if P = 0 then LAMBDA := LAMBDA TIMES W else P := 0;
        for I := 1 step 1 until N do
          B[I] := VAL[I] TIMES TAMVEC(1, M, I, JAC, G);
        L: for I := 1 step 1 until N do
          BB[I] := B[I] ÷ (VAL[I] TIMES VAL[I] + LAMBDA);
        for I := 1 step 1 until N do
          PARPRES[I] := PAR[I] - MATVEC(1, N, I, V, BB);
        LOCFUNCT(M, N, PARPRES, G);
        FPARPRES := VECVEC(1, M, 0, G, G);
        RES := FPAR - FPARPRES;
        if RES < MU TIMES VECVEC(1, N, 0, B, BB) then begin;
            P := P + 1;
            LAMBDA := VV TIMES LAMBDA;
            if P = 1 then begin;
                LAMBDAMIN := WW TIMES VECVEC(1, N, 0, VAL, VAL);
                if LAMBDA < LAMBDAMIN then LAMBDA := LAMBDAMIN;
            end;
            if P < PW then goto L else begin;
                ERR := 4;
                goto EXIT;
            end;
            ;
        end;
        DUPVEC(1, N, 0, PAR, PARPRES);
        FPAR := FPARPRES;
    end ITERATION;
    EXIT: for I := 1 step 1 until N do
      MULCOL(1, N, I, I, JAC, V, 1 ÷ (VAL[I] + IN[0]));
    for I := 1 step 1 until N do
      for J := 1 step 1 until I do
      V[I, J] := V[J, I] := MATTAM(1, N, I, J, JAC, JAC);
    LAMBDA := LAMBDAMIN := VAL[1];
    for I := 2 step 1 until N do
      if VAL[I] > LAMBDA then LAMBDA := VAL[I] else if VAL[I] < LAMBDAMIN then LAMBDAMIN := VAL[I];
    OUT[7] := (LAMBDA ÷ (LAMBDAMIN + IN[0])) POWER 2;
    OUT[2] := SQRT(FPAR);
    OUT[6] := SQRT(RES + FPAR) - OUT[2];
    ESCAPE: OUT[4] := FE;
    OUT[5] := IT - 1;
    OUT[1] := ERR;
end MARQUARDT;
comment  ================== 33135 =================
;
procedure IMPEX(N, T0, TEND, Y0, DERIV, AVAILABLE, H0, HMAX, PRESCH, EPS, WEIGHTS, UPDATE, FAIL, CONTROL); 
  value N;
  integer N;
  real T0, TEND, H0, HMAX, EPS;
  Boolean PRESCH, FAIL;
  array Y0, WEIGHTS;
  Boolean procedure AVAILABLE;
  procedure DERIV, UPDATE, CONTROL;
begin;
    integer I, K, ECI;
    real T, T1, T2, T3, TP, H, H2, HNEW, ALF, LQ;
    array Y, Z, S1, S2, S3, U1, U3, W1, W2, W3, EHR[1 : N], R, RF[1 : 5, 1 : N], ERR[1 : 3], A1, A2[1 : N, 1 : N];
    integer array PS1, PS2[1 : N];
    Boolean START, TWO, HALV;
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure INIMAT(LR, UR, LC, UC, A, X); code 31011;
    
    procedure MULVEC(L, U, SHIFT, A, B, X); code 31020;
    
    procedure MULROW(L, U, I, J, A, B, X); code 31021;
    
    procedure DUPVEC(L, U, SHIFT, A, B); code 31030;
    
    procedure DUPROWVEC(L, U, I, A, B); code 31032;
    
    procedure DUPMAT(L, U, I, J, A, B); code 31035;
    
    real procedure VECVEC(L, U, SHIFT, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020;
    
    procedure ELMROW(L, U, I, J, A, B, X); code 34024;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure SOL(A, N, P, B); code 34051;
    
    procedure DFDY(T, Y, A);
      real T;
      array Y, A;
    begin;
        integer I, J;
        real SL;
        array F1, F2[1 : N];
        DERIV(T, Y, F1, N);
        for I := 1 step 1 until N do
          begin;
            SL := 10-6 TIMES Y[I];
            if ABS(SL) < 10-6 then SL := 10-6;
            Y[I] := Y[I] + SL;
            DERIV(T, Y, F2, N);
            for J := 1 step 1 until N do
              A[J, I] := (F2[J] - F1[J]) ÷ SL;
            Y[I] := Y[I] - SL;
            ;
        end;
    end DFDY;
    procedure STARTV(Y, T); 
      value T;
      real T;
      array Y;
    begin;
        real A, B, C;
        A := (T - T1) ÷ (T1 - T2);
        B := (T - T2) ÷ (T1 - T3);
        C := (T - T1) ÷ (T2 - T3) TIMES B;
        B := A TIMES B;
        A := 1 + A + B;
        B := A + C - 1;
        MULVEC(1, N, 0, Y, S1, A);
        ELMVEC(1, N, 0, Y, S2, -B);
        ELMVEC(1, N, 0, Y, S3, C);
    end STARTV;
    procedure ITERATE(Z, Y, A, H, T, WEIGHTS, FAIL, PS);
      array Z, Y, A, WEIGHTS;
      real H, T;
      label FAIL;
      integer array PS;
    begin;
        integer IT, LIT;
        real MAX, MAX1, CONV;
        array DZ, F1[1 : N];
        for I := 1 step 1 until N do
          Z[I] := (Z[I] + Y[I]) ÷ 2;
        IT := LIT := 1;
        CONV := 1;
        ATER: DERIV(T, Z, F1, N);
        for I := 1 step 1 until N do
          F1[I] := DZ[I] := Z[I] - H TIMES F1[I] ÷ 2 - Y[I];
        SOL(A, N, PS, DZ);
        ELMVEC(1, N, 0, Z, DZ, -1);
        MAX := 0;
        for I := 1 step 1 until N do
          MAX := MAX + (WEIGHTS[I] TIMES DZ[I]) POWER 2;
        MAX := SQRT(MAX);
        if MAX TIMES CONV < EPS ÷ 10 then goto OUT;
        IT := IT + 1;
        if IT = 2 then goto ASS;
        CONV := MAX ÷ MAX1;
        if CONV > .2 then begin;
            if LIT = 0 then goto FAIL;
            LIT := 0;
            CONV := 1;
            IT := 1;
            RECOMP(A, H, T, Z, FAIL, PS);
            ;
        end;
        ASS: MAX1 := MAX;
        goto ATER;
        OUT: for I := 1 step 1 until N do
          Z[I] := 2 TIMES Z[I] - Y[I];
        ;
    end ITERATE;
    procedure RECOMP(A, H, T, Y, FAIL, PS);
      real H, T;
      array A, Y;
      label FAIL;
      integer array PS;
    begin;
        real SL;
        array AUX[1 : 3];
        SL := H ÷ 2;
        if ¬AVAILABLE(T, Y, A, N) then DFDY(T, Y, A);
        for I := 1 step 1 until N do
          begin;
            MULROW(1, N, I, I, A, A, -SL);
            A[I, I] := 1 + A[I, I];
        end;
        AUX[2] := 10-14;
        DEC(A, N, AUX, PS);
        if AUX[3] < N then goto FAIL;
    end RECOMP;
    procedure INITIALIZATION;
    begin;
        H2 := HNEW;
        H := H2 ÷ 2;
        DUPVEC(1, N, 0, S1, Y0);
        DUPVEC(1, N, 0, S2, Y0);
        DUPVEC(1, N, 0, S3, Y0);
        DUPVEC(1, N, 0, W1, Y0);
        DUPROWVEC(1, N, 1, R, Y0);
        INIVEC(1, N, U1, 0);
        INIVEC(1, N, W2, 0);
        INIMAT(2, 5, 1, N, R, 0);
        INIMAT(1, 5, 1, N, RF, 0);
        T := T1 := T0;
        T2 := T0 - 2 TIMES H - 106;
        T3 := 2 TIMES T2 + 1;
        RECOMP(A1, H, T, S1, MISS, PS1);
        RECOMP(A2, H2, T, W1, MISS, PS2);
        ;
    end procedureONE_LARGE_STEP;
    begin;
        STARTV(Z, T + H);
        ITERATE(Z, S1, A1, H, T + H ÷ 2, WEIGHTS, MISS, PS1);
        DUPVEC(1, N, 0, Y, Z);
        STARTV(Z, T + H2);
        ITERATE(Z, Y, A1, H, T + 3 TIMES H ÷ 2, WEIGHTS, MISS, PS1);
        DUPVEC(1, N, 0, U3, U1);
        DUPVEC(1, N, 0, U1, Y);
        DUPVEC(1, N, 0, S3, S2);
        DUPVEC(1, N, 0, S2, S1);
        DUPVEC(1, N, 0, S1, Z);
        ELMVEC(1, N, 0, Z, W1, 1);
        ELMVEC(1, N, 0, Z, S2, -1);
        ITERATE(Z, W1, A2, H2, T + H, WEIGHTS, MISS, PS2);
        T3 := T2;
        T2 := T1;
        T1 := T + H2;
        DUPVEC(1, N, 0, W3, W2);
        DUPVEC(1, N, 0, W2, W1);
        DUPVEC(1, N, 0, W1, Z);
        ;
    end;
    procedure CHANGE OF INFORMATION;
    begin;
        real ALF1, C1, C2, C3;
        array KOF[2 : 4, 2 : 4], E, D[1 : 4];
        C1 := HNEW ÷ H2;
        C2 := C1 TIMES C1;
        C3 := C2 TIMES C1;
        KOF[2, 2] := C1;
        KOF[2, 3] := (C1 - C2) ÷ 2;
        KOF[2, 4] := C3 ÷ 6 - C2 ÷ 2 + C1 ÷ 3;
        KOF[3, 3] := C2;
        KOF[3, 4] := C2 - C3;
        KOF[4, 4] := C3;
        for I := 1 step 1 until N do
          U1[I] := R[2, I] + R[3, I] ÷ 2 + R[4, I] ÷ 3;
        ALF1 := MATVEC(1, N, 1, RF, U1) ÷ VECVEC(1, N, 0, U1, U1);
        ALF := (ALF + ALF1) TIMES C1;
        for I := 1 step 1 until N do
          begin;
            E[1] := RF[1, I] - ALF1 TIMES U1[I];
            E[2] := RF[2, I] - ALF1 TIMES 2 TIMES R[3, I];
            E[3] := RF[3, I] - ALF1 TIMES 4 TIMES R[4, I];
            E[4] := RF[4, I];
            D[1] := R[1, I];
            RF[1, I] := E[1] := E[1] TIMES C2;
            for K := 2 step 1 until 4 do
              begin;
                R[K, I] := D[K] := MATMAT(K, 4, K, I, KOF, R);
                RF[K, I] := E[K] := C2 TIMES MATVEC(K, 4, K, KOF, E);
            end K;
            S1[I] := D[1] + E[1];
            W1[I] := D[1] + 4 TIMES E[1];
            S2[I] := S1[I] - (D[2] + E[2] ÷ 2);
            S3[I] := S2[I] - (D[2] + E[2]) + (D[3] + E[3] ÷ 2);
            ;
        end I;
        T3 := T - HNEW;
        T2 := T - HNEW ÷ 2;
        T1 := T;
        H2 := HNEW;
        H := H2 ÷ 2;
        ERR[1] := 0;
        if HALV then begin;
            DUPVEC(1, N, 0, PS2, PS1);
            DUPMAT(1, N, 1, N, A2, A1);
        end;
        if TWO then begin;
            DUPVEC(1, N, 0, PS1, PS2);
            DUPMAT(1, N, 1, N, A1, A2);
        end else RECOMP(A1, HNEW ÷ 2, T, S1, MISS, PS1);
        if ¬HALV then RECOMP(A2, HNEW, T, W1, MISS, PS2);
        ;
    end;
    procedure BACKWARD DIFFERENCES;
    for I := 1 step 1 until N do
      begin;
        real B0, B1, B2, B3;
        B1 := (U1[I] + 2 TIMES S2[I] + U3[I]) ÷ 4;
        B2 := (W1[I] + 2 TIMES W2[I] + W3[I]) ÷ 4;
        B3 := (S3[I] + 2 TIMES U3[I] + S2[I]) ÷ 4;
        B2 := (B2 - B1) ÷ 3;
        B0 := B1 - B2;
        B2 := B2 - (S1[I] - 2 TIMES S2[I] + S3[I]) ÷ 16;
        B1 := 2 TIMES B3 - (B2 + RF[1, I]) - (B0 + R[1, I]) ÷ 2;
        B3 := 0;
        for K := 1 step 1 until 4 do
          begin;
            B1 := B1 - B3;
            B3 := R[K, I];
            R[K, I] := B0;
            B0 := B0 - B1;
        end;
        R[5, I] := B0;
        for K := 1 step 1 until 4 do
          begin;
            B3 := RF[K, I];
            RF[K, I] := B2;
            B2 := B2 - B3;
        end;
        RF[5, I] := B2;
        ;
    end;
    procedure ERROR ESTIMATES;
    begin;
        real C0, C1, C2, C3, B0, B1, B2, B3, W, SL1, SN, LR;
        C0 := C1 := C2 := C3 := 0;
        for I := 1 step 1 until N do
          begin;
            W := WEIGHTS[I] POWER 2;
            B0 := RF[4, I] ÷ 36;
            C0 := C0 + B0 TIMES B0 TIMES W;
            LR := ABS(B0);
            B1 := RF[1, I] + ALF TIMES R[2, I];
            C1 := C1 + B1 TIMES B1 TIMES W;
            B2 := RF[3, I];
            C2 := C2 + B2 TIMES B2 TIMES W;
            SL1 := ABS(RF[1, I] - RF[2, I]);
            SN := if SL1 < 10-10 then 1 else ABS(RF[1, I] - R[4, I] ÷ 6) ÷ SL1;
            if SN > 1 then SN := 1;
            if START then begin;
                SN := SN POWER 4;
                LR := LR TIMES 4;
            end;
            EHR[I] := B3 := SN TIMES EHR[I] + LR;
            C3 := C3 + B3 TIMES B3 TIMES W;
            ;
        end I;
        B0 := ERR[1];
        ERR[1] := B1 := SQRT(C0);
        ERR[2] := SQRT(C1);
        ERR[3] := SQRT(C3) + SQRT(C2) ÷ 2;
        LQ := EPS ÷ (if B0 < B1 then B1 else B0);
        if B0 < B1 IMPL LQ NOTLESS 80 then LQ := 10;
        ;
    end;
    procedure REJECT;
    if START then begin;
        HNEW := LQ POWER (1 ÷ 5) TIMES H ÷ 2;
        goto INIT;
    end else begin;
        for K := 1,
                 2,
                 3,
                 4,
                 1,
                 2,
                 3 do
          ELMROW(1, N, K, K + 1, R, R, -1);
        for K := 1,
                 2,
                 3,
                 4 do
          ELMROW(1, N, K, K + 1, RF, RF, -1);
        T := T - H2;
        HALV := true;
        HNEW := H;
        goto MSTP;
    end;
    procedure STEPSIZE;
    if LQ < 2 then begin;
        HALV := true;
        HNEW := H;
    end else begin;
        if LQ > 80 then HNEW := (if LQ > 5120 then (LQ ÷ 5) POWER (1 ÷ 5) else 2) TIMES H2;
        if HNEW > HMAX then HNEW := HMAX;
        if TEND > T IMPL TEND - T < HNEW then HNEW := TEND - T;
        TWO := HNEW = 2 TIMES H2;
        ;
    end;
    if PRESCH then H := H0 else begin;
        if H0 > HMAX then H := HMAX else H := H0;
        if H > (TEND - T0) ÷ 4 then H := (TEND - T0) ÷ 4;
        ;
    end;
    HNEW := H;
    ALF := 0;
    T := TP := T0;
    INIVEC(1, 3, ERR, 0);
    INIVEC(1, N, EHR, 0);
    DUPROWVEC(1, N, 1, R, Y0);
    CONTROL(TP, T, H, HNEW, R, ERR, N);
    INIT: INITIALIZATION;
    START := true;
    for ECI := 0,
             1,
             2,
             3 do
      begin;
        ONE LARGE STEP;
        T := T + H2;
        if ECI > 0 then begin;
            BACKWARD DIFFERENCES;
            UPDATE(WEIGHTS, S2, N);
        end;
    end;
    ECI := 4;
    MSTP: if HNEW NOTEQUAL H2 then begin;
        ECI := 1;
        CHANGE OF INFORMATION;
        ONE LARGE STEP;
        T := T + H2;
        ECI := 2;
        ;
    end;
    ONE LARGE STEP;
    BACKWARD DIFFERENCES;
    UPDATE(WEIGHTS, S2, N);
    ERROR ESTIMATES;
    if ECI < 4 IMPL LQ > 80 then LQ := 20;
    HALV := TWO := false;
    if PRESCH then goto TRYCK;
    if LQ < 1 then REJECT else STEPSIZE;
    TRYCK: if TP NOTLESS T then CONTROL(TP, T, H, HNEW, R, ERR, N);
    if START then START := false;
    if HNEW = H2 then T := T + H2;
    ECI := ECI + 1;
    if T < TEND + H2 then goto MSTP else goto END;
    MISS: FAIL := PRESCH;
    if ¬FAIL then begin;
        if ECI > 1 then T := T - H2;
        HALV := TWO := false;
        HNEW := H2 ÷ 2;
        if START then goto INIT else goto TRYCK;
    end;
    END: ;
end IMPEX;
comment  ================== 35021 =================
;
procedure ERRORFUNCTION(X, ERF, ERFC); 
  value X;
  real X, ERF, ERFC;
if X > 26 then begin;
    ERF := 1;
    ERFC := 0;
end else if X < -5.5 then begin;
    ERF := -1;
    ERFC := 2;
end else begin;
    real ABSX, C, P, Q;
    real procedure NONEXPERFC(X); code 35022;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 0.5 then begin;
        C := X TIMES X;
        P := ((-0.35609843701815410-1 TIMES C + 0.69963834886191410+1) TIMES C + 0.21979261618294210+2) TIMES C + 0.24266795523053210+3;
        Q := ((C + 0.15082797630407810+2) TIMES C + 0.91164905404514910+2) TIMES C + 0.21505887586986110+3;
        ERF := X TIMES P ÷ Q;
        ERFC := 1 - ERF;
    end else begin;
        ERFC := EXP(-X TIMES X) TIMES NONEXPERFC(ABSX);
        ERF := 1 - ERFC;
        if X < 0 then begin;
            ERF := -ERF;
            ERFC := 2 - ERFC;
        end;
    end;
end ERRORFUNCTION;
comment  ================== 35022 =================
;
real procedure NONEXPERFC(X); 
  value X;
  real X;
begin;
    real ABSX, ERF, ERFC, C, P, Q;
    procedure ERRORFUNCTION(X, ERF, ERFC); code 35021;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 0.5 then begin;
        ERRORFUNCTION(X, ERF, ERFC);
        NONEXPERFC := EXP(X TIMES X) TIMES ERFC;
    end else if ABSX < 4 then begin;
        C := ABSX;
        P := ((((((-0.13686485738271710-6 TIMES C + 0.56419551747897410+0) TIMES C + 0.72117582508830910+1) TIMES C + 0.43162227222056710+2) TIMES C + 0.15298928504694010+3) TIMES C + 0.33932081673434410+3) TIMES C + 0.45191895371187310+3) TIMES C + 0.30045926102016210+3;
        Q := ((((((C + 0.12782727319629410+2) TIMES C + 0.77000152935229510+2) TIMES C + 0.27758544474398810+3) TIMES C + 0.63898026446563110+3) TIMES C + 0.93135409485061010+3) TIMES C + 0.79095092532789810+3) TIMES C + 0.30045926095698310+3;
        NONEXPERFC := if X > 0 then P ÷ Q else EXP(X TIMES X) TIMES 2 - P ÷ Q;
    end else begin;
        C := 1 ÷ X ÷ X;
        P := (((0.22319245973418510-1 TIMES C + 0.27866130860964810-0) TIMES C + 0.22695659353968710-0) TIMES C + 0.49473091062325110-1) TIMES C + 0.29961070770354210-2;
        Q := (((C + 0.19873320181713510+1) TIMES C + 0.10516751070679310+1) TIMES C + 0.19130892610783010+0) TIMES C + 0.10620923052846810-1;
        C := (C TIMES (-P) ÷ Q + 0.564189583547756) ÷ ABSX;
        NONEXPERFC := if X > 0 then C else EXP(X TIMES X) TIMES 2 - C;
    end;
end NONEXPERFC;
comment  ================== 35027 =================
;
procedure FRESNEL(X, C, S); 
  value X;
  real X, C, S;
begin;
    real ABSX, X3, X4, A, P, Q, F, G, C1, S1;
    procedure FG(X, F, G); code 35028;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 1.2 then begin;
        A := X TIMES X;
        X3 := A TIMES X;
        X4 := A TIMES A;
        P := (((5.4771138568268710-6 TIMES X4 - 5.2807965137262310-4) TIMES X4 + 1.7619395254349110-2) TIMES X4 - 1.9946089882618410-1) TIMES X4 + 1;
        Q := (((1.1893890142287610-7 TIMES X4 + 1.5523788527699410-5) TIMES X4 + 1.0995721502564210-3) TIMES X4 + 4.7279211201045310-2) TIMES X4 + 1;
        C := X TIMES P ÷ Q;
        P := (((6.7174846662514110-7 TIMES X4 - 8.4555728435277710-5) TIMES X4 + 3.8778212346368310-3) TIMES X4 - 7.0748991514452310-2) TIMES X4 + 5.2359877559829910-1;
        Q := (((5.9528122767841010-8 TIMES X4 + 9.6269087593903410-6) TIMES X4 + 8.1709194215213410-4) TIMES X4 + 4.1122315114238410-2) TIMES X4 + 1;
        S := X3 TIMES P ÷ Q;
    end else if ABSX NOTLESS 1.6 then begin;
        A := X TIMES X;
        X3 := A TIMES X;
        X4 := A TIMES A;
        P := ((((-5.6829331012187110-8 TIMES X4 + 1.0236543505610610-5) TIMES X4 - 6.7137603469492210-4) TIMES X4 + 1.9187027943174710-2) TIMES X4 - 2.0707336033532410-1) TIMES X4 + 1.0000000000011110+0;
        Q := ((((4.4170137406501010-10 TIMES X4 + 8.7794537789236910-8) TIMES X4 + 1.0134463086674910-5) TIMES X4 + 7.8890524505236010-4) TIMES X4 + 3.9666749695232310-2) TIMES X4 + 1;
        C := X TIMES P ÷ Q;
        P := ((((-5.7676581559308910-9 TIMES X4 + 1.2853104374272510-6) TIMES X4 - 1.0954002391143510-4) TIMES X4 + 4.3073052650436710-3) TIMES X4 - 7.3776691401019110-2) TIMES X4 + 5.2359877559834410-1;
        Q := ((((2.0553912445858010-10 TIMES X4 + 5.0309058124661210-8) TIMES X4 + 6.8708626571862010-6) TIMES X4 + 6.1822462019547310-4) TIMES X4 + 3.5339834276747210-2) TIMES X4 + 1;
        S := X3 TIMES P ÷ Q;
    end else if ABSX < 1015 then begin;
        FG(X, F, G);
        A := X TIMES X;
        A := (A - ENTIER(A ÷ 4) TIMES 4) TIMES 1.57079632679490;
        C1 := COS(A);
        S1 := SIN(A);
        A := if X < 0 then -0.5 else 0.5;
        C := F TIMES S1 - G TIMES C1 + A;
        S := -F TIMES C1 - G TIMES S1 + A;
    end else C := S := SIGN(X) TIMES 0.5;
end FRESNEL;
comment  ================== 35028 =================
;
procedure FG(X, F, G); 
  value X;
  real X, F, G;
begin;
    real ABSX, C, S, C1, S1, A, XINV, X3INV, C4, P, Q;
    procedure FRESNEL(X, C, S); code 35027;
    
    ABSX := ABS(X);
    if ABSX NOTLESS 1.6 then begin;
        FRESNEL(X, C, S);
        A := X TIMES X TIMES 1.57079632679490;
        C1 := COS(A);
        S1 := SIN(A);
        A := if X < 0 then -0.5 else 0.5;
        P := A - C;
        Q := A - S;
        F := Q TIMES C1 - P TIMES S1;
        G := P TIMES C1 + Q TIMES S1;
    end else if ABSX NOTLESS 1.9 then begin;
        XINV := 1 ÷ X;
        A := XINV TIMES XINV;
        X3INV := A TIMES XINV;
        C4 := A TIMES A;
        P := (((1.3530423554038810+1 TIMES C4 + 6.9853426160102110+1) TIMES C4 + 4.8034065557792510+1) TIMES C4 + 8.0358812280394210+0) TIMES C4 + 3.1830926850490610-1;
        Q := (((6.5563064008391610+1 TIMES C4 + 2.4956199380517210+2) TIMES C4 + 1.5761100558012310+2) TIMES C4 + 2.5549161843579510+1) TIMES C4 + 1;
        F := XINV TIMES P ÷ Q;
        P := ((((2.0542143249850110+1 TIMES C4 + 1.9623203797166310+2) TIMES C4 + 1.9918281867890310+2) TIMES C4 + 5.3112281348098910+1) TIMES C4 + 4.4453382755051210+0) TIMES C4 + 1.0132061881027510-1;
        Q := ((((1.0137948339600310+3 TIMES C4 + 3.4811214785654510+3) TIMES C4 + 2.5447313318182210+3) TIMES C4 + 5.8359057571642910+2) TIMES C4 + 4.5392501967368910+1) TIMES C4 + 1;
        G := X3INV TIMES P ÷ Q;
    end else if ABSX NOTLESS 2.4 then begin;
        XINV := 1 ÷ X;
        A := XINV TIMES XINV;
        X3INV := A TIMES XINV;
        C4 := A TIMES A;
        P := ((((7.1770324936514010+2 TIMES C4 + 3.0914516157443010+3) TIMES C4 + 1.9300764078671610+3) TIMES C4 + 3.3983713492698410+2) TIMES C4 + 1.9588394102196910+1) TIMES C4 + 3.1830988182201710-1;
        Q := ((((3.3612169918055110+3 TIMES C4 + 1.0933424898880910+4) TIMES C4 + 6.3374715585114410+3) TIMES C4 + 1.0853506750065010+3) TIMES C4 + 6.1842713817288710+1) TIMES C4 + 1;
        F := XINV TIMES P ÷ Q;
        P := ((((3.1333016306875610+2 TIMES C4 + 1.5926800608535410+3) TIMES C4 + 9.0831174952959410+2) TIMES C4 + 1.4095961791131610+2) TIMES C4 + 7.1120500178978310+0) TIMES C4 + 1.0132116176180510-1;
        Q := ((((1.1514983237626110+4 TIMES C4 + 2.4131556721337010+4) TIMES C4 + 1.0672967803058110+4) TIMES C4 + 1.4905192279732910+3) TIMES C4 + 7.1712859693930210+1) TIMES C4 + 1;
        G := X3INV TIMES P ÷ Q;
    end else begin;
        XINV := 1 ÷ X;
        A := XINV TIMES XINV;
        X3INV := A TIMES XINV;
        C4 := A TIMES A;
        P := ((((2.6129475322514210+4 TIMES C4 + 6.1354711361470010+4) TIMES C4 + 1.3492202817185710+4) TIMES C4 + 8.1634340178437510+2) TIMES C4 + 1.6479771284124610+1) TIMES C4 + 9.6754603296709010-2;
        Q := ((((1.3701236481722610+6 TIMES C4 + 1.0010547890079110+6) TIMES C4 + 1.6594646262185310+5) TIMES C4 + 9.0182759623152410+3) TIMES C4 + 1.7387169067364910+2) TIMES C4 + 1;
        F := (C4 TIMES (-P) ÷ Q + 0.318309886183791) TIMES XINV;
        P := (((((1.7259022465483710+6 TIMES C4 + 6.6690706166863610+6) TIMES C4 + 1.7775895083803010+6) TIMES C4 + 1.3567886781375610+5) TIMES C4 + 3.8775414174637810+3) TIMES C4 + 4.3171015782335810+1) TIMES C4 + 1.5398973381976910-1;
        Q := (((((1.4062244112358010+8 TIMES C4 + 9.3869586253163510+7) TIMES C4 + 1.6209560050023210+7) TIMES C4 + 1.0287869305668810+6) TIMES C4 + 2.6918318039624310+4) TIMES C4 + 2.8673319497589910+2) TIMES C4 + 1;
        G := (C4 TIMES (-P) ÷ Q + 0.101321183642338) TIMES X3INV;
    end;
end FG;
comment  ================== 34453 =================
;
Boolean procedure ZEROINDER(X, Y, FX, DFX, TOLX);
  real X, Y, FX, DFX, TOLX;
begin;
    integer EXT;
    real B, FB, DFB, A, FA, DFA, C, FC, DFC, D, W, MB, TOL, M, P, Q, DW;
    real procedure DWARF; code 30003;
    
    DW := DWARF;
    B := X;
    FB := FX;
    DFB := DFX;
    A := X := Y;
    FA := FX;
    DFA := DFX;
    INTERPOLATE: C := A;
    FC := FA;
    DFC := DFA;
    EXT := 0;
    EXTRAPOLATE: if ABS(FC) < ABS(FB) then begin;
        A := B;
        FA := FB;
        DFA := DFB;
        B := X := C;
        FB := FC;
        DFB := DFC;
        C := A;
        FC := FA;
        DFC := DFA;
    end INTERCHANGE;
    TOL := TOLX;
    M := (C + B) TIMES 0.5;
    MB := M - B;
    if ABS(MB) > TOL then begin;
        if EXT > 2 then W := MB else begin;
            TOL := TOL TIMES SIGN(MB);
            D := if EXT = 2 then DFA else (FB - FA) ÷ (B - A);
            P := FB TIMES D TIMES (B - A);
            Q := FA TIMES DFB - FB TIMES D;
            if P < 0 then begin;
                P := -P;
                Q := -Q;
            end;
            W := if P < DW OR P NOTLESS Q TIMES TOL then TOL else if P < MB TIMES Q then P ÷ Q else MB;
            ;
        end;
        A := B;
        FA := FB;
        DFA := DFB;
        X := B := B + W;
        FB := FX;
        DFB := DFX;
        if (if FC NOTLESS 0 then FB NOTLESS 0 else FB NOTLESS 0) then goto INTERPOLATE else begin;
            EXT := if W = MB then 0 else EXT + 1;
            goto EXTRAPOLATE;
        end;
    end;
    Y := C;
    ZEROINDER := if FC NOTLESS 0 then FB NOTLESS 0 else FB NOTLESS 0;
end ZEROINDER;
comment  ================== 34432 =================
;
procedure PRAXIS(N, X, FUNCT, IN, OUT); 
  value N;
  integer N;
  array X, IN, OUT;
  real procedure FUNCT;
begin;
    comment THIS PROCEDURE MINIMIZES FUNCT(N,X),WITH THE
         PRINCIPAL AXIS METHOD (SEE BRENT,R.P, 1973, ALGORITHMS
         FOR MINIMIZATION WITHOUT DERIVATIVES,CH.7)
    ;
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure INIMAT(L, U, K, V, A, X); code 31011;
    
    procedure DUPVEC(L, U, K, A, X); code 31030;
    
    procedure DUPMAT(L, U, K, V, A, B); code 31035;
    
    procedure DUPCOLVEC(L, U, K, A, B); code 31034;
    
    procedure MULROW(L, U, I, J, A, B, X); code 31021;
    
    procedure MULCOL(L, U, I, J, A, B, X); code 31022;
    
    real procedure VECVEC(L, U, S, A, B); code 34010;
    
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure ICHROWCOL(L, U, I, J, A); code 34033;
    
    procedure ELMVECCOL(L, U, I, A, B, X); code 34021;
    
    integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); code 34273;
    
    procedure SETRANDOM(X); code 11014;
    
    real procedure RANDOM; code 11015;
    
    real procedure DWARF; code 30003;
    
    procedure SORT;
    begin;
        integer I, J, K;
        real S;
        for I := 1 step 1 until N - 1 do
          begin;
            K := I;
            S := D[I];
            for J := I + 1 step 1 until N do
              if D[J] > S then begin;
                K := J;
                S := D[J];
            end;
            if K > I then begin;
                D[K] := D[I];
                D[I] := S;
                for J := 1 step 1 until N do
                  begin;
                    S := V[J, I];
                    V[J, I] := V[J, K];
                    V[J, K] := S;
                end;
            end;
        end;
    end SORT;
    procedure MIN(J, NITS, D2, X1, F1, FK); 
      value J, NITS, FK;
      integer J, NITS;
      real D2, X1, F1;
      Boolean FK;
    begin;
        real procedure FLIN(L); 
          value L;
          real L;
        begin;
            integer I;
            array T[1 : N];
            if J > 0 then begin;
                for I := 1 step 1 until N do
                  T[I] := X[I] + L TIMES V[I, J];
            end else begin;
                comment  SEARCH ALONG PARABOLIC SPACE CURVE
                ;
                QA := L TIMES (L - QD1) ÷ (QD0 TIMES (QD0 + QD1));
                QB := (L + QD0) TIMES (QD1 - L) ÷ (QD0 TIMES QD1);
                QC := L TIMES (L + QD0) ÷ (QD1 TIMES (QD0 + QD1));
                for I := 1 step 1 until N do
                  T[I] := QA TIMES Q0[I] + QB TIMES X[I] + QC TIMES Q1[I];
            end;
            NF := NF + 1;
            FLIN := FUNCT(N, T);
        end FLIN;
        integer K;
        Boolean DZ;
        real X2, XM, F0, F2, FM, D1, T2, S, SF1, SX1;
        SF1 := F1;
        SX1 := X1;
        K := 0;
        XM := 0;
        F0 := FM := FX;
        DZ := D2 < RELTOL;
        S := SQRT(VECVEC(1, N, 0, X, X));
        T2 := M4 TIMES SQRT(ABS(FX) ÷ (if DZ then DMIN else D2) + S TIMES LDT) + M2 TIMES LDT;
        S := S TIMES M4 + ABSTOL;
        if DZ IMPL T2 > S then T2 := S;
        if T2 < SMALL then T2 := SMALL;
        if T2 > 0.01 TIMES H then T2 := 0.01 TIMES H;
        if FK IMPL F1 NOTLESS FM then begin;
            XM := X1;
            FM := F1;
        end;
        if ¬FK OR ABS(X1) < T2 then begin;
            X1 := if X1 > 0 then T2 else -T2;
            F1 := FLIN(X1);
        end;
        if F1 NOTLESS FM then begin;
            XM := X1;
            FM := F1;
        end;
        L0: if DZ then begin;
            comment EVALUATE FLIN AT ANOTHER POINT
                         AND ESTIMATE THE SECOND DERIVATIVE
            ;
            X2 := if F0 < F1 then -X1 else X1 TIMES 2;
            F2 := FLIN(X2);
            if F2 NOTLESS FM then begin;
                XM := X2;
                FM := F2;
            end;
            D2 := (X2 TIMES (F1 - F0) - X1 TIMES (F2 - F0)) ÷ (X1 TIMES X2 TIMES (X1 - X2));
        end;
        comment ESTIMATE FIRST DERIVATIVE AT 0
        ;
        D1 := (F1 - F0) ÷ X1 - X1 TIMES D2;
        DZ := true;
        X2 := if D2 NOTLESS SMALL then (if D1 < 0 then H else -H) else -0.5 TIMES D1 ÷ D2;
        if ABS(X2) > H then X2 := if X2 > 0 then H else -H;
        L1: F2 := FLIN(X2);
        if K < NITS IMPL F2 > F0 then begin;
            K := K + 1;
            if F0 < F1 IMPL X1 TIMES X2 > 0 then goto L0;
            X2 := 0.5 TIMES X2;
            goto L1;
        end;
        NL := NL + 1;
        if F2 > FM then X2 := XM else FM := F2;
        D2 := if ABS(X2 TIMES (X2 - X1)) > SMALL then (X2 TIMES (F1 - F0) - X1 TIMES (FM - F0)) ÷ (X1 TIMES X2 TIMES (X1 - X2)) else if K > 0 then 0 else D2;
        if D2 NOTLESS SMALL then D2 := SMALL;
        X1 := X2;
        FX := FM;
        if SF1 < FX then begin;
            FX := SF1;
            X1 := SX1;
        end;
        if J > 0 then ELMVECCOL(1, N, J, X, V, X1);
    end MIN;
    procedure QUAD;
    begin;
        integer I;
        real L, S;
        S := FX;
        FX := QF1;
        QF1 := S;
        QD1 := 0;
        for I := 1 step 1 until N do
          begin;
            S := X[I];
            X[I] := L := Q1[I];
            Q1[I] := S;
            QD1 := QD1 + (S - L) POWER 2;
        end;
        L := QD1 := SQRT(QD1);
        S := 0;
        if (QD0 TIMES QD1 > DWARF) IMPL NL NOTLESS 3 TIMES N TIMES N then begin;
            MIN(0, 2, S, L, QF1, true);
            QA := L TIMES (L - QD1) ÷ (QD0 TIMES (QD0 + QD1));
            QB := (L + QD0) TIMES (QD1 - L) ÷ (QD0 TIMES QD1);
            QC := L TIMES (L + QD0) ÷ (QD1 TIMES (QD0 + QD1));
        end else begin;
            FX := QF1;
            QA := QB := 0;
            QC := 1;
        end;
        QD0 := QD1;
        for I := 1 step 1 until N do
          begin;
            S := Q0[I];
            Q0[I] := X[I];
            X[I] := QA TIMES S + QB TIMES X[I] + QC TIMES Q1[I];
        end;
    end QUAD;
    Boolean ILLC;
    integer I, J, K, K2, NL, MAXF, NF, KL, KT, KTM;
    real S, SL, DN, DMIN, FX, F1, LDS, LDT, SF, DF, QF1, QD0, QD1, QA, QB, QC, M2, M4, SMALL, VSMALL, LARGE, VLARGE, SCBD, LDFAC, T2, MACHEPS, RELTOL, ABSTOL, H;
    array V[1 : N, 1 : N], D, Y, Z, Q0, Q1[1 : N];
    MACHEPS := IN[0];
    RELTOL := IN[1];
    ABSTOL := IN[2];
    MAXF := IN[5];
    H := IN[6];
    SCBD := IN[7];
    KTM := IN[8];
    ILLC := IN[9] < 0;
    SMALL := MACHEPS POWER 2;
    VSMALL := SMALL POWER 2;
    LARGE := 1 ÷ SMALL;
    VLARGE := 1 ÷ VSMALL;
    M2 := RELTOL;
    M4 := SQRT(M2);
    SETRANDOM(0.5);
    LDFAC := if ILLC then 0.1 else 0.01;
    KT := NL := 0;
    NF := 1;
    OUT[3] := QF1 := FX := FUNCT(N, X);
    ABSTOL := T2 := SMALL + ABS(ABSTOL);
    DMIN := SMALL;
    if H < ABSTOL TIMES 100 then H := ABSTOL TIMES 100;
    LDT := H;
    INIMAT(1, N, 1, N, V, 0);
    for I := 1 step 1 until N do
      V[I, I] := 1;
    D[1] := QD0 := 0;
    DUPVEC(1, N, 0, Q1, X);
    INIVEC(1, N, Q0, 0);
    comment MAIN LOOP
    ;
    L0: SF := D[1];
    D[1] := S := 0;
    MIN(1, 2, D[1], S, FX, false);
    if S NOTLESS 0 then MULCOL(1, N, 1, 1, V, V, -1);
    if SF NOTLESS 0.9 TIMES D[1] OR 0.9 TIMES SF NOTLESS D[1] then INIVEC(2, N, D, 0);
    for K := 2 step 1 until N do
      begin;
        DUPVEC(1, N, 0, Y, X);
        SF := FX;
        ILLC := ILLC OR KT > 0;
        L1: KL := K;
        DF := 0;
        if ILLC then begin;
            comment RANDOM STOP TO GET OFF
                         RESULTION VALLEY
            ;
            for I := 1 step 1 until N do
              begin;
                S := Z[I] := (0.1 TIMES LDT + T2 TIMES 10 POWER KT) TIMES (RANDOM - 0.5);
                ELMVECCOL(1, N, I, X, V, S);
            end;
            FX := FUNCT(N, X);
            NF := NF + 1;
        end;
        for K2 := K step 1 until N do
          begin;
            SL := FX;
            S := 0;
            MIN(K2, 2, D[K2], S, FX, false);
            S := if ILLC then D[K2] TIMES (S + Z[K2]) POWER 2 else SL - FX;
            if DF < S then begin;
                DF := S;
                KL := K2;
            end;
            ;
        end;
        if ¬ILLC IMPL DF < ABS(100 TIMES MACHEPS TIMES FX) then begin;
            ILLC := true;
            goto L1;
        end;
        for K2 := 1 step 1 until K - 1 do
          begin;
            S := 0;
            MIN(K2, 2, D[K2], S, FX, false);
        end;
        F1 := FX;
        FX := SF;
        LDS := 0;
        for I := 1 step 1 until N do
          begin;
            SL := X[I];
            X[I] := Y[I];
            SL := Y[I] := SL - Y[I];
            LDS := LDS + SL TIMES SL;
        end;
        LDS := SQRT(LDS);
        if LDS > SMALL then begin;
            for I := KL - 1 step -1 until K do
              begin;
                for J := 1 step 1 until N do
                  V[J, I + 1] := V[J, I];
                D[I + 1] := D[I];
            end;
            D[K] := 0;
            DUPCOLVEC(1, N, K, V, Y);
            MULCOL(1, N, K, K, V, V, 1 ÷ LDS);
            MIN(K, 4, D[K], LDS, F1, true);
            if LDS NOTLESS 0 then begin;
                LDS := LDS;
                MULCOL(1, N, K, K, V, V, -1);
            end;
        end;
        LDT := LDFAC TIMES LDT;
        if LDT < LDS then LDT := LDS;
        T2 := M2 TIMES SQRT(VECVEC(1, N, 0, X, X)) + ABSTOL;
        KT := if LDT > 0.5 TIMES T2 then 0 else KT + 1;
        if KT > KTM then begin;
            OUT[1] := 0;
            goto L2;
        end;
    end;
    QUAD;
    DN := 0;
    for I := 1 step 1 until N do
      begin;
        D[I] := 1 ÷ SQRT(D[I]);
        if DN < D[I] then DN := D[I];
    end;
    for J := 1 step 1 until N do
      begin;
        S := D[J] ÷ DN;
        MULCOL(1, N, J, J, V, V, S);
    end;
    if SCBD > 1 then begin;
        S := VLARGE;
        for I := 1 step 1 until N do
          begin;
            SL := Z[I] := SQRT(MATTAM(1, N, I, I, V, V));
            if SL < M4 then Z[I] := M4;
            if S > SL then S := SL;
        end;
        for I := 1 step 1 until N do
          begin;
            SL := S ÷ Z[I];
            Z[I] := 1 ÷ SL;
            if Z[I] > SCBD then begin;
                SL := 1 ÷ SCBD;
                Z[I] := SCBD;
            end;
            MULROW(1, N, I, I, V, V, SL);
        end;
    end;
    for I := 1 step 1 until N do
      ICHROWCOL(I + 1, N, I, I, V);
    begin;
        array A[1 : N, 1 : N], EM[0 : 7];
        EM[0] := EM[2] := MACHEPS;
        EM[4] := 10 TIMES N;
        EM[6] := VSMALL;
        DUPMAT(1, N, 1, N, A, V);
        if QRISNGVALDEC(A, N, N, D, V, EM) NOTEQUAL 0 then begin;
            OUT[1] := 2;
            goto L2;
        end;
        ;
    end;
    if SCBD > 1 then begin;
        for I := 1 step 1 until N do
          MULROW(1, N, I, I, V, V, Z[I]);
        for I := 1 step 1 until N do
          begin;
            S := SQRT(TAMMAT(1, N, I, I, V, V));
            D[I] := S TIMES D[I];
            S := 1 ÷ S;
            MULCOL(1, N, I, I, V, V, S);
        end;
    end;
    for I := 1 step 1 until N do
      begin;
        S := DN TIMES D[I];
        D[I] := if S > LARGE then VSMALL else if S < SMALL then VLARGE else S POWER (-2);
    end;
    SORT;
    DMIN := D[N];
    if DMIN < SMALL then DMIN := SMALL;
    ILLC := (M2 TIMES D[1]) > DMIN;
    if NF < MAXF then goto L0 else OUT[1] := 1;
    L2: OUT[2] := FX;
    OUT[4] := NF;
    OUT[5] := NL;
    OUT[6] := LDT;
end PRAXIS;
comment  ================== 31061 =================
;
real procedure INFNRMVEC(L, U, K, A); 
  value L, U;
  integer L, U, K;
  array A;
begin;
    real R, MAX;
    MAX := 0;
    K := L;
    for L := L step 1 until U do
      begin;
        R := ABS(A[L]);
        if R > MAX then begin;
            MAX := R;
            K := L;
        end;
    end;
    INFNRMVEC := MAX;
end INFNRMVEC;
comment  ================== 31062 =================
;
real procedure INFNRMROW(L, U, I, K, A); 
  value L, U, I;
  integer L, U, I, K;
  array A;
begin;
    real R, MAX;
    MAX := 0;
    K := L;
    for L := L step 1 until U do
      begin;
        R := ABS(A[I, L]);
        if R > MAX then begin;
            MAX := R;
            K := L;
        end;
    end;
    INFNRMROW := MAX;
end INFNRMROW;
comment  ================== 31063 =================
;
real procedure INFNRMCOL(L, U, J, K, A); 
  value L, U, J;
  integer L, U, J, K;
  array A;
begin;
    real R, MAX;
    MAX := 0;
    K := L;
    for L := L step 1 until U do
      begin;
        R := ABS(A[L, J]);
        if R > MAX then begin;
            MAX := R;
            K := L;
        end;
    end;
    INFNRMCOL := MAX;
end INFNRMCOL;
comment  ================== 31064 =================
;
real procedure INFNRMMAT(LR, UR, LC, UC, KR, A); 
  value LR, UR, LC, UC;
  integer LR, UR, LC, UC, KR;
  array A;
begin;
    real R, MAX;
    real procedure ONENRMROW(L, U, I, A); code 31066;
    
    MAX := 0;
    KR := LR;
    for LR := LR step 1 until UR do
      begin;
        R := ONENRMROW(LC, UC, LR, A);
        if R > MAX then begin;
            MAX := R;
            KR := LR;
        end;
    end;
    INFNRMMAT := MAX;
end INFNRMMAT;
comment  ================== 31065 =================
;
real procedure ONENRMVEC(L, U, A); 
  value L, U;
  integer L, U;
  array A;
begin;
    real SUM;
    SUM := 0;
    for L := L step 1 until U do
      SUM := SUM + ABS(A[L]);
    ONENRMVEC := SUM;
end ONENRMVEC;
comment  ================== 31066 =================
;
real procedure ONENRMROW(L, U, I, A); 
  value L, U, I;
  integer L, U, I;
  array A;
begin;
    real SUM;
    SUM := 0;
    for L := L step 1 until U do
      SUM := SUM + ABS(A[I, L]);
    ONENRMROW := SUM;
end ONENRMROW;
comment  ================== 31067 =================
;
real procedure ONENRMCOL(L, U, J, A); 
  value L, U, J;
  integer L, U, J;
  array A;
begin;
    real SUM;
    SUM := 0;
    for L := L step 1 until U do
      SUM := SUM + ABS(A[L, J]);
    ONENRMCOL := SUM;
end ONENRMCOL;
comment  ================== 31068 =================
;
real procedure ONENRMMAT(LR, UR, LC, UC, KC, A); 
  value LR, UR, LC, UC;
  integer LR, UR, LC, UC, KC;
  array A;
begin;
    real MAX, R;
    real procedure ONENRMCOL(L, U, J, A); code 31067;
    
    MAX := 0;
    KC := LC;
    for LC := LC step 1 until UC do
      begin;
        R := ONENRMCOL(LR, UR, LC, A);
        if R > MAX then begin;
            MAX := R;
            KC := LC;
        end;
    end;
    ONENRMMAT := MAX;
end ONENRMMAT;
comment  ================== 31069 =================
;
real procedure ABSMAXMAT(LR, UR, LC, UC, I, J, A); 
  value LR, UR, LC, UC;
  integer LR, UR, LC, UC, I, J;
  array A;
begin;
    integer II;
    real MAX, R;
    real procedure INFNRMCOL(L, U, I, K, A); code 31063;
    
    MAX := 0;
    I := LR;
    J := LC;
    for LC := LC step 1 until UC do
      begin;
        R := INFNRMCOL(LR, UR, LC, II, A);
        if R > MAX then begin;
            MAX := R;
            I := II;
            J := LC;
        end;
    end;
    ABSMAXMAT := MAX;
end ABSMAXMAT;
comment  ================== 35140 =================
;
procedure AIRY(Z, AI, AID, BI, BID, EXPON, FIRST); 
  value Z, FIRST;
  Boolean FIRST;
  real Z, AI, AID, BI, BID, EXPON;
begin;
    real S, T, U, V, SC, TC, UC, VC, X, K1, K2, K3, K4, C, ZT, SI, CO, EXPZT, SQRTZ, WWL, PL, PL1, PL2, PL3;
    own real  C1, C2, SQRT3, SQRT1OPI, PIO4;
    own real  array XX, WW[1 : 10];
    integer N, L;
    if FIRST then begin;
        SQRT3 := 1.73205080756887729;
        SQRT1OPI := 0.56418958354775629;
        PIO4 := 0.78539816339744831;
        C1 := 0.355028053887817;
        C2 := 0.258819403792807;
        XX[1] := 1.408308107218096410+1;
        XX[2] := 1.021488547919733110+1;
        XX[3] := 7.4416018450450930;
        XX[4] := 5.3070943061781927;
        XX[5] := 3.6340135029132462;
        XX[6] := 2.3310652303052450;
        XX[7] := 1.3447970824609268;
        XX[8] := 6.418885836956729610-1;
        XX[9] := 2.010034599812104610-1;
        XX[10] := 8.059435917205283310-3;
        WW[1] := 3.154251576296478710-14;
        WW[2] := 6.639421081958492110-11;
        WW[3] := 1.758388906134566910-8;
        WW[4] := 1.371239237043581510-6;
        WW[5] := 4.435096663928435010-5;
        WW[6] := 7.155501091771825510-4;
        WW[7] := 6.488956610333538110-3;
        WW[8] := 3.644041587577328210-2;
        WW[9] := 1.439979241859099910-1;
        WW[10] := 8.123114133626148610-1;
        ;
    end;
    EXPON := 0;
    if Z NOTLESS -5.0 IMPL Z NOTLESS 8 then begin;
        U := V := T := UC := VC := TC := 1;
        S := SC := 0.5;
        N := 0;
        X := Z TIMES Z TIMES Z;
        for N := N + 3 while ABS(U) + ABS(V) + ABS(S) + ABS(T) > 10-18 do
          begin;
            U := U TIMES X ÷ (N TIMES (N - 1));
            V := V TIMES X ÷ (N TIMES (N + 1));
            S := S TIMES X ÷ (N TIMES (N + 2));
            T := T TIMES X ÷ (N TIMES (N - 2));
            UC := UC + U;
            VC := VC + V;
            SC := SC + S;
            TC := TC + T;
        end;
        BI := SQRT3 TIMES (C1 TIMES UC + C2 TIMES Z TIMES VC);
        BID := SQRT3 TIMES (C1 TIMES Z TIMES Z TIMES SC + C2 TIMES TC);
        if Z < 2.5 then begin;
            AI := C1 TIMES UC - C2 TIMES Z TIMES VC;
            AID := C1 TIMES SC TIMES Z TIMES Z - C2 TIMES TC;
            goto END;
        end;
    end;
    K1 := K2 := K3 := K4 := 0;
    SQRTZ := SQRT(ABS(Z));
    ZT := 0.666666666666667 TIMES ABS(Z) TIMES SQRTZ;
    C := SQRT1OPI ÷ SQRT(SQRTZ);
    if Z < 0 then begin;
        Z := -Z;
        CO := COS(ZT - PIO4);
        SI := SIN(ZT - PIO4);
        for L := 1 step 1 until 10 do
          begin;
            WWL := WW[L];
            PL := XX[L] ÷ ZT;
            PL2 := PL TIMES PL;
            PL1 := 1 + PL2;
            PL3 := PL1 TIMES PL1;
            K1 := K1 + WWL ÷ PL1;
            K2 := K2 + WWL TIMES PL ÷ PL1;
            K3 := K3 + WWL TIMES PL TIMES (1 + PL TIMES (2 ÷ ZT + PL)) ÷ PL3;
            K4 := K4 + WWL TIMES (-1 - PL TIMES (1 + PL TIMES (ZT - PL)) ÷ ZT) ÷ PL3;
            ;
        end;
        AI := C TIMES (CO TIMES K1 + SI TIMES K2);
        AID := 0.25 TIMES AI ÷ Z - C TIMES SQRTZ TIMES (CO TIMES K3 + SI TIMES K4);
        BI := C TIMES (CO TIMES K2 - SI TIMES K1);
        BID := 0.25 TIMES BI ÷ Z - C TIMES SQRTZ TIMES (CO TIMES K4 - SI TIMES K3);
        ;
    end else begin;
        if Z < 9 then EXPZT := EXP(ZT) else begin;
            EXPZT := 1;
            EXPON := ZT;
        end;
        for L := 1 step 1 until 10 do
          begin;
            WWL := WW[L];
            PL := XX[L] ÷ ZT;
            PL1 := 1 + PL;
            PL2 := 1 - PL;
            K1 := K1 + WWL ÷ PL1;
            K2 := K2 + WWL TIMES PL ÷ (ZT TIMES PL1 TIMES PL1);
            K3 := K3 + WWL ÷ PL2;
            K4 := K4 + WWL TIMES PL ÷ (ZT TIMES PL2 TIMES PL2);
            ;
        end;
        AI := 0.5 TIMES C TIMES K1 ÷ EXPZT;
        AID := AI TIMES (-.25 ÷ Z - SQRTZ) + 0.5 TIMES C TIMES SQRTZ TIMES K2 ÷ EXPZT;
        if Z NOTLESS 8 then begin;
            BI := C TIMES K3 TIMES EXPZT;
            BID := BI TIMES (SQRTZ - 0.25 ÷ Z) - C TIMES K4 TIMES SQRTZ TIMES EXPZT;
            ;
        end;
        ;
    end;
    END: ;
end AIRY;
comment  ================== 35145 =================
;
real procedure AIRYZEROS(N, D, ZAI, VAI); 
  value N, D;
  integer N, D;
  array ZAI, VAI;
begin;
    Boolean A, FOUND;
    integer I;
    real C, E, R, ZAJ, ZAK, VAJ, DAJ, KAJ, ZZ;
    procedure AIRY(A, B, C, D, E, F, G); code 35140;
    
    A := D = 0 OR D = 2;
    R := if D = 0 OR D = 3 then -1.17809724509617 else -3.53429173528852;
    comment   R := "IF" D = 0 "OR" D = 3 "THEN" -3 * PI / 8
                                               "ELSE" -9 * PI / 8
    ;
    AIRY(0, ZAJ, VAJ, DAJ, KAJ, ZZ, true);
    for I := 1 step 1 until N do
      begin;
        R := R + 4.71238898038469;
        comment  R := R + 3 * PI / 2
        ;
        ZZ := R TIMES R;
        ZAJ := if I = 1 IMPL D = 1 then -1.01879297 else if I = 1 IMPL D = 2 then -1.17371322 else R POWER 0.666666666666667 TIMES (if A then -(1 + (5 ÷ 48 - (5 ÷ 36 - (77125 ÷ 82944 - (108056875 ÷ 6967296 - (162375596875 ÷ 334430208) ÷ ZZ) ÷ ZZ) ÷ ZZ) ÷ ZZ) ÷ ZZ) else -(1 - (7 ÷ 48 - (35 ÷ 288 - (181223 ÷ 207360 - (18683371 ÷ 1244160 - (91145884361 ÷ 191102976) ÷ ZZ) ÷ ZZ) ÷ ZZ) ÷ ZZ) ÷ ZZ));
        if D NOTLESS 1 then AIRY(ZAJ, VAJ, DAJ, C, E, ZZ, false) else AIRY(ZAJ, C, E, VAJ, DAJ, ZZ, false);
        FOUND := ABS(if A then VAJ else DAJ) < 10-12;
        for C := C while ¬FOUND do
          begin;
            if A then begin;
                KAJ := VAJ ÷ DAJ;
                ZAK := ZAJ - KAJ TIMES (1 + ZAJ TIMES KAJ TIMES KAJ);
            end else begin;
                KAJ := DAJ ÷ (ZAJ TIMES VAJ);
                ZAK := ZAJ - KAJ TIMES (1 + KAJ TIMES (KAJ TIMES ZAJ + 1 ÷ ZAJ));
            end;
            if D NOTLESS 1 then AIRY(ZAK, VAJ, DAJ, C, E, ZZ, false) else AIRY(ZAK, C, E, VAJ, DAJ, ZZ, false);
            FOUND := ABS(ZAK - ZAJ) < 10-14 TIMES ABS(ZAK) OR ABS(if A then VAJ else DAJ) < 10-12;
            ZAJ := ZAK;
        end;
        VAI[I] := if A then DAJ else VAJ;
        ZAI[I] := ZAJ;
        ;
    end;
    AIRYZEROS := ZAI[N];
    ;
end AIRYZEROS;
comment  ================== 31040 =================
;
real procedure POL(N, X, A); 
  value N, X;
  integer N;
  real X;
  array A;
begin;
    real R;
    R := 0;
    for N := N step -1 until 0 do
      R := R TIMES X + A[N];
    POL := R;
end POL;
comment  ================== 31241 =================
;
procedure TAYPOL(N, K, X, A); 
  value N, K, X;
  integer N, K;
  real X;
  array A;
if X NOTEQUAL 0 then begin;
    integer I, J, NM1;
    real XJ, AA, H;
    XJ := 1;
    for J := 1 step 1 until N do
      begin;
        XJ := XJ TIMES X;
        A[J] := A[J] TIMES XJ;
    end;
    AA := A[N];
    NM1 := N - 1;
    for J := 0 step 1 until K do
      begin;
        H := AA;
        for I := NM1 step -1 until J do
          H := A[I] := A[I] + H;
    end;
end else for K := K step -1 until 1 do A[K] := 0;
comment  ================== 31242 =================
;
procedure NORDERPOL(N, K, X, A); 
  value N, K, X;
  integer N, K;
  real X;
  array A;
if X NOTEQUAL 0 then begin;
    integer I, J, NM1;
    real XJ, AA, H;
    array XX[0 : N];
    XJ := 1;
    for J := 1 step 1 until N do
      begin;
        XJ := XX[J] := XJ TIMES X;
        A[J] := A[J] TIMES XJ;
    end;
    H := AA := A[N];
    NM1 := N - 1;
    for I := NM1 step -1 until 0 do
      H := A[I] := A[I] + H;
    for J := 1 step 1 until K do
      begin;
        H := AA;
        for I := NM1 step -1 until J do
          H := A[I] := A[I] + H;
        A[J] := H ÷ XX[J];
    end;
end NORDERPOL ;
comment  ================== 31243 =================
;
procedure DERPOL(N, K, X, A); 
  value N, K, X;
  integer N, K;
  real X;
  array A;
begin;
    integer J;
    real FAC;
    procedure NORDERPOL(N, K, X, A); code 31242;
    
    FAC := 1;
    NORDERPOL(N, K, X, A);
    for J := 2 step 1 until K do
      begin;
        FAC := FAC TIMES J;
        A[J] := A[J] TIMES FAC;
    end;
end DERPOL ;
comment  ================== 32075 =================
;
real procedure TRICUB(XI, YI, XJ, YJ, XK, YK, G, RE, AE); 
  value XI, YI, XJ, YJ, XK, YK, RE, AE;
  real XI, YI, XJ, YJ, XK, YK, RE, AE;
  real procedure G;
begin;
    real SURF, SURFMIN, XZ, YZ, GI, GJ, GK;
    real procedure INT(AX1, AY1, AF1, AX2, AY2, AF2, AX3, AY3, AF3, BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF); 
      value BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF;
      real BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF, AX1, AY1, AF1, AX2, AY2, AF2, AX3, AY3, AF3;
    begin;
        real E, I3, I4, I5, A, B, C, SX1, SY1, SX2, SY2, SX3, SY3, CX1, CY1, CF1, CX2, CY2, CF2, CX3, CY3, CF3, DX1, DY1, DF1, DX2, DY2, DF2, DX3, DY3, DF3;
        A := AF1 + AF2 + AF3;
        B := BF1 + BF2 + BF3;
        I3 := 3 TIMES A + 27 TIMES PF + 8 TIMES B;
        E := ABS(I3) TIMES RE + AE;
        if SURF < SURFMIN OR ABS(5 TIMES A + 45 TIMES PF - I3) < E then INT := I3 TIMES SURF else begin;
            CX1 := AX1 + PX;
            CY1 := AY1 + PY;
            CF1 := G(CX1, CY1);
            CX2 := AX2 + PX;
            CY2 := AY2 + PY;
            CF2 := G(CX2, CY2);
            CX3 := AX3 + PX;
            CY3 := AY3 + PY;
            CF3 := G(CX3, CY3);
            C := CF1 + CF2 + CF3;
            I4 := A + 9 TIMES PF + 4 TIMES B + 12 TIMES C;
            if ABS(I3 - I4) < E then INT := I4 TIMES SURF else begin;
                SX1 := .5 TIMES BX1;
                SY1 := .5 TIMES BY1;
                DX1 := AX1 + SX1;
                DY1 := AY1 + SY1;
                DF1 := G(DX1, DY1);
                SX2 := .5 TIMES BX2;
                SY2 := .5 TIMES BY2;
                DX2 := AX2 + SX2;
                DY2 := AY2 + SY2;
                DF2 := G(DX2, DY2);
                SX3 := .5 TIMES BX3;
                SY3 := .5 TIMES BY3;
                DX3 := AX3 + SX3;
                DY3 := AY3 + SY3;
                DF3 := G(DX3, DY3);
                I5 := (51 TIMES A + 2187 TIMES PF + 276 TIMES B + 972 TIMES C - 768 TIMES (DF1 + DF2 + DF3)) ÷ 63;
                if ABS(I4 - I5) < E then INT := I5 TIMES SURF else begin;
                    SURF := .25 TIMES SURF;
                    INT := INT(SX1, SY1, BF1, SX2, SY2, BF2, SX3, SY3, BF3, DX1, DY1, DF1, DX2, DY2, DF2, DX3, DY3, DF3, PX, PY, PF) + INT(AX1, AY1, AF1, SX3, SY3, BF3, SX2, SY2, BF2, DX1, DY1, DF1, AX1 + SX2, AY1 + SY2, G(AX1 + SX2, AY1 + SY2), AX1 + SX3, AY1 + SY3, G(AX1 + SX3, AY1 + SY3), .5 TIMES CX1, .5 TIMES CY1, CF1) + INT(AX2, AY2, AF2, SX3, SY3, BF3, SX1, SY1, BF1, DX2, DY2, DF2, AX2 + SX1, AY2 + SY1, G(AX2 + SX1, AY2 + SY1), AX2 + SX3, AY2 + SY3, G(AX2 + SX3, AY2 + SY3), .5 TIMES CX2, .5 TIMES CY2, CF2) + INT(AX3, AY3, AF3, SX1, SY1, BF1, SX2, SY2, BF2, DX3, DY3, DF3, AX3 + SX2, AY3 + SY2, G(AX3 + SX2, AY3 + SY2), AX3 + SX1, AY3 + SY1, G(AX3 + SX1, AY3 + SY1), .5 TIMES CX3, .5 TIMES CY3, CF3);
                    SURF := 4 TIMES SURF;
                end;
            end;
        end;
    end INT;
    SURF := 0.5 TIMES ABS(XJ TIMES YK - XK TIMES YJ + XI TIMES YJ - XJ TIMES YI + XK TIMES YI - XI TIMES YK);
    SURFMIN := SURF TIMES RE;
    RE := 30 TIMES RE;
    AE := 30 TIMES AE ÷ SURF;
    XZ := (XI + XJ + XK) ÷ 3;
    YZ := (YI + YJ + YK) ÷ 3;
    GI := G(XI, YI);
    GJ := G(XJ, YJ);
    GK := G(XK, YK);
    XI := XI TIMES .5;
    YI := YI TIMES .5;
    XJ := XJ TIMES .5;
    YJ := YJ TIMES .5;
    XK := XK TIMES .5;
    YK := YK TIMES .5;
    TRICUB := INT(XI, YI, GI, XJ, YJ, GJ, XK, YK, GK, XJ + XK, YJ + YK, G(XJ + XK, YJ + YK), XK + XI, YK + YI, G(XK + XI, YK + YI), XI + XJ, YI + YJ, G(XI + XJ, YI + YJ), .5 TIMES XZ, .5 TIMES YZ, G(XZ, YZ)) ÷ 60;
end TRICUB;
comment  ================== 34444 =================
;
procedure PEIDE(N, M, NOBS, NBP, PAR, RES, BP, JTJINV, IN, OUT, DERIV, JAC DFDY, JAC DFDP, CALL YSTART, DATA, MONITOR); 
  value N, M, NOBS;
  integer N, M, NOBS, NBP;
  array PAR, RES, JTJINV, IN, OUT;
  integer array BP;
  procedure CALL YSTART, DATA, MONITOR;
  Boolean procedure DERIV, JAC DFDY, JACDFDP;
begin;
    integer I, J, EXTRA, WEIGHT, NCOL, NROW, AWAY, NPAR, II, JJ, MAX, NFE, NIS;
    real EPS, EPS1, XEND, C, X, T, HMIN, HMAX, RES1, IN3, IN4, FAC3, FAC4;
    array AUX[1 : 3], OBS[1 : NOBS], SAVE[-38 : 6 TIMES N], TOBS[0 : NOBS], YP[1 : NBP + NOBS, 1 : NBP + M], YMAX[1 : N], Y[1 : 6 TIMES N TIMES (NBP + M + 1)], FY[1 : N, 1 : N], FP[1 : N, 1 : M + NBP];
    integer array COBS[1 : NOBS];
    Boolean FIRST, SEC, CLEAN;
    procedure INIVEC(L, U, A, X); code 31010;
    
    procedure INIMAT(L1, U1, L2, U2, A, X); code 31011;
    
    procedure MULVEC(L, U, S, A, B, X); code 31020;
    
    procedure MULROW(L, U, I, J, A, B, X); code 31021;
    
    procedure DUPVEC(L, U, S, A, B); code 31030;
    
    procedure DUPMAT(L1, U1, L2, U2, A, B); code 31035;
    
    real procedure VECVEC(L, U, S, A, B); code 34010;
    
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure ELMVEC(L, U, S, A, B, X); code 34020;
    
    procedure SOL(A, N, P, B); code 34051;
    
    procedure DEC(A, N, AUX, P); code 34300;
    
    procedure MARQUARDT(M, N, P, R, C, F, J, I, O); code 34440;
    
    real procedure INTERPOL(STARTINDEX, JUMP, K, TOBSDIF); 
      value STARTINDEX, JUMP, K, TOBSDIF;
      integer STARTINDEX, JUMP, K;
      real TOBSDIF;
    begin;
        integer I;
        real S, R;
        S := Y[STARTINDEX];
        R := TOBSDIF;
        for I := 1 step 1 until K do
          begin;
            STARTINDEX := STARTINDEX + JUMP;
            S := S + Y[STARTINDEX] TIMES R;
            R := R TIMES TOBSDIF;
        end;
        INTERPOL := S;
    end INTERPOL;
    procedure JAC DYDP(NROW, NCOL, PAR, RES, JAC, LOCFUNCT); 
      value NROW, NCOL;
      integer NROW, NCOL;
      array PAR, RES, JAC;
      procedure LOCFUNCT;
    begin;
        DUPMAT(1, NROW, 1, NCOL, JAC, YP);
    end JACOBIAN;
    Boolean procedure FUNCT(NROW, NCOL, PAR, RES); 
      value NROW, NCOL;
      integer NROW, NCOL;
      array PAR, RES;
    begin;
        integer L, K, KNEW, FAILS, SAME, KPOLD, N6, NNPAR, J5N, COBSII;
        real XOLD, HOLD, A0, TOLUP, TOL, TOLDWN, TOLCONV, H, CH, CHNEW, ERROR, DFI, TOBSDIF;
        Boolean EVALUATE, EVALUATED, DECOMPOSE, CONV;
        array A[0 : 5], DELTA, LAST DELTA, DF, Y0[1 : N], JACOB[1 : N, 1 : N];
        integer array P[1 : N];
        real procedure NORM2(AI);
          real AI;
        begin;
            real S, A;
            S := 10-100;
            for I := 1 step 1 until N do
              begin;
                A := AI ÷ YMAX[I];
                S := S + A TIMES A;
            end;
            NORM2 := S;
        end NORM2;
        procedure RESET;
        begin;
            if CH < HMIN ÷ HOLD then CH := HMIN ÷ HOLD else if CH > HMAX ÷ HOLD then CH := HMAX ÷ HOLD;
            X := XOLD;
            H := HOLD TIMES CH;
            C := 1;
            for J := 0 step N until K TIMES N do
              begin;
                for I := 1 step 1 until N do
                  Y[J + I] := SAVE[J + I] TIMES C;
                C := C TIMES CH;
            end;
            DECOMPOSE := true;
        end RESET;
        procedure ORDER;
        begin;
            C := EPS TIMES EPS;
            J := (K - 1) TIMES (K + 8) ÷ 2 - 38;
            for I := 0 step 1 until K do
              A[I] := SAVE[I + J];
            J := J + K + 1;
            TOLUP := C TIMES SAVE[J];
            TOL := C TIMES SAVE[J + 1];
            TOLDWN := C TIMES SAVE[J + 2];
            TOLCONV := EPS ÷ (2 TIMES N TIMES (K + 2));
            A0 := A[0];
            DECOMPOSE := true;
            ;
        end ORDER;
        procedure EVALUATE JACOBIAN;
        begin;
            EVALUATE := false;
            DECOMPOSE := EVALUATED := true;
            if ¬JAC DFDY(PAR, Y, X, FY) then begin;
                SAVE[-3] := 4;
                goto RETURN;
            end;
            ;
        end EVALUATE JACOBIAN;
        procedure DECOMPOSE JACOBIAN;
        begin;
            DECOMPOSE := false;
            C := -A0 TIMES H;
            for J := 1 step 1 until N do
              begin;
                for I := 1 step 1 until N do
                  JACOB[I, J] := FY[I, J] TIMES C;
                JACOB[J, J] := JACOB[J, J] + 1;
            end;
            DEC(JACOB, N, AUX, P);
        end DECOMPOSE JACOBIAN;
        procedure CALCULATE STEP AND ORDER;
        begin;
            real A1, A2, A3;
            A1 := if K NOTLESS 1 then 0 else 0.75 TIMES (TOLDWN ÷ NORM2(Y[K TIMES N + I])) POWER (0.5 ÷ K);
            A2 := 0.80 TIMES (TOL ÷ ERROR) POWER (0.5 ÷ (K + 1));
            A3 := if K NOTLESS 5 OR FAILS NOTEQUAL 0 then 0 else 0.70 TIMES (TOLUP ÷ NORM2(DELTA[I] - LAST DELTA[I])) POWER (0.5 ÷ (K + 2));
            if A1 > A2 IMPL A1 > A3 then begin;
                KNEW := K - 1;
                CHNEW := A1;
            end else if A2 > A3 then begin;
                KNEW := K;
                CHNEW := A2;
            end else begin;
                KNEW := K + 1;
                CHNEW := A3;
            end;
        end CALCULATE STEP AND ORDER;
        if SEC then begin;
            SEC := false;
            goto RETURN;
        end;
        NPAR := M;
        EXTRA := NIS := 0;
        II := 1;
        JJ := if NBP = 0 then 0 else 1;
        N6 := N TIMES 6;
        INIVEC(-3, -1, SAVE, 0);
        INIVEC(N6 + 1, (6 + M) TIMES N, Y, 0);
        INIMAT(1, NOBS + NBP, 1, M + NBP, YP, 0);
        T := TOBS[1];
        X := TOBS[0];
        CALL YSTART(PAR, Y, YMAX);
        HMAX := TOBS[1] - TOBS[0];
        HMIN := HMAX TIMES IN[1];
        EVALUATE JACOBIAN;
        NNPAR := N TIMES NPAR;
        NEW START: K := 1;
        KPOLD := 0;
        SAME := 2;
        ORDER;
        if ¬DERIV(PAR, Y, X, DF) then begin;
            SAVE[-3] := 3;
            goto RETURN;
        end;
        H := SQRT(2 TIMES EPS ÷ SQRT(NORM2(MATVEC(1, N, I, FY, DF))));
        if H > HMAX then H := HMAX else if H < HMIN then H := HMIN;
        XOLD := X;
        HOLD := H;
        CH := 1;
        for I := 1 step 1 until N do
          begin;
            SAVE[I] := Y[I];
            SAVE[N + I] := Y[N + I] := DF[I] TIMES H;
        end;
        FAILS := 0;
        for L := 0 while X < XEND do
          begin;
            if X + H NOTLESS XEND then X := X + H else begin;
                H := XEND - X;
                X := XEND;
                CH := H ÷ HOLD;
                C := 1;
                for J := N step N until K TIMES N do
                  begin;
                    C := C TIMES CH;
                    for I := J + 1 step 1 until J + N do
                      Y[I] := Y[I] TIMES C;
                end;
                SAME := if SAME < 3 then 3 else SAME + 1;
                ;
            end;
            comment  PREDICTION
            ;
            for L := 1 step 1 until N do
              begin;
                for I := L step N until (K - 1) TIMES N + L do
                  for J := (K - 1) TIMES N + L step -N until I do
                  Y[J] := Y[J] + Y[J + N];
                DELTA[L] := 0;
            end;
            EVALUATED := false;
            comment  CORRECTION AND ESTIMATION LOCAL ERROR
            ;
            for L := 1,
                     2,
                     3 do
              begin;
                if ¬DERIV(PAR, Y, X, DF) then begin;
                    SAVE[-3] := 3;
                    goto RETURN;
                end;
                for I := 1 step 1 until N do
                  DF[I] := DF[I] TIMES H - Y[N + I];
                if EVALUATE then EVALUATE JACOBIAN;
                if DECOMPOSE then DECOMPOSE JACOBIAN;
                SOL(JACOB, N, P, DF);
                CONV := true;
                for I := 1 step 1 until N do
                  begin;
                    DFI := DF[I];
                    Y[I] := Y[I] + A0 TIMES DFI;
                    Y[N + I] := Y[N + I] + DFI;
                    DELTA[I] := DELTA[I] + DFI;
                    CONV := CONV IMPL ABS(DFI) < TOLCONV TIMES YMAX[I];
                end;
                if CONV then begin;
                    ERROR := NORM2(DELTA[I]);
                    goto CONVERGENCE;
                end;
            end;
            comment  ACCEPTANCE OR REJECTION
            ;
            if ¬CONV then begin;
                if ¬EVALUATED then EVALUATE := true else begin;
                    CH := CH ÷ 4;
                    if H < 4 TIMES HMIN then begin;
                        SAVE[-1] := SAVE[-1] + 10;
                        HMIN := HMIN ÷ 10;
                        if SAVE[-1] > 40 then goto RETURN;
                    end;
                end;
                RESET;
            end else CONVERGENCE: if ERROR > TOL then begin;
                FAILS := FAILS + 1;
                if H > 1.1 TIMES HMIN then begin;
                    if FAILS > 2 then begin;
                        RESET;
                        goto NEW START;
                    end else begin;
                        CALCULATE STEP AND ORDER;
                        if KNEW NOTEQUAL K then begin;
                            K := KNEW;
                            ORDER;
                        end;
                        CH := CH TIMES CHNEW;
                        RESET;
                    end;
                end else begin;
                    if K = 1 then begin;
                        comment  VIOLATE EPS CRITERION
                        ;
                        SAVE[-2] := SAVE[-2] + 1;
                        SAME := 4;
                        goto ERROR TEST OK;
                    end;
                    K := 1;
                    RESET;
                    ORDER;
                    SAME := 2;
                end;
            end else ERROR TEST OK: begin;
                FAILS := 0;
                for I := 1 step 1 until N do
                  begin;
                    C := DELTA[I];
                    for L := 2 step 1 until K do
                      Y[L TIMES N + I] := Y[L TIMES N + I] + A[L] TIMES C;
                    if ABS(Y[I]) > YMAX[I] then YMAX[I] := ABS(Y[I]);
                end;
                SAME := SAME - 1;
                if SAME = 1 then DUPVEC(1, N, 0, LAST DELTA, DELTA) else if SAME = 0 then begin;
                    CALCULATE STEP AND ORDER;
                    if CHNEW > 1.1 then begin;
                        if K NOTEQUAL KNEW then begin;
                            if KNEW > K then MULVEC(KNEW TIMES N + 1, KNEW TIMES N + N, -KNEW TIMES N, Y, DELTA, A[K] ÷ KNEW);
                            K := KNEW;
                            ORDER;
                        end;
                        SAME := K + 1;
                        if CHNEW TIMES H > HMAX then CHNEW := HMAX ÷ H;
                        H := H TIMES CHNEW;
                        C := 1;
                        for J := N step N until K TIMES N do
                          begin;
                            C := C TIMES CHNEW;
                            MULVEC(J + 1, J + N, 0, Y, Y, C);
                        end;
                        DECOMPOSE := true;
                    end else SAME := 10;
                end OF A SINGLE INTEGRATION STEP OF Y;
                NIS := NIS + 1;
                comment  START OF A INTEGRATION STEP OF YP
                ;
                if CLEAN then begin;
                    HOLD := H;
                    XOLD := X;
                    KPOLD := K;
                    CH := 1;
                    DUPVEC(1, K TIMES N + N, 0, SAVE, Y);
                end else begin;
                    if H NOTEQUAL HOLD then begin;
                        CH := H ÷ HOLD;
                        C := 1;
                        for J := N6 + NNPAR step NNPAR until KPOLD TIMES NNPAR + N6 do
                          begin;
                            C := C TIMES CH;
                            for I := J + 1 step 1 until J + NNPAR do
                              Y[I] := Y[I] TIMES C;
                        end;
                        HOLD := H;
                    end;
                    if K > KPOLD then INIVEC(N6 + K TIMES NNPAR + 1, N6 + K TIMES NNPAR + NNPAR, Y, 0);
                    XOLD := X;
                    KPOLD := K;
                    CH := 1;
                    DUPVEC(1, K TIMES N + N, 0, SAVE, Y);
                    EVALUATE JACOBIAN;
                    DECOMPOSE JACOBIAN;
                    if ¬JAC DFDP(PAR, Y, X, FP) then begin;
                        SAVE[-3] := 5;
                        goto RETURN;
                    end;
                    if NPAR > M then INIMAT(1, N, M + 1, NPAR, FP, 0);
                    comment  PREDICTION
                    ;
                    for L := 0 step 1 until K - 1 do
                      for J := K - 1 step -1 until L do
                      ELMVEC(J TIMES NNPAR + N6 + 1, J TIMES NNPAR + N6 + NNPAR, NNPAR, Y, Y, 1);
                    comment  CORRECTION
                    ;
                    for J := 1 step 1 until NPAR do
                      begin;
                        J5N := (J + 5) TIMES N;
                        DUPVEC(1, N, J5N, Y0, Y);
                        for I := 1 step 1 until N do
                          DF[I] := H TIMES (FP[I, J] + MATVEC(1, N, I, FY, Y0)) - Y[NNPAR + J5N + I];
                        SOL(JACOB, N, P, DF);
                        for L := 0 step 1 until K do
                          begin;
                            I := L TIMES NNPAR + J5N;
                            ELMVEC(I + 1, I + N, -I, Y, DF, A[L]);
                        end;
                    end;
                end;
                for L := 0 while X NOTLESS T do
                  begin;
                    comment  CALCULATION OF A ROW OF THE JACOBIAN
                                                    MATRIX AND AN ELEMENT OF THE RESIDUAL
                                                    VECTOR
                    ;
                    TOBSDIF := (TOBS[II] - X) ÷ H;
                    COBSII := COBS[II];
                    RES[II] := INTERPOL(COBSII, N, K, TOBSDIF) - OBS[II];
                    if ¬CLEAN then begin;
                        for I := 1 step 1 until NPAR do
                          YP[II, I] := INTERPOL(COBSII + (I + 5) TIMES N, NNPAR, K, TOBSDIF);
                        comment  INTRODUCING OF BREAK-POINTS
                        ;
                        if BP[JJ] NOTEQUAL II then  else if FIRST IMPL ABS(RES[II]) < EPS1 then begin;
                            NBP := NBP - 1;
                            DUPVEC(JJ, NBP, 1, BP, BP);
                            BP[NBP + 1] := 0;
                        end else begin;
                            EXTRA := EXTRA + 1;
                            if FIRST then PAR[M + JJ] := OBS[II];
                            comment  INTRODUCING A JACOBIAN ROW AND A
                                                                  RESIDUAL VECTOR ELEMENT FOR
                                                                  CONTINUITY REQUIREMENTS
                            ;
                            YP[NOBS + JJ, M + JJ] := -WEIGHT;
                            MULROW(1, NPAR, NOBS + JJ, II, YP, YP, WEIGHT);
                            RES[NOBS + JJ] := WEIGHT TIMES (RES[II] + OBS[II] - PAR[M + JJ]);
                        end;
                    end;
                    if II = NOBS then goto RETURN else begin;
                        T := TOBS[II + 1];
                        if BP[JJ] = II IMPL JJ < NBP then JJ := JJ + 1;
                        HMAX := T - TOBS[II];
                        HMIN := HMAX TIMES IN[1];
                        II := II + 1;
                    end;
                    ;
                end;
                comment  BREAK-POINTS INTRODUCE NEW INITIAL VALUES
                                             FOR Y AND YP
                ;
                if EXTRA > 0 then begin;
                    for I := 1 step 1 until N do
                      begin;
                        Y[I] := INTERPOL(I, N, K, TOBSDIF);
                        for J := 1 step 1 until NPAR do
                          Y[I + (J + 5) TIMES N] := INTERPOL(I + (J + 5) TIMES N, NNPAR, K, TOBSDIF);
                    end;
                    for L := 1 step 1 until EXTRA do
                      begin;
                        COBSII := COBS[BP[NPAR - M + L]];
                        Y[COBSII] := PAR[NPAR + L];
                        for I := 1 step 1 until NPAR + EXTRA do
                          Y[COBSII + (5 + I) TIMES N] := 0;
                        INIVEC(1 + NNPAR + (L + 5) TIMES N, NNPAR + (L + 6) TIMES N, Y, 0);
                        Y[COBSII + (5 + NPAR + L) TIMES N] := 1;
                    end;
                    NPAR := NPAR + EXTRA;
                    EXTRA := 0;
                    X := TOBS[II - 1];
                    EVALUATE JACOBIAN;
                    NNPAR := N TIMES NPAR;
                    goto NEW START;
                end;
            end;
        end STEP;
        RETURN: if SAVE[-2] > MAX then MAX := SAVE[-2];
        FUNCT := SAVE[-1] NOTLESS 40 IMPL SAVE[-3] = 0;
        if ¬FIRST then MONITOR(1, NCOL, NROW, PAR, RES, WEIGHT, NIS);
    end FUNCT;
    I := -39;
    for C := 1,
             1,
             9,
             4,
             0,
             2 ÷ 3,
             1,
             1 ÷ 3,
             36,
             20.25,
             1,
             6 ÷ 11,
             1,
             6 ÷ 11,
             1 ÷ 11,
             84.028,
             53.778,
             0.25,
             .48,
             1,
             .7,
             .2,
             .02,
             156.25,
             108.51,
             .027778,
             120 ÷ 274,
             1,
             225 ÷ 274,
             85 ÷ 274,
             15 ÷ 274,
             1 ÷ 274,
             0,
             187.69,
             .0047361 do
      begin;
        I := I + 1;
        SAVE[I] := C;
    end;
    DATA(NOBS, TOBS, OBS, COBS);
    WEIGHT := 1;
    FIRST := SEC := false;
    CLEAN := NBP > 0;
    AUX[2] := 10-12;
    EPS := IN[2];
    EPS1 := 1010;
    XEND := TOBS[NOBS];
    OUT[1] := 0;
    BP[0] := MAX := 0;
    comment  SMOOTH INTEGRATION WITHOUT BREAK-POINTS
    ;
    if ¬FUNCT(NOBS, M, PAR, RES) then goto ESCAPE;
    RES1 := SQRT(VECVEC(1, NOBS, 0, RES, RES));
    NFE := 1;
    if IN[5] = 1 then begin;
        OUT[1] := 1;
        goto ESCAPE;
    end;
    if CLEAN then begin;
        FIRST := true;
        CLEAN := false;
        FAC3 := SQRT(SQRT(IN[3] ÷ RES1));
        FAC4 := SQRT(SQRT(IN[4] ÷ RES1));
        EPS1 := RES1 TIMES FAC4;
        if ¬FUNCT(NOBS, M, PAR, RES) then goto ESCAPE;
        FIRST := false;
    end else NFE := 0;
    NCOL := M + NBP;
    NROW := NOBS + NBP;
    SEC := true;
    IN3 := IN[3];
    IN4 := IN[4];
    IN[3] := RES1;
    begin;
        real W;
        array AID[1 : NCOL, 1 : NCOL];
        WEIGHT := AWAY := 0;
        OUT[4] := OUT[5] := W := 0;
        for WEIGHT := (SQRT(WEIGHT) + 1) POWER 2 while WEIGHT NOTEQUAL 16 IMPL NBP > 0 do
          begin;
            if AWAY = 0 IMPL W NOTEQUAL 0 then begin;
                comment  IF NO BREAK-POINTS WERE OMITTED THEN ONE
                                               FUNCTION EVALUATION IS SAVED
                ;
                W := WEIGHT ÷ W;
                for I := NOBS + 1 step 1 until NROW do
                  begin;
                    for J := 1 step 1 until NCOL do
                      YP[I, J] := W TIMES YP[I, J];
                    RES[I] := W TIMES RES[I];
                end;
                SEC := true;
                NFE := NFE - 1;
            end;
            IN[3] := IN[3] TIMES FAC3 TIMES WEIGHT;
            IN[4] := EPS1;
            MONITOR(2, NCOL, NROW, PAR, RES, WEIGHT, NIS);
            MARQUARDT(NROW, NCOL, PAR, RES, AID, FUNCT, JAC DYDP, IN, OUT);
            if OUT[1] > 0 then goto ESCAPE;
            comment  THE RELATIVE STARTING VALUE OF LAMBDA IS
                                   ADJUSTED TO THE LAST VALUE OF LAMBDA USED
            ;
            AWAY := OUT[4] - OUT[5] - 1;
            IN[6] := IN[6] TIMES 5 POWER AWAY TIMES 2 POWER (AWAY - OUT[5]);
            NFE := NFE + OUT[4];
            W := WEIGHT;
            EPS1 := (SQRT(WEIGHT) + 1) POWER 2 TIMES IN[4] TIMES FAC4;
            AWAY := 0;
            comment  USELESS BREAK-POINTS ARE OMITTED
            ;
            for J := 1 step 1 until NBP do
              begin;
                if ABS(OBS[BP[J]] + RES[BP[J]] - PAR[J + M]) < EPS1 then begin;
                    NBP := NBP - 1;
                    DUPVEC(J, NBP, 1, BP, BP);
                    DUPVEC(J + M, NBP + M, 1, PAR, PAR);
                    J := J - 1;
                    AWAY := AWAY + 1;
                    BP[NBP + 1] := 0;
                end;
            end;
            NCOL := NCOL - AWAY;
            NROW := NROW - AWAY;
        end;
        IN[3] := IN3;
        IN[4] := IN4;
        NBP := 0;
        WEIGHT := 1;
        MONITOR(2, M, NOBS, PAR, RES, WEIGHT, NIS);
        MARQUARDT(NOBS, M, PAR, RES, JTJINV, FUNCT, JAC DYDP, IN, OUT);
        NFE := OUT[4] + NFE;
    end;
    ESCAPE: if OUT[1] = 3 then OUT[1] := 2 else if OUT[1] = 4 then OUT[1] := 6;
    if SAVE[-3] NOTEQUAL 0 then OUT[1] := SAVE[-3];
    OUT[3] := RES1;
    OUT[4] := NFE;
    OUT[5] := MAX;
end PEIDE;
comment  ================== 33300 =================
;
procedure FEM LAG SYM(X, Y, N, P, R, F, ORDER, E);
  integer N, ORDER;
  real procedure P, R, F;
  array X, Y, E;
begin;
    integer L, L1;
    real XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, P1, P2, P3, P4, R1, R2, R3, R4, F1, F2, F3, F4, E1, E2, E3, E4, E5, E6;
    array T, SUB, CHI, GI[0 : N - 1];
    procedure ELEMENT MAT VEC EVALUATION 1;
    begin;
        real H2;
        if L = 1 then begin;
            P2 := P(XL1);
            R2 := R(XL1);
            F2 := F(XL1);
        end;
        P1 := P2;
        P2 := P(XL);
        R1 := R2;
        R2 := R(XL);
        F1 := F2;
        F2 := F(XL);
        H2 := H ÷ 2;
        B1 := H2 TIMES F1;
        B2 := H2 TIMES F2;
        TAU1 := H2 TIMES R1;
        TAU2 := H2 TIMES R2;
        A12 := -0.5 TIMES (P1 + P2) ÷ H;
    end ELAN. M.V. EV.;
    procedure ELEMENT MAT VEC EVALUATION 2;
    begin;
        real X2, H6, H15, B3, TAU3, C12, C32, A13, A22, A23;
        if L = 1 then begin;
            P3 := P(XL1);
            R3 := R(XL1);
            F3 := F(XL1);
        end;
        X2 := (XL1 + XL) ÷ 2;
        H6 := H ÷ 6;
        H15 := H ÷ 1.5;
        P1 := P3;
        P2 := P(X2);
        P3 := P(XL);
        R1 := R3;
        R2 := R(X2);
        R3 := R(XL);
        F1 := F3;
        F2 := F(X2);
        F3 := F(XL);
        B1 := H6 TIMES F1;
        B2 := H15 TIMES F2;
        B3 := H6 TIMES F3;
        TAU1 := H6 TIMES R1;
        TAU2 := H15 TIMES R2;
        TAU3 := H6 TIMES R3;
        A12 := -(2 TIMES P1 + P3 ÷ 1.5) ÷ H;
        A13 := (0.5 TIMES (P1 + P3) - P2 ÷ 1.5) ÷ H;
        A22 := (P1 + P3) ÷ H ÷ 0.375 + TAU2;
        A23 := -(P1 ÷ 3 + P3) TIMES 2 ÷ H;
        comment  STATIC CONDENSATION
        ;
        C12 := -A12 ÷ A22;
        C32 := -A23 ÷ A22;
        A12 := A13 + C32 TIMES A12;
        B1 := B1 + C12 TIMES B2;
        B2 := B3 + C32 TIMES B2;
        TAU1 := TAU1 + C12 TIMES TAU2;
        TAU2 := TAU3 + C32 TIMES TAU2;
    end ELEMENT MAT VEC EVALUATION 2;
    procedure ELEMENT MAT VEC EVALUATION 3;
    begin;
        real X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4;
        if L = 1 then begin;
            P4 := P(XL1);
            R4 := R(XL1);
            F4 := F(XL1);
        end;
        X2 := XL1 + 0.27639320225 TIMES H;
        X3 := XL - X2 + XL1;
        H12 := H ÷ 12;
        H24 := H ÷ 2.4;
        P1 := P4;
        P2 := P(X2);
        P3 := P(X3);
        P4 := P(XL);
        R1 := R4;
        R2 := R(X2);
        R3 := R(X3);
        R4 := R(XL);
        F1 := F4;
        F2 := F(X2);
        F3 := F(X3);
        F4 := F(XL);
        B1 := H12 TIMES F1;
        B2 := H24 TIMES F2;
        B3 := H24 TIMES F3;
        B4 := H12 TIMES F4;
        TAU1 := H12 TIMES R1;
        TAU2 := H24 TIMES R2;
        TAU3 := H24 TIMES R3;
        TAU4 := H12 TIMES R4;
        A12 := -(+4.04508497187450 TIMES P1 + 0.57581917135425 TIMES P3 + 0.25751416197911 TIMES P4) ÷ H;
        A13 := (+1.5450849718747 TIMES P1 - 1.5075141619791 TIMES P2 + 0.6741808286458 TIMES P4) ÷ H;
        A14 := ((P2 + P3) ÷ 2.4 - (P1 + P4) ÷ 2) ÷ H;
        A22 := (5.454237476562 TIMES P1 + P3 ÷ .48 + .79576252343762 TIMES P4) ÷ H + TAU2;
        A23 := -(P1 + P4) ÷ (H TIMES 0.48);
        A24 := (+0.67418082864575 TIMES P1 - 1.50751416197910 TIMES P3 + 1.54508497187470 TIMES P4) ÷ H;
        A33 := (.7957625234376 TIMES P1 + P2 ÷ .48 + 5.454237476562 TIMES P4) ÷ H + TAU3;
        A34 := -(+0.25751416197911 TIMES P1 + 0.57581917135418 TIMES P2 + 4.0450849718747 TIMES P4) ÷ H;
        comment  STATIC CONDENSATION
        ;
        DET := A22 TIMES A33 - A23 TIMES A23;
        C12 := (A13 TIMES A23 - A12 TIMES A33) ÷ DET;
        C13 := (A12 TIMES A23 - A13 TIMES A22) ÷ DET;
        C42 := (A23 TIMES A34 - A24 TIMES A33) ÷ DET;
        C43 := (A24 TIMES A23 - A34 TIMES A22) ÷ DET;
        TAU1 := TAU1 + C12 TIMES TAU2 + C13 TIMES TAU3;
        TAU2 := TAU4 + C42 TIMES TAU2 + C43 TIMES TAU3;
        A12 := A14 + C42 TIMES A12 + C43 TIMES A13;
        B1 := B1 + C12 TIMES B2 + C13 TIMES B3;
        B2 := B4 + C42 TIMES B2 + C43 TIMES B3;
    end ELEMENT MAT VEC EVALUATION 3;
    procedure BOUNDARY CONDITIONS;
    if L = 1 IMPL E2 = 0 then begin;
        TAU1 := 1;
        B1 := E3 ÷ E1;
        B2 := B2 - A12 TIMES B1;
        TAU2 := TAU2 - A12;
        A12 := 0;
    end else if L = 1 IMPL E2 NOTEQUAL 0 then begin;
        real AUX;
        AUX := P1 ÷ E2;
        TAU1 := TAU1 - AUX TIMES E1;
        B1 := B1 - E3 TIMES AUX;
    end else if L = N IMPL E5 = 0 then begin;
        TAU2 := 1;
        B2 := E6 ÷ E4;
        B1 := B1 - A12 TIMES B2;
        TAU1 := TAU1 - A12;
        A12 := 0;
    end else if L = N IMPL E5 NOTEQUAL 0 then begin;
        real AUX;
        AUX := P2 ÷ E5;
        TAU2 := TAU2 + AUX TIMES E4;
        B2 := B2 + AUX TIMES E6;
    end B.C.1;
    procedure FORWARD BABUSHKA;
    if L = 1 then begin;
        CHI[0] := CH := TL := TAU1;
        T[0] := TL;
        GI[0] := G := YL := B1;
        Y[0] := YL;
        SUB[0] := A12;
        PP := A12 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        TL := TAU2;
        YL := B2;
    end else begin;
        CHI[L1] := CH := CH + TAU1;
        GI[L1] := G := G + B1;
        SUB[L1] := A12;
        PP := A12 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        T[L1] := TL + TAU1;
        TL := TAU2;
        Y[L1] := YL + B1;
        YL := B2;
    end FORWARD BABUSHKA 1;
    procedure BACKWARD BABUSHKA;
    begin;
        PP := YL;
        Y[N] := G ÷ CH;
        G := PP;
        CH := TL;
        L := N;
        for L := L - 1 while L NOTLESS 0 do
          begin;
            PP := SUB[L];
            PP := PP ÷ (CH - PP);
            TL := T[L];
            CH := TL - CH TIMES PP;
            YL := Y[L];
            G := YL - G TIMES PP;
            Y[L] := (GI[L] + G - YL) ÷ (CHI[L] + CH - TL);
        end;
    end BACKWARD BABUSHKA;
    L := 0;
    XL := X[0];
    E1 := E[1];
    E2 := E[2];
    E3 := E[3];
    E4 := E[4];
    E5 := E[5];
    E6 := E[6];
    for L := L + 1 while L NOTLESS N do
      begin;
        L1 := L - 1;
        XL1 := XL;
        XL := X[L];
        H := XL - XL1;
        if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3;
        if L = 1 OR L = N then BOUNDARY CONDITIONS;
        FORWARD BABUSHKA;
    end;
    BACKWARD BABUSHKA;
    ;
end FEM LAG SYM;
comment  ================== 33301 =================
;
procedure FEM LAG(X, Y, N, R, F, ORDER, E); 
  value N, ORDER;
  integer N, ORDER;
  real procedure R, F;
  array X, Y, E;
begin;
    integer L, L1;
    real XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6;
    array T, SUB, CHI, GI[0 : N - 1];
    procedure ELEMENT MAT VEC EVALUATION 1;
    begin;
        own real  F2, R2;
        real R1, F1, H2;
        if L = 1 then begin;
            F2 := F(XL1);
            R2 := R(XL1);
        end;
        A12 := -1 ÷ H;
        H2 := H ÷ 2;
        R1 := R2;
        R2 := R(XL);
        F1 := F2;
        F2 := F(XL);
        B1 := H2 TIMES F1;
        B2 := H2 TIMES F2;
        TAU1 := H2 TIMES R1;
        TAU2 := H2 TIMES R2;
    end ELEMENT MAT VEC EVALUATION 1;
    procedure ELEMENT MAT VEC EVALUATION 2;
    begin;
        own real  R3, F3;
        real R1, R2, F1, F2, X2, H6, H15, B3, TAU3, C12, A13, A22, A23;
        if L = 1 then begin;
            R3 := R(XL1);
            F3 := F(XL1);
        end;
        X2 := (XL1 + XL) ÷ 2;
        H6 := H ÷ 6;
        H15 := H ÷ 1.5;
        R1 := R3;
        R2 := R(X2);
        R3 := R(XL);
        F1 := F3;
        F2 := F(X2);
        F3 := F(XL);
        B1 := H6 TIMES F1;
        B2 := H15 TIMES F2;
        B3 := H6 TIMES F3;
        TAU1 := H6 TIMES R1;
        TAU2 := H15 TIMES R2;
        TAU3 := R3 TIMES H6;
        A12 := A23 := -8 ÷ H ÷ 3;
        A13 := -A12 ÷ 8;
        A22 := -2 TIMES A12 + TAU2;
        comment  STATIC CONDENSATION
        ;
        C12 := -A12 ÷ A22;
        A12 := A13 + C12 TIMES A12;
        B2 := C12 TIMES B2;
        B1 := B1 + B2;
        B2 := B3 + B2;
        TAU2 := C12 TIMES TAU2;
        TAU1 := TAU1 + TAU2;
        TAU2 := TAU3 + TAU2;
    end ELEMENT MAT VEC EVALUATION2;
    procedure ELEMENT MAT VEC EVALUATION 3;
    begin;
        own real  R4, F4;
        real R1, R2, R3, F1, F2, F3, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4;
        if L = 1 then begin;
            R4 := R(XL1);
            F4 := F(XL1);
        end;
        X2 := XL1 + 0.27639320225 TIMES H;
        X3 := XL - X2 + XL1;
        R1 := R4;
        R2 := R(X2);
        R3 := R(X3);
        R4 := R(XL);
        F1 := F4;
        F2 := F(X2);
        F3 := F(X3);
        F4 := F(XL);
        H12 := H ÷ 12;
        H24 := H ÷ 2.4;
        B1 := F1 TIMES H12;
        B2 := F2 TIMES H24;
        B3 := F3 TIMES H24;
        B4 := F4 TIMES H12;
        TAU1 := R1 TIMES H12;
        TAU2 := R2 TIMES H24;
        TAU3 := R3 TIMES H24;
        TAU4 := R4 TIMES H12;
        A12 := A34 := -4.8784183052078 ÷ H;
        A13 := A24 := 0.7117516385412 ÷ H;
        A14 := -0.16666666666667 ÷ H;
        A23 := 25 TIMES A14;
        A22 := -2 TIMES A23 + TAU2;
        A33 := -2 TIMES A23 + TAU3;
        comment  STATIC CONDENSATION
        ;
        DET := A22 TIMES A33 - A23 TIMES A23;
        C12 := (A13 TIMES A23 - A12 TIMES A33) ÷ DET;
        C13 := (A12 TIMES A23 - A13 TIMES A22) ÷ DET;
        C42 := (A23 TIMES A34 - A24 TIMES A33) ÷ DET;
        C43 := (A24 TIMES A23 - A34 TIMES A22) ÷ DET;
        TAU1 := TAU1 + C12 TIMES TAU2 + C13 TIMES TAU3;
        TAU2 := TAU4 + C42 TIMES TAU2 + C43 TIMES TAU3;
        A12 := A14 + C42 TIMES A12 + C43 TIMES A13;
        B1 := B1 + C12 TIMES B2 + C13 TIMES B3;
        B2 := B4 + C42 TIMES B2 + C43 TIMES B3;
    end ELEMENT MAT VEC EVALUATION3;
    procedure BOUNDARY CONDITIONS;
    if L = 1 IMPL E2 = 0 then begin;
        TAU1 := 1;
        B1 := E3 ÷ E1;
        B2 := B2 - A12 TIMES B1;
        TAU2 := TAU2 - A12;
        A12 := 0;
    end else if L = 1 IMPL E2 NOTEQUAL 0 then begin;
        TAU1 := TAU1 - E1 ÷ E2;
        B1 := B1 - E3 ÷ E2;
    end else if L = N IMPL E5 = 0 then begin;
        TAU2 := 1;
        B2 := E6 ÷ E4;
        B1 := B1 - A12 TIMES B2;
        TAU1 := TAU1 - A12;
        A12 := 0;
    end else if L = N IMPL E5 NOTEQUAL 0 then begin;
        TAU2 := TAU2 + E4 ÷ E5;
        B2 := B2 + E6 ÷ E5;
    end BOUNDARY CONDITIONS;
    procedure FORWARD BABUSHKA;
    if L = 1 then begin;
        CHI[0] := CH := TL := TAU1;
        T[0] := TL;
        GI[0] := G := YL := B1;
        Y[0] := YL;
        SUB[0] := A12;
        PP := A12 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        TL := TAU2;
        YL := B2;
    end else begin;
        CHI[L1] := CH := CH + TAU1;
        GI[L1] := G := G + B1;
        SUB[L1] := A12;
        PP := A12 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        T[L1] := TL + TAU1;
        TL := TAU2;
        Y[L1] := YL + B1;
        YL := B2;
    end FORWARD BABUSHKA 1;
    procedure BACKWARD BABUSHKA;
    begin;
        PP := YL;
        Y[N] := G ÷ CH;
        G := PP;
        CH := TL;
        L := N;
        for L := L - 1 while L NOTLESS 0 do
          begin;
            PP := SUB[L];
            PP := PP ÷ (CH - PP);
            TL := T[L];
            CH := TL - CH TIMES PP;
            YL := Y[L];
            G := YL - G TIMES PP;
            Y[L] := ((GI[L] + G) - YL) ÷ ((CHI[L] + CH) - TL);
        end;
    end BACKWARD BABUSHKA;
    L := 0;
    XL := X[0];
    E1 := E[1];
    E2 := E[2];
    E3 := E[3];
    E4 := E[4];
    E5 := E[5];
    E6 := E[6];
    for L := L + 1 while L NOTLESS N do
      begin;
        L1 := L - 1;
        XL1 := XL;
        XL := X[L];
        H := XL - XL1;
        if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3;
        if L = 1 OR L = N then BOUNDARY CONDITIONS;
        FORWARD BABUSHKA;
    end;
    BACKWARD BABUSHKA;
    ;
end FEM LAGR;
comment  ================== 33302 =================
;
procedure FEM LAG SKEW(X, Y, N, Q, R, F, ORDER, E);
  integer N, ORDER;
  real procedure Q, R, F;
  array X, Y, E;
begin;
    integer L, L1;
    real XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6;
    array T, SUPER, SUB, CHI, GI[0 : N - 1];
    procedure ELEMENT MAT VEC EVALUATION 1;
    begin;
        own real  Q2, R2, F2;
        real Q1, R1, F1, H2, S12;
        if L = 1 then begin;
            Q2 := Q(XL1);
            R2 := R(XL1);
            F2 := F(XL1);
        end;
        H2 := H ÷ 2;
        S12 := -1 ÷ H;
        Q1 := Q2;
        Q2 := Q(XL);
        R1 := R2;
        R2 := R(XL);
        F1 := F2;
        F2 := F(XL);
        B1 := H2 TIMES F1;
        B2 := H2 TIMES F2;
        TAU1 := H2 TIMES R1;
        TAU2 := H2 TIMES R2;
        A12 := S12 + Q1 ÷ 2;
        A21 := S12 - Q2 ÷ 2;
    end ELEMENT MAT VEC EV.;
    procedure ELEMENT MAT VEC EVALUATION 2;
    begin;
        own real  Q3, R3, F3;
        real Q1, Q2, R1, R2, F1, F2, S12, S13, S22, X2, H6, H15, C12, C32, A13, A31, A22, A23, A32, B3, TAU3;
        if L = 1 then begin;
            Q3 := Q(XL1);
            R3 := R(XL1);
            F3 := F(XL1);
        end;
        X2 := (XL1 + XL) ÷ 2;
        H6 := H ÷ 6;
        H15 := H ÷ 1.5;
        Q1 := Q3;
        Q2 := Q(X2);
        Q3 := Q(XL);
        R1 := R3;
        R2 := R(X2);
        R3 := R(XL);
        F1 := F3;
        F2 := F(X2);
        F3 := F(XL);
        B1 := H6 TIMES F1;
        B2 := H15 TIMES F2;
        B3 := H6 TIMES F3;
        TAU1 := H6 TIMES R1;
        TAU2 := H15 TIMES R2;
        TAU3 := H6 TIMES R3;
        S12 := -1 ÷ H ÷ 0.375;
        S13 := -S12 ÷ 8;
        S22 := -2 TIMES S12;
        A12 := S12 + Q1 ÷ 1.5;
        A13 := S13 - Q1 ÷ 6;
        A21 := S12 - Q2 ÷ 1.5;
        A23 := S12 + Q2 ÷ 1.5;
        A22 := S22 + TAU2;
        A31 := S13 + Q3 ÷ 6;
        A32 := S12 - Q3 ÷ 1.5;
        comment  STATIC CONDENSATION
        ;
        C12 := -A12 ÷ A22;
        C32 := -A32 ÷ A22;
        A12 := A13 + C12 TIMES A23;
        A21 := A31 + C32 TIMES A21;
        B1 := B1 + C12 TIMES B2;
        B2 := B3 + C32 TIMES B2;
        TAU1 := TAU1 + C12 TIMES TAU2;
        TAU2 := TAU3 + C32 TIMES TAU2;
    end ELEMENT MAT VEC EVALUATION 2;
    procedure ELEMENT MAT VEC EVALUATION 3;
    begin;
        own real  Q4, R4, F4;
        real Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, S12, S13, S14, S22, S23, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A31, A32, A33, A34, A41, A42, A43, B3, B4, TAU3, TAU4;
        if L = 1 then begin;
            Q4 := Q(XL1);
            R4 := R(XL1);
            F4 := F(XL1);
        end;
        X2 := XL1 + 0.27639320225 TIMES H;
        X3 := XL - X2 + XL1;
        H12 := H ÷ 12;
        H24 := H ÷ 2.4;
        Q1 := Q4;
        Q2 := Q(X2);
        Q3 := Q(X3);
        Q4 := Q(XL);
        R1 := R4;
        R2 := R(X2);
        R3 := R(X3);
        R4 := R(XL);
        F1 := F4;
        F2 := F(X2);
        F3 := F(X3);
        F4 := F(XL);
        S12 := -4.8784183052080 ÷ H;
        S13 := 0.7117516385414 ÷ H;
        S14 := -.16666666666667 ÷ H;
        S23 := 25 TIMES S14;
        S22 := -2 TIMES S23;
        B1 := H12 TIMES F1;
        B2 := H24 TIMES F2;
        B3 := H24 TIMES F3;
        B4 := H12 TIMES F4;
        TAU1 := H12 TIMES R1;
        TAU2 := H24 TIMES R2;
        TAU3 := H24 TIMES R3;
        TAU4 := H12 TIMES R4;
        A12 := S12 + 0.67418082864578 TIMES Q1;
        A13 := S13 - 0.25751416197912 TIMES Q1;
        A14 := S14 + Q1 ÷ 12;
        A21 := S12 - 0.67418082864578 TIMES Q2;
        A22 := S22 + TAU2;
        A23 := S23 + 0.93169499062490 TIMES Q2;
        A24 := S13 - 0.25751416197912 TIMES Q2;
        A31 := S13 + 0.25751416197912 TIMES Q3;
        A32 := S23 - 0.93169499062490 TIMES Q3;
        A33 := S22 + TAU3;
        A34 := S12 + 0.67418082864578 TIMES Q3;
        A41 := S14 - Q4 ÷ 12;
        A42 := S13 + 0.25751416197912 TIMES Q4;
        A43 := S12 - 0.67418082864578 TIMES Q4;
        comment  STATIC CONDENSATION
        ;
        DET := A22 TIMES A33 - A23 TIMES A32;
        C12 := (A13 TIMES A32 - A12 TIMES A33) ÷ DET;
        C13 := (A12 TIMES A23 - A13 TIMES A22) ÷ DET;
        C42 := (A32 TIMES A43 - A42 TIMES A33) ÷ DET;
        C43 := (A42 TIMES A23 - A43 TIMES A22) ÷ DET;
        TAU1 := TAU1 + C12 TIMES TAU2 + C13 TIMES TAU3;
        TAU2 := TAU4 + C42 TIMES TAU2 + C43 TIMES TAU3;
        A12 := A14 + C12 TIMES A24 + C13 TIMES A34;
        A21 := A41 + C42 TIMES A21 + C43 TIMES A31;
        B1 := B1 + C12 TIMES B2 + C13 TIMES B3;
        B2 := B4 + C42 TIMES B2 + C43 TIMES B3;
    end ELEMENT MAT VEC EVALUATION 3;
    procedure BOUNDARY CONDITIONS;
    if L = 1 IMPL E2 = 0 then begin;
        TAU1 := 1;
        B1 := E3 ÷ E1;
        A12 := 0;
    end else if L = 1 IMPL E2 NOTEQUAL 0 then begin;
        TAU1 := TAU1 - E1 ÷ E2;
        B1 := B1 - E3 ÷ E2;
    end else if L = N IMPL E5 = 0 then begin;
        TAU2 := 1;
        A21 := 0;
        B2 := E6 ÷ E4;
        ;
    end else if L = N IMPL E5 NOTEQUAL 0 then begin;
        TAU2 := TAU2 + E4 ÷ E5;
        B2 := B2 + E6 ÷ E5;
    end B.C.1;
    procedure FORWARD BABUSKA;
    if L = 1 then begin;
        CHI[0] := CH := TL := TAU1;
        T[0] := TL;
        GI[0] := G := YL := B1;
        Y[0] := YL;
        SUB[0] := A21;
        SUPER[0] := A12;
        PP := A21 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        TL := TAU2;
        YL := B2;
    end else begin;
        CHI[L1] := CH := CH + TAU1;
        GI[L1] := G := G + B1;
        SUB[L1] := A21;
        SUPER[L1] := A12;
        PP := A21 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        T[L1] := TL + TAU1;
        TL := TAU2;
        Y[L1] := YL + B1;
        YL := B2;
    end FORWARD BABUSKA;
    procedure BACKWARD BABUSKA;
    begin;
        PP := YL;
        Y[N] := G ÷ CH;
        G := PP;
        CH := TL;
        L := N;
        for L := L - 1 while L NOTLESS 0 do
          begin;
            PP := SUPER[L] ÷ (CH - SUB[L]);
            TL := T[L];
            CH := TL - CH TIMES PP;
            YL := Y[L];
            G := YL - G TIMES PP;
            Y[L] := (GI[L] + G - YL) ÷ (CHI[L] + CH - TL);
            ;
        end;
    end BACKWARD BABUSKA;
    L := 0;
    XL := X[0];
    E1 := E[1];
    E2 := E[2];
    E3 := E[3];
    E4 := E[4];
    E5 := E[5];
    E6 := E[6];
    comment  ELEMENTWISE ASSEMBLAGE OF MATRIX AND VECTOR
          COMBINED WITH FORWARD BABUSKA SUBSTITUTION
    ;
    for L := L + 1 while L NOTLESS N do
      begin;
        XL1 := XL;
        L1 := L - 1;
        XL := X[L];
        H := XL - XL1;
        if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3;
        if L = 1 OR L = N then BOUNDARY CONDITIONS;
        FORWARD BABUSKA;
    end;
    BACKWARD BABUSKA;
    ;
end FEM LAGR;
comment  ================== 33303 =================
;
procedure FEM HERM SYM(X, Y, N, P, Q, R, F, ORDER, E); 
  value N, ORDER;
  integer N, ORDER;
  array X, Y, E;
  real procedure P, Q, R, F;
begin;
    integer L, N2, V, W;
    array A[1 : 8 TIMES (N - 1)], EM[2 : 3];
    real A11, A12, A13, A14, A22, A23, A24, A33, A34, A44, YA, YB, ZA, ZB, B1, B2, B3, B4, D1, D2, E1, R1, R2, XL1, XL;
    procedure CHLDECSOLBND(A, N, W, AUX, B); code 34333;
    
    procedure ELEMENTMATVECEVALUATION;
    if ORDER = 4 then begin;
        real X2, H, H2, H3, P1, P2, Q1, Q2, R1, R2, F1, F2, B11, B12, B13, B14, B22, B23, B24, B33, B34, B44, S11, S12, S13, S14, S22, S23, S24, S33, S34, S44, M11, M12, M13, M14, M22, M23, M24, M33, M34, M44;
        own real  P3, Q3, R3, F3;
        H := XL - XL1;
        H2 := H TIMES H;
        H3 := H TIMES H2;
        X2 := (XL1 + XL) ÷ 2;
        if L = 1 then begin;
            P3 := P(XL1);
            Q3 := Q(XL1);
            R3 := R(XL1);
            F3 := F(XL1);
        end;
        comment  ELEMENT BENDING MATRIX
        ;
        P1 := P3;
        P2 := P(X2);
        P3 := P(XL);
        B11 := 6 TIMES (P1 + P3);
        B12 := 4 TIMES P1 + 2 TIMES P3;
        B13 := -B11;
        B14 := B11 - B12;
        B22 := (4 TIMES P1 + P2 + P3) ÷ 1.5;
        B23 := -B12;
        B24 := B12 - B22;
        B33 := B11;
        B34 := -B14;
        B44 := B14 - B24;
        comment  ELEMENT STIFFNESS MATRIX
        ;
        Q1 := Q3;
        Q2 := Q(X2);
        Q3 := Q(XL);
        S11 := 1.5 TIMES Q2;
        S12 := Q2 ÷ 4;
        S13 := -S11;
        S14 := S12;
        S24 := Q2 ÷ 24;
        S22 := Q1 ÷ 6 + S24;
        S23 := -S12;
        S33 := S11;
        S34 := -S12;
        S44 := S24 + Q3 ÷ 6;
        comment  ELEMENT MASS MATRIX
        ;
        R1 := R3;
        R2 := R(X2);
        R3 := R(XL);
        M11 := (R1 + R2) ÷ 6;
        M12 := R2 ÷ 24;
        M13 := R2 ÷ 6;
        M14 := -M12;
        M22 := R2 ÷ 96;
        M23 := -M14;
        M24 := -M22;
        M33 := (R2 + R3) ÷ 6;
        M34 := M14;
        M44 := M22;
        comment  ELEMENT LOAD VECTOR
        ;
        F1 := F3;
        F2 := F(X2);
        F3 := F(XL);
        B1 := H TIMES (F1 + 2 TIMES F2) ÷ 6;
        B3 := H TIMES (F3 + 2 TIMES F2) ÷ 6;
        B2 := H2 TIMES F2 ÷ 12;
        B4 := -B2;
        A11 := B11 ÷ H3 + S11 ÷ H + M11 TIMES H;
        A12 := B12 ÷ H2 + S12 + M12 TIMES H2;
        A13 := B13 ÷ H3 + S13 ÷ H + M13 TIMES H;
        A14 := B14 ÷ H2 + S14 + M14 TIMES H2;
        A22 := B22 ÷ H + S22 TIMES H + M22 TIMES H3;
        A23 := B23 ÷ H2 + S23 + M23 TIMES H2;
        A24 := B24 ÷ H + S24 TIMES H + M24 TIMES H3;
        A34 := B34 ÷ H2 + S34 + M34 TIMES H2;
        A33 := B33 ÷ H3 + S33 ÷ H + M33 TIMES H;
        A44 := B44 ÷ H + S44 TIMES H + M44 TIMES H3;
    end else if ORDER = 6 then begin;
        own real  P4, Q4, R4, F4;
        real H, H2, H3, X2, X3, P1, P2, P3, Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, B11, B12, B13, B14, B15, B22, B23, B24, B25, B33, B34, B35, B44, B45, B55, S11, S12, S13, S14, S15, S22, S23, S24, S25, S33, S34, S35, S44, S45, S55, M11, M12, M13, M14, M15, M22, M23, M24, M25, M33, M34, M35, M44, M45, M55, A15, A25, A35, A45, A55, C1, C2, C3, C4, B5;
        if L = 1 then begin;
            P4 := P(XL1);
            Q4 := Q(XL1);
            R4 := R(XL1);
            F4 := F(XL1);
        end;
        H := XL - XL1;
        H2 := H TIMES H;
        H3 := H TIMES H2;
        X2 := 0.27639320225 TIMES H + XL1;
        X3 := XL1 + XL - X2;
        comment  ELEMENT BENDING MATRIX
        ;
        P1 := P4;
        P2 := P(X2);
        P3 := P(X3);
        P4 := P(XL);
        B11 := +4.033333333333310+1 TIMES P1 + 1.112491386673810-1 TIMES P2 + 1.442208419466410+1 TIMES P3 + 8.333333333333310+0 TIMES P4;
        B12 := +1.466666666666710+1 TIMES P1 - 3.319142509165910-1 TIMES P2 + 2.798580917581810+0 TIMES P3 + 1.666666666666710+0 TIMES P4;
        B13 := +1.833333333333310+1 TIMES (P1 + P4) + 1.266666666666710+0 TIMES (P2 + P3);
        B15 := -(B11 + B13);
        B14 := -(B12 + B13 + B15 ÷ 2);
        B22 := +5.333333333333310+0 TIMES P1 + 9.902734644167410-1 TIMES P2 + 5.430598689162410-1 TIMES P3 + 3.333333333333310-1 TIMES P4;
        B23 := +6.666666666666710+0 TIMES P1 - 3.779127846416710+0 TIMES P2 + 2.457945130829510-1 TIMES P3 + 3.666666666666710+0 TIMES P4;
        B25 := -(B12 + B23);
        B24 := -(B22 + B23 + B25 ÷ 2);
        B33 := +8.333333333333310+0 TIMES P1 + 1.442208419466610+1 TIMES P2 + 1.112491386672610-1 TIMES P3 + 4.033333333333310+1 TIMES P4;
        B35 := -(B13 + B33);
        B34 := -(B23 + B33 + B35 ÷ 2);
        B45 := -(B14 + B34);
        B44 := -(B24 + B34 + B45 ÷ 2);
        B55 := -(B15 + B35);
        comment  ELEMENT STIFFNESS MATRIX
        ;
        Q1 := Q4;
        Q2 := Q(X2);
        Q3 := Q(X3);
        Q4 := Q(XL);
        S11 := +2.884416838933010+0 TIMES Q2 + 2.224982773344810-2 TIMES Q3;
        S12 := +2.567105187249810-1 TIMES Q2 + 3.289481274999410-3 TIMES Q3;
        S13 := +2.533333333333310-1 TIMES (Q2 + Q3);
        S14 := -3.745355992500510-2 TIMES Q2 - 2.254644007498810-2 TIMES Q3;
        S15 := -(S13 + S11);
        S22 := +8.333333333333310-2 TIMES Q1 + 2.284700655416410-2 TIMES Q2 + 4.863267791644510-4 TIMES Q3;
        S23 := +2.254644007500210-2 TIMES Q2 + 3.745355992487310-2 TIMES Q3;
        S24 := -3.333333333333310-3 TIMES (Q2 + Q3);
        S25 := -(S12 + S23);
        S33 := +2.224982773347110-2 TIMES Q2 + 2.884416838933010+0 TIMES Q3;
        S34 := -3.289481275012710-3 TIMES Q2 - 2.567105187249610-1 TIMES Q3;
        S35 := -(S13 + S33);
        S44 := +4.863267791678810-4 TIMES Q2 + 2.284700655416110-2 TIMES Q3 + 8.333333333333810-2 TIMES Q4;
        S45 := -(S14 + S34);
        S55 := -(S15 + S35);
        comment  ELEMENT MASS MATRIX
        ;
        R1 := R4;
        R2 := R(X2);
        R3 := R(X3);
        R4 := R(XL);
        M11 := +8.333333333333310-2 TIMES R1 + 1.012907608608310-1 TIMES R2 + 7.375905805838010-3 TIMES R3;
        M12 := +1.329618127333310-2 TIMES R2 + 1.370485393335310-3 TIMES R3;
        M13 := -2.733333333333310-2 TIMES (R2 + R3);
        M14 := +5.078689325833510-3 TIMES R2 + 3.587977340833310-3 TIMES R3;
        M15 := +1.314798711599910-1 TIMES R2 - 3.547987115999110-2 TIMES R3;
        M22 := +1.745355992500010-3 TIMES R2 + 2.546440075005910-4 TIMES R3;
        M23 := -3.587977340833610-3 TIMES R2 - 5.078689325838510-3 TIMES R3;
        M24 := +6.666666666666710-4 TIMES (R2 + R3);
        M25 := +1.725902921333310-2 TIMES R2 - 6.592362546671910-3 TIMES R3;
        M33 := +7.375905805838010-3 TIMES R2 + 1.012907608608310-1 TIMES R3 + 8.333333333333310-2 TIMES R4;
        M34 := -1.370485393333310-3 TIMES R2 - 1.329618127333310-2 TIMES R3;
        M35 := -3.547987115999210-2 TIMES R2 + 1.314798711599910-1 TIMES R3;
        M44 := +2.546440075000810-4 TIMES R2 + 1.745355992499710-3 TIMES R3;
        M45 := +6.592362546665610-3 TIMES R2 - 1.725902921333010-2 TIMES R3;
        M55 := +.1706666666666710+0 TIMES (R2 + R3);
        comment  ELEMENT LOAD VECTOR
        ;
        F1 := F4;
        F2 := F(X2);
        F3 := F(X3);
        F4 := F(XL);
        B1 := +8.333333333333310-2 TIMES F1 + 2.054372986874910-1 TIMES F2 - 5.543729868748910-2 TIMES F3;
        B2 := +2.696723314583210-2 TIMES F2 - 1.030056647917510-2 TIMES F3;
        B3 := -5.543729868748910-2 TIMES F2 + 2.054372986874910-1 TIMES F3 + 8.333333333333310-2 TIMES F4;
        B4 := +1.030056647916510-2 TIMES F2 - 2.696723314583010-2 TIMES F3;
        B5 := +2.666666666666710-1 TIMES (F2 + F3);
        A11 := H2 TIMES (H2 TIMES M11 + S11) + B11;
        A12 := H2 TIMES (H2 TIMES M12 + S12) + B12;
        A13 := H2 TIMES (H2 TIMES M13 + S13) + B13;
        A14 := H2 TIMES (H2 TIMES M14 + S14) + B14;
        A15 := H2 TIMES (H2 TIMES M15 + S15) + B15;
        A22 := H2 TIMES (H2 TIMES M22 + S22) + B22;
        A23 := H2 TIMES (H2 TIMES M23 + S23) + B23;
        A24 := H2 TIMES (H2 TIMES M24 + S24) + B24;
        A25 := H2 TIMES (H2 TIMES M25 + S25) + B25;
        A33 := H2 TIMES (H2 TIMES M33 + S33) + B33;
        A34 := H2 TIMES (H2 TIMES M34 + S34) + B34;
        A35 := H2 TIMES (H2 TIMES M35 + S35) + B35;
        A44 := H2 TIMES (H2 TIMES M44 + S44) + B44;
        A45 := H2 TIMES (H2 TIMES M45 + S45) + B45;
        A55 := H2 TIMES (H2 TIMES M55 + S55) + B55;
        comment  STATIC CONDENSATION
        ;
        C1 := A15 ÷ A55;
        C2 := A25 ÷ A55;
        C3 := A35 ÷ A55;
        C4 := A45 ÷ A55;
        B1 := (B1 - C1 TIMES B5) TIMES H;
        B2 := (B2 - C2 TIMES B5) TIMES H2;
        B3 := (B3 - C3 TIMES B5) TIMES H;
        B4 := (B4 - C4 TIMES B5) TIMES H2;
        A11 := (A11 - C1 TIMES A15) ÷ H3;
        A12 := (A12 - C1 TIMES A25) ÷ H2;
        A13 := (A13 - C1 TIMES A35) ÷ H3;
        A14 := (A14 - C1 TIMES A45) ÷ H2;
        A22 := (A22 - C2 TIMES A25) ÷ H;
        A23 := (A23 - C2 TIMES A35) ÷ H2;
        A24 := (A24 - C2 TIMES A45) ÷ H;
        A33 := (A33 - C3 TIMES A35) ÷ H3;
        A34 := (A34 - C3 TIMES A45) ÷ H2;
        A44 := (A44 - C4 TIMES A45) ÷ H;
        ;
    end else begin;
        own real  P5, Q5, R5, F5;
        real X2, X3, X4, H, H2, H3, P1, P2, P3, P4, Q1, Q2, Q3, Q4, R1, R2, R3, R4, F1, F2, F3, F4, B11, B12, B13, B14, B15, B16, B22, B23, B24, B25, B26, B33, B34, B35, B36, B44, B45, B46, B55, B56, B66, S11, S12, S13, S14, S15, S16, S22, S23, S24, S25, S26, S33, S34, S35, S36, S44, S45, S46, S55, S56, S66, M11, M12, M13, M14, M15, M16, M22, M23, M24, M25, M26, M33, M34, M35, M36, M44, M45, M46, M55, M56, M66, C15, C16, C25, C26, C35, C36, C45, C46, B5, B6, A15, A16, A25, A26, A35, A36, A45, A46, A55, A56, A66, DET;
        if L = 1 then begin;
            P5 := P(XL1);
            Q5 := Q(XL1);
            R5 := R(XL1);
            F5 := F(XL1);
        end;
        H := XL - XL1;
        H2 := H TIMES H;
        H3 := H TIMES H2;
        X2 := XL1 + H TIMES .172673164646;
        X3 := XL1 + H ÷ 2;
        X4 := XL1 + XL - X2;
        comment  ELEMENT BENDING MATRIX
        ;
        P1 := P5;
        P2 := P(X2);
        P3 := P(X3);
        P4 := P(X4);
        P5 := P(XL);
        B11 := +105.8 TIMES P1 + 9.8 TIMES P5 + 7.359312130351310-2 TIMES P2 + 2.275555555555610+1 TIMES P3 + 7.056565608855310+0 TIMES P4;
        B12 := +27.6 TIMES P1 + 1.4 TIMES P5 - 3.4155482481110-1 TIMES P2 + 2.844444444444410+0 TIMES P3 + 1.011396094652210+0 TIMES P4;
        B13 := -32.2 TIMES (P1 + P5) - 7.206349206350510-1 TIMES (P2 + P4) + 2.275555555555610+1 TIMES P3;
        B14 := +4.6 TIMES P1 + 8.4 TIMES P5 + 1.032864122294410-1 TIMES P2 - 2.844444444444410+0 TIMES P3 - 3.344556253499210+0 TIMES P4;
        B15 := -(B11 + B13);
        B16 := -(B12 + B13 + B14 + B15 ÷ 2);
        B22 := +7.2 TIMES P1 + 0.2 TIMES P5 + 1.585198402858110+0 TIMES P2 + 3.555555555555610-1 TIMES P3 + 1.449603273005910-1 TIMES P4;
        B23 := -8.4 TIMES P1 - 4.6 TIMES P5 + 3.344556253499210+0 TIMES P2 + 2.844444444444410+0 TIMES P3 - 1.032864122294410-1 TIMES P4;
        B24 := +1.2 TIMES (P1 + P5) - 4.793650793650810-1 TIMES (P2 + P4) - 3.555555555555610-1 TIMES P3;
        B25 := -(B12 + B23);
        B26 := -(B22 + B23 + B24 + B25 ÷ 2);
        B33 := +7.056565608855310+0 TIMES P2 + 2.275555555555610+1 TIMES P3 + 7.359312130351310-2 TIMES P4 + 105.8 TIMES P5 + 9.8 TIMES P1;
        B34 := -1.4 TIMES P1 - 27.6 TIMES P5 - 1.011396094652210+0 TIMES P2 - 2.844444444444410+0 TIMES P3 + 3.415548248110010-1 TIMES P4;
        B35 := -(B13 + B33);
        B36 := -(B23 + B33 + B34 + B35 ÷ 2);
        B44 := +7.2 TIMES P5 + P1 ÷ 5 + 1.449603273005910-1 TIMES P2 + 3.555555555555610-1 TIMES P3 + 1.585198402858110+0 TIMES P4;
        B45 := -(B14 + B34);
        B46 := -(B24 + B34 + B44 + B45 ÷ 2);
        B55 := -(B15 + B35);
        B56 := -(B16 + B36);
        B66 := -(B26 + B36 + B46 + B56 ÷ 2);
        comment  ELEMENT STIFFNESS MATRIX
        ;
        Q1 := Q5;
        Q2 := Q(X2);
        Q3 := Q(X3);
        Q4 := Q(X4);
        Q5 := Q(XL);
        S11 := +3.024242403795110+0 TIMES Q2 + 3.153990913006510-2 TIMES Q4;
        S12 := +1.257552558174410-1 TIMES Q2 + 4.176716971674210-3 TIMES Q4;
        S13 := -3.088435374149610-1 TIMES (Q2 + Q4);
        S14 := +4.089904124306210-2 TIMES Q2 + 1.284245535557710-2 TIMES Q4;
        S15 := -(S13 + S11);
        S16 := +5.925486117706810-1 TIMES Q2 + 6.051261271911610-2 TIMES Q4;
        S22 := +5.229205286542210-3 TIMES Q2 + 5.531076386279610-4 TIMES Q4 + Q1 ÷ 20;
        S23 := -1.284245535557710-2 TIMES Q2 - 4.089904124306210-2 TIMES Q4;
        S24 := +1.700680272108810-3 TIMES (Q2 + Q4);
        S25 := -(S12 + S23);
        S26 := +2.463959309742610-2 TIMES Q2 + 8.013468127064110-3 TIMES Q4;
        S33 := +3.153990913006510-2 TIMES Q2 + 3.024242403795110+0 TIMES Q4;
        S34 := -4.176716971674210-3 TIMES Q2 - 1.257552558174410-1 TIMES Q4;
        S35 := -(S13 + S33);
        S36 := -6.051261271911610-2 TIMES Q2 - 5.925486117706810-1 TIMES Q4;
        S44 := +5.531076386279610-4 TIMES Q2 + 5.229205286542210-3 TIMES Q4 + Q5 ÷ 20;
        S45 := -(S14 + S34);
        S46 := +8.013468127064110-3 TIMES Q2 + 2.463959309742610-2 TIMES Q4;
        S55 := -(S15 + S35);
        S56 := -(S16 + S36);
        S66 := +1.160997732426310-1 TIMES (Q2 + Q4) + 3.555555555555610-1 TIMES Q3;
        comment  ELEMENT MASS MATRIX
        ;
        R1 := R5;
        R2 := R(X2);
        R3 := R(X3);
        R4 := R(X4);
        R5 := R(XL);
        M11 := +9.710702072731010-2 TIMES R2 + 1.581025919918010-3 TIMES R4 + R1 ÷ 20;
        M12 := +8.235488946025410-3 TIMES R2 + 2.193215496007110-4 TIMES R4;
        M13 := +1.239067055393610-2 TIMES (R2 + R4);
        M14 := -1.718846624996810-3 TIMES R2 - 1.050832675293910-3 TIMES R4;
        M15 := +5.308978971211910-2 TIMES R2 + 6.774155866106010-3 TIMES R4;
        M16 := -1.737771285607610-2 TIMES R2 + 2.217363001846610-3 TIMES R4;
        M22 := +6.984384617314510-4 TIMES R2 + 3.042451202934910-5 TIMES R4;
        M23 := +1.050832675294710-3 TIMES R2 + 1.718846624993610-3 TIMES R4;
        M24 := -1.457725947520610-4 TIMES (R2 + R4);
        M25 := +4.502458967912710-3 TIMES R2 + 9.397179028337410-4 TIMES R4;
        M26 := -1.473775645278010-3 TIMES R2 + 3.075948872599810-4 TIMES R4;
        M33 := +1.581025919920910-3 TIMES R2 + 9.710702072729010-2 TIMES R4 + R5 ÷ 20;
        M34 := -2.193215496013110-4 TIMES R2 - 8.235488946025410-3 TIMES R4;
        M35 := +6.774155866112310-3 TIMES R2 + 5.308978971211210-2 TIMES R4;
        M36 := -2.217363001849210-3 TIMES R2 + 1.737771285607110-2 TIMES R4;
        M44 := +3.042451202945710-5 TIMES R2 + 6.984384617315810-4 TIMES R4;
        M45 := -9.397179028354210-4 TIMES R2 - 4.502458967913110-3 TIMES R4;
        M46 := +3.075948872606010-4 TIMES R2 - 1.473775645277810-3 TIMES R4;
        M55 := +2.902494331065710-2 TIMES (R2 + R4) + 3.555555555555610-1 TIMES R3;
        M56 := +9.500642840205010-3 TIMES (R4 - R2);
        M66 := +3.109815354712510-3 TIMES (R2 + R4);
        comment  ELEMENT LOAD VECTOR
        ;
        F1 := F5;
        F2 := F(X2);
        F3 := F(X3);
        F4 := F(X4);
        F5 := F(XL);
        B1 := +1.625874809933610-1 TIMES F2 + 2.074585233996910-2 TIMES F4 + F1 ÷ 20;
        B2 := +1.378878058923310-2 TIMES F2 + 2.877886077433510-3 TIMES F4;
        B3 := +2.074585233996910-2 TIMES F2 + 1.625874809933610-1 TIMES F4 + F5 ÷ 20;
        B4 := -2.877886077433510-3 TIMES F2 - 1.378878058923310-2 TIMES F4;
        B5 := +(F2 + F4) ÷ 11.25 + 3.555555555555610-1 TIMES F3;
        B6 := +2.909571869813210-2 TIMES (F4 - F2);
        A11 := H2 TIMES (H2 TIMES M11 + S11) + B11;
        A12 := H2 TIMES (H2 TIMES M12 + S12) + B12;
        A13 := H2 TIMES (H2 TIMES M13 + S13) + B13;
        A14 := H2 TIMES (H2 TIMES M14 + S14) + B14;
        A15 := H2 TIMES (H2 TIMES M15 + S15) + B15;
        A16 := H2 TIMES (H2 TIMES M16 + S16) + B16;
        A22 := H2 TIMES (H2 TIMES M22 + S22) + B22;
        A23 := H2 TIMES (H2 TIMES M23 + S23) + B23;
        A24 := H2 TIMES (H2 TIMES M24 + S24) + B24;
        A25 := H2 TIMES (H2 TIMES M25 + S25) + B25;
        A26 := H2 TIMES (H2 TIMES M26 + S26) + B26;
        A33 := H2 TIMES (H2 TIMES M33 + S33) + B33;
        A34 := H2 TIMES (H2 TIMES M34 + S34) + B34;
        A35 := H2 TIMES (H2 TIMES M35 + S35) + B35;
        A36 := H2 TIMES (H2 TIMES M36 + S36) + B36;
        A44 := H2 TIMES (H2 TIMES M44 + S44) + B44;
        A45 := H2 TIMES (H2 TIMES M45 + S45) + B45;
        A46 := H2 TIMES (H2 TIMES M46 + S46) + B46;
        A55 := H2 TIMES (H2 TIMES M55 + S55) + B55;
        A56 := H2 TIMES (H2 TIMES M56 + S56) + B56;
        A66 := H2 TIMES (H2 TIMES M66 + S66) + B66;
        comment  STATIC CONDENSATION
        ;
        DET := -A55 TIMES A66 + A56 TIMES A56;
        C15 := (A15 TIMES A66 - A16 TIMES A56) ÷ DET;
        C16 := (A16 TIMES A55 - A15 TIMES A56) ÷ DET;
        C25 := (A25 TIMES A66 - A26 TIMES A56) ÷ DET;
        C26 := (A26 TIMES A55 - A25 TIMES A56) ÷ DET;
        C35 := (A35 TIMES A66 - A36 TIMES A56) ÷ DET;
        C36 := (A36 TIMES A55 - A35 TIMES A56) ÷ DET;
        C45 := (A45 TIMES A66 - A46 TIMES A56) ÷ DET;
        C46 := (A46 TIMES A55 - A45 TIMES A56) ÷ DET;
        A11 := (A11 + C15 TIMES A15 + C16 TIMES A16) ÷ H3;
        A12 := (A12 + C15 TIMES A25 + C16 TIMES A26) ÷ H2;
        A13 := (A13 + C15 TIMES A35 + C16 TIMES A36) ÷ H3;
        A14 := (A14 + C15 TIMES A45 + C16 TIMES A46) ÷ H2;
        A22 := (A22 + C25 TIMES A25 + C26 TIMES A26) ÷ H;
        A23 := (A23 + C25 TIMES A35 + C26 TIMES A36) ÷ H2;
        A24 := (A24 + C25 TIMES A45 + C26 TIMES A46) ÷ H;
        A33 := (A33 + C35 TIMES A35 + C36 TIMES A36) ÷ H3;
        A34 := (A34 + C35 TIMES A45 + C36 TIMES A46) ÷ H2;
        A44 := (A44 + C45 TIMES A45 + C46 TIMES A46) ÷ H;
        B1 := (B1 + C15 TIMES B5 + C16 TIMES B6) TIMES H;
        B2 := (B2 + C25 TIMES B5 + C26 TIMES B6) TIMES H2;
        B3 := (B3 + C35 TIMES B5 + C36 TIMES B6) TIMES H;
        B4 := (B4 + C45 TIMES B5 + C46 TIMES B6) TIMES H2;
        ;
    end EL.MATVECEVAL.;
    L := 1;
    W := V := 0;
    N2 := N + N - 2;
    XL1 := X[0];
    XL := X[1];
    YA := E[1];
    ZA := E[2];
    YB := E[3];
    ZB := E[4];
    ELEMENTMATVECEVALUATION;
    EM[2] := 10-12;
    R1 := B3 - A13 TIMES YA - A23 TIMES ZA;
    D1 := A33;
    D2 := A44;
    R2 := B4 - A14 TIMES YA - A24 TIMES ZA;
    E1 := A34;
    for L := L + 1 while L < N do
      begin;
        XL1 := XL;
        XL := X[L];
        ELEMENTMATVECEVALUATION;
        A[W + 1] := D1 + A11;
        A[W + 4] := E1 + A12;
        A[W + 7] := A13;
        A[W + 10] := A14;
        A[W + 5] := D2 + A22;
        A[W + 8] := A23;
        A[W + 11] := A24;
        A[W + 14] := 0;
        Y[V + 1] := R1 + B1;
        Y[V + 2] := R2 + B2;
        R1 := B3;
        R2 := B4;
        V := V + 2;
        W := W + 8;
        D1 := A33;
        D2 := A44;
        E1 := A34;
    end;
    L := N;
    XL1 := XL;
    XL := X[L];
    ELEMENTMATVECEVALUATION;
    Y[N2 - 1] := R1 + B1 - A13 TIMES YB - A14 TIMES ZB;
    Y[N2] := R2 + B2 - A23 TIMES YB - A24 TIMES ZB;
    A[W + 1] := D1 + A11;
    A[W + 4] := E1 + A12;
    A[W + 5] := D2 + A22;
    CHLDECSOLBND(A, N2, 3, EM, Y);
end FEMHERM;
comment  ================== 34600 =================
;
procedure QZIVAL(N, A, B, ALFR, ALFI, BETA, ITER, EM); 
  value N;
  integer N;
  array A, B, ALFR, ALFI, BETA, EM;
  integer array ITER;
begin;
    real DWARF, EPS, EPSA, EPSB;
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    procedure HSHDECMUL(N, A, B, DWARF); code 34602;
    
    procedure HESTGL2(N, A, B); code 34604;
    
    procedure HSH2ROW2(LA, LB, UA, UB, J, A1, A2, A, B); code 34608;
    
    procedure HSH3ROW2(LA, LB, U, J, A1, A2, A3, A, B); code 34610;
    
    procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605;
    
    procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); code 34606;
    
    procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); code 34611;
    
    procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070;
    
    procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073;
    
    procedure QZIT(N, A, B, EPS, EPSA, EPSB, ITER); 
      value N, EPS;
      real EPS, EPSA, EPSB;
      integer N;
      integer array ITER;
      array A, B;
    begin;
        real ANORM, BNORM, ANI, BNI, CONST, A10, A20, A30, B11, B22, B33, B44, A11, A12, A21, A22, A33, A34, A43, A44, B12, B34, OLD1, OLD2;
        integer I, Q, M, M1, Q1, J, K, K1, K2, K3, KM1;
        Boolean STATIONARY;
        ANORM := BNORM := 0;
        for I := 1 step 1 until N do
          begin;
            BNI := 0;
            ITER[I] := 0;
            ANI := if I > 1 then ABS(A[I, I - 1]) else 0;
            for J := I step 1 until N do
              begin;
                ANI := ANI + ABS(A[I, J]);
                BNI := BNI + ABS(B[I, J]);
            end;
            if ANI > ANORM then ANORM := ANI;
            if BNI > BNORM then BNORM := BNI;
        end;
        if ANORM = 0 then ANORM := EPS;
        if BNORM = 0 then BNORM := EPS;
        EPSA := EPS TIMES ANORM;
        EPSB := EPS TIMES BNORM;
        for M := N,
                 M while M NOTLESS 3 do
          begin;
            for I := M + 1,
                     I - 1 while (if I > 1 then ABS(A[I, I - 1]) > EPSA else false) do Q := I - 1;
            if Q > 1 then A[Q, Q - 1] := 0;
            L: if Q NOTLESS M - 1 then M := Q - 1 else begin;
                if ABS(B[Q, Q]) NOTLESS EPSB then begin;
                    B[Q, Q] := 0;
                    Q1 := Q + 1;
                    HSH2COL(Q, Q, M, Q, A[Q, Q], A[Q1, Q], A, B);
                    A[Q1, Q] := 0;
                    Q := Q1;
                    goto L;
                end else M1 := M - 1;
                Q1 := Q + 1;
                CONST := 0.75;
                ITER[M] := ITER[M] + 1;
                STATIONARY := if ITER[M] = 1 then true else ABS(A[M, M - 1]) NOTLESS CONST TIMES OLD1 IMPL ABS(A[M - 1, M - 2]) NOTLESS CONST TIMES OLD2;
                if ITER[M] > 30 IMPL STATIONARY then begin;
                    for I := 1 step 1 until M do
                      ITER[I] := -1;
                    goto OUT;
                end;
                if ITER[M] = 10 IMPL STATIONARY then begin;
                    A10 := 0;
                    A20 := 1;
                    A30 := 1.1605;
                end else begin;
                    B11 := B[Q, Q];
                    B22 := if ABS(B[Q1, Q1]) < EPSB then EPSB else B[Q1, Q1];
                    B33 := if ABS(B[M1, M1]) < EPSB then EPSB else B[M1, M1];
                    B44 := if ABS(B[M, M]) < EPSB then EPSB else B[M, M];
                    A11 := A[Q, Q] ÷ B11;
                    A12 := A[Q, Q1] ÷ B22;
                    A21 := A[Q1, Q] ÷ B11;
                    A22 := A[Q1, Q1] ÷ B22;
                    A33 := A[M1, M1] ÷ B33;
                    A34 := A[M1, M] ÷ B44;
                    A43 := A[M, M1] ÷ B33;
                    A44 := A[M, M] ÷ B44;
                    B12 := B[Q, Q1] ÷ B22;
                    B34 := B[M1, M] ÷ B44;
                    A10 := ((A33 - A11) TIMES (A44 - A11) - A34 TIMES A43 + A43 TIMES B34 TIMES A11) ÷ A21 + A12 - A11 TIMES B12;
                    A20 := (A22 - A11 - A21 TIMES B12) - (A33 - A11) - (A44 - A11) + A43 TIMES B34;
                    A30 := A[Q + 2, Q1] ÷ B22;
                end;
                OLD1 := ABS(A[M, M - 1]);
                OLD2 := ABS(A[M - 1, M - 2]);
                for K := Q step 1 until M1 do
                  begin;
                    K1 := K + 1;
                    K2 := K + 2;
                    K3 := if K + 3 > M then M else K + 3;
                    KM1 := if K - 1 < Q then Q else K - 1;
                    if K NOTEQUAL M1 then begin;
                        if K = Q then begin;
                            HSH3COL(KM1, KM1, M, K, A[K, KM1], A[K1, KM1], A[K2, KM1], A, B);
                            A[K1, KM1] := A[K2, KM1] := 0;
                        end;
                        HSH3ROW2(Q, Q, K3, K, B[K2, K2], B[K2, K1], B[K2, K], A, B);
                        B[K2, K] := B[K2, K1] := 0;
                        ;
                    end else begin;
                        HSH2COL(KM1, KM1, M, K, A[K, KM1], A[K1, KM1], A, B);
                        A[K1, KM1] := 0;
                    end;
                    HSH2ROW2(Q, Q, K3, K3, K, B[K1, K1], B[K1, K], A, B);
                    B[K1, K] := 0;
                end;
            end;
            OUT: ;
        end;
    end QZIT;
comment  ================== 34601 =================
;
procedure QZI(N, A, B, X, ALFR, ALFI, BETA, ITER, EM); 
  value N;
  integer N;
  array A, B, X, ALFR, ALFI, BETA, EM;
  integer array ITER;
begin;
    real DWARF, EPS, EPSA, EPSB;
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure HSHDECMUL(N, A, B, DWARF); code 34602;
    
    procedure HESTGL3(N, A, B, X); code 34603;
    
    procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); code 34607;
    
    procedure HSH3ROW3(L, U, UX, J, A1, A2, A3, A, B, X); code 34609;
    
    procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605;
    
    procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); code 34606;
    
    procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); code 34611;
    
    procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342;
    
    procedure QZIT(N, A, B, X, EPS, EPSA, EPSB, ITER); 
      value N, EPS;
      real EPS, EPSA, EPSB;
      integer N;
      integer array ITER;
      array A, B, X;
    begin;
        real ANORM, BNORM, ANI, BNI, CONST, A10, A20, A30, B11, B22, B33, B44, A11, A12, A21, A22, A33, A34, A43, A44, B12, B34, OLD1, OLD2;
        integer I, Q, M, M1, Q1, J, K, K1, K2, K3, KM1;
        Boolean STATIONARY;
        ANORM := BNORM := 0;
        for I := 1 step 1 until N do
          begin;
            BNI := 0;
            ITER[I] := 0;
            ANI := if I > 1 then ABS(A[I, I - 1]) else 0;
            for J := I step 1 until N do
              begin;
                ANI := ANI + ABS(A[I, J]);
                BNI := BNI + ABS(B[I, J]);
            end;
            if ANI > ANORM then ANORM := ANI;
            if BNI > BNORM then BNORM := BNI;
        end;
        if ANORM = 0 then ANORM := EPS;
        if BNORM = 0 then BNORM := EPS;
        EPSA := EPS TIMES ANORM;
        EPSB := EPS TIMES BNORM;
        for M := N,
                 M while M NOTLESS 3 do
          begin;
            for I := M + 1,
                     I - 1 while (if I > 1 then ABS(A[I, I - 1]) > EPSA else false) do Q := I - 1;
            if Q > 1 then A[Q, Q - 1] := 0;
            L: if Q NOTLESS M - 1 then M := Q - 1 else begin;
                if ABS(B[Q, Q]) NOTLESS EPSB then begin;
                    B[Q, Q] := 0;
                    Q1 := Q + 1;
                    HSH2COL(Q, Q, N, Q, A[Q, Q], A[Q1, Q], A, B);
                    A[Q1, Q] := 0;
                    Q := Q1;
                    goto L;
                end else M1 := M - 1;
                Q1 := Q + 1;
                CONST := 0.75;
                ITER[M] := ITER[M] + 1;
                STATIONARY := if ITER[M] = 1 then true else ABS(A[M, M - 1]) NOTLESS CONST TIMES OLD1 IMPL ABS(A[M - 1, M - 2]) NOTLESS CONST TIMES OLD2;
                if ITER[M] > 30 IMPL STATIONARY then begin;
                    for I := 1 step 1 until M do
                      ITER[I] := -1;
                    goto OUT;
                end;
                if ITER[M] = 10 IMPL STATIONARY then begin;
                    A10 := 0;
                    A20 := 1;
                    A30 := 1.1605;
                end else begin;
                    B11 := B[Q, Q];
                    B22 := if ABS(B[Q1, Q1]) < EPSB then EPSB else B[Q1, Q1];
                    B33 := if ABS(B[M1, M1]) < EPSB then EPSB else B[M1, M1];
                    B44 := if ABS(B[M, M]) < EPSB then EPSB else B[M, M];
                    A11 := A[Q, Q] ÷ B11;
                    A12 := A[Q, Q1] ÷ B22;
                    A21 := A[Q1, Q] ÷ B11;
                    A22 := A[Q1, Q1] ÷ B22;
                    A33 := A[M1, M1] ÷ B33;
                    A34 := A[M1, M] ÷ B44;
                    A43 := A[M, M1] ÷ B33;
                    A44 := A[M, M] ÷ B44;
                    B12 := B[Q, Q1] ÷ B22;
                    B34 := B[M1, M] ÷ B44;
                    A10 := ((A33 - A11) TIMES (A44 - A11) - A34 TIMES A43 + A43 TIMES B34 TIMES A11) ÷ A21 + A12 - A11 TIMES B12;
                    A20 := (A22 - A11 - A21 TIMES B12) - (A33 - A11) - (A44 - A11) + A43 TIMES B34;
                    A30 := A[Q + 2, Q1] ÷ B22;
                end;
                OLD1 := ABS(A[M, M - 1]);
                OLD2 := ABS(A[M - 1, M - 2]);
                for K := Q step 1 until M1 do
                  begin;
                    K1 := K + 1;
                    K2 := K + 2;
                    K3 := if K + 3 > M then M else K + 3;
                    KM1 := if K - 1 < Q then Q else K - 1;
                    if K NOTEQUAL M1 then begin;
                        if K = Q then HSH3COL(KM1, KM1, N, K, A10, A20, A30, A, B) else begin;
                            HSH3COL(KM1, KM1, N, K, A[K, KM1], A[K1, KM1], A[K2, KM1], A, B);
                            A[K1, KM1] := A[K2, KM1] := 0;
                        end;
                        HSH3ROW3(1, K3, N, K, B[K2, K2], B[K2, K1], B[K2, K], A, B, X);
                        B[K2, K] := B[K2, K1] := 0;
                        ;
                    end else begin;
                        HSH2COL(KM1, KM1, N, K, A[K, KM1], A[K1, KM1], A, B);
                        A[K1, KM1] := 0;
                    end;
                    HSH2ROW3(1, K3, K3, N, K, B[K1, K1], B[K1, K], A, B, X);
                    B[K1, K] := 0;
                end;
            end;
        end;
        OUT: ;
    end QZIT;
    procedure QZVAL(N, A, B, X, EPSA, EPSB, ALFR, ALFI, BETA); 
      value N;
      real EPSA, EPSB;
      integer N;
      array ALFR, ALFI, BETA, A, B, X;
    begin;
        integer M, L, J;
        real AN, BN, A11, A12, A21, A22, B11, B12, B22, E, C, D, ER, EI, A11R, A11I, A12R, A12I, A21R, A21I, A22R, A22I, CZ, SZR, SZI, CQ, SQR, SQI, SSR, SSI, TR, TI, BDR, BDI, R;
        for M := N,
                 M while M > 0 do
          if (if M > 1 then A[M, M - 1] = 0 else true) then begin;
            ALFR[M] := A[M, M];
            BETA[M] := B[M, M];
            ALFI[M] := 0;
            M := M - 1;
        end else begin;
            L := M - 1;
            if ABS(B[L, L]) NOTLESS EPSB then begin;
                B[L, L] := 0;
                HSH2COL(L, L, N, L, A[L, L], A[M, L], A, B);
                A[M, L] := B[M, L] := 0;
                ALFR[L] := A[L, L];
                ALFR[M] := A[M, M];
                BETA[L] := B[L, L];
                BETA[M] := B[M, M];
                ALFI[M] := ALFI[L] := 0;
                ;
            end else if ABS(B[M, M]) NOTLESS EPSB then begin;
                B[M, M] := 0;
                HSH2ROW3(1, M, M, N, L, A[M, M], A[M, L], A, B, X);
                A[M, L] := B[M, L] := 0;
                ALFR[L] := A[L, L];
                ALFR[M] := A[M, M];
                BETA[L] := B[L, L];
                BETA[M] := B[M, M];
                ALFI[M] := ALFI[L] := 0;
                ;
            end else begin;
                AN := ABS(A[L, L]) + ABS(A[L, M]) + ABS(A[M, L]) + ABS(A[M, M]);
                BN := ABS(B[L, L]) + ABS(B[L, M]) + ABS(B[M, M]);
                A11 := A[L, L] ÷ AN;
                A12 := A[L, M] ÷ AN;
                A21 := A[M, L] ÷ AN;
                A22 := A[M, M] ÷ AN;
                B11 := B[L, L] ÷ BN;
                B12 := B[L, M] ÷ BN;
                B22 := B[M, M] ÷ BN;
                E := A11 ÷ B11;
                C := ((A22 - E TIMES B22) ÷ B22 - (A21 TIMES B12) ÷ (B11 TIMES B22)) ÷ 2;
                D := C TIMES C + (A21 TIMES (A12 - E TIMES B12)) ÷ (B11 TIMES B22);
                if D NOTLESS 0 then begin;
                    E := E + (if C < 0 then C - SQRT(D) else C + SQRT(D));
                    A11 := A11 - E TIMES B11;
                    A12 := A12 - E TIMES B12;
                    A22 := A22 - E TIMES B22;
                    if ABS(A11) + ABS(A12) NOTLESS ABS(A21) + ABS(A22) then HSH2ROW3(1, M, M, N, L, A12, A11, A, B, X) else HSH2ROW3(1, M, M, N, L, A22, A21, A, B, X);
                    if AN NOTLESS ABS(E) TIMES BN then HSH2COL(L, L, N, L, B[L, L], B[M, L], A, B) else HSH2COL(L, L, N, L, A[L, L], A[M, L], A, B);
                    A[M, L] := B[M, L] := 0;
                    ALFR[L] := A[L, L];
                    ALFR[M] := A[M, M];
                    BETA[L] := B[L, L];
                    BETA[M] := B[M, M];
                    ALFI[M] := ALFI[L] := 0;
                    ;
                end else begin;
                    ER := E + C;
                    EI := SQRT(-D);
                    A11R := A11 - ER TIMES B11;
                    A11I := EI TIMES B11;
                    A12R := A12 - ER TIMES B12;
                    A12I := EI TIMES B12;
                    A21R := A21;
                    A21I := 0;
                    A22R := A22 - ER TIMES B22;
                    A22I := EI TIMES B22;
                    if ABS(A11R) + ABS(A11I) + ABS(A12R) + ABS(A12I) NOTLESS ABS(A21R) + ABS(A22R) + ABS(A22I) then CHSH2(A12R, A12I, -A11R, -A11I, CZ, SZR, SZI) else CHSH2(A22R, A22I, -A21R, -A21I, CZ, SZR, SZI);
                    if AN NOTLESS (ABS(ER) + ABS(EI)) TIMES BN then CHSH2(CZ TIMES B11 + SZR TIMES B12, SZI TIMES B12, SZR TIMES B22, SZI TIMES B22, CQ, SQR, SQI) else CHSH2(CZ TIMES A11 + SZR TIMES A12, SZI TIMES A12, CZ TIMES A21 + SZR TIMES A22, SZI TIMES A22, CQ, SQR, SQI);
                    SSR := SQR TIMES SZR + SQI TIMES SZI;
                    SSI := SQR TIMES SZI - SQI TIMES SZR;
                    TR := CQ TIMES CZ TIMES A11 + CQ TIMES SZR TIMES A12 + SQR TIMES CZ TIMES A21 + SSR TIMES A22;
                    TI := CQ TIMES SZI TIMES A12 - SQI TIMES CZ TIMES A21 + SSI TIMES A22;
                    BDR := CQ TIMES CZ TIMES B11 + CQ TIMES SZR TIMES B12 + SSR TIMES B22;
                    BDI := CQ TIMES SZI TIMES B12 + SSI TIMES B22;
                    R := SQRT(BDR TIMES BDR + BDI TIMES BDI);
                    BETA[L] := BN TIMES R;
                    ALFR[L] := AN TIMES (TR TIMES BDR + TI TIMES BDI) ÷ R;
                    ALFI[L] := AN TIMES (TR TIMES BDI - TI TIMES BDR) ÷ R;
                    TR := SSR TIMES A11 - SQR TIMES CZ TIMES A12 - CQ TIMES SZR TIMES A21 + CQ TIMES CZ TIMES A22;
                    TI := -SSI TIMES A11 - SQI TIMES CZ TIMES A12 + CQ TIMES SZI TIMES A21;
                    BDR := SSR TIMES B11 - SQR TIMES CZ TIMES B12 + CQ TIMES CZ TIMES B22;
                    BDI := -SSI TIMES B11 - SQI TIMES CZ TIMES B12;
                    R := SQRT(BDR TIMES BDR + BDI TIMES BDI);
                    BETA[M] := BN TIMES R;
                    ALFR[M] := AN TIMES (TR TIMES BDR + TI TIMES BDI) ÷ R;
                    ALFI[M] := AN TIMES (TR TIMES BDI - TI TIMES BDR) ÷ R;
                    ;
                end;
            end;
            M := M - 2;
        end;
    end QZVAL;
comment  ================== 34602 =================
;
procedure HSHDECMUL(N, A, B, DWARF); 
  value N, DWARF;
  integer N;
  real DWARF;
  array A, B;
begin;
    array V[1 : N];
    integer J, K, K1, N1;
    real R, T, C;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070;
    
    K := 1;
    N1 := N + 1;
    for K1 := 2 step 1 until N1 do
      begin;
        R := TAMMAT(K1, N, K, K, B, B);
        if R > DWARF then begin;
            R := if B[K, K] < 0 then -SQRT(R + B[K, K] TIMES B[K, K]) else SQRT(R + B[K, K] TIMES B[K, K]);
            T := B[K, K] + R;
            C := -T ÷ R;
            B[K, K] := -R;
            V[K] := 1;
            for J := K1 step 1 until N do
              V[J] := B[J, K] ÷ T;
            HSHVECMAT(K, N, K1, N, C, V, B);
            HSHVECMAT(K, N, 1, N, C, V, A);
        end;
        K := K1;
    end;
end HSHDECMUL;
comment  ================== 34603 =================
;
procedure HESTGL3(N, A, B, X); 
  value N;
  integer N;
  array A, B, X;
begin;
    integer NM1, K, L, K1, L1;
    procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605;
    
    procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); code 34607;
    
    if N > 2 then begin;
        for K := 2 step 1 until N do
          for L := 1 step 1 until K - 1 do
          B[K, L] := 0;
        NM1 := N - 1;
        K := 1;
        for K1 := 2 step 1 until NM1 do
          begin;
            L1 := N;
            for L := N - 1 step -1 until K1 do
              begin;
                HSH2COL(K, L, N, L, A[L, K], A[L1, K], A, B);
                A[L1, K] := 0;
                HSH2ROW3(1, N, L1, N, L, B[L1, L1], B[L1, L], A, B, X);
                B[L1, L] := 0;
                L1 := L;
            end;
            K := K1;
        end;
    end;
end HESTGL3;
comment  ================== 34604 =================
;
procedure HESTGL2(N, A, B); 
  value N;
  integer N;
  array A, B;
begin;
    integer NM1, K, L, K1, L1;
    procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605;
    
    procedure HSH2ROW2(LA, LB, UA, UB, A1, A2, A, B); code 34608;
    
    if N > 2 then begin;
        for K := 2 step 1 until N do
          for L := 1 step 1 until K - 1 do
          B[K, L] := 0;
        NM1 := N - 1;
        K := 1;
        for K1 := 2 step 1 until NM1 do
          begin;
            L1 := N;
            for L := N - 1 step -1 until K1 do
              begin;
                HSH2COL(K, L, N, L, A[L, K], A[L1, K], A, B);
                A[L1, K] := 0;
                HSH2ROW2(1, 1, N, L1, L, B[L1, L1], B[L1, L], A, B);
                B[L1, L] := 0;
                L1 := L;
            end;
            K := K1;
        end;
    end;
end HESTGL2;
comment  ================== 34605 =================
;
procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); 
  value LA, LB, U, I, A1, A2;
  integer LA, LB, U, I;
  real A1, A2;
  array A, B;
if A2 NOTEQUAL 0 then begin;
    real R, T, C;
    array V[I : I + 1];
    procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2) else SQRT(A1 TIMES A1 + A2 TIMES A2);
    T := A1 + R;
    C := -T ÷ R;
    V[I] := 1;
    V[I + 1] := A2 ÷ T;
    HSHVECMAT(I, I + 1, LA, U, C, V, A);
    HSHVECMAT(I, I + 1, LB, U, C, V, B);
end HSH2COL;
comment  ================== 34606 =================
;
procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); 
  value LA, LB, U, I, A1, A2, A3;
  integer LA, LB, I, U;
  real A1, A2, A3;
  array A, B;
if A2 NOTEQUAL 0 OR A3 NOTEQUAL 0 then begin;
    real R, T, C;
    array V[I : I + 2];
    procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3) else SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3);
    T := A1 + R;
    C := -T ÷ R;
    V[I] := 1;
    V[I + 1] := A2 ÷ T;
    V[I + 2] := A3 ÷ T;
    HSHVECMAT(I, I + 2, LA, U, C, V, A);
    HSHVECMAT(I, I + 2, LB, U, C, V, B);
end HSH3COL;
comment  ================== 34607 =================
;
procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); 
  value L, UA, UB, UX, J, A1, A2;
  integer L, UA, UB, UX, J;
  real A1, A2;
  array A, B, X;
if A2 NOTEQUAL 0 then begin;
    real R, T, C;
    integer K;
    array V[J : J + 1];
    procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2) else SQRT(A1 TIMES A1 + A2 TIMES A2);
    T := A1 + R;
    C := -T ÷ R;
    V[J + 1] := 1;
    V[J] := A2 ÷ T;
    HSHVECTAM(L, UA, J, J + 1, C, V, A);
    HSHVECTAM(L, UB, J, J + 1, C, V, B);
    HSHVECTAM(1, UX, J, J + 1, C, V, X);
end HSH2ROW3;
comment  ================== 34608 =================
;
procedure HSH2ROW2(LA, LB, UA, UB, J, A1, A2, A, B); 
  value LA, LB, UA, UB, J, A1, A2;
  integer LA, LB, UA, UB, J;
  real A1, A2;
  array A, B;
if A2 NOTEQUAL 0 then begin;
    real R, T, C;
    integer K;
    array V[J : J + 1];
    procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2) else SQRT(A1 TIMES A1 + A2 TIMES A2);
    T := A1 + R;
    C := -T ÷ R;
    V[J + 1] := 1;
    V[J] := A2 ÷ T;
    HSHVECTAM(LA, UA, J, J + 1, C, V, A);
    HSHVECTAM(LB, UB, J, J + 1, C, V, B);
end HSH2ROW2;
comment  ================== 34609 =================
;
procedure HSH3ROW3(L, U, UX, J, A1, A2, A3, A, B, X); 
  value L, U, UX, J, A1, A2, A3;
  integer L, J, U, UX;
  real A1, A2, A3;
  array A, B, X;
if A2 NOTEQUAL 0 OR A3 NOTEQUAL 0 then begin;
    real R, T, C;
    array V[J : J + 2];
    integer K;
    procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3) else SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3);
    T := A1 + R;
    C := -T ÷ R;
    V[J + 2] := 1;
    V[J + 1] := A2 ÷ T;
    V[J] := A3 ÷ T;
    HSHVECTAM(L, U, J, J + 2, C, V, A);
    HSHVECTAM(L, U, J, J + 2, C, V, B);
    HSHVECTAM(L, UX, J, J + 2, C, V, X);
end HSH3ROW3;
comment  ================== 34610 =================
;
procedure HSH3ROW2(LA, LB, U, J, A1, A2, A3, A, B); 
  value LA, LB, U, J, A1, A2, A3;
  integer LA, LB, U, J;
  real A1, A2, A3;
  array A, B;
if A2 NOTEQUAL 0 OR A3 NOTEQUAL 0 then begin;
    real R, T, C;
    array V[J : J + 2];
    procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073;
    
    R := if A1 < 0 then -SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3) else SQRT(A1 TIMES A1 + A2 TIMES A2 + A3 TIMES A3);
    T := A1 + R;
    C := -T ÷ R;
    V[J + 2] := 1;
    V[J + 1] := A2 ÷ T;
    V[J] := A3 ÷ T;
    HSHVECTAM(LA, U, J, J + 2, C, V, A);
    HSHVECTAM(LB, U, J, J + 2, C, V, B);
end HSH3ROW2;
comment  ================== 31070 =================
;
procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); 
  value LR, UR, LC, UC, X;
  integer LR, UR, LC, UC;
  real X;
  array U, A;
begin;
    real procedure TAMVEC(L, U, I, A, B); code 34012;
    
    procedure ELMCOLVEC(L, U, I, A, B, X); code 34022;
    
    for LC := LC step 1 until UC do
      ELMCOLVEC(LR, UR, LC, A, U, TAMVEC(LR, UR, LC, A, U) TIMES X);
end;
comment  ================== 31071 =================
;
procedure HSHCOLMAT(LR, UR, LC, UC, I, X, U, A); 
  value LR, UR, LC, UC, I, X;
  integer LR, UR, LC, UC, I;
  real X;
  array U, A;
begin;
    real procedure TAMMAT(L, U, I, J, A, B); code 34014;
    
    procedure ELMCOL(L, U, I, J, A, B, X); code 34023;
    
    for LC := LC step 1 until UC do
      ELMCOL(LR, UR, LC, I, A, U, TAMMAT(LR, UR, LC, I, A, U) TIMES X);
end;
comment  ================== 31072 =================
;
procedure HSHROWMAT(LR, UR, LC, UC, I, X, U, A); 
  value LR, UR, LC, UC, I, X;
  integer LR, UR, LC, UC, I;
  real X;
  array U, A;
begin;
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029;
    
    for LC := LC step 1 until UC do
      ELMCOLROW(LR, UR, LC, I, A, U, MATMAT(LR, UR, I, LC, U, A) TIMES X);
end;
comment  ================== 31073 =================
;
procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); 
  value LR, UR, LC, UC, X;
  integer LR, UR, LC, UC;
  real X;
  array U, A;
begin;
    real procedure MATVEC(L, U, I, A, B); code 34011;
    
    procedure ELMROWVEC(L, U, I, A, B, X); code 34027;
    
    for LR := LR step 1 until UR do
      ELMROWVEC(LC, UC, LR, A, U, MATVEC(LC, UC, LR, A, U) TIMES X);
end;
comment  ================== 31074 =================
;
procedure HSHCOLTAM(LR, UR, LC, UC, I, X, U, A); 
  value LR, UR, LC, UC, I, X;
  integer LR, UR, LC, UC, I;
  real X;
  array U, A;
begin;
    real procedure MATMAT(L, U, I, J, A, B); code 34013;
    
    procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028;
    
    for LR := LR step 1 until UR do
      ELMROWCOL(LC, UC, LR, I, A, U, MATMAT(LC, UC, LR, I, A, U) TIMES X);
end;
comment  ================== 31075 =================
;
procedure HSHROWTAM(LR, UR, LC, UC, I, X, U, A); 
  value LR, UR, LC, UC, I, X;
  integer LR, UR, LC, UC, I;
  real X;
  array U, A;
begin;
    real procedure MATTAM(L, U, I, J, A, B); code 34015;
    
    procedure ELMROW(L, U, I, J, A, B, X); code 34024;
    
    for LR := LR step 1 until UR do
      ELMROW(LC, UC, LR, I, A, U, MATTAM(LC, UC, LR, I, A, U) TIMES X);
end;
comment  ================== 30006 =================
;
real procedure PI;
PI := 3.14159265358979;
comment  ================== 30007 =================
;
real procedure E;
E := 2.71828182845905;
comment  ================== 34410 =================
;
procedure LNGVECVEC(L, U, SHIFT, A, B, C, CC, D, DD); 
  value L, U, SHIFT, C, CC;
  integer L, U, SHIFT;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[L], B[L + SHIFT], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGVECVEC;
comment  ================== 34411 =================
;
procedure LNGMATVEC(L, U, I, A, B, C, CC, D, DD); 
  value L, U, I, C, CC;
  integer L, U, I;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[I, L], B[I], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGMATVEC;
comment  ================== 34412 =================
;
procedure LNGTAMVEC(L, U, I, A, B, C, CC, D, DD); 
  value L, U, I, C, CC;
  integer L, U, I;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[L, I], B[I], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGTAMVEC;
comment  ================== 34413 =================
;
procedure LNGMATMAT(L, U, I, J, A, B, C, CC, D, DD); 
  value L, U, I, J, C, CC;
  integer L, U, I, J;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[I, L], B[L, J], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGMATMAT;
comment  ================== 34414 =================
;
procedure LNGTAMMAT(L, U, I, J, A, B, C, CC, D, DD); 
  value L, U, I, J, C, CC;
  integer L, U, I, J;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[L, I], B[L, J], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGTAMMAT;
comment  ================== 34415 =================
;
procedure LNGMATTAM(L, U, I, J, A, B, C, CC, D, DD); 
  value L, U, I, J, C, CC;
  integer L, U, I, J;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[I, L], B[J, L], E, EE);
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGMATTAM;
comment  ================== 34416 =================
;
procedure LNGSEQVEC(L, U, IL, SHIFT, A, B, C, CC, D, DD); 
  value L, U, IL, SHIFT, C, CC;
  integer L, U, IL, SHIFT;
  real C, CC, D, DD;
  array A, B;
begin;
    real E, EE;
    procedure DPMUL(A, B, C, CC); code 31103;
    
    procedure LNGADD(A, AA, B, BB, C, CC); code 31105;
    
    for L := L step 1 until U do
      begin;
        DPMUL(A[IL], B[L + SHIFT], E, EE);
        IL := IL + L;
        LNGADD(C, CC, E, EE, C, CC);
    end;
    D := C;
    DD := CC;
end LNGSEQVEC;
comment  ================== 31507 =================
;
procedure LNGFULSYMMATVEC(LR, UR, LC, UC, A, B, C); 
  value LR, UR, LC, UC, B;
  integer LR, UR, LC, UC;
  array A, B, C;
begin;
    real D, DD;
    procedure LNGSYMMATVEC(L, U, I, A, B, C, CC, D, DD); code 34418;
    
    for LR := LR step 1 until UR do
      begin;
        LNGSYMMATVEC(LC, UC, LR, A, B, 0, 0, D, DD);
        C[LR] := D + DD;
    end;
end LNGFULSYMMATVEC;
comment  ================== 31508 =================
;
procedure LNGRESVEC(LR, UR, LC, UC, A, B, C, X); 
  value LR, UR, LC, UC, X;
  integer LR, UR, LC, UC;
  real X;
  array A, B, C;
begin;
    real D, DD, E, EE;
    procedure DPMUL(X, Y, E, EE); code 31103;
    
    procedure LNGMATVEC(L, U, I, A, B, C, CC, D, DD); code 34411;
    
    for LR := LR step 1 until UR do
      begin;
        DPMUL(C[LR], X, E, EE);
        LNGMATVEC(LC, UC, LR, A, B, E, EE, D, DD);
        C[LR] := D + DD;
    end;
end LNGRESVEC;
comment  ================== 31509 =================
;
procedure LNGSYMRESVEC(LR, UR, LC, UC, A, B, C, X); 
  value LR, UR, LC, UC, B, X;
  integer LR, UR, LC, UC;
  real X;
  array A, B, C;
begin;
    real D, DD, E, EE;
    procedure DPMUL(X, Y, E, EE); code 31103;
    
    procedure LNGSYMMATVEC(L, U, I, A, B, C, CC, D, DD); code 34418;
    
    for LR := LR step 1 until UR do
      begin;
        DPMUL(C[LR], X, E, EE);
        LNGSYMMATVEC(LC, UC, LR, A, B, E, EE, D, DD);
        C[LR] := D + DD;
    end;
end LNGSYMRESVEC;
comment  ================== 34357 =================
;
procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); 
  value L, U, I, J, CR, CI, S;
  integer L, U, I, J;
  real CR, CI, S;
  array AR, AI;
begin;
    real ARLI, AILI, ARLJ, AILJ;
    for L := L step 1 until U do
      begin;
        ARLI := AR[L, I];
        AILI := AI[L, I];
        ARLJ := AR[L, J];
        AILJ := AI[L, J];
        AR[L, I] := CR TIMES ARLI + CI TIMES AILI - S TIMES ARLJ;
        AI[L, I] := CR TIMES AILI - CI TIMES ARLI - S TIMES AILJ;
        AR[L, J] := CR TIMES ARLJ - CI TIMES AILJ + S TIMES ARLI;
        AI[L, J] := CR TIMES AILJ + CI TIMES ARLJ + S TIMES AILI;
        ;
    end;
end ROTCOMCOL;
comment  ================== 34358 =================
;
procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); 
  value L, U, I, J, CR, CI, S;
  integer L, U, I, J;
  real CR, CI, S;
  array AR, AI;
begin;
    real ARIL, AIIL, ARJL, AIJL;
    for L := L step 1 until U do
      begin;
        ARIL := AR[I, L];
        AIIL := AI[I, L];
        ARJL := AR[J, L];
        AIJL := AI[J, L];
        AR[I, L] := CR TIMES ARIL + CI TIMES AIIL + S TIMES ARJL;
        AI[I, L] := CR TIMES AIIL - CI TIMES ARIL + S TIMES AIJL;
        AR[J, L] := CR TIMES ARJL - CI TIMES AIJL - S TIMES ARIL;
        AI[J, L] := CR TIMES AIJL + CI TIMES ARJL - S TIMES AIIL;
        ;
    end;
end ROTCOMROW;
comment  ================== 34611 =================
;
procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); 
  value A1R, A1I, A2R, A2I;
  real A1R, A1I, A2R, A2I, C, SR, SI;
begin;
    real R;
    if A2R NOTEQUAL 0 OR A2I NOTEQUAL 0 then begin;
        if A1R NOTEQUAL 0 OR A1I NOTEQUAL 0 then begin;
            R := SQRT(A1R TIMES A1R + A1I TIMES A1I);
            C := R;
            SR := (A1R TIMES A2R + A1I TIMES A2I) ÷ R;
            SI := (A1R TIMES A2I - A1I TIMES A2R) ÷ R;
            R := SQRT(C TIMES C + SR TIMES SR + SI TIMES SI);
            C := C ÷ R;
            SR := SR ÷ R;
            SI := SI ÷ R;
        end else begin;
            SI := C := 0;
            SR := 1;
        end;
    end else begin;
        C := 1;
        SR := SI := 0;
    end;
end CHSH2;
comment  ================== 33314 =================
;
procedure NONLIN FEM LAG SKEW(X, Y, N, F, FY, FZ, NC, E);
  integer N, NC;
  real procedure F, FY, FZ;
  array X, Y, E;
begin;
    integer L, L1, IT;
    real XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, PLM, PRM, PL1, PL3, PL1PL2, PL1PL3, PL2PL2, PL2PL3, PR1PR2, PR1PR3, PR2PR3, PL1QL2, PL1QL3, PL2QL1, PL2QL2, PL2QL3, PL3QL1, PL3QL2, PR1QR2, PR1QR3, PR2QR1, PR2QR2, PR2QR3, PR3QR1, PR3QR2, H2RM, ZL1, ZL, E1, E2, E3, E4, E5, E6, EPS, RHO;
    array T, SUPER, SUB, CHI, GI[0 : N - 1], Z[0 : N];
    procedure DUPVEC(L, U, S, A, B); code 31030;
    
    procedure ELEMENT MAT VEC EVALUATION 1;
    begin;
        real XM, VL, VR, WL, WR, PR, QM, RM, FM, XL12, XL1XL, XL2, ZM, ZACCM;
        if NC = 0 then VL := VR := 0.5 else if NC = 1 then begin;
            VL := (XL1 TIMES 2 + XL) ÷ 6;
            VR := (XL1 + XL TIMES 2) ÷ 6;
        end else begin;
            XL12 := XL1 TIMES XL1 ÷ 12;
            XL1XL := XL1 TIMES XL ÷ 6;
            XL2 := XL TIMES XL ÷ 12;
            VL := 3 TIMES XL12 + XL1XL + XL2;
            VR := 3 TIMES XL2 + XL1XL + XL12;
        end;
        WL := H TIMES VL;
        WR := H TIMES VR;
        PR := VR ÷ (VL + VR);
        XM := XL1 + H TIMES PR;
        ZM := PR TIMES ZL + (1 - PR) TIMES ZL1;
        ZACCM := (ZL - ZL1) ÷ H;
        QM := FZ(XM, ZM, ZACCM);
        RM := FY(XM, ZM, ZACCM);
        FM := F(XM, ZM, ZACCM);
        TAU1 := WL TIMES RM;
        TAU2 := WR TIMES RM;
        B1 := WL TIMES FM - ZACCM TIMES (VL + VR);
        B2 := WR TIMES FM + ZACCM TIMES (VL + VR);
        A12 := -(VL + VR) ÷ H + VL TIMES QM + (1 - PR) TIMES PR TIMES RM TIMES (WL + WR);
        A21 := -(VL + VR) ÷ H - VR TIMES QM + (1 - PR) TIMES PR TIMES RM TIMES (WL + WR);
        ;
    end ELEM. M.V. EV.;
    procedure BOUNDARY CONDITIONS;
    if L = 1 IMPL E2 = 0 then begin;
        TAU1 := 1;
        B1 := A12 := 0;
    end else if L = 1 IMPL E2 NOTEQUAL 0 then begin;
        TAU1 := TAU1 - E1 ÷ E2;
    end else if L = N IMPL E5 = 0 then begin;
        TAU2 := 1;
        B2 := A21 := 0;
    end else if L = N IMPL E5 NOTEQUAL 0 then begin;
        TAU2 := TAU2 + E4 ÷ E5;
    end B.C.1;
    procedure FORWARD BABUSKA;
    if L = 1 then begin;
        CHI[0] := CH := TL := TAU1;
        T[0] := TL;
        GI[0] := G := YL := B1;
        Y[0] := YL;
        SUB[0] := A21;
        SUPER[0] := A12;
        PP := A21 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        TL := TAU2;
        YL := B2;
    end else begin;
        CHI[L1] := CH := CH + TAU1;
        GI[L1] := G := G + B1;
        SUB[L1] := A21;
        SUPER[L1] := A12;
        PP := A21 ÷ (CH - A12);
        CH := TAU2 - CH TIMES PP;
        G := B2 - G TIMES PP;
        T[L1] := TL + TAU1;
        TL := TAU2;
        Y[L1] := YL + B1;
        YL := B2;
    end FORWARD BABUSKA;
    procedure BACKWARD BABUSKA;
    begin;
        PP := YL;
        Y[N] := G ÷ CH;
        G := PP;
        CH := TL;
        L := N;
        for L := L - 1 while L NOTLESS 0 do
          begin;
            PP := SUPER[L] ÷ (CH - SUB[L]);
            TL := T[L];
            CH := TL - CH TIMES PP;
            YL := Y[L];
            G := YL - G TIMES PP;
            Y[L] := (GI[L] + G - YL) ÷ (CHI[L] + CH - TL);
            ;
        end;
    end BACKWARD BABUSKA;
    DUPVEC(0, N, 0, Z, Y);
    E1 := E[1];
    E2 := E[2];
    E3 := E[3];
    E4 := E[4];
    E5 := E[5];
    E6 := E[6];
    for IT := 1,
             IT + 1 while EPS > RHO do
      begin;
        L := 0;
        XL := X[0];
        ZL := Z[0];
        for L := L + 1 while L NOTLESS N do
          begin;
            XL1 := XL;
            L1 := L - 1;
            XL := X[L];
            H := XL - XL1;
            ZL1 := ZL;
            ZL := Z[L];
            ELEMENT MAT VEC EVALUATION 1;
            if L = 1 OR L = N then BOUNDARY CONDITIONS;
            FORWARD BABUSKA;
        end;
        BACKWARD BABUSKA;
        EPS := 0;
        RHO := 1;
        for L := 0 step 1 until N do
          begin;
            RHO := RHO + ABS(Z[L]);
            EPS := EPS + ABS(Y[L]);
            Z[L] := Z[L] - Y[L];
        end;
        RHO := 10-14 TIMES RHO;
    end;
    DUPVEC(0, N, 0, Y, Z);
end NONLIN FEM LAG SKEW;