function X = gauss1pivotmax(A,B)   // division de la ligne du pivot par le pivot
                                   // avec recherche du pivot maximal

printf('gauss1 avec 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

// B est recopié dans la colonne n+1 de A
A(:,n+1) = B
print(6,A),

de=1, // pour calculer le determinant en meme temps

for k = 1 : n ,   // etape k
    amax=0, l=k, // recherche du pivot maximal
    for i=k:n
        absA=abs(A(i,k))
        if absA>amax then l=i, amax=absA, end
    end
    if amax==0 then X='matrice singuliere', return, end
    if l<> k then printf('pour pivot max on echange les lignes %d et %d',k,l),
                  A([k,l],:)=A([l,k],:),
                  de=-de,
                  print(6,A),
    end,
  
    printf('pivot max = %f',A(k,k)),
    de=de*A(k,k),

    A(k,k:n+1) = A(k,k:n+1)/A(k,k), // nouvelle ligne k

    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) 
    end,
    // ou  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,

printf('determinant=%f', de),

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

// appel gauss1pivotmax(A,B) ou X=gauss1pivotmax(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
