// gauss1 pour matrices tridiagonales

function X = gauss(A,B)     // premiere version de GAUSS

nop = 0
n=size(A,'c') // calcul de la taille de A et vérif carrée
if ~ size(A,'r')==n  then printf('matrice non carree'), end

// copie de B dans la colonne n+1 de A
A(:,n+1) = B
print(6,A),

ech=1 // pour le nombre d'echanges (parite)

for k = 1 : n-1 ,   // etape k
    if A(k,k)==0 then // recherche d'un pivot non nul
        printf('pivot nul a l''etape %d',k),
        printf('la methode ne s applique pas'),
        X='pivot nul', return 
                        end,
  
   printf('pivot=%f',A(k,k)),

   // pour i = k+1 seulement  nouvelle ligne i
      A(k+1,[k,k+1,n+1]) = A(k+1,[k,k+1,n+1]) - A(k+1,k)*A(k,[k,k+1,n+1])/A(k,k)
   // A(k+1,[k+1,n+1]) = A(k+1,[k+1,n+1]) - A(k+1,k)*A(k,[k+1,n+1])/A(k,k)
      nop = nop + 6  
   // k si on veut pour avoir les 0 à l'affichage
   // k+1 pour le seul de la colonne non nul
   // n+1 pour le second membre
   printf('etape %d',k),
   print(6,A),
end,

de = ech*prod(diag(A)),
// de = ech,
// for i=1:n, de=de*A(i,i), end,
printf('determinant=%f', de),

// remontée, calcul des xi dans le vecteur X
X(n) = A(n,n+1)/A(n,n), nop = nop+1
for i=[n-1:-1:1],   // remontee : calcul des xi
    X(i) = (A(i,n+1) - A(i,i+1)*X(i+1))/A(i,i),
    // y a plus que i+1
    nop=nop+3
end,
printf('nop= %d',nop)
printf('solution'),

// nombre d'operations nop :
// i=1:n-1 une seule ligne 2 fois */+ , soit 6*(n-1)
// remontee i=n  / ,                    soit 1
//          i=n-1 à 1  1 fois *+/ ,     soit 3*(n-1)
//  total 9*(n-1)+1 = 9*n-8


// A=[6 4 0 0 0 0 0;8 7 5 0 0 0 0 ;0 9 5 6 0 0 0;0 0 7 6 4 0 0;0 0 0 7 6 5 0;0 0 0 0 9 8 3;0 0 0 0 0 8 1]
// B=[7;4;5;9;8;7;1]

// A=[8 3 0 0 0 0 0;9 5 7 0 0 0 0 ;0 7 4 9 0 0 0;0 0 8 7 6  0 0;0 0 0 6 5 3 0;0 0 0 0 8 7 3;0 0 0 0 0 4 1]

// A=[2,1,0;3,3,-5;0,5,-2], B=[8;14;16]       
