{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0a187efd",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "# $ℤ/nℤ$, groupes, etc. dans SageMath"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f1435ce",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "<font color=\"red\">**Consigne :** lire le sujet dans l'ordre et **exécuter chaque cellule de code pré-remplie** pour observer le résultat avant de continuer.</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c029014",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 1. Construire $ℤ/nℤ$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c05ef52e",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Dans SageMath, on peut construire l'*anneau* $ℤ/nℤ$ avec la commande `IntegerModRing(n)`. Les calculs se font alors selon les règles de l'anneau.\n",
    "\n",
    "*Remarque.* Le constructeur `IntegerModRing` possède deux alias, `Integers` et `Zmod`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "4b153588",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "A = IntegerModRing(6) # ℤ/6ℤ\n",
    "print(A)\n",
    "a, b, c, d = A(0), A(1), A(3), A(5)\n",
    "a+b, b+d, c+d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "e39ef964",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "IntegerModRing(17) is Integers(17) is Zmod(17) # alias"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83714dcf",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "On peut également explorer certaines propriétés des éléments. Pour cela, chaque élément a des méthodes qui lui sont associées. Par exemple, on peut calculer l'ordre d'un élément $g$ dans le groupe additif $(ℤ/nℤ,+)$ avec `g.additive_order()`, on peut tester s'il est inversible (on dit que c'est une *unité*) avec `g.is_unit()`, et dans ce cas calculer son ordre dans le groupe multiplicatif $(ℤ/nℤ^×,×)$ avec `g.multiplicative_order()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "6a18950f",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "c.additive_order(), c.is_unit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "80db0375",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "d.additive_order(), d.is_unit(), d.multiplicative_order()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "303f349b",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Pour calculer l'inverse d'un élément $g$ inversible, plusieurs solutions sont possibles : soit écrire directement  `1/g` ou `g^-1`, soit utiliser le symbole « ~ » qui dans SageMath signifie « inverse » en écrivant `~g`, soit appeler la méthode `g.inverse_of_unit()` (on remarque qu'il est dit explicitement dans le nom de la méthode que l'on ne peut inverser que des *unités*). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "36c98841",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "1/d, d^-1, ~d, d.inverse_of_unit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "c89b2eeb",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "d * ~d == ~d * d == A.one() # one() permet de renvoyer le \"1\" de l'anneau"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99e3125a",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "SageMath permet également de travailler directement sur l'anneau. Par exemple, on peut obtenir quelques propriétés."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "cc5372c4",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "print(\"A est un anneau :\",A.is_ring())\n",
    "print(\"Son ordre est :\", A.order())\n",
    "print(\"A est intègre :\", A.is_integral_domain())\n",
    "print(\"A est un corps :\", A.is_field())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a49e2b72",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. Construire l'anneau $ℤ/16ℤ$ et répondre aux questions suivantes :\n",
    "    1. Parmi les éléments $2$, $4$, $5$, $6$, $13$ et $15$, lesquels sont inversibles ?\n",
    "    1. Calculer l'ordre multiplicatif des inversibles.\n",
    " 1. Répondre aux mêmes questions pour l'anneau $ℤ/17ℤ$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "b4408acb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "d8ce825d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "4d9bd71f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "ed5e394b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "6bf8251f",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 2. Le groupe des inversibles $ℤ/nℤ^×$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be177647",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "SageMath sait calculer le groupe des inversibles de $ℤ/nℤ$, de plusieurs manières. La première consiste à lister les éléments qui en font partie, ou à tester si ce groupe est cyclique, ou encore à calculer son ordre. *On remarque que selon les cas, SageMath utilise soit « multiplicative group » soit « unit group » : les deux sont synonymes et désignent le groupe des inversibles.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "53b0dc71",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "A = Zmod(36)\n",
    "A.list_of_elements_of_multiplicative_group(), A.multiplicative_group_is_cyclic(), A.unit_group_order()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1a840a1",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "L'autre façon est de calculer *vraiment* le groupe des inversibles, avec `A.unit_group()`. On obtient une description un peu cryptique, qui signifie (dans ce cas) : « le groupe des inversibles de `A` est un groupe multiplicatif abélien, isomorphe au groupe $C_2×C_6$ » où $C_k$ désigne le groupe (multiplicatif) cyclique d'ordre $k$, qui est isomorphe à $(ℤ/kℤ,+)$. On peut décrire $C_k$ de la manière suivante : il possède un générateur $g$ qui vérifie $g^k = 1$ et $g^ℓ ≠ 1$ pour $0<ℓ<k$ ; autrement dit, $C_k = \\{g^0, g^1, …, g^{k-1}\\}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "aed12727",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "G = A.unit_group()\n",
    "G"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "500d44f7",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Si on liste les éléments de $G$, on s'aperçoit qu'ils n'ont rien à voir avec notre $ℤ/36ℤ$ de départ ! SageMath décrit $G$ grâce à deux *générateurs* (qu'il a appelé `f0` et `f1`, arbitrairement). Le *produit cartésien* $C_2×C_6$ s'obtient en prenant tous les produits possibles entre les éléments de $C_2 = \\{1,f_0\\}$ et ceux de $C_6 = \\{1, f_1, …, f_1^5\\}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "287a63f6",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "print(G.list())   # on vérifie qu'il y a bien 12 éléments, comme indiqué par A.unit_group_order() au dessus\n",
    "f0, f1 = G.gens() # on récupère les générateurs de G\n",
    "f0^2, f1^6        # pourquoi ce résultat ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0993be4e",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Il est malgré tout possible de revenir à notre $ℤ/36ℤ$ de départ (heureusement !). Chaque élément du groupe $G$ possède une *valeur* dans $ℤ/36ℤ$, c'est-à-dire simplement que chaque élément de $G$ représente un élément de $ℤ/36ℤ$. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "aa02a557",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "for g in G:\n",
    "    print(g, \"→\", g.value())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a184aae6",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "On vérifie que c'est cohérent : par exemple, puisque $f_0$ correspond à $19$, $f_1^3$ à $17$, le produit $f_0f_1^3$ doit être $(19×17)\\bmod 36 = 35$ ; de même, si on élève $f_0f_1^3$ au carré, on obtient $f_0^2f_1^6$ qui doit valoir $1$ (puisque $f_0^2 = 1$ et $f_1^6 = 1$)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "d2e65505",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "f0.value() * (f1^3).value() == A(35), (f0*f1^3).value()^2 == A.one()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5e36845",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. Calculer le groupe des inversibles de $ℤ/105ℤ$. Combien a-t-il de générateurs ? À quel élément de $ℤ/105ℤ$ correspond chacun des générateurs ?\n",
    "1. Calculer le groupe des inversibles de $ℤ/nℤ$ pour $n = 2$ à $30$. Lesquels sont cycliques ?\n",
    "1. Vérifier expérimentalement que si $p>2$ est premier, $Z/p^eℤ^×$ est cyclique. *Utiliser plusieurs valeurs de $p$ et de $e$, même en dépassant $30$.*\n",
    "1. Le résultat précédent n'est pas vrai pour $p = 2$. Essayer diverses valeurs de $e$ pour conjecturer la forme de $ℤ/2^eℤ^×$, en fonction de $e$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "17731aba",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "fb0159a5",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "0c748a24",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "3aed5eb1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "ee09dae7",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 3. Sous-groupes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ef6380c",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Si $G$ est un groupe (fini), `G.subgroups()` renvoie la liste de tous les sous-groupes de $G$. D'autre part, on peut directement construire le groupe abélien cyclique $C_k$ avec la commande `AbelianGroup([k])` (*attention aux crochets !*). Notez qu'on peut également avoir une version plus compacte de l'information : si $H$ est un groupe, `H.gens_order()` renvoie les ordres des générateurs, donc en particulier si $H$ est (isomorphe à) $C_{k_1}×\\dotsb×C_{k_ℓ}$, on obtient $(k_1,…,k_ℓ)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "a1a34073",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "G = AbelianGroup([18])\n",
    "for H in G.subgroups():\n",
    "    print(H.gens_orders(),':',H)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b05b8862",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. Pour $k = 2$ à $30$, calculer tous les sous-groupes de $C_k$. Conjecturer quels sont les sous-groupes de $C_k$ de manière générale.\n",
    "1. Vérifier la conjecture avec $k = 105 = 3×5×7$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "5c8d5b8e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "eb330f43",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1cd3f26b",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 4. Isomorphismes de groupes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c78313aa",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "De même qu'on peut créer $C_k$ avec `AbelianGroup([k])`, on peut créer le produit $C_k×C_ℓ$ avec `AbelianGroup([k,l])`. D'autre part, étant donnés deux groupes $G$ et $H$, on peut tester s'ils sont isomorphes avec `G.is_isomorphic(H)`. Enfin, on peut tester si un groupe est cyclique avec la commande `G.is_cyclic()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "16673d2b",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "G = AbelianGroup([6])\n",
    "H = AbelianGroup([2,3])\n",
    "G.is_isomorphic(H), H.is_cyclic()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "594eaf25",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. Pour $2 ≤ k ≤ ℓ ≤ 10$, tester quels groupes $C_k×C_ℓ$ sont cycliques. Quelle est la condition sur $k$ et $ℓ$ pour que $C_k×C_ℓ$ soit cyclique ?\n",
    "1. Si $C_k×C_ℓ$ est cyclique, il doit être isomorphe à un $C_m$. Conjecturer la valeur de $m$ et vérifier sur les exemples précédents.\n",
    "1. Prendre du recul : on a vu précédemment que $C_k$ est un groupe multiplicatif isomorphe à $(ℤ/kℤ,+)$. Comparer ce que vous avez observé dans cet exercice avec ce que prévoit l'isomorphisme du théorème chinois."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "35bc49e5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "f97e0343",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "80c53381",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 5. Idéaux et quotients"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd2f3408",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Étant donné un anneau $A$, on peut définir un idéal $I$ de $A$ en fournissant un ou plusieurs *générateurs* de l'idéal. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "a2420cdb",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "A = ZZ # anneaux des entiers\n",
    "I4 = A.ideal(4) # idéal 4ℤ\n",
    "I57 = A.ideal([5,7]) # idéal engendré par 5 et 7 → que remarque-t-on ?\n",
    "I4, I57"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "a730dc94",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "B = Zmod(6)\n",
    "J2 = B.ideal(A(2))\n",
    "J34 = B.ideal([A(3), A(4)])\n",
    "J2, J34"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae088acb",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Étant donné des idéaux, on peut alors construire des anneaux quotients."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "d198db27",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "Q4 = A.quotient_ring(I4)\n",
    "Q57 = A.quotient_ring(I57)\n",
    "Q4, Q57"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "21c814f1",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "Q2 = B.quotient_ring(J2)\n",
    "Q34 = B.quotient_ring(J34)\n",
    "Q2, Q34"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42a0e861",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "On remarque plusieurs choses : \n",
    "- quand on quotiente $ℤ$ par $4ℤ$, on obtient bien $ℤ/4ℤ$ (heureusement !) ;\n",
    "- si on le quotiente par $1ℤ$, on obtient $ℤ/1ℤ$, qui n'est pas très intéressant ;\n",
    "- si on quotiente $ℤ/nℤ$ par un $m⋅ℤ/nℤ$, on obtient un nouveau $ℤ/kℤ$ (éventuellement $k = 1$ si $m$ est mal choisi)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "a4e8ba06",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "print(Q4 is IntegerModRing(4)) # c'est bien le même objet !\n",
    "print(Q57.list())              # anneau trivial\n",
    "print(Q2 is IntegerModRing(2)) # idem\n",
    "print(Q57 is Q34)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e4eea7b",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Puisque `Q4` construit à partir de `ZZ` et d'un idéal est le même objet que `IntegerModRing(4)`, on doit pouvoir retrouver depuis `IntegerModRing(4)` l'anneau et l'idéal dont il vient ! "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "5361ac76",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "Z4 = IntegerModRing(4)\n",
    "print(Z4.cover_ring()) # \"Cover ring\" signifie \"anneau de base\" (dans ce contexte)\n",
    "print(Z4.defining_ideal())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b66b6951",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "On peut également trouver le *morphisme naturel* qui va de l'anneau d'origine dans l'anneau quotient. C'est le morphisme qui effectue la *réduction modulo l'idéal*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "a9badc12",
   "metadata": {
    "tags": [
     "sujet"
    ]
   },
   "outputs": [],
   "source": [
    "f = Z4.cover()\n",
    "print(f)\n",
    "f(6), f(6).parent()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c20cdcf",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. Calculer tous les idéaux $I$ de $ℤ/42ℤ$ engendrés par un élément, et tous les anneaux quotients $(ℤ/42ℤ)/I$. Que pouvez-vous conjecturer ?\n",
    "1. Vérifier votre conjecture avec $ℤ/33ℤ$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "5fb1ee67",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "2dfe2ef2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "972c9892",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## 6. Arithmétique sur les idéaux"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67a9df14",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "On peut effectuer de l'arithmétique avec les idéaux. Pour deux idéaux $I$ et $J$, on définit la somme $I+J = \\{x+y:x\\in I, y\\in J\\}$ et le produit $I⋅J = \\{x×y:x\\in I, y\\in J\\}$. On peut vérifier que $I+J$ et $I⋅J$ sont bien des idéaux. En SageMath, les opérations sont définies. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19207e59",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Exercice\n",
    "\n",
    "1. En expérimentant plusieurs idéaux de $ℤ$ (qui sont tous de la forme $nℤ$ pour un certain entier $n$), décrire l'idéal $mℤ+nℤ$ en fonction de $m$ et $n$.\n",
    "1. Même question pour le produit d'idéaux."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "23a70e45",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "f4537a9a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "id": "81878f15",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath 9.5",
   "language": "sage",
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
