gaussjordan_redi(M):={ local pivo,j,k,nl,nc,temp,l,n,a; nl:=nrows(M); nc:=ncols(M); n:=min(nl,nc-1); //on met des 0 sous et au dessus de la diagonale du carre n*n for (j:=0;j<n;j++) { //choix du pivot k:=j; while (M[k,j]==0 and k<nl-1) {k:=k+1;} //on ne fait la suite que si on a pivo!=0 if (M[k,j]!=0) { pivo:=M[k,j]; //echange de la ligne j et de la ligne k for (l:=j;l<nc;l++){ temp:=M[j,l]; M[j,l] := M[k,l]; M[k,l]:=temp; } //fin du choix du pivot qui est M[j,j] // on met des zeros au dessus de la diag for (k:=0;k<j;k++) { a:=M[k,j]; for (l:=0;l<nc;l++){ M[k,l]:=M[k,l]*pivo-M[j,l]*a; } } // on met des zeros au dessous de la diag for (k:=j+1;k<nl;k++) { a:=M[k,j]; for (l:=j;l<nc;l++){ M[k,l]:=M[k,l]*pivo-M[j,l]*a; } } } } return M; }De la même façon que pour la mèthode de Gauss, on va mettre des zéros sous la "fausse diagonale" et au dessus de cette "fausse diagonale" (on ne pourra pas bien sûr, mettre des zéros au dessus de cette "fausse diagonale", pour les colonnes sans pivot!!)
gaussjordan_red(M):={ local pivo,jc,jl,k,nl,nc,temp,l,a; nl:=nrows(M); nc:=ncols(M); //on met des 0 sous la fausse diagonale jc:=0; jl:=0; //on doit traiter toutes les colonnes sauf le derniere et //on doit traiter toutes les lignes while (jc<nc-1 and jl<nl) { //choix du pivot que l'on veut mettre en M[jl,jc] k:=jl; while (M[k,jc]==0 and k<nl-1) {k:=k+1;} //on ne fait la suite que si on a pivo!=0 if (M[k,jc]!=0) { pivo:=M[k,jc]; //echange de la ligne jl et de la ligne k for (l:=jc;l<nc;l++){ temp:=M[jl,l]; M[jl,l] := M[k,l]; M[k,l]:=temp; } //fin du choix du pivot qui est M[jl,jc] //on met des 0 au dessus la fausse diagonale de //la colonne jc for (k:=0;k<jl;k++) { a:=M[k,jc]; for (l:=0;l<nc;l++){ M[k,l]:=M[k,l]*pivo-M[jl,l]*a; } } //on met des 0 sous la fausse diag de la colonne jc for (k:=jl+1;k<nl;k++) { a:=M[k,jc]; for (l:=jc;l<nc;l++){ M[k,l]:=M[k,l]*pivo-M[jl,l]*a; } } //on a un pivot donc //le numero de ligne de la fausse diag augmente de 1 jl:=jl+1; } //ds tous les cas, //le numero de colonne de la fausse diag augmente de 1 jc:=jc+1; } return M; }On tape :