code 34138; procedure LSQREFSOL(A, QR, N, M, N1, AUX, AID, CI, B,LDX,X,RES); value N,M,N1;integer N,M,N1;integer array CI;real LDX; array QR,A,AID,AUX,X,RES,B; begin integer I,J,K,S; real C1,NEXVE,NDX,NDR,D,DD,OP,OPL,CORRNORM; array F[1:N],G[1:M]; procedure HOUSEHOLDER(P, Q, R, E); value P,Q,R,E;integer P,Q,R,E; begin for S:=P step Q until R do ELMVECCOL(S, E, S, F, QR,TAMVEC(S, E, S,QR, F)/(QR[S,S]* AID[S])) end; for J:=1 step 1 until M do begin S:=CI[J];if S^=J"THEN" ICHCOL(1,N,J,S,A) end; for J:=1step 1until M"DO"X[J]:=G[J]:=0; for I:=1step 1until N"DO" begin RES[I]:=0;F[I]:=B[I]end; for K:=0,1,K+1 while (CORRNORM>AUX[2]*NEXVE & K<=AUX[6]) do begin NDX:=NDR:=0; if K^=0then begin for I:=1step 1until N"DO"RES[I]:=RES[I]+F[I]; for S:=1step 1until M"DO" begin X[S]:=X[S]+G[S]; LNGTAMVEC(1,N,S,A,RES,0,0,D,DD); G[S]:=(-D-TAMVEC(1,S-1,S,QR,G))/AID[S] end; for I:=1step 1until N"DO" begin LNGMATVEC(1, M, I, A, X, if I>N1 then RES[I] else 0, 0, D, DD); LNG SUB(B[I],0,D,DD,OP,OPL); F[I]:=OP end end; NEXVE:=SQRT(VECVEC(1,M,0,X,X)+VECVEC(1,N,0,RES,RES)); HOUSEHOLDER(1, 1, N1, N1); for I:=N1+1 step 1 until N do F[I]:=F[I]-MATVEC(1,N1, I, QR, F); HOUSEHOLDER(N1+1, 1, M, N); for I:=1 step 1 until M do begin C1:=F[I];F[I]:=G[I]; G[I]:=if I>N1 then C1-G[I] else C1 end; for S:=M"STEP"-1until 1do begin G[S]:=(G[S]-MATVEC(S+1,M,S,QR,G))/AID[S]; NDX:=NDX+G[S]**2 end; HOUSEHOLDER(M, -1, N1+1, N); for S:=1 step 1 until N1 do F[S]:=F[S]-TAMVEC(N1+1, N, S, QR, F); HOUSEHOLDER(N1, -1, 1, N1); AUX[7]:=K; for I:=1step 1until N"DO"NDR:=NDR+F[I]**2; CORRNORM:=SQRT(NDX+NDR) end FOR K; LDX:=SQRT(NDX); for S:=M step -1 until 1 do begin J:=CI[S];if J^=S then begin C1:=X[J];X[J]:=X[S];X[S]:=C1;ICHCOL(1,N,J,S,A)end end end LSQREFSOL; eop