### 1.46.12 Ερμιτιανή κανονική μορφή : `ihermite`

`ihermite` παίρνει ως όρισμα έναν πίνακα `A` με συντελεστές στο ℤ.
`ihermite` επιστρέφει δύο πίνακες `U` και `B` τέτοιους ώστε `B=U*A`, όπου ο `U` είναι αντιστρέψιμος στο ℤ ( det(U) = ± 1) και ο `B` είναι άνω τριγωνικός. Εκτός αυτού, η απόλυτη τιμή των συντελεστών πάνω από τη διαγώνιο του `B` είναι μικρότερη από τον οδηγό της στήλης διαιρεμένο δια 2.

Η απάντηση υπολογίζεται από έναν αλγόριθμο σαν τον αλγόριθμο αναγωγής `Gauss` κάνοντας μόνο πράξεις γραμμών με ακέραιους συντελεστές.
Είσοδος :

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

΄Έξοδος :

`[[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]]`

Εφαρμογή: Υπολογίστε μια ℤ-βάση του πυρήνα ενός πίνακα με ακέραιους συντελεστές
Έστω `M` ένας πίνακας με ακέραιους συντελεστές. Είσοδος :

`(U,A):=ihermite(transpose(M))`.

Αυτό επιστρέφει τους πίνακες U και τον A τέτοιους ώστε `A=U*transpose(M)` και επομένως
`transpose(A)=M*transpose(U)`.
Οι μηδενικές στήλες του `transpose(A)` (στα δεξιά του πίνακα, προερχόμενες από τις μηδενικές γραμμές του A στο κάτω μέρος του πίνακα) αντιστοιχούν στις στήλες του `transpose(U)` οι οποίες σχηματίζουν μια βάση του `Ker(M)`. Με άλλα λόγια, οι μηδενικές γραμμές του `A` αντιστοιχούν στις γραμμές του `U` οι οποίες σχηματίζουν μια βάση του `Ker(M)`.
Παράδειγμα
Έστω `M:=[[1,4,7],[2,5,8],[3,6,9]]`. Είσοδος

`[U,A]:=ihermite(tran(M))`

Έξοδος:

`U:=[[-3,1,0],[4,-1,0],[-1,2,-1]]` `και` `A:=[[1,-1,-3],[0,3,6],[0,0,0]]`

Αφού `A[2]=[0,0,0]`, μια ℤ-βάση του `Ker(M)` είναι `U[2]=[-1,2,-1]`.
Επαλήθευση `M*U[2]=[0,0,0]`.