{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5c5e1d02",
   "metadata": {},
   "source": [
    "# Feuille d'exercices 7 -- avancé\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "```{admonition} Objectifs\n",
    "* Vecteurs\n",
    "* Matrices\n",
    "* Résolution de systèmes linéaires\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "```{warning} \n",
    "Ces exercices sont prévus pour les étudiant·e·s ayant déjà réussi la feuille d'exercices \"classiques\".\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Exercice 6 : interprétation géométrique de certaines applications linéaires\n",
    "\n",
    "Les deux lignes suivantes permettent de déclarer dans une variable `T` un triangle de couleur bleue, sont les sommets sont les vecteurs de coordonnées $(1, 1), (1, 2), (3, 1)$ présents dans la liste `L`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4cbbdcad",
   "metadata": {},
   "outputs": [],
   "source": [
    "L = [vector([1,1]), vector([1, 2]), vector([3, 1])]\n",
    "T = polygon(L, color=\"blue\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a74f940f",
   "metadata": {},
   "source": [
    "**Question 1 :** Exécutez la cellule ci-dessus, puis afficher ce triangle dans une figure pour laquelle les abscisses et les ordonnées varient entre $-4$ et $4$. Pour cela, on utilisera la méthode `.show()` de l'objet `T`, avec les arguments optionnels usuels : `xmin=-1`, `xmax=4`, `ymin=-4` et `ymax=4`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f9c96770",
   "metadata": {},
   "outputs": [],
   "source": [
    "T.show(xmin=-4, xmax=4, ymin=-4, ymax=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79d863cd",
   "metadata": {},
   "source": [
    "**Question 2 :** On considère la matrice \n",
    "\n",
    "$$\n",
    "  R = \\begin{pmatrix}\n",
    "  \\cos(\\theta) & -\\sin(\\theta) \\\\ \\sin(\\theta) & \\cos(\\theta) \\end{pmatrix}\n",
    "$$\n",
    "\n",
    "1. Déclarer la matrice $R$ pour $\\theta = \\pi/3$\n",
    "2. Appliquer la matrice $R$ à chacun des vecteurs de la liste `L`, pour former ainsi une liste `L2` de $3$ vecteurs.\n",
    "3. Créer puis afficher le triangle `T2` correspondant à la liste `L2`, en rouge, et sur la même figure que `T`. Pour cette dernière étape, on suivra la syntaxe suivante :\n",
    "```\n",
    "FIG = T + T2\n",
    "FIG.show(xmin=-4, xmax=4, ymin=-4, ymax=4)\n",
    "```\n",
    "4. Quelle transformation géométrique a été opérée sur le triangle ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7ebd56ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "theta = pi/3\n",
    "R = matrix([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])\n",
    "L2 = [R*u for u in L]\n",
    "T2 = polygon(L2, color=\"red\")\n",
    "FIG = T + T2\n",
    "FIG.show(xmin=-4, xmax=4, ymin=-4, ymax=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce87da59",
   "metadata": {},
   "source": [
    "On observe une rotation du triangle, d'angle $\\pi/3$, autour du point $(0, 0)$.\n",
    "\n",
    "\n",
    "\n",
    "**Question 3 :** On considère la matrice \n",
    "\n",
    "$$\n",
    "  S = \\begin{pmatrix}\n",
    "  0 & -1 \\\\\n",
    "  -1 & 0 \\end{pmatrix}\n",
    "$$\n",
    "\n",
    "1. Déclarer la matrice $S$\n",
    "2. Appliquer la matrice $S$ à chacun des vecteurs de la liste `L`, pour former ainsi une liste `L3` de $3$ vecteurs.\n",
    "3. Créer puis afficher le triangle `T3` correspondant à la liste `L3`, en vert, et sur la même figure que `T`.\n",
    "4. Quelle transformation géométrique a été opérée sur le triangle ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e43f4e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "S = matrix([[0, -1], [-1, 0]])\n",
    "L3 = [S*u for u in L]\n",
    "T3 = polygon(L3, color=\"green\")\n",
    "FIG = T + T3\n",
    "FIG.show(xmin=-4, xmax=4, ymin=-4, ymax=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4216f736",
   "metadata": {},
   "source": [
    "On observe une symétrie axiale d'axe la droite d'équation $y = -x$.\n",
    "\n",
    "\n",
    "\n",
    "**Question 4 :** On considère la matrice \n",
    "\n",
    "$$\n",
    "A = \\begin{pmatrix} 1/2 & 0 \\\\ 0 & 1/2 \\end{pmatrix}\n",
    "$$\n",
    "  \n",
    "1. Déclarer la matrice $A$\n",
    "2. Appliquer la matrice $A$ à chacun des vecteurs de la liste `L`, pour former ainsi une liste `L4` de $3$ vecteurs.\n",
    "3. Créer puis afficher le triangle `T4` correspondant à la liste `L4`, en jaune, et sur la même figure que `T`.\n",
    "4. Quelle transformation géométrique a été opérée sur le triangle ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63b6fa65",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix([[0.5, 0], [0, 0.5]])\n",
    "L4 = [A*u for u in L]\n",
    "T4 = polygon(L4, color=\"yellow\")\n",
    "FIG = T + T4\n",
    "FIG.show(xmin=-4, xmax=4, ymin=-4, ymax=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ffcaf67",
   "metadata": {},
   "source": [
    "On observe une homothétie de centre le point $(0,0)$ et de rapport $1/2$.\n",
    "\n",
    "\n",
    "<!-- ## Exercice 7 : matrices de permutation -->\n",
    "\n",
    "<!-- **Question 1.** Construire la matrice  -->\n",
    "\n",
    "<!-- $$ -->\n",
    "<!-- P = \\begin{pmatrix} -->\n",
    "<!--  0 & 1 & 0 & 0 \\\\ -->\n",
    "<!--  0 & 0 & 1 & 0 \\\\ -->\n",
    "<!--  0 & 0 & 0 & 1 \\\\ -->\n",
    "<!--  1 & 0 & 0 & 0 \\\\ -->\n",
    "<!-- \\end{pmatrix} -->\n",
    "<!-- $$ -->\n",
    "\n",
    "<!-- et le vecteur $v = (1, 2, 3, 4)$, puis calculer $P v$. Quel type de transformation a été opérée sur le vecteur $v$ ? -->\n",
    "\n",
    "\n",
    "<!-- <only student> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- # Votre réponse ici -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "<!-- <only teacher> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- P = matrix(QQ, [ [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0] ]) -->\n",
    "<!-- v = vector(QQ, [1, 2, 3, 4]) -->\n",
    "<!-- print(P * v) -->\n",
    "<!-- ``` -->\n",
    "<!-- On observe que $P$ réalise une permutation cyclique des coefficients de $v$.  -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "\n",
    "\n",
    "<!-- On modélise une permutation  de l'ensemble $\\{0, \\dots, n-1\\}$ par une liste d'entiers `L` de longueur $n$, telle que `L[i]` est l'image par la permutation de l'élément $i$. Une telle liste `L` doit donc contenir tous les entiers entre $0$ et $n-1$ une et une seule fois. -->\n",
    "\n",
    "<!-- **Question 2.** Écrire une fonction `teste_permutation(L)` qui teste si la liste `L` peut correspondre à une permutation. On supposera que `L` ne contient que des entiers (pas besoin de le vérifier). -->\n",
    "\n",
    "<!-- <only student> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- # Votre réponse ici -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "<!-- <only teacher> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- def teste_permutation(L): -->\n",
    "<!--     n = len(L) -->\n",
    "<!--     return all( (i in L) for i in range(n) ) -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "<!-- **Question 3.** Écrire une fonction `matrice_permutation(L)`, qui prend en entyrée une liste `L` correspondant à une permutation $\\sigma$, et qui retourne la matrice $P$ dont l'action sur un vecteur $v$ permute les coordonnées de $v$ selon $\\sigma$. -->\n",
    "\n",
    "\n",
    "\n",
    "<!-- <only student> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- # Votre réponse ici -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "<!-- <only teacher> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- def matrice_permutation(L): -->\n",
    "<!--     n = len(L) -->\n",
    "<!--     M = [] -->\n",
    "<!--     for i in range(n): -->\n",
    "<!--         row = [0]*n -->\n",
    "<!--         row[L[i]] = 1 -->\n",
    "<!--         M.append(row) -->\n",
    "<!--     return matrix(QQ, M) -->\n",
    "\n",
    "<!-- print(matrice_permutation([1, 2, 3, 0])) -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "\n",
    "\n",
    "<!-- **Question 4.** Pour `L =  [3, 1, 7, 2, 0, 4, 5, 6]`, calculer la matrice de permutation $P$ correspondante, puis vérifier que $P^k$ est égale à la matrice identité pour $k = {\\rm ppcm}(2, 3, \\dots, 8)$. -->\n",
    "\n",
    "\n",
    "\n",
    "<!-- <only student> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- # Votre réponse ici -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "<!-- <only teacher> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- L =  [3, 1, 7, 2, 0, 4, 5, 6] -->\n",
    "<!-- P = matrice_permutation(L) -->\n",
    "<!-- k = lcm([i for i in range(2, 9)]) -->\n",
    "<!-- print(P**k == matrix.identity(QQ, 8)) -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "\n",
    "\n",
    "## Exercice 7 : modélisation d'un système linéaire\n",
    "\n",
    "**Question 1.** Déterminer l'ensemble des matrices à coefficients rationnels, de taille $2 \\times 2$, dont la trace vaut $2$, et qui admettent le vecteur $(1, 3)$ dans leur noyau à gauche.\n",
    "\n",
    "\n",
    "\n",
    "Les matrices recherchées sont de la forme $M = \\begin{pmatrix} a & b \\\\ c & d \\end{pmatrix}$ où $(a, b, c, d)$ forme le vecteur des inconnues. Pour trouver l'ensemble des matrices $M$ qui sont de trace égale à $1$ et qui admettent $(1, 3)$ dans leur noyau à gauche, il faut expliciter les équations :\n",
    "\n",
    "$$\n",
    "\\begin{array}{ll}\n",
    "   {\\rm Tr(M) = 1} & \\iff \\; a + d = 1 \\\\\n",
    "   {\\rm (1, 3)} \\in {\\rm Ker_g(M)} &\\iff (1, 3) \\cdot M \\\\\n",
    "    ~ & \\iff  a + 3c = 0 \\;\\text{ et } \\; b + 3d = 0\n",
    "\\end{array}\n",
    "$$\n",
    "\n",
    "Il ne reste plus qu'à résoudre ce système de $3$ équations à $4$ inconnues."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "963c41b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix(QQ, [ [1, 0, 0, 1], [1, 0, 3, 0], [0, 1, 0, 3] ])\n",
    "b = vector(QQ, [1, 0, 0])\n",
    "\n",
    "x = A.solve_right(b)\n",
    "K = A.right_kernel()\n",
    "\n",
    "\n",
    "print(\"Les solutions de la forme x + v avec\")\n",
    "print(\"x = \", x)\n",
    "print(\"et v un élément de l'espace vectoriel engendré par \")\n",
    "print(K.basis())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15f2ab80",
   "metadata": {},
   "source": [
    "On en déduit que les matrices recherchées sont de la forme \n",
    "\n",
    "$$\n",
    "\\begin{pmatrix} 1 & 0 \\\\ -1/3 & 0 \\end{pmatrix} + \\lambda \\begin{pmatrix} 1 & 3 \\\\ -1/3 & -1 \\end{pmatrix}, \\quad \\text{ pour } \\lambda \\in \\mathbb{Q}\n",
    "$$\n",
    "\n",
    "\n",
    "\n",
    "## Exercice 9 : matrice des pgcd\n",
    "\n",
    "On considère une matrice $M_n$ de taille $n \\times n$, à coefficients entiers (donc rationnels), dont le coefficient d'indice $(i, j)$ est ${\\rm pgcd}(i, j)$.\n",
    "\n",
    "\n",
    "**Question 1.** Écrire une fonction `matrice_pgcd(n)` qui construite la matrice $M$ pour la taille $n$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ab8e658b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrice_pgcd(n):\n",
    "    L = [ [gcd(i+1, j+1) for j in range(n)] for i in range(n) ]\n",
    "    return matrix(QQ, L)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92ae2caa",
   "metadata": {},
   "source": [
    "**Question 2.** Vérifier que $M_n$ est symétrique pour toutes les valeurs de $n$ entre $1$ et $20$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "24bdba4b",
   "metadata": {},
   "outputs": [],
   "source": [
    "print( all( matrice_pgcd(n).is_symmetric() for n in range(1, 21) ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60d740a3",
   "metadata": {},
   "source": [
    "**Question 3.** Combien vaut ${\\rm Tr}(M_n)$ ? Vérifier le résultat avec Sagemath, pour des valeurs de $n$ entre $1$ et $20$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4f57a8b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "print( all( matrice_pgcd(n).trace() == n*(n+1)/2 for n in range(1, 21) ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9d60bde",
   "metadata": {},
   "source": [
    "**Question 4.** On note $\\phi(k)$ l'indicatrice d'Euler, c'est-à-dire le nombre d'entiers entre $1$ et $k$ qui sont premiers avec $k$. Voir [https://fr.wikipedia.org/wiki/Indicatrice_d%27Euler](https://fr.wikipedia.org/wiki/Indicatrice_d%27Euler) pour des détails. Écrire une fonction `indicatrice_euler(k)` qui prend en entrée un entier $k$ et retourne $\\phi(k)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f992a659",
   "metadata": {},
   "outputs": [],
   "source": [
    "def indicatrice_euler(n):\n",
    "    return len([x for x in range(1, n+1) if gcd(x, n) == 1])\n",
    "    \n",
    "print(indicatrice_euler(12))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c3bc87b",
   "metadata": {},
   "source": [
    "**Question 5.**  Vérifier que ${\\rm det}(M_n) = \\prod_{i=1}^n \\phi(k)$, pour des valeurs de $n$ entre $1$ et $20$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bb15f60c",
   "metadata": {},
   "outputs": [],
   "source": [
    "determinants =  [ matrice_pgcd(n).det() for n in range(1, 21) ]\n",
    "produits = [ 1 ]\n",
    "for n in range(2, 21):\n",
    "    produits.append(produits[n-2]*indicatrice_euler(n))\n",
    "    \n",
    "print( all( determinants[n] == produits[n] for n in range(20) ) )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Sagemath",
   "language": "python",
   "name": "sagemath"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
