1
subroutine dpsimp(a,na,b,nb,a1,na1,b1,nb1,w,ierr)
3
c Etant donnes une fraction rationnelle donnee par ses polynomes
4
c numerateur et denominateurs, ce sous programme retourne le numerateur
5
c et le denominateur de sa representation simplifiee.
7
c subroutine dpsimp(a,na,b,nb,as,nas,bs,nbs,w,ierr)
9
c double precision a(na+1),b(nb+1),as(*),bs(*),w,er
10
c integer na,nb,nas,nbs,ierr
12
c a : tableau contenant les coefficients du numerateur range
13
c par puissance croissante.(entree)
14
c na : degre du numerateur (entree)
15
c b : tableau contenant les coefficients du denominateur range
16
c par puissance croissante. (entree)
17
c nb : degre du denominateur (entree)
19
c a1 : tableau contenant les coefficients du numerateur range
20
c par puissance croissante.(sortie)
21
c na1 : degre+1 du numerateur (sortie)
22
c b1 : tableau contenant les coefficients du denominateur range
23
c par puissance croissante. (sortie)
24
c nb1 : degre+1 du denominateur (sortie)
26
c les implantations de a et a1, b et b1 peuvent etre confondues.
27
c Dans les cas ou les zones memoires de a (resp b) et a1 (resp b1) se
28
c chevauchent, l'adresse de a1 (resp b1) doit etre au moins egale a
29
c l'adresse de a (resp b)
31
c w : tableau de travail de taille:
32
c 2*(na+nb)+min(na,nb)+10*max(na,nb)+3*max(na,nb)**2+4
34
c en entree ierr specifie l'espace memoire disponible dans w
37
c ierr=1 : denominateur nul
38
c ierr=2 : espace memoire insuffisant on retourne les polynomes
40
c origine S Steer INRIA 1990
43
double precision a(na+1),b(nb+1),w(*),a1(*),b1(*),t,er,t1,t2
44
integer na,nb,ierr,ipb(6)
46
lw=1+2*(na+nb)+min(na,nb)+3
48
c lfree=lw+10*n0+3*n0*n0
54
c degre reel des polynomes
64
if(b(nnb+1).eq.0.0d+0) goto 08
69
if(a(nna+1).eq.0.0d+0) goto 09
71
c elimination des racines en zero
74
if(a(la0).eq.0.0d+0) goto 10
80
if(b(lb0).eq.0.0d+0) goto 11
86
lfree=lw+10*n0+3*n0*n0
87
if(lfree.ge.maxw.and.na1.gt.0.and.nb1.gt.0) ierr=2
88
if(lfree.ge.maxw.or.na1.eq.0.or.nb1.eq.0) then
90
call dcopy(na1+1,a(la0),1,a1,1)
91
call dcopy(nb1+1,b(lb0),1,b1,1)
93
call dset(nz,0.0d0,a1,1)
94
call dcopy(na1+1,a(la0),1,a1(nz+1),1)
95
call dcopy(nb1+1,b(lb0),1,b1,1)
98
call dcopy(na1+1,a(la0),1,a1,1)
99
call dset(-nz,0.0d0,b1,1)
100
call dcopy(nb1+1,b(lb0),1,b1(-nz+1),1)
107
c normalize highest degree coefficients of num and den
110
call dscal(na1+1,1.0d0/t1,a(la0),1)
111
call dscal(nb1+1,1.0d0/t2,b(lb0),1)
113
call recbez(a(la0),na1,b(lb0),nb1,w,ipb,w(lw),er)
114
if(er.gt.1d-3) goto 30
117
if(na1.ne.nnum-1) then
121
call dcopy(nnum,w(ipb(5)),1,a1,1)
122
call dcopy(nden,w(ipb(4)),1,b1,1)
123
call dscal(nden,t,b1,1)
124
else if(nz.gt.0) then
125
call dcopy(nnum,w(ipb(5)),1,a1(1+nz),1)
126
call dset(nz,0.0d0,a1,1)
128
call dcopy(nden,w(ipb(4)),1,b1,1)
129
call dscal(nden,t,b1,1)
130
else if(nz.lt.0) then
132
call dcopy(nnum,w(ipb(5)),1,a1,1)
133
call dcopy(nden,w(ipb(4)),1,b1(1+nz),1)
134
call dset(nz,0.0d+0,b1,1)
135
call dscal(nden,t,b1(1+nz),1)
138
call dscal(nnum,-t*t1/t2,a1,1)
141
call dcopy(nnum,a(la0),1,a1,1)
142
call dcopy(nden,b(lb0),1,b1,1)
143
else if(nz.gt.0) then
144
call dcopy(nnum,a(la0),1,a1(1+nz),1)
145
call dset(nz,0.0d+0,a1,1)
147
call dcopy(nden,b(lb0),1,b1,1)
150
call dcopy(nnum,a(la0),1,a1,1)
151
call dcopy(nden,b(lb0),1,b1(1+nz),1)
152
call dset(nz,0.0d+0,b1,1)
155
call dscal(nnum,t1,a1,1)
156
call dscal(nden,t2,b1,1)
168
call dcopy(na1+1,a(la0),1,a1,1)
169
call dcopy(nb1+1,b(lb0),1,b1,1)
171
call dset(nz,0.0d0,a1,1)
172
call dcopy(na1+1,a(la0),1,a1(nz+1),1)
173
call dcopy(nb1+1,b(lb0),1,b1,1)
176
call dcopy(na1+1,a(la0),1,a1,1)
177
call dset(-nz,0.0d0,b1,1)
178
call dcopy(nb1+1,b(lb0),1,b1(-nz+1),1)
183
call dscal(na1,t1,a1,1)
184
call dscal(nb1,t2,b1,1)