File: recbez.f

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (161 lines) | stat: -rw-r--r-- 4,169 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
      subroutine recbez(p1,n1,p2,n2,best,ipb,w,err)
c!but
c calcule la factorisation de bezout de deux polynomes p1,p2 c'est a dire
c les polynomes x,y,u, v et pgcd de degre minimal et tels que :
c                      [x  u]
c            [p1 p2] * [    ] = [0 Pgcd]
c                      [y  v]
c!liste d'appel
c     subroutine recbez(p1,n1,p2,n2,best,ipb,w,err)
c     double precision  p1(n1+1),p2(n2+1),w(*),best(*),err
c
c     p1 : vecteur des coefficients du polynome p1 ranges par puissances
c          croissantes
c     n1 : degre du polynome p1
c     p2 : vecteur des coefficients du polynome p2 ranges par puissances
c          croissantes
c     n2 : degre du polynome p2
c
c     best : tableau resultat doit etre de taille au moins :
c            (2*(n1+n2)+min(n1,n2)+3)  [x y u v pgcd]
c            x=best(1:ipb(2)-1),y=best(ipb(2):ipb(3)-1)
c            u=best(ipb(3):ipb(4)-1) v=best(ipb(4):ipb(5)-1)
c            pgcd=best(ipb(5):ipb(6)-1)
c     ipb :vecteur des pointeurs sur les adresses de debut de x,y,u,v,pgcd
c          dans best ( voir ci-dessus)
c     w: tableau de travail  w(7*n0+3*n0*n0) ou n0=max(n1,n2)+1
c     err : estimee de l'erreur d'equation
c! sous programmes appeles
c     dest dcopy bezstp dlamch
c!origine
c S Steer INRIA 1989
c!
c     Copyright INRIA
      double precision  p1(n1+1),p2(n2+1),w(*),best(*),err
      double precision  dlamch
      integer ipb(6)
c
      integer nn1,nn2
c
      err=dlamch('o')
      ia=1
      nn1=n1
      nn2=n2
c
c degre reel des polynomes
c
      nn1=nn1+1
 01   nn1=nn1-1
      if(nn1.lt.0) goto 30
      if(p1(nn1+1).eq.0.0d+0) goto 01
c
      nn2=nn2+1
 02   nn2=nn2-1
      if(nn2.lt.0) goto 30
      if(p2(nn2+1).eq.0.0d+0) goto 02
c
      n0=max(nn1,nn2)+1
      n02=n0*(n0+1)
      na=n0+1
      call dset(n02,0.0d+0,w(ia),1)
      iu=ia+n02
      nu=n0+1
      call dset(2*n02,0.0d+0,w(iu),1)
      iw=iu+2*n02
      ifree=iw+7*n0
c
      la=ia+na-1
      lu=iu+nu-1+2*n0*nu
c
      call dcopy(nn1+1,p1,1,w(la-1),na)
      call dcopy(nn2+1,p2,1,w(la),na)
      call dset(2,1.0d+0,w(lu-1-2*nu),nu+1)
c
      do 20 l=1,n0
         la=la-1
         lu=lu-1-2*nu
c     la :  pointeur sur le coin en haut a gauche de la matrice a courante
c     lu : pointeur sur le coin en haut a gauche de la matrice u courante
         call bezstp(p1,nn1,p2,nn2,w(la),na,w(lu),nu,l,w(la-1+na),
     $        w(lu-1-2*nu),w(iw),best,ipb,err)
 20   continue
      return
 30   continue
      err=0.0d+0
      ipb(1)=1
      if(min(nn1,nn2).eq.0) goto 70
      if(nn1-nn2) 40,50,60
 40   continue
c     p1=0
      np=nn2
      call dcopy(nn2+1,p2,1,best(1),1)
      ipb(2)=ipb(1)+nn2+1
      best(ipb(2))=0.0d+0
      ipb(3)=ipb(2)+1
      best(ipb(3))=1.0d+0
      ipb(4)=ipb(3)+1
      best(ipb(4))=1.0d+0
      ipb(5)=ipb(4)+1
      best(ipb(5))=0.0d+0
      ipb(6)=ipb(5)+1
      return
 50   continue
c     p1=0,p2=0  la decomposition n'est pas definie
      np=0
      best(1)=0.0d+0
      ipb(2)=ipb(1)+1
      best(ipb(2))=1.0d+0
      ipb(3)=ipb(2)+1
      best(ipb(3))=0.0d+0
      ipb(4)=ipb(3)+1
      best(ipb(4))=0.0d+0
      ipb(5)=ipb(4)+1
      best(ipb(5))=1.0d+0
      ipb(6)=ipb(5)+1
      return
 60   continue
c     p2=0
      np=nn1
      call dcopy(nn1+1,p1,1,best(1),1)
      ipb(2)=ipb(1)+nn1+1
      best(ipb(2))=1.0d+0
      ipb(3)=ipb(2)+1
      best(ipb(3))=0.0d+0
      ipb(4)=ipb(3)+1
      best(ipb(4))=0.0d+0
      ipb(5)=ipb(4)+1
      best(ipb(5))=1.0d+0
      ipb(6)=ipb(5)+1
      return
c
 70   best(1)=1.0d+0
      ipb(2)=2
      if(nn1-nn2) 90,95,100
 90   continue
c     p1=cte
      best(ipb(2))=1.0d+0/p1(1)
      ipb(3)=ipb(2)+1
      best(ipb(3))=0.0d+0
      ipb(4)=ipb(3)+1
      call dcopy(nn2+1,p2,1,best(ipb(4)),1)
      ipb(5)=ipb(4)+nn2+1
      best(ipb(5))=-p1(1)
      ipb(6)=ipb(5)+1
      return
  95  continue
c     p1=cte,p2=cte
      if(abs(p1(1)).gt.abs(p2(1))) goto 90
c
 100  continue
c     p2=cte
      best(ipb(2))=0.0d+0
      ipb(3)=ipb(2)+1
      best(ipb(3))=1.0d+0/p2(1)
      ipb(4)=ipb(3)+1
      best(ipb(4))=-p2(1)
      ipb(5)=ipb(4)+1
      call dcopy(nn1+1,p1,1,best(ipb(5)),1)
      ipb(6)=ipb(5)+nn1+1
      return
c
      end