Skip to content

Chapter 1 : Groupes abéliens de type fini

Structure de groupe abéliens de type fini

Soit $(A,+)$ un groupe abélien.

Rappel : $A$ est de type fini s’il admet une partie génératrice finie, i. e. une partie $\{a_1, \cdots, a_r\} \subset A$ telle que tout $a \in A$ s’écrit $a = x_1a_1+x_2a_2+\cdots+x_ra_r$ pour des $x_1, \cdots, x_r \in \mathbb{Z}$. Autrement dit, le morphisme $$\mathbb{Z}^r \to A, \quad \begin{bmatrix} x_1 \\ \vdots \\ x_r \end{bmatrix} \mapsto x_1a_1 + x_2a_2 + \cdots + x_ra_r$$ est surjectif. Alors tout quotient de $A$ est encore de type fini.

Exemple : Le groupe $(\mathbb{Q},+)$ n’est pas de type fini !

Exemple : Les groupes $\mathbb{Z}^r$, $r \in \mathbb{N}$, $\mathbb{Z}/n\mathbb{Z}$ sont de type fini.

Proposition : Si $A$ est abélien de type fini, tout sous-groupe $B \subset A$ est (abélien) de type fini.

Remarque : Cette proposition est fausse pour les groupes non abéliens !

Preuve : Soit $p : \mathbb{Z}^r \to A$ un morphisme surjectif. Alors $B \subset A$ est quotient de $C = p^{-1}(B) \subset \mathbb{Z}^r$. Il suffit donc de montrer que $C \subset \mathbb{Z}^r$ est de type fini. On procède par récurrence sur $r$. Pour $r = 0$, il n’y a rien à démontrer. Notons $\mathbb{Z} \subset \mathbb{Z}^r$ le sous-groupe $\mathbb{Z}\times\{0\}^{r-1}$. Alors $\mathbb{Z}\cap C$ est un sous-groupe de $\mathbb{Z}$. Donc $\mathbb{Z}\cap C$ est engendré par un seul élément $c \in \mathbb{Z} \cap C$. Considérons le diagramme (avec suites exactes) :

La projection $\pi : \mathbb{Z}^r \to \mathbb{Z}^{r-1}$, $\begin{bmatrix} x_1 \\ \vdots \\ x_r \end{bmatrix} \mapsto \begin{bmatrix} x_2 \\ \vdots \\ x_r \end{bmatrix}$ induit un isomorphisme de $C/(\mathbb{Z}\cap C)$ sur $\pi(C)$. Par l’hypothèse de récurrence sur $r$, le sous-groupe $\pi(C) \subset \mathbb{Z}^{r-1}$ est engendré par un nombre fini d’éléments $\pi(c_2), \cdots, \pi(c_s)$. Alors il est clair que $C$ est engendré par $c, c_2, \cdots, c_s$.

$\square$

Définition : Le groupe $A$ est (abélien) libre de type fini s’il est isomorphe à $\mathbb{Z}^r$ pour un $r \in \mathbb{N}$. Une famille $a_1, \cdots, a_r$ d’éléments de $A$ est une base de $A$ si le morphisme $\varphi:\mathbb{Z}^r \to A$, $e_i \mapsto a_i$ est un isomorphisme.

Remarque : Une famille $a_1, \cdots, a_r$ est une base s.s.i. elle est

  1. génératrice ($\Leftrightarrow\varphi$ est surjectif)
  2. libre ($\Leftrightarrow\varphi$ est injectif), i.e. $\forall x_1, \cdots, x_r \in \mathbb{Z}$, on a

$$x_1a_1 + \cdots + x_ra_r = 0 \implies x_1 = \cdots = x_r = 0. $$

Théorème : Toutes les bases d’un groupe abélien libre de type fini ont le même nombre d’éléments, appelé le rang du groupe abélien libre et on le note $\text{rg}(A)$.

Preuve : Soit $A$ abélien libre avec deux bases $a_1, \cdots, a_r$ et $b_1, \cdots, b_s$. Soient $\varphi : \mathbb{Z}^r \to A$, $e_i \mapsto a_i$ et $\psi : \mathbb{Z}^s \to A$, $e_i \mapsto b_i$ les isomorphismes associés. Alors $\psi^{-1} \circ \varphi : \mathbb{Z}^r \to \mathbb{Z}^s$ est un isomorphisme. Donc les $v_i := \psi^{-1}(\varphi(e_i))$ forment une famille génératrice et libre dans $\mathbb{Z}^s$. Mais alors ils forment aussi une famille génératrice et libre dans le $\mathbb{Q}$-espace vectoriel $\mathbb{Q}^s$. En effet, tout $e_i$ est combinaison linéaire à coefficients entiers des $v_i$ et si on a une relation $y_1v_1 + \cdots + y_rv_r = 0$ à coefficients rationnels, il suffit de multiplier par le produit des dénominateurs pour conclure $y_1 = \cdots = y_r = 0$. Donc les $v_1, \cdots, v_r$ forment une base du $\mathbb{Q}$-espace vectoriel $\mathbb{Q}^s$. Donc $r = s$.

$\square$

Remarque : Si $V \neq 0$ est un espace vectoriel, tout $0 \neq v \in V$ se complète en une base. Cette propriété est fausse pour les groupes abéliens libres. Par exemple $0 \neq 2 \in \mathbb{Z}$ ne se complète pas en une base de $\mathbb{Z}$ car les seules bases de $\mathbb{Z}$ sont $1$ et $-1$.

Définition : Soit $n \geq 1$ un entier. Le $GL_n(\mathbb{Z})$ est le groupe des éléments inversibles de l’anneau $\mathcal{M}_n(\mathbb{Z})$.

Exercice : Une matrice $M \in \mathcal{M}_n(\mathbb{Z})$ est dans $GL_n(\mathbb{Z})$ s.s.i. $\det(M) \in \{\pm1\}$.

Théorème : Soit $A \in \mathcal{M}_{p \times q}(\mathbb{Z})$. Alors il existe $P \in GL_p(\mathbb{Z})$ et $Q \in GL_q(\mathbb{Z})$ telles que

$$PAQ = \begin{bmatrix} d_1 & 0 & 0 & \cdots & 0 & \cdots & 0 \\ 0 & d_2 & 0 & & & & \\ 0 & 0 & \ddots & & \vdots & & \vdots\\ \vdots & & & d_s & & & \\ 0 & & \cdots & & 0 & \cdots & 0 \\ \vdots & & & & \vdots & & \vdots \\ 0 & & \cdots & & 0 & \cdots & 0 \end{bmatrix}_{p\times q}, $$

$d_1, \cdots, d_s$ sont des entiers $\geq 1$ tels que $d_1 \mid \cdots \mid d_s$. Les $d_i$ sont déterminés par la matrice $A$ et s’appellent les facteurs invariants de $A$.

Preuve : Montrons d’abord l’unicité. Notons $B$ la matrice $PAQ$ et $\text{Im }B \subset \mathbb{Z}^p$ le sous-groupe formé des $Bx$, $x \in \mathbb{Z}^q$. Alors il est clair que l’automorphisme $P:\mathbb{Z}^p \to \mathbb{Z}^p$ induit un isomorphisme de $\text{Im }A$ sur $\text{Im }B$ et donc un isomorphisme $\mathbb{Z}^p/\text{Im }A \to \mathbb{Z}^p/\text{Im }B$. Il est clair que $\text{Im }B$ est le sous-groupe $d_1\mathbb{Z} \oplus \cdots \oplus d_s\mathbb{Z} \oplus 0 \oplus \cdots \oplus 0 \subset \mathbb{Z}^p$. Or si $M_1$ et $M_2$ sont deux groupes abéliens et $M'_1 \subset M_1$ et $M'_2 \subset M_2$ des sous-groupes, alors $(M_1 \oplus M_2) / (M'_1 \oplus M'_2) \simeq (M_1/M'_1) \oplus (M_2/M'_2)$. Donc

$$\mathbb{Z}^p/\text{Im }B \simeq \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z} \oplus \mathbb{Z}^{p-s}. $$

Le sous-groupe fini $T := \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}\subset \mathbb{Z}^p/\text{Im } B$ admet un description intrinsèque comme le sous-groupe de torsion de $\mathbb{Z}^p/\text{Im }B$ :

$$ T = (\mathbb{Z}^p/\text{Im }B)_t = \{b\in \mathbb{Z}^p/\text{Im }B \mid \exists x\in \mathbb{Z} \setminus \{0\} \text{ t.q. } xb = 0\}. $$

L'isomorphisme $\mathbb{Z}^p/\text{Im }A \simeq \mathbb{Z}^p/\text{Im }B$ induit un isomorphisme entre les sous-groupes de torsion :

$$ (\mathbb{Z}^p/\text{Im }A)_t \simeq (\mathbb{Z}^p/\text{Im }B)_t \simeq \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}. $$

Donc $(\mathbb{Z}^p/\text{Im }A)_t$ est un groupe abélien fini isomorphe à

$$\mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}, \quad d_1 \mid \cdots \mid d_s. $$

Par la classification des groupes abéliens finis, les $d_i\,(d_i>1)$ sont déterminés par le groupe $(\mathbb{Z}^p/\text{Im }A)_t$, et donc par la matrice $A$. De plus, le nombre de facteurs invariants de $A$ est $s=\text{rg}(PAQ) = \text{rg}(A)$, qui ne dependent que de la matrice $A$. Donc le nombre des facteurs invariants $d_i=1$ sont aussi déterminés par la matrice $A$.

Montrons l’existence. On procède comme pour les matrices à coefficients dans un corps : on utilise les opérations élémentaires qui correspondent à des multiplications à droite et à gauche par des matrices dans $GL_p(\mathbb{Z})$ resp. $GL_q(\mathbb{Z})$, par exemple

$$\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix},\quad \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix},\quad \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix},\quad\text{etc.} $$

On peut supposer que $A \neq 0$.

Étape 1 : En permutant les lignes et les colonnes on transforme $A$ en une matrice telle que $|a_{11}|$ soit minimal parmi les $|a_{ij}|$. Si nécessaire, on multiplie la première ligne par $-1$ pour obtenir $a_{11} > 0$. Dans la suite, on va retourner plusieurs fois à l’étape 1 mais à chaque fois la valeur de $|a_{11}|$ va diminuer strictement de façon que le processus doit s’arrêter après un nombre fini d’itérations.

Étape 2 : Supposons qu’il y a un coefficient $a_{i1}$, $i > 1$, non nul à la première colonne. Effectuons une division euclidienne $a_{i1} = q \cdot a_{11} + r$$0 \leq r < a_{11}$. Soustrayons $q$ fois la ligne 1 à la ligne $i$. Cette opération transforme $a_{i1}$ en $r < a_{11}$. Si $r \neq 0$, on retourne à l’étape 1.

Étape 2' : Comme l’étape 2 mais pour les coefficients $a_{1,j}$, $j > 1$, non nul à la première ligne. Après un nombre fini d’itérations des étapes 1, 2 et 2', on obtient une matrice de la forme

$$\begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ 0 & & & \\ \vdots & & B & \\ 0 & & & \end{bmatrix} $$

Ici, il est possible que $a_{11}$ ne divise pas tous les coefficients de $B$. Alors on prend un $b_{ij}$ non divisible par $a_{11}$, on ajoute la colonne $j+1$ (corrrespondant à la $j$-ème colonne de $B$) à la colonne $1$ et on retourne à l’étape 1. Après un nombre fini d’itérations on obtient une matrice

$$\begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ 0 & & & \\ \vdots & & A' & \\ 0 & & & \end{bmatrix} $$

$a_{11}$ divise tous les coefficients de $A'$. On conclut par récurrence sur la taille de la matrice.

$\square$

Implémentation SageMath : Calcul de la forme normale de Smith (Cliquez pour déplier)
Ce script détaille chaque étape (permutations, éliminations, vérifications de divisibilité). Vous pouvez le copier-coller directement dans SageMathCell pour l'exécuter et visualiser le processus.
python
def smith_normal_form_with_steps(A, verbose=True):
    """
    Calcule la forme normale de Smith d'une matrice A à coefficients entiers
    en suivant les étapes données, avec affichage des étapes intermédiaires.
    
    INPUT:
        A -- matrice à coefficients dans ZZ
        verbose -- bool, si True affiche les étapes intermédiaires
    
    OUTPUT:
        (B, P, Q) où B = P * A * Q est la forme normale de Smith,
        P et Q sont les matrices de changement de base (unimodulaires)
    """
    m, n = A.dimensions()
    B = A.change_ring(ZZ)
    P = identity_matrix(ZZ, m)
    Q = identity_matrix(ZZ, n)
    
    if verbose:
        print("Matrice initiale A:")
        print(B)
        print()
    
    # On traite chaque position diagonale
    d = 0  # indice diagonal courant
    while d < min(m, n):
        if verbose:
            print(f"\n{'#'*70}")
            print(f"# Traitement de la position diagonale ({d+1}, {d+1})")
            print(f"{'#'*70}")
        
        # Sous-matrice active : lignes d..m-1, colonnes d..n-1
        sub_m = m - d
        sub_n = n - d
        
        if sub_m == 0 or sub_n == 0:
            break
        
        # Vérifier si c'est la dernière position diagonale
        is_last_diagonal = (d == min(m, n) - 1)
        
        if is_last_diagonal:
            # Pour la dernière position diagonale, juste vérifier le signe
            if verbose:
                print(f"\n  >>> Dernière position diagonale : vérification du signe de a_{{{d+1},{d+1}}}")
            
            if B[d, d] < 0:
                B.rescale_row(d, -1)
                P.rescale_row(d, -1)
                if verbose:
                    print(f"    L{d+1} <- -L{d+1}")
                    print(f"    -> a_{{{d+1},{d+1}}} = {B[d,d]} > 0")
            elif B[d, d] == 0:
                if verbose:
                    print(f"    a_{{{d+1},{d+1}}} = 0, aucune action nécessaire.")
            else:
                if verbose:
                    print(f"    a_{{{d+1},{d+1}}} = {B[d,d]} déjà > 0, aucune action nécessaire.")
            
            if verbose:
                print("\n    Matrice B après vérification du signe:")
                print(B)
            
            d += 1
            continue
        
        # Tant que la première ligne/colonne du bloc actif n'est pas nettoyée
        cleaned = False
        while not cleaned:
            
            # Étape 1 : Minimiser |a_{dd}| par permutations
            if verbose:
                print(f"\n  >>> Étape 1 : Minimisation de |a_{{{d+1},{d+1}}}|")
            
            operations = []
            
            changed = True
            while changed:
                changed = False
                # Trouver le coefficient non nul de valeur absolue minimale dans le bloc actif
                min_val = None
                min_pos = None
                for i in range(d, m):
                    for j in range(d, n):
                        val = abs(B[i, j])
                        if val != 0 and (min_val is None or val < min_val):
                            min_val = val
                            min_pos = (i, j)
                
                if min_pos is None:
                    # Bloc entièrement nul
                    if verbose:
                        print("    Bloc actif entièrement nul, on passe au bloc suivant.")
                        print("\n    Matrice B après l'Étape 1:")
                        print(B)
                    cleaned = True
                    break
                
                # Placer ce coefficient en position (d, d) par permutations
                i_min, j_min = min_pos
                
                if i_min != d:
                    B.swap_rows(d, i_min)
                    P.swap_rows(d, i_min)
                    operations.append(f"L{d+1} <-> L{i_min+1}")
                    changed = True
                
                if j_min != d:
                    B.swap_columns(d, j_min)
                    Q.swap_columns(d, j_min)
                    operations.append(f"C{d+1} <-> C{j_min+1}")
                    changed = True
            
            if verbose and not cleaned:
                for op in operations:
                    print(f"    {op}")
                print(f"    -> |a_{{{d+1},{d+1}}}| = {abs(B[d,d])}")
            
            if cleaned:
                break
            
            # Assurer a_{dd} > 0
            if B[d, d] < 0:
                B.rescale_row(d, -1)
                P.rescale_row(d, -1)
                if verbose:
                    print(f"    L{d+1} <- -L{d+1}")
                    print(f"    -> a_{{{d+1},{d+1}}} = {B[d,d]} > 0")
            elif B[d, d] == 0:
                if verbose:
                    print("\n    Matrice B après l'Étape 1:")
                    print(B)
                cleaned = True
                break
            
            if verbose:
                print("\n    Matrice B après l'Étape 1:")
                print(B)
            
            # Étape 2 : Élimination dans la première colonne          
            if verbose:
                print(f"\n  >>> Étape 2 : Élimination des coefficients de la colonne {d+1}")
            
            operations = []
            restart_etape1 = False
            
            for i in range(d + 1, m):
                if B[i, d] != 0:
                    q = B[i, d] // B[d, d]
                    r = B[i, d] % B[d, d]
                    B.add_multiple_of_row(i, d, -q)
                    P.add_multiple_of_row(i, d, -q)
                    operations.append(f"L{i+1} <- L{i+1} - {q}*L{d+1}  (car {B[i,d]+q*B[d,d]} = {q}*{B[d,d]} + {r})")
                    
                    if r != 0:
                        restart_etape1 = True
            
            if verbose:
                if operations:
                    for op in operations:
                        print(f"    {op}")
                else:
                    print(f"    Aucun coefficient non nul dans la colonne {d+1}")
                print("\n    Matrice B après l'Étape 2:")
                print(B)
            
            if restart_etape1:
                if verbose:
                    print("    -> Reste non nul détecté, retour à l'Étape 1")
                continue
            
            # Étape 2' : Élimination dans la première ligne
            if verbose:
                print(f"\n  >>> Étape 2' : Élimination des coefficients de la ligne {d+1}")
            
            operations = []
            
            for j in range(d + 1, n):
                if B[d, j] != 0:
                    q = B[d, j] // B[d, d]
                    r = B[d, j] % B[d, d]
                    B.add_multiple_of_column(j, d, -q)
                    Q.add_multiple_of_column(j, d, -q)
                    operations.append(f"C{j+1} <- C{j+1} - {q}*C{d+1}  (car {B[d,j]+q*B[d,d]} = {q}*{B[d,d]} + {r})")
                    
                    if r != 0:
                        restart_etape1 = True
            
            if verbose:
                if operations:
                    for op in operations:
                        print(f"    {op}")
                else:
                    print(f"    Aucun coefficient non nul dans la ligne {d+1}")
                print("\n    Matrice B après l'Étape 2':")
                print(B)
            
            if restart_etape1:
                if verbose:
                    print("    -> Reste non nul détecté, retour à l'Étape 1")
                continue
            
            # Vérifier si la première ligne et la première colonne sont nettoyées
            first_col_clean = all(B[i, d] == 0 for i in range(d + 1, m))
            first_row_clean = all(B[d, j] == 0 for j in range(d + 1, n))
            
            if first_col_clean and first_row_clean:
                # Matrice sous la forme (*)
                if verbose:
                    print(f"\n  >>> Forme (*) atteinte :")
                    print(f"      a_{{{d+1},{d+1}}} = {B[d,d]}, première ligne et colonne nettoyées")
                
                # Vérifier si a_{dd} divise tous les coefficients du bloc A'
                a_dd = B[d, d]
                if a_dd == 0:
                    cleaned = True
                    break
                
                # Étape 3 : Vérifier la divisibilité dans le bloc A'
                if verbose:
                    print(f"\n  >>> Étape 3 : Vérification de la divisibilité dans A'")
                    
                divisible = True
                non_div_pos = None
                for i in range(d + 1, m):
                    for j in range(d + 1, n):
                        if B[i, j] % a_dd != 0:
                            divisible = False
                            non_div_pos = (i, j)
                            break
                    if not divisible:
                        break
                
                if divisible:
                    if verbose:
                        print(f"    a_{{{d+1},{d+1}}} = {a_dd} divise tous les coefficients de A'.")
                        print(f"    Bloc ({d+1},{d+1}) terminé.")
                        print("\n    Matrice B après l'Étape 3:")
                        print(B)
                    cleaned = True
                else:
                    # Il existe un coefficient non divisible, on ajoute sa colonne à la première
                    i_bad, j_bad = non_div_pos
                    b_ij = B[i_bad, j_bad]
                    B.add_multiple_of_column(d, j_bad, 1)
                    Q.add_multiple_of_column(d, j_bad, 1)
                    if verbose:
                        print(f"    a_{{{d+1},{d+1}}} = {a_dd} ne divise pas b_{{{i_bad-d},{j_bad-d}}} = {b_ij}.")
                        print(f"    C{d+1} <- C{d+1} + C{j_bad+1}")
                        print(f"    Retour à l'Étape 1.")
                        print("\n    Matrice B après l'Étape 3:")
                        print(B)
            else:
                if verbose:
                    print("\n    Matrice B après l'Étape 2':")
                    print(B)
        
        d += 1
    
    if verbose:
        print("\n" + "="*70)
        print("FORME NORMALE DE SMITH FINALE :")
        print("="*70)
        print(B)
    
    return B, P, Q


# Exemple d'utilisation
if __name__ == "__main__":
    # Exemple de matrice
    A = matrix(ZZ, [
        [2, 4, 4],
        [-6, 6, 12],
        [10, 4, 16]
    ])
    
    print("="*70)
    print("CALCUL DE LA FORME NORMALE DE SMITH - AVEC ÉTAPES INTERMÉDIAIRES")
    print("="*70)
    
    B, P, Q = smith_normal_form_with_steps(A, verbose=True)
    
    print("\nVérification : P * A * Q = B ?")
    print(P * A * Q == B)
    
    print("\nP =")
    print(P)
    print("\nQ =")
    print(Q)

Remarque : Si $k$ est un corps, on a une division euclidienne pour l’anneau des polynômes en une variable $k[T]$. Si on remplace la valeur absolue par le degré et qu’on demande que les $d_i$ soient des polynômes unitaires, alors on a un théorème analogue (avec la "même" démonstration) pour des matrices $A \in \mathcal{M}_{p\times q}(k[T])$ avec $P \in GL_p(k[T]) = \{P \mid \det P \in k^*\}$ et $Q \in GL_q(k[T])$.

Théorème : (La base adaptée)

Soit $M$ un groupe abélien libre de rang fini $p$. Soit $L \subset M$ un sous-groupe. Alors $L$ est (abélien) libre de rang $s \leq p$ et il existe une base $e_1, \cdots, e_p$ de $M$ et des entiers strictement positifs $d_1 \mid \cdots \mid d_s$ tels que $d_1e_1, \cdots, d_se_s$ forment une base de $L$.

Preuve : Choisissons un isomorphisme $\varphi : \mathbb{Z}^p \to M$. On sait que $\varphi^{-1}(L) \subset \mathbb{Z}^p$ est de type fini. Soit $a_1, \cdots, a_q$ une famille génératrice de $\varphi^{-1}(L)$. Soit $A \in M_{p \times q}(\mathbb{Z})$ la matrice de colonnes $a_1, \cdots, a_q$. Soient $P, Q, d_1, \cdots, d_s$ comme dans le Théorème précédent. On considère le diagramme

$D = {\small\begin{bmatrix} d_1 & & & \\ & \ddots & & O \\ & & d_s & \\ & O & & O \end{bmatrix}}$. On a $\varphi^{-1}(L) = \text{Im }A$ et $P$ induit un isomorphisme de $\text{Im }A$ sur $\text{Im }D = d_1\mathbb{Z} \oplus \cdots \oplus d_s\mathbb{Z} \oplus 0 \oplus \cdots \oplus 0 \subset \mathbb{Z}^s$. Alors il est clair que les $\varphi(P^{-1}e_i)$, $1 \leq i \leq p$ forment une base de $M$ avec les propriétés souhaitées.

$\square$

Théorème : (Théorème de structure) Soit $A$ un groupe abélien de type fini. Alors il existe des entiers $r$ et $s$ et des entiers $1 < d_1 \mid d_2 \mid \cdots \mid d_s$ déterminés par $A$ tels que

$$A \simeq \mathbb{Z}^r \oplus \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}. $$

Définition : Le rang de $A$ est $\text{rg}(A) = r$.

Remarques :

(i) $A$ est fini s.s.i. $r = 0$. Il est abélien libre s.s.i. $s = 0$.

(ii) Soit $\varphi : \mathbb{Z}^r \oplus \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z} \to A$ un isomorphisme (choix !). Alors l'image $A_1 = \varphi(0 \oplus \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}) \subset A$ ne dépend pas du choix de $\varphi$. En effet, le sous-groupe $0 \oplus \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}$ est le sous-groupe de torsion de $\mathbb{Z}^r \oplus \mathbb{Z}/d_1\mathbb{Z} \oplus \cdots \oplus \mathbb{Z}/d_s\mathbb{Z}$. Donc son image par $\varphi$ est le sous-groupe de torsion de $A$ : $A_t = \{a \in A \mid na = 0 \text{ pour un } n \in \mathbb{N} \setminus \{0\}\}$. Ce sous-groupe est clairement indépendant du choix de $\varphi$. Mais $A_2 = \varphi(\mathbb{Z}^r \oplus 0) \subset A$ dépend du choix de $\varphi$. Exemple :

$$\begin{align*} \mathbb{Z} \oplus \mathbb{Z}/2\mathbb{Z} &\xrightarrow{\text{id}} \mathbb{Z} \oplus \mathbb{Z}/2\mathbb{Z} = A, &&A_2 = \mathbb{Z} \oplus 0\\ \mathbb{Z} \oplus \mathbb{Z}/2\mathbb{Z} &\xrightarrow{\varphi} \mathbb{Z} \oplus \mathbb{Z}/2\mathbb{Z}, &&A_2 = \mathbb{Z}\oplus\mathbb{Z}/2\mathbb{Z} \\ (n, \bar{m}) &\longmapsto (n, \bar{n}+\bar{m}) && \end{align*} $$

Alors $A'_2 = \{(n, \bar{n} + \bar{m}) \mid n \in \mathbb{Z}, \bar{m} \in \mathbb{Z}/2\mathbb{Z}\} \neq A_2$. Car l'image de $A'_2$ par la projection $\mathbb{Z} \oplus \mathbb{Z}/2\mathbb{Z} \to \mathbb{Z}/2\mathbb{Z}$ est non nulle.

(iii) Notons $A_t$ le sous-groupe de torsion de $A$. Alors on a une suite exacte canonique :

$$ 0 \to A_t \to A \to A/A_t \to 0. $$

Le groupe $A/A_t$ est isomorphe (de façon non canonique !) à $\mathbb{Z}^r$. La suite est scindée : le sous-groupe $A_t$ admet un supplémentaire isomorphe à $A/A_t$ : $A \simeq A_t \oplus (A/A_t)$. Mais elle n’est pas canoniquement scindée !

Définition : Un groupe abélien est indécomposable s’il est non nul et n’est pas la somme directe de deux sous-groupes non nuls.

Corollaire : Tout groupe abélien de type fini est somme directe de groupes abéliens indécomposables qui sont uniques à isomorphisme et permutation près.

Preuve : L’existence est claire par le théorème de structure et le lemme chinois (voir l’exemple). Montrons l’unicité. Dans la décomposition en indécomposables, le nombre de facteurs $\mathbb{Z}$ est le rang du groupe, donc unique. Il suffit de montrer l’unicité pour un groupe abélien fini $B$. Le groupe $B$ est la somme directe de ses $p$-Sylow. Donc on peut supposer que $B$ est un $p$-groupe. Alors la classification des groupes abéliens finis donne

$$B \simeq \mathbb{Z}/p^{m_1} \oplus \mathbb{Z}/p^{m_2} \oplus \cdots \oplus \mathbb{Z}/p^{m_s}. $$

$\square$

Exemple : Soit $A = \mathbb{Z}/2\mathbb{Z} \oplus \mathbb{Z}/6\mathbb{Z} \oplus \mathbb{Z}/60\mathbb{Z} \oplus \mathbb{Z}/600\mathbb{Z}$. Par le lemme chinois,

$$\begin{align*} 2 = 2 &\implies \mathbb{Z}/2\mathbb{Z} \simeq \mathbb{Z}/2\mathbb{Z} \\ 6 = 2 \times 3 &\implies \mathbb{Z}/6\mathbb{Z} \simeq \mathbb{Z}/2\mathbb{Z} \oplus \mathbb{Z}/3\mathbb{Z} \\ 60 = 2^2 \times 3 \times 5 &\implies \mathbb{Z}/60\mathbb{Z} \simeq \mathbb{Z}/4\mathbb{Z} \oplus \mathbb{Z}/3\mathbb{Z} \oplus \mathbb{Z}/5\mathbb{Z} \\ 600 = 2^3 \times 3 \times 5^2 &\implies \mathbb{Z}/600\mathbb{Z} \simeq \mathbb{Z}/8\mathbb{Z} \oplus \mathbb{Z}/3\mathbb{Z} \oplus \mathbb{Z}/25\mathbb{Z} \end{align*} $$

La décomposition en groupes abéliens indécomposables de $A$ est donnée par la somme des groupes à droite des équations.

Illustration : le théorème de Mordell

Une courbe elliptique sur $\mathbb{Q}$ est l’ensemble $E$ des solutions $(x, y) \in \mathbb{Q}^2$ d’une équation $y^2 = x^3 + ax + b$, où $a, b \in \mathbb{Q}$ t.q. $4a^3 + 27b^2 \neq 0$. On admet aussi le "point à l’infini $O = (0,\infty)$" comme solution. Toutes les droites verticales passent par $O$. On peut munir $E$ d’une structure de groupe abélien, d’élément neutre $O$ telle que

$$P + Q + R = O \iff P, Q, R \text{ sont alignés} $$

Il est non trivial de montrer que $(E,+)$ est un groupe (associativité !). Il est clair que $(E,+)$ est abélien.

Théorème : (Mordell, 1922) Le groupe abélien $(E,+)$ est de type fini.

Théorème : (Mazur, 1977) Le groupe de torsion $E_t$ est isomorphe à l’un des groupes suivants : $\mathbb{Z}/n\mathbb{Z}$, $1 \leq n \leq 10$, ou $\mathbb{Z}/2\mathbb{Z} \oplus \mathbb{Z}/d\mathbb{Z}$$d \in \{2, 4, 6, 8\}$.

Les groupes $GL_n(\mathbb{Z})$ et $SL_n(\mathbb{Z})$

Soit $n \geq 1$ un entier. Considérons les matrices suivantes :

  • Transvections élémentaires : $E_{ij}(a) = I_n + aE_{ij}$, $a \in \mathbb{Z}$, $i \neq j$.
  • Dilatations : $D_i(\epsilon) = \text{diag}(1, \cdots, 1, \epsilon, 1, \cdots, 1)$, $\epsilon \in \{\pm1\} = \mathbb{Z}^*$.
  • Transpositions :

$$\phantom{\tau_{ij}=} \begin{matrix} \phantom{0} &\phantom{\ddots} &\phantom{0} &i &\phantom{0} &\phantom{\cdots} &\phantom{0} &j &\phantom{0} &\phantom{\ddots} &\phantom{0} \end{matrix}\qquad $$

$$\tau_{ij}=\begin{bmatrix} 1 & & & & & & & & & & \\ &\ddots & & & & & & & & & \\ & &1 & & & & & & & & \\ & & &0 &0 &\cdots &0 &1 & & & \\ & & &0 &1 & & &0 & & & \\ & & &\vdots & &\ddots & &\vdots & & & \\ & & &0 & & &1 &0 & & & & \\ & & &1 &0 &\cdots &0 &0 & & & \\ & & & & & & & &1 & & \\ & & & & & & & & &\ddots & \\ & & & & & & & & & &1 \\ \end{bmatrix} \begin{matrix} \\ \\ \\ i\\ \\ \\ \\ j\\ \\ \\ \\ \end{matrix} $$


Théorème :

(a) Toute matrice $A \in GL_n(\mathbb{Z})$ s’écrit $A = L \cdot \text{diag}(1, \cdots, 1, \det A)$, où $L$ est un produit de transvections élémentaires.

(b) Le groupe $SL_n(\mathbb{Z})$ est engendré par les transvections élémentaires $E_{i,i+1}(1)$, $E_{i+1,i}(1)$, $1 \leq i \leq n-1$.

Preuve :

(a) Soit $E$ le sous-groupe de $SL_n(\mathbb{Z})$ engendré par les transvections élémentaires. Soit $D \subset GL_n(\mathbb{Z})$ le sous-groupe engendré par les dilatations. Pour $\epsilon \in \{\pm1\}$ et $a \in \mathbb{Z}$, on a $$D_i(\epsilon)E_{kl}(a)D_i(\epsilon)^{-1} = E_{kl}(\pm a).$$ Donc $DE = ED$. Nous avons

$$\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ -1 & 1 \end{bmatrix} \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \in E, \quad\text{et} $$

$$\begin{bmatrix} 0 & 1\\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \in ED, $$

donc les transpositions sont dans $ED$. La démonstration du "Théorème $PAQ$" montre alors que $ED = GL_n(\mathbb{Z})$. Notons qu'on a

$$\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}^2 \in E. \qquad(*) $$

Si $g \in GL_n(\mathbb{Z})$, on a $g = ed$ pour $e \in E$ et $d \in D$. Alors $(*)$ montre que l’on a aussi $g = e' \cdot \text{diag}(1, \cdots, 1, \det g)$ pour un $e' \in E$.

(b) On note que $E_{ij}(a) = E_{ij}(1)^a$, $a \in \mathbb{Z}$, et que

$$[E_{ij}(a), E_{jk}(b)] = E_{ik}(ab) $$

pour $i < j < k$, $a, b \in \mathbb{Z}$. Donc $E$ est engendré par les $E_{i,i+1}(1)$, $E_{i+1,i}(1)$, $1 \leq i \leq n-1$.

$\square$