### 6.55.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]`.