File: bezous.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 (91 lines) | stat: -rw-r--r-- 2,595 bytes parent folder | download | duplicates (4)
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
       subroutine bezous(a,n,c,w,ierr)
c!but
c  ce sous programme calcule le second coefficient de bezout du
c  couple (a,at) si at=(z**n)*a(1/z) et a est un polynome de degre
c  n ayant tous ces poles dans le disque unite.;a et at sont donc
c  premiers
c!liste d'appel
c
c       subroutine bezous(a,n,c,w,ierr)
c
c a:tableau de taille n+1 contenant les coefficients du polynome a
c    ranges par puissances croissantes.
c n:degre de a
c c:tableau de taille n contenant apres execution le facteur de bezout
c    les coefficients etant ranges par puissances croissantes
c w:tableau de travail de taille n*n+(n+1)/2
c ierr:indicateur d'erreur:
c      si ierr=0 ok
c      si ierr=1 a est de degre inferieur a n
c      si ierr=2 a et at non premiers ou calcul numeriquement faux.
c
c!methode:
c la methode utilisee ici est de resoudre le systeme lineaire associe
c a la relation de bezout: a*b+at*c=1 c'est a dire:
c      [x' y'] [e1]  [b]
c      [     ].[  ] =[ ]
c      [y  x ] [ 0]  [c]
c ou x et y sont des matrice n*n toeplitz triangulaires superieures
c la premiere ligne de x est formee des n premiers coefficient de a
c la premiere ligne de y  des n derniers ranges en ordre inverse
c c est alors solution du systeme : (y'-x'*(y**-1)*x)*c=e1
c!auteur
c     serge Steer Inria 1983
c     Copyright INRIA
c!sous programmes appeles
c     invtpl
c     ddot (blas)
c     dlslv (linpack.extension)
c!
      implicit double precision (a-h,o-z)
      dimension a(*),c(*),w(*)
c
c calcul de la premiere ligne de y**-1
      call invtpl(a(2),n,n,c,ierr)
      if (ierr.ne.0) goto 70
      ierr=0
c c contient les coeff de la premiere ligne de y**-1 dans l'ordre invers
c
c calcul de la premiere ligne de la matrice de toeplitz:-(y**-1)*x
      j=n+1
      do 10 jj=1,n
      j=j-1
      c(jj)=-ddot(j,a,-1,c(jj),-1)
   10 continue
c c contient la premiere ligne du produit ranges dans l'ordre inverse
c
c calcul de x'*(-(y**-1)*x)
      i2=0
      do 20 i=1,n
      w(i2+i)=a(i)*c(n)
   20 continue
      if(n.eq.1) goto 45
       do 40 j=2,n
       i1=i2
       i2=i2+n
       w(i2+1)=a(1)*c(n+1-j)
       do 30 i=2,n
       w(i2+i)=w(i1+i-1)+a(i)*c(n+1-j)
   30 continue
   40 continue
c calcul de y'+w
   45 i1=-n
      do 60 j=1,n
      c(j)=0.0d+0
      i1=i1+n
      do 50 i=j,n
      w(i1+i)=w(i1+i)+a(n+1+j-i)
   50 continue
   60 continue
      c(1)=1.0d+0
c w contient la matrice du systeme lineaire et c le second menbre
c
c resolution
      call dlslv(w,n,n,c,n,1,w(n*n+1),rcond,ierr,1)
      if(ierr.ne.0) goto 80
      return
   70 ierr=1
      return
   80 ierr=2
      return
      end