### 6.57.13 Forme normale de Hermite : ihermite

ihermite a comme argument une matrice à coefficient dans ℤ.
ihermite renvoie les matrices B et U tels que B est inversible dans ℤ, U est triangulaire supérieure et vérifie : U=B*A.
Pour faire cela on effectue la réduction sous forme échelonnée (de type Gauss) d’une matrice d’entiers en utilisant uniquement des opérations de lignes inversibles dans les entiers, en d’autres termes si A est la matrice de départ, on calcule une matrice B inversible dans ℤ et une matrice U triangulaire supérieure telles que U = B*A.
De plus les coefficients au-dessus de la diagonale de A sont en module inférieurs au pivot de la colonne divisé par 2. Puisque det(B) = 1, on passe aussi de U à A uniquement avec des manipulations de ligne à coefficients entiers.
On tape :

A:=[[9,-36,30],[-36,192,-180],[30,-180,180]];B,U:=ihermite(A)

On obtient :

[[9,-36,30],[-36,192,-180],[30,-180,180]], [[13,9,7],[6,4,3],[20,15,12]],[[3,0,30],[0,12,0],[0,0,60]]

On vérifie :

det(B),B*A

renvoie :

1,[[3,0,30],[0,12,0],[0,0,60]]

Application: Calcul d’une Z-base d’un noyau
Soit M la matrice dont on cherche le noyau.
Soit A,U:=ihermite(transpose(M)).
On a U=A*transpose(M) donc transpose(U)=M*transpose(A).
Les colonnes nulles de transpose(U) correspondent donc aux colonnes de transpose(A) qui sont dans Ker(M). Ainsi, les lignes nulles de U correspondent aux lignes de A qui sont dans Ker(M).
Exemple
Si M:=[[1,4,7],[2,5,8],[3,6,9]]
A,U:=ihermite(tran(M)) renvoie :
A:=[[-3,1,0],[4,-1,0],[-1,2,-1]] et
U:=[[1,-1,-3],[0,3,6],[0,0,0]]
U[2]=[0,0,0] donc une base de Ker(M) est composée de A[2]=[-1,2,-1].
On vérifie que l’a bien M*A[2]=[0,0,0].