1
subroutine dmrdsp(mpn,dn,mpd,dd,nl,mm,nn,var,lvar,maxc,mode,ll,
4
c dmpdsp ecrit une matrice polynomiale (ou un polynome) sous
5
c la forme d'un tableau de polynomes, avec gestion automatique de
9
c subroutine dmrdsp(mpn,dn,mpd,dd,nl,m,n,var,lvar,maxc,mode,ll,
12
c double precision mp(*)
13
c integer d(nl*n+1),nl,m,n,lvar,maxc,mode,iw(*),ll,lunit
14
c character var*(*),cw*(*)
16
c pm : tableau reel contenant les coefficients des polynomes,
17
c le coefficient de degre k du polynome pm(i,j) est range
18
c dans pm( d(i + (j-1)*nl + k) )
19
c pm doit etre de taille au moins d(nl*n+1)-d(1)
20
c d : tableau entier de taille nl*n+1, si k=i+(j-1)*nl alors
21
c d(k)) contient l'adresse dans pm du coeff de degre 0
22
c du polynome pm(i,j). Le degre du polynome pm(i,j) vaut:
24
c nl : entier definissant le rangement dans d
25
c m : nombre de ligne de la matrice polynomiale
26
c n : nombre de colonnes de la matrice polynomiale
27
c var : nom de la variable muette
28
c lvar : nombre de caracteres de var
29
c maxc : nombre de caracteres maximum autorise pour
30
c representer un nombre
31
c mode : si mode = 1 alors representation variable
32
c si mode = 0 alors representation d(maxc).(maxc-7)
33
c ll : longueur de ligne maximum admissible
34
c lunit : etiquette logique du support d'edition
35
c cw : chaine de caracteres de travail de longueur au moins ll*2
36
c iw : tableau de travail entier de taille au moins egale a
37
c n*(4+m)+1+dn(n*m+1)+dd(n*m+1)
44
double precision mpn(*),mpd(*),a
45
integer dd(*),dn(*),iw(*),maxc,mode
46
integer fl,sk,sl,c1,c2,typ
48
character var*(*),cw*(*),sgn*1,dl*1
49
character*10 form(2),fexp,expo
58
write(form(1),130) maxc,maxc-7
62
c phase d'analyse: pour chaque coefficient a representer on determine
63
c format avec lequel on va l'editer, on en deduit la longueur
64
c de la representation de chacun des polynomes.
65
c les differents formats sont stockes sous forme codee dans iw
67
c la taille respective des representation des chacun des polynomes
68
c est contenue dans iw a partir de 1 .
94
c traitement du polynome (l,k)
96
npn=dn(ldg+l+1)-dn(ldg+l)
104
c determination du format devant representer a
106
if(mode.eq.1) call fmt(a,maxc,typ,n1,n2)
110
elseif(typ.lt.0) then
120
c determination de la longueur de la representation du monome,
121
c cette longueur est a priori fl+2 (' '//sgn//rep(a)//var).
122
c mais peut etre reduite dans des cas particulier
126
if(i.ne.1.and.int(a+0.1).eq.1) lghn=lghn-1
128
if(i.ne.1) lghn=lghn+lvar
134
c cas particulier du dernier exposant du polynome
135
nd=ifix(log10(0.5+npn))+1
137
c cas particulier d'un polynome reduit a 0
141
npd=dd(ldg+l+1)-dd(ldg+l)
149
c determination du format devant representer a
151
if(mode.eq.1) call fmt(a,maxc,typ,n1,n2)
155
elseif(typ.lt.0) then
164
c determination de la longueur de la representation du monome,
165
c cette longueur est a priori fl+2 (' '//sgn//rep(a)//var).
166
c mais peut etre reduite dans des cas particulier
170
if(i.ne.1.and.int(a+0.1).eq.1) lghd=lghd-1
172
if(i.ne.1) lghd=lghd+lvar
177
c cas particulier du dernier exposant du polynome
178
nd=ifix(log10(0.5+npd))+1
180
c cas particulier d'un polynome reduit a 0
183
iw(k)=max(iw(k),lghn,lghd)
184
sl=sl+(lghn/(ll-10))+(lghd/(ll-10))+2
185
iw(idelta)=min(lghn,ll-2)-min(lghd,ll-2)
202
c lines=lines+2*sl+m+2
209
write(cw(l1:l1+4),'(''eye *'')')
211
call basout(io,lunit,cw(1:l1-1))
212
call basout(io,lunit,' ')
217
c phase d'edition : les deux chaines de caracteres representant
218
c la ligne des exposants et la ligne des coefficients,sont
219
c constituees puis imprimees.
226
call blktit(lunit,k1,k2,io)
227
if (io.eq.-1) goto 99
233
c2=max(3+ll,nind+maxc+15)
239
if(iw(k1).gt.ll-2) ll1=ll
242
idelta=ldelta-1+l+(k-1)*m
244
if(iw(idelta).lt.-1) then
246
cw(l1:l1+ndelta-1)=' '
247
cw(l2:l2+ndelta-1)=' '
254
npn=dn(ldg+1)-dn(ldg)
255
ldefn=lfn-1+dn(ldg)-dn(1)
262
if(ifmt.eq.0) goto 40
266
if(mpn(lpn+j).lt.0.0d+0) sgn='-'
273
elseif(ifmt.ge.0) then
278
write(form(nf),120) fl,n2
279
elseif(ifmt.lt.0) then
287
if(j.gt.2) nd=ifix(log10(0.5+j))+1
288
if(l2+fl+2+lvar+nd.gt.c2+ll-2) then
289
c gestion des lignes suites
294
if(l2.le.c2+ll-2) then
300
call basout(io,lunit,cw(c1-1:l1))
303
call basout(io,lunit,cw(c2-1:l2))
305
cw(c2-1:c2+nind-1)=' '
308
cw(c1-1:c1+nind-1)=' '
312
c representation du monome
316
write(cw(l2+1:l2+fl),form(nf)) a
317
elseif(ifmt.eq.-1) then
319
elseif(ifmt.eq.-2) then
325
if(n2.eq.0.and.int(a+0.1).eq.1) l2=l2-1
326
cw(l2+1:l2+lvar)=var(1:lvar)
334
cw(nl1+1:nl1+nd)=expo(1:nd)
341
c cas particulier du polynome nul
348
if(iw(lfin-1+k).eq.0) iw(lfin-1+k)=l2
349
if(nd.ne.0) cw(l2:l2+nd-1)=' '
351
if(ll1.eq.ll) nl1=ll-1
357
if(cw(c1:l1-1).ne.' ') then
359
call basout(io,lunit,cw(c1-1:l1))
363
call basout(io,lunit,cw(c2-1:l2))
370
idelta=ldelta-1+l+(k-1)*m
371
ndelta=max(0,-iw(idelta)/2)
372
ideb=max(jjb1,iw(ldeb-1+k)-ndelta+2)
373
ifin=iw(lfin-1+k)+ndelta-2
374
if(ifin-ideb+1.eq.2) ideb=ideb-1
381
call basout(io,lunit,cw(c2-1:l2))
389
idelta=ldelta-1+l+(k-1)*m
391
if(iw(idelta).gt.1) then
393
cw(l1:l1+ndelta-1)=' '
394
cw(l2:l2+ndelta-1)=' '
401
npd=dd(ldg+1)-dd(ldg)
402
ldefd=lfd-1+dd(ldg)-dd(1)
407
if(ifmt.eq.0) goto 50
411
if(mpd(lpd+j).lt.0.0d+0) sgn='-'
418
elseif(ifmt.ge.0) then
423
write(form(nf),120) fl,n2
424
elseif(ifmt.lt.0) then
431
if(j.gt.2) nd=ifix(log10(0.5+j))+1
432
if(l2+fl+2+lvar+nd.gt.c2+ll-2) then
433
c gestion des lignes suites
438
if(l2.le.c2+ll-2) then
443
call basout(io,lunit,cw(c1-1:l1))
445
call basout(io,lunit,cw(c2-1:l2))
454
c representation du monome
458
write(cw(l2+1:l2+fl),form(nf)) a
459
elseif(ifmt.eq.-1) then
461
elseif(ifmt.eq.-2) then
467
if(n2.eq.0.and.int(a+0.1).eq.1) l2=l2-1
468
cw(l2+1:l2+lvar)=var(1:lvar)
476
cw(nl1+1:nl1+nd)=expo(1:nd)
483
c cas particulier du polynome nul
490
if(nd.ne.0) cw(l2:l2+nd-1)=' '
492
if(ll1.eq.ll) nl1=ll-1
498
if(cw(c1:l1-1).ne.' ') then
500
call basout(io,lunit,cw(c1-1:l1))
504
call basout(io,lunit,cw(c2-1:l2))
509
call basout(io,lunit,cw(c1-1:l1))
519
110 format('(i',i2,')')
520
120 format('(f',i2,'.',i2,')')
521
130 format('(1pd',i2,'.',i2,')')