function X = gauss0(A,B) 

printf('gauss0 sans pivot maximal')

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
//// 1ere version
// for i=1:n, A(i,n+1)=B(i), end;
//// meilleure version
A(:,n+1) = B // ou A=[A,B]
////
print(6,A),

ech=1 // pour le nombre d'echanges (parite)

for k = 1 : n ,   // etape k
    if A(k,k)==0 then // recherche d'un pivot non nul
        printf('pivot nul a l''etape %d',k),
        if k<n then i=k+1,
                    while(A(i,k)==0 & i<n ), i=i+1, 
                    end,
               else i=k,
        end,
        if A(i,k)==0 then X='matrice singuliere', return 
                     else printf('on echange les lignes %d et %d',k,i),
                       // 1ere version
                       // aux=A(k,:),A(k,:)=A(i,:),A(i,:)=aux
                       // meilleure version 
                          A([k,i],:)=A([i,k],:),
                       //
                          ech=-ech,
                          print(6,A),
        end,
    end,
  
    printf('pivot=%f',A(k,k)),

    //  nouvelles lignes i
    //// 1ere version
    // for i = k+1 : n ,   // nouvelle ligne i
    //    for j = [n+1:-1:1] , A(i,j) = A(i,j) - A(i,k)*A(k,j)/A(k,k), end,
    //    si on allait de 1 a n+1 il faudrait ranger A(i,k) dans une variable
    //    auxiliaire car il serait modifie en premier
    // end,
    //// meilleure version
    // for i = k+1 : n ,   // nouvelle ligne i
    //   A(i,k:n+1) = A(i,k:n+1) - A(i,k)*A(k,k:n+1)/A(k,k)
    // end,
    //// et encore mieux
    A(k+1:n,k:n+1) = A(k+1:n,k:n+1) - A(k+1:n,k)*A(k,k:n+1)/A(k,k)
    ////
    printf('etape %d',k),
    print(6,A),
end,

// calcul du déterminant
//// 1ere version
// de = ech,
// for i=1:n, de=de*A(i,i), end,
//// meilleure version
de = ech*prod(diag(A)),
////
printf('determinant=%f', de),

// remontée, calcul des xi dans le vecteur X
X(n) = A(n,n+1)/A(n,n), 
for i=[n-1:-1:1],   // remontee : calcul des xi
    //// 1ere version
    // X(i)=A(i,n+1),
    // for j=i+1:n, X(i) = X(i) - X(j)*A(i,j), end, X(i) = X(i)/A(i,i), 
    //// meilleure version
    X(i) = (A(i,n+1) - A(i,i+1:n)*X(i+1:n))/A(i,i),
end,
printf('solution'),

// appel gauss0(A,B) ou X=gauss0(A,B)
// A=[2,1,-4;3,3,-5;4,5,-2], B=[8;14;16]       premier exemple du cours
// A=[2,1,-4;4,2,-7;2,1,-1], B=[8;15;9]        impossible
// A=[2,1,-4;4,2,-7;2,1,-1], B=[8;15;5]        indetermine
// A=[2,1,-4;4,2,-7;2,2,-1], B=[8;15;5]        echange de lignes obligatoire
