2
This file is part of the Numlib package.
3
Copyright (c) 1986-2000 by
4
Kees van Ginneken, Wil Kortsmit and Loek van Reij of the
5
Computational centre of the Eindhoven University of Technology
7
FPC port Code by Marco van de Voort (marco@freepascal.org)
8
documentation by Michael van Canneyt (Michael@freepascal.org)
11
See the file COPYING.FPC, included in this distribution,
12
for details about the copyright.
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
**********************************************************************}
27
const versie = 'augustus 1993';
29
procedure eiggs1(var a: ArbFloat; n, rwidth: ArbInt; var lam: ArbFloat;
32
procedure eiggs2(var a: ArbFloat; n, rwidth, k1, k2: ArbInt;
33
var lam: ArbFloat; var term: ArbInt);
35
procedure eiggs3(var a: ArbFloat; n, rwidtha: ArbInt; var lam, x: ArbFloat;
36
rwidthx: ArbInt; var term: ArbInt);
38
procedure eiggs4(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var lam, x: ArbFloat;
39
rwidthx: ArbInt; var m2, term: ArbInt);
41
procedure eigts1(var d, cd: ArbFloat; n: ArbInt; var lam: ArbFloat;
44
procedure eigts2(var d, cd: ArbFloat; n, k1, k2: ArbInt; var lam: ArbFloat;
47
procedure eigts3(var d, cd: ArbFloat; n: ArbInt; var lam, x: ArbFloat;
48
rwidth: ArbInt; var term: ArbInt);
50
procedure eigts4(var d, cd: ArbFloat; n, k1, k2: ArbInt; var lam, x: ArbFloat;
51
rwidth: ArbInt; var m2, term: ArbInt);
53
procedure eigbs1(var a: ArbFloat; n, l: ArbInt; var lam: ArbFloat;
56
procedure eigbs2(var a: ArbFloat; n, l, k1, k2: ArbInt; var lam: ArbFloat;
59
procedure eigbs3(var a: ArbFloat; n, l: ArbInt; var lam, x: ArbFloat;
60
rwidthx: ArbInt; var term: ArbInt);
62
procedure eigbs4(var a: ArbFloat; n, l, k1, k2: ArbInt;
63
var lam, x: ArbFloat; rwidthx: ArbInt;
64
var m2, term: ArbInt);
66
procedure eigge1(var a: ArbFloat; n, rwidth: ArbInt; var lam: complex;
69
procedure eigge3(var a: ArbFloat; n, rwidtha: ArbInt; var lam, x: complex;
70
rwidthx: ArbInt; var term: ArbInt);
72
procedure eiggg1(var a: ArbFloat; n, rwidtha: ArbInt; var b: ArbFloat;
73
rwidthb: ArbInt; var lam: ArbFloat; var term: ArbInt);
75
procedure eiggg2(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var b: ArbFloat;
76
rwidthb: ArbInt; var lam: ArbFloat; var term: ArbInt);
78
procedure eiggg3(var a: ArbFloat; n, rwidtha: ArbInt; var b: ArbFloat;
79
rwidthb: ArbInt; var lam, x: ArbFloat; rwidthx: ArbInt;
82
procedure eiggg4(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var b: ArbFloat;
83
rwidthb: ArbInt; var lam, x: ArbFloat; rwidthx: ArbInt;
84
var m2, term: ArbInt);
86
procedure eigsv1(var a: ArbFloat; m, n, rwidth: ArbInt; var sig: ArbFloat;
89
procedure eigsv3(var a: ArbFloat; m, n, rwidtha: ArbInt; var sig, u: ArbFloat;
90
rwidthu: ArbInt; var v: ArbFloat; rwidthv: ArbInt;
97
procedure eiggs1(var a: ArbFloat; n, rwidth: ArbInt; var lam: ArbFloat;
99
var i, sr, nsr : ArbInt;
100
d, cd, dh, cdh, u, pa : ^arfloat1;
107
sr:=sizeof(ArbFloat); nsr:=n*sr;
108
getmem(d, nsr); getmem(cd, nsr); getmem(dh, nsr); getmem(cdh, nsr);
110
for i:=1 to n do move(pa^[(i-1)*rwidth+1], u^[(i-1)*n+1], i*sr);
111
tred1(u^[1], n, n, d^[1], cd^[1], term);
112
move(d^[1], dh^[1], nsr); move(cd^[1], cdh^[1], nsr);
113
tql1(d^[1], cd^[1], n, lam, term);
114
if term=2 then bisect(dh^[1], cdh^[1], n, 1, n, 0, lam, term);
115
freemem(d, nsr); freemem(cd, nsr); freemem(dh, nsr); freemem(cdh, nsr);
119
procedure eiggs2(var a: ArbFloat; n, rwidth, k1, k2: ArbInt;
120
var lam: ArbFloat; var term: ArbInt);
121
var i, sr, nsr : ArbInt;
122
d, cd, u, pa : ^arfloat1;
124
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
129
sr:=sizeof(ArbFloat); nsr:=n*sr;
130
getmem(d, nsr); getmem(cd, nsr); getmem(u, n*nsr);
131
for i:=1 to n do move(pa^[(i-1)*rwidth+1], u^[(i-1)*n+1], i*sr);
132
tred1(u^[1], n, n, d^[1], cd^[1], term);
133
bisect(d^[1], cd^[1], n, k1, k2, 0, lam, term);
134
freemem(d, nsr); freemem(cd, nsr); freemem(u, n*nsr);
137
procedure eiggs3(var a: ArbFloat; n, rwidtha: ArbInt; var lam, x: ArbFloat;
138
rwidthx: ArbInt; var term: ArbInt);
146
nsr:=n*sizeof(ArbFloat);
147
getmem(d, nsr); getmem(cd, nsr);
148
tred2(a, n, rwidtha, d^[1], cd^[1], x, rwidthx, term);
149
tql2(d^[1], cd^[1], n, lam, x, rwidthx, term);
150
freemem(d, nsr); freemem(cd, nsr)
153
procedure eiggs4(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var lam, x: ArbFloat;
154
rwidthx: ArbInt; var m2, term: ArbInt);
155
var i, sr, nsr : ArbInt;
156
pa, d, cd, u : ^arfloat1;
158
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
163
sr:=sizeof(ArbFloat); nsr:=n*sr;
164
getmem(d, nsr); getmem(cd, nsr); getmem(u, n*nsr);
165
for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], i*sr);
166
tred1(u^[1], n, n, d^[1], cd^[1], term);
167
trsturm1(d^[1], cd^[1], n, k1, k2, lam, x, rwidthx, m2, term);
168
trbak1(u^[1], n, n, cd^[1], k1, k2, x, rwidthx);
169
freemem(d, nsr); freemem(cd, nsr); freemem(u, n*nsr) { toegevoegd 3 apr 92 }
172
procedure eigts1(var d, cd: ArbFloat; n: ArbInt; var lam: ArbFloat;
174
var sr, nsr : ArbInt;
175
pd, pcd, dh, cdh : ^arfloat1;
181
sr:=sizeof(ArbFloat); nsr:=n*sr;
182
pd:=@d; pcd:=@cd; getmem(dh, nsr); getmem(cdh, nsr);
183
move(pd^[1], dh^[1], nsr); move(pcd^[1], cdh^[2], (n-1)*sr);
184
tql1(dh^[1], cdh^[1], n, lam, term);
187
move(pd^[1], dh^[1], nsr); move(pcd^[1], cdh^[2], (n-1)*sr);
188
bisect(dh^[1], cdh^[1], n, 1, n, 0, lam, term)
190
freemem(dh, nsr); freemem(cdh, nsr);
193
procedure eigts2(var d, cd: ArbFloat; n, k1, k2: ArbInt; var lam: ArbFloat;
195
var sr, nsr : ArbInt;
196
pcd, cdh : ^arfloat1;
198
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
203
term:=1; sr:=sizeof(ArbFloat); nsr:=n*sr; getmem(cdh, nsr);
204
move(pcd^[1], cdh^[2], (n-1)*sr);
205
bisect(d, cdh^[1], n, k1, k2, 0, lam, term);
209
procedure eigts3(var d, cd: ArbFloat; n: ArbInt; var lam, x: ArbFloat;
210
rwidth: ArbInt; var term: ArbInt);
211
var i, sr, nsr : ArbInt;
212
px, pcd, cdh : ^arfloat1;
219
sr:=sizeof(ArbFloat); nsr:=n*sr;
221
move(pcd^[1], cdh^[2], (n-1)*sr);
222
for i:=1 to n do fillchar(px^[(i-1)*rwidth+1], nsr, 0);
223
for i:=1 to n do px^[(i-1)*rwidth+i]:=1;
224
tql2(d, cdh^[1], n, lam, px^[1], rwidth, term);
228
procedure eigts4(var d, cd: ArbFloat; n, k1, k2: ArbInt; var lam, x: ArbFloat;
229
rwidth: ArbInt; var m2, term: ArbInt);
231
pcd, cdh : ^arfloat1;
233
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
238
pcd:=@cd; sr:=sizeof(ArbFloat);
240
move(pcd^[1], cdh^[2], (n-1)*sr);
241
trsturm1(d, cdh^[1], n, k1, k2, lam, x, rwidth, m2, term);
245
procedure eigbs1(var a: ArbFloat; n, l: ArbInt; var lam: ArbFloat;
247
var u, d, cd : ^arfloat1;
248
uwidth, i, sr, nsr : ArbInt;
250
if (n<1) or (l<0) or (l>n-1) then
254
sr:=sizeof(ArbFloat); nsr:=n*sr; uwidth:=l+1;
255
getmem(u, uwidth*nsr); getmem(d, nsr); getmem(cd, nsr);
256
transf(a, n, l, u^[1], uwidth);
257
bandrd1(u^[1], n, l, uwidth, d^[1], cd^[1]);
258
eigts1(d^[1], cd^[2], n, lam, term);
259
freemem(u, uwidth*nsr); freemem(d, nsr); freemem(cd, nsr);
262
procedure eigbs2(var a: ArbFloat; n, l, k1, k2: ArbInt; var lam: ArbFloat;
264
var u, d, cd : ^arfloat1;
265
i, sr, nsr, uwidth : ArbInt;
267
if (n<1) or (k1<1) or (k2<k1) or (k2>n) or (l<0) or (l>n-1) then
271
sr:=sizeof(ArbFloat); nsr:=n*sr; uwidth:=l+1;
272
getmem(u, uwidth*nsr); getmem(d, nsr); getmem(cd, nsr);
273
transf(a, n, l, u^[1], uwidth);
274
bandrd1(u^[1], n, l, uwidth, d^[1], cd^[1]);
275
eigts2(d^[1], cd^[2], n, k1, k2, lam, term);
276
freemem(u, uwidth*nsr); freemem(d, nsr); freemem(cd, nsr)
279
procedure eigbs3(var a: ArbFloat; n, l: ArbInt; var lam, x: ArbFloat;
280
rwidthx: ArbInt; var term: ArbInt);
281
var u, d, cd : ^arfloat1;
282
i, sr, nsr, uwidth : ArbInt;
284
if (n<1) or (l<0) or (l>n-1) then
288
sr:=sizeof(ArbFloat); nsr:=n*sr; uwidth:=l+1;
289
getmem(u, uwidth*nsr); getmem(d, nsr); getmem(cd, nsr);
290
transf(a, n, l, u^[1], uwidth);
291
bandrd2(u^[1], n, l, uwidth, d^[1], cd^[1], x, rwidthx);
292
tql2(d^[1], cd^[1], n, lam, x, rwidthx, term);
293
freemem(u, uwidth*nsr); freemem(d, nsr); freemem(cd, nsr)
296
procedure eigbs4(var a: ArbFloat; n, l, k1, k2: ArbInt;
297
var lam, x: ArbFloat; rwidthx: ArbInt;
298
var m2, term: ArbInt);
299
var i, j, k, m, uwidth : ArbInt;
300
plam, px, pa, v, u : ^arfloat1;
303
if (n<1) or (k1<1) or (k2<k1) or (k2>n) or (l<0) or (l>n-1) then
307
plam:=@lam; px:=@x; pa:=@a; getmem(v, n*sizeof(ArbFloat));
308
uwidth:=l+1; getmem(u, n*uwidth*sizeof(ArbFloat));
309
eigbs2(a, n, l, k1, k2, plam^[1], term);
310
{ kijk of norm(A-lambda.I)=0 }
311
{ zo ja, lever dan de eenheidsvectoren e(k1) t/m e(k2) af }
315
if i<=l then m:=i else m:=l+1; s:=0;
317
if k=j+m-1 then s:=s+abs(pa^[k]-plam^[1]) else s:=s+abs(pa^[k]);
318
if s>norm then norm:=s;
323
for i:=k1 to k2 do for j:=1 to n do
324
if j=i then px^[(j-1)*rwidthx+i-k1+1]:=1
325
else px^[(j-1)*rwidthx+i-k1+1]:=0;
326
freemem(v, n*sizeof(ArbFloat)); freemem(u, n*uwidth*sizeof(ArbFloat));
327
m2:=k2; term:=1; exit
329
transf(a, n, l, u^[1], uwidth);
331
while (i <= k2) and (term=1) do
333
bandev(u^[1], n, l, uwidth, plam^[i-k1+1], v^[1], term);
336
m2:=i; for j:=1 to n do px^[(j-1)*rwidthx+i-k1+1]:=v^[j]
340
freemem(v, n*sizeof(ArbFloat));
341
freemem(u, n*uwidth*sizeof(ArbFloat));
344
procedure eigge1(var a: ArbFloat; n, rwidth: ArbInt; var lam: complex;
346
var pa, h, dummy : ^arfloat1;
353
ns:=n*sizeof(ArbFloat); pa:=@a;
354
getmem(dummy, ns); getmem(h, n*ns);
355
for i:=1 to n do move(pa^[(i-1)*rwidth+1], h^[(i-1)*n+1], ns);
356
orthes(h^[1], n, n, dummy^[1]);
357
hessva(h^[1], n, n, lam, term);
358
freemem(dummy, ns); freemem(h, n*ns);
361
procedure eigge3(var a: ArbFloat; n, rwidtha: ArbInt; var lam, x: complex;
362
rwidthx: ArbInt; var term: ArbInt);
363
var pa, pd, u, v: ^arfloat1;
364
m1, m2, i, j, ns: ArbInt;
370
ns:=n*sizeof(ArbFloat); getmem(pd, ns); getmem(u, n*ns); getmem(v, n*ns);
371
pa:=@a; for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], ns);
372
balance(u^[1], n, n, m1, m2, pd^[1]);
373
orttrans(u^[1], n, n, v^[1], n);
374
hessvec(u^[1], n, n, lam, v^[1], n, term);
377
balback(pd^[1], n, m1, m2, 1, n, v^[1], n);
378
normeer(lam, n, v^[1], n);
379
transx(v^[1], n, n, lam, x, rwidthx)
381
freemem(pd, ns); freemem(u, n*ns); freemem(v, n*ns);
384
procedure eiggg1(var a: ArbFloat; n, rwidtha: ArbInt; var b: ArbFloat;
385
rwidthb: ArbInt; var lam: ArbFloat; var term: ArbInt);
386
var u, v, pa, pb : ^arfloat1;
393
pa:=@a; pb:=@b; ns:=n*sizeof(ArbFloat); getmem(u, n*ns); getmem(v, n*ns);
394
for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], ns);
395
for i:=1 to n do move(pb^[(i-1)*rwidthb+1], v^[(i-1)*n+1], ns);
396
reduc1(u^[1], n, n, v^[1], n, term);
397
if term=1 then eiggs1(u^[1], n, n, lam, term);
398
freemem(u, n*ns); freemem(v, n*ns);
401
procedure eiggg2(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var b: ArbFloat;
402
rwidthb: ArbInt; var lam: ArbFloat; var term: ArbInt);
403
var u, v, pa, pb : ^arfloat1;
406
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
410
pa:=@a; pb:=@b; ns:=n*sizeof(ArbFloat); getmem(u, n*ns); getmem(v, n*ns);
411
for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], ns);
412
for i:=1 to n do move(pb^[(i-1)*rwidthb+1], v^[(i-1)*n+1], ns);
413
reduc1(u^[1], n, n, v^[1], n, term);
414
if term=1 then eiggs2(u^[1], n, n, k1, k2, lam, term);
415
freemem(u, n*ns); freemem(v, n*ns)
418
procedure eiggg3(var a: ArbFloat; n, rwidtha: ArbInt; var b: ArbFloat;
419
rwidthb: ArbInt; var lam, x: ArbFloat; rwidthx: ArbInt;
421
var u, v, pa, pb : ^arfloat1;
429
ns:=n*sizeof(ArbFloat);
430
getmem(u, n*ns); getmem(v, n*ns);
431
for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], ns);
432
for i:=1 to n do move(pb^[(i-1)*rwidthb+1], v^[(i-1)*n+1], ns);
433
reduc1(u^[1], n, n, v^[1], n, term);
436
eiggs3(u^[1], n, n, lam, x, rwidthx, term);
437
if term=1 then rebaka(v^[1], n, n, 1, n, x, rwidthx, term)
439
freemem(u, n*ns); freemem(v, n*ns)
442
procedure eiggg4(var a: ArbFloat; n, rwidtha, k1, k2: ArbInt; var b: ArbFloat;
443
rwidthb: ArbInt; var lam, x: ArbFloat; rwidthx: ArbInt;
444
var m2, term: ArbInt);
446
var u, v, pa, pb : ^arfloat1;
447
i, j, ns, t : ArbInt;
449
if (n<1) or (k1<1) or (k2<k1) or (k2>n) then
453
pa:=@a; pb:=@b; ns:=n*sizeof(ArbFloat); getmem(u, n*ns); getmem(v, n*ns);
454
for i:=1 to n do move(pa^[(i-1)*rwidtha+1], u^[(i-1)*n+1], ns);
455
for i:=1 to n do move(pb^[(i-1)*rwidthb+1], v^[(i-1)*n+1], ns);
456
reduc1(u^[1], n, n, v^[1], n, term);
459
eiggs4(u^[1], n, n, k1, k2, lam, x, rwidthx, m2, term);
460
if m2 < k2 then term:=4;
463
rebaka(v^[1], n, n, k1, m2, x, rwidthx, t);
470
freemem(u, n*ns); freemem(v, n*ns)
473
procedure eigsv1(var a: ArbFloat; m, n, rwidth: ArbInt; var sig: ArbFloat;
476
var pa, pq, u, e : ^arfloat1;
477
i, j, k, l, ns, ii, jj, kk : ArbInt;
478
c, f, g, h, p, s, x, y, z, eps, tol : ArbFloat;
479
conv, goon, cancel : boolean;
481
if (n<1) or (m<n) then
485
pa:=@a; pq:=@sig; term:=1;
486
ns:=n*sizeof(ArbFloat); getmem(e, ns); getmem(u, m*ns);
487
for i:=1 to m do move(pa^[(i-1)*rwidth+1], u^[(i-1)*n+1], ns);
488
g:=0; x:=0; tol:=midget/macheps;
491
ii:=(i-1)*n; e^[i]:=g;
492
s:=0; for j:=i to m do s:=s+sqr(u^[(j-1)*n+i]);
493
if s<tol then g:=0 else
495
f:=u^[ii+i]; if f<0 then g:=sqrt(s) else g:=-sqrt(s);
496
h:=f*g-s; u^[ii+i]:=f-g;
502
kk:=(k-1)*n; s:=s+u^[kk+i]*u^[kk+j]
507
kk:=(k-1)*n; u^[kk+j]:=u^[kk+j]+f*u^[kk+i]
512
for j:=i+1 to n do s:=s+sqr(u^[ii+j]);
513
if s < tol then g:=0 else
515
f:=u^[ii+i+1]; if f < 0 then g:=sqrt(s) else g:=-sqrt(s);
516
h:=f*g-s; u^[ii+i+1]:=f-g;
517
for j:=i+1 to n do e^[j]:=u^[ii+j]/h;
521
for k:=i+1 to n do s:=s+u^[jj+k]*u^[ii+k];
522
for k:=i+1 to n do u^[jj+k]:=u^[jj+k]+s*e^[k]
525
y:=abs(pq^[i])+abs(e^[i]); if y > x then x:=y
535
if abs(e^[l]) <= eps then
537
goon:=false; cancel:=false
539
if abs(pq^[l-1]) <= eps then
541
goon:=false; cancel:=true
551
f:=s*e^[i]; e^[i]:=c*e^[i]; goon:=abs(f) > eps;
554
g:=pq^[i]; h:=sqrt(f*f+g*g); pq^[i]:=h;
561
if k=l then conv:=true else
563
x:=pq^[l]; y:=pq^[k-1]; g:=e^[k-1]; h:=e^[k];
564
f:=((y-z)*(y+z)+(g-h)*(g+h))/(2*h*y); g:=sqrt(f*f+1);
565
if f < 0 then s:=f-g else s:=f+g;
566
f:=((x-z)*(x+z)+h*(y/s-h))/x;
570
g:=e^[i]; y:=pq^[i]; h:=s*g; g:=c*g;
571
z:=sqrt(f*f+h*h); e^[i-1]:=z; c:=f/z; s:=h/z;
572
f:=x*c+g*s; g:=-x*s+g*c; h:=y*s; y:=y*c;
573
z:=sqrt(f*f+h*h); pq^[i-1]:=z; c:=f/z; s:=h/z;
574
f:=c*g+s*y; x:=-s*g+c*y
576
e^[l]:=0; e^[k]:=f; pq^[k]:=x
579
if z < 0 then pq^[k]:=-z
591
pq^[k]:=pq^[i]; pq^[i]:=p
594
freemem(e, ns); freemem(u, m*ns)
597
procedure eigsv3(var a: ArbFloat; m, n, rwidtha: ArbInt; var sig, u: ArbFloat;
598
rwidthu: ArbInt; var v: ArbFloat; rwidthv: ArbInt;
601
var pa, pu, pq, pv, e : ^arfloat1;
602
i, j, k, l, ns, ii, jj, kk : ArbInt;
603
c, f, g, h, p, s, x, y, z, eps, tol : ArbFloat;
604
conv, goon, cancel : boolean;
611
pa:=@a; pu:=@u; pq:=@sig; pv:=@v; term:=1;
612
ns:=n*sizeof(ArbFloat); getmem(e, ns);
613
for i:=1 to m do move(pa^[(i-1)*rwidtha+1], pu^[(i-1)*rwidthu+1], ns);
614
g:=0; x:=0; tol:=midget/macheps;
619
for j:=i to m do s:=s+sqr(pu^[(j-1)*rwidthu+i]);
620
if s<tol then g:=0 else
622
f:=pu^[ii+i]; if f<0 then g:=sqrt(s) else g:=-sqrt(s);
623
h:=f*g-s; pu^[ii+i]:=f-g;
629
kk:=(k-1)*rwidthu; s:=s+pu^[kk+i]*pu^[kk+j]
634
kk:=(k-1)*rwidthu; pu^[kk+j]:=pu^[kk+j]+f*pu^[kk+i]
638
pq^[i]:=g; s:=0; for j:=i+1 to n do s:=s+sqr(pu^[ii+j]);
639
if s < tol then g:=0 else
642
if f < 0 then g:=sqrt(s) else g:=-sqrt(s);
643
h:=f*g-s; pu^[ii+i+1]:=f-g;
644
for j:=i+1 to n do e^[j]:=pu^[ii+j]/h;
647
s:=0; jj:=(j-1)*rwidthu;
648
for k:=i+1 to n do s:=s+pu^[jj+k]*pu^[ii+k];
649
for k:=i+1 to n do pu^[jj+k]:=pu^[jj+k]+s*e^[k]
652
y:=abs(pq^[i])+abs(e^[i]); if y > x then x:=y
660
for j:=i+1 to n do pv^[(j-1)*rwidthv+i]:=pu^[ii+j]/h;
664
for k:=i+1 to n do s:=s+pu^[ii+k]*pv^[(k-1)*rwidthv+j];
667
kk:=(k-1)*rwidthv; pv^[kk+j]:=pv^[kk+j]+s*pv^[kk+i]
674
pv^[ii+j]:=0; pv^[(j-1)*rwidthv+i]:=0
676
pv^[ii+i]:=1; g:=e^[i]
680
g:=pq^[i]; ii:=(i-1)*rwidthu;
681
for j:=i+1 to n do pu^[ii+j]:=0;
690
kk:=(k-1)*rwidthu; s:=s+pu^[kk+i]*pu^[kk+j]
696
pu^[kk+j]:=pu^[kk+j]+f*pu^[kk+i]
701
jj:=(j-1)*rwidthu+i; pu^[jj]:=pu^[jj]/g
705
for j:=i to m do pu^[(j-1)*rwidthu+i]:=0;
706
pu^[ii+i]:=pu^[ii+i]+1
716
if abs(e^[l]) <= eps then
718
goon:=false; cancel:=false
720
if abs(pq^[l-1]) <= eps then
722
goon:=false; cancel:=true
727
c:=0; s:=1; i:=l; goon:=true;
730
f:=s*e^[i]; e^[i]:=c*e^[i]; goon:=abs(f) > eps;
733
g:=pq^[i]; h:=sqrt(f*f+g*g); pq^[i]:=h;
737
jj:=(j-1)*rwidthu; y:=pu^[jj+l-1]; z:=pu^[jj+i];
738
pu^[jj+l-1]:=y*c+z*s; pu^[jj+i]:=-y*s+z*c
744
z:=pq^[k]; if k=l then conv:=true else
746
x:=pq^[l]; y:=pq^[k-1]; g:=e^[k-1]; h:=e^[k];
747
f:=((y-z)*(y+z)+(g-h)*(g+h))/(2*h*y); g:=sqrt(f*f+1);
748
if f < 0 then s:=f-g else s:=f+g;
749
f:=((x-z)*(x+z)+h*(y/s-h))/x;
753
g:=e^[i]; y:=pq^[i]; h:=s*g; g:=c*g;
754
z:=sqrt(f*f+h*h); e^[i-1]:=z; c:=f/z; s:=h/z;
755
f:=x*c+g*s; g:=-x*s+g*c; h:=y*s; y:=y*c;
759
x:=pv^[jj+i-1]; z:=pv^[jj+i];
760
pv^[jj+i-1]:=x*c+z*s; pv^[jj+i]:=-x*s+z*c
762
z:=sqrt(f*f+h*h); pq^[i-1]:=z; c:=f/z; s:=h/z;
763
f:=c*g+s*y; x:=-s*g+c*y;
767
y:=pu^[jj+i-1]; z:=pu^[jj+i];
768
pu^[jj+i-1]:=y*c+z*s; pu^[jj+i]:=-y*s+z*c
771
e^[l]:=0; e^[k]:=f; pq^[k]:=x
779
jj:=(j-1)*rwidthv+k; pv^[jj]:=-pv^[jj]
793
pq^[k]:=pq^[i]; pq^[i]:=p;
797
p:=pu^[jj+i]; pu^[jj+i]:=pu^[jj+k]; pu^[jj+k]:=p;
802
p:=pv^[jj+i]; pv^[jj+i]:=pv^[jj+k]; pv^[jj+k]:=p
803
end { interchange in u and v column i with comlumn k }