{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fdea1426",
   "metadata": {},
   "source": [
    "# Feuille d'exercices 7\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "```{admonition} Objectifs\n",
    "* Vecteurs\n",
    "* Matrices\n",
    "* Résolution de systèmes linéaires\n",
    "```\n",
    "\n",
    "## Exercice 1. Opérations élémentaires\n",
    "\n",
    "**Question 1 :** Effectuer les opérations élémentaires suivantes sur des vecteurs :\n",
    "\n",
    "1. Créer le vecteur à coefficients réels $v = (1.2, 0, -\\sqrt{2})$.\n",
    "2. Stocker dans $w$ le vecteur nul (à coefficients réels) de longueur $3$, puis effectuer le produit scalaire entre $v$ et $w$.\n",
    "3. Créer le vecteur à coefficients réels $u = (0.4, -1, \\frac{\\pi}{4})$, puis calculer $v - 3u$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "823140df",
   "metadata": {},
   "outputs": [],
   "source": [
    "v = vector(RR, [1.2, 0, -sqrt(2)])\n",
    "print(v)\n",
    "\n",
    "w = zero_vector(RR, 3)\n",
    "print(w)\n",
    "\n",
    "ps = v.inner_product(w)\n",
    "print(ps)\n",
    "\n",
    "u = vector(RR, [0.4, -1, pi/4])\n",
    "print(v - 3 * u)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf269ebc",
   "metadata": {},
   "source": [
    "**Question 2 :** Effectuer les opérations élémentaires suivantes sur des matrices **à coefficients rationnels** :\n",
    "\n",
    "1. Construire la matrice $A = \\begin{pmatrix} 2 & 0 \\\\ 1 & 1 \\end{pmatrix}$ sur le corps des rationnels.\n",
    "2. Calculer le déterminant de $A$, puis l'inverse $A^{-1}$ de $A$.\n",
    "3. Calculer la trace de $A$ de deux manières : en utilisant la méthode `trace()`, puis en sommant \"à la main\" les deux valeurs diagonales.\n",
    "4. Construire la matrice $B = \\begin{pmatrix} -1 & 3 & -1 \\\\ 0 & 2 & 4 \\end{pmatrix}$.\n",
    "5. Construire la matrice identité $I_2$ de taille $2 \\times 2$ (que l'on stockera dans la variable `I2` pour ne pas écraser le nombre complexe imaginaire pur)\n",
    "6. Calculer $B^\\top (A + 7 I_2)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1eb27ef8",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix(QQ, [ [2, 0], [1, 1] ])\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f5c6305b",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Le déterminant vaut :\", A.det())\n",
    "print(A**(-1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "99850435",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"La trace vaut :\", A.trace())\n",
    "print(\"La trace vaut :\", A[0,0] + A[1,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4338b260",
   "metadata": {},
   "outputs": [],
   "source": [
    "B = matrix(QQ, 2, 3,  [-1, 3, -1, 0, 2, 4] )\n",
    "print(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2b617016",
   "metadata": {},
   "outputs": [],
   "source": [
    "I2 = matrix.identity(QQ, 2)\n",
    "print(I2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d5773f0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "C = B.transpose() * (A + 7 * I2)\n",
    "print(C)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24606421",
   "metadata": {},
   "source": [
    "## Exercice 2. Noyau, image et théorème du rang\n",
    "\n",
    "**Question 1 :** Construire la matrice à coefficients rationnels\n",
    "\n",
    "$$\n",
    "M = \n",
    "\\begin{pmatrix}\n",
    "1 & 1 & 1 & 1 \\\\\n",
    "2 & 3 & 4 & 5 \\\\\n",
    "-1 & -2 & -3 & -4 \\\\\n",
    "\\end{pmatrix}\n",
    "$$\n",
    "\n",
    "puis calculer le noyau et l'image de l'application $x \\in \\mathbf{Q}^4 \\mapsto Mx \\in \\mathbf{Q}^3$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8069c91",
   "metadata": {},
   "outputs": [],
   "source": [
    "M = matrix(QQ, 3, 4, [1, 1, 1, 1, 2, 3, 4, 5, -1, -2, -3, -4])\n",
    "noyau = M.right_kernel()\n",
    "image = M.column_space()\n",
    "\n",
    "print(\"Matrice :\")\n",
    "print(M)\n",
    "print(\"\\nNoyau :\")\n",
    "print(noyau)\n",
    "print(\"\\nImage :\")\n",
    "print(image)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea91fb52",
   "metadata": {},
   "source": [
    "**Question 2 :** Vérifier que le théorème du rang est bien satisfait pour la matrice $M$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8f5a631b",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(M.rank() + M.right_kernel().dimension() == M.ncols())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "848476ac",
   "metadata": {},
   "source": [
    "## Exercice 3. Résolution de systèmes linéaires\n",
    "\n",
    "**Question 1 :** Trouver **une** solution au système linéaire :\n",
    "\n",
    "$$\n",
    "    \\left\\{\n",
    "    \\begin{array}{cccccccc}\n",
    "        - &x &  &    & + &2 z & = & 1 \\\\\n",
    "          & &  &y    & + &z   & = & 2 \\\\\n",
    "         &x & - &2 y & - &5z   & = & 3\n",
    "    \\end{array}\n",
    "    \\right.\n",
    "$$\n",
    "\n",
    "On vérifiera que la solution donnée par Sagemath est bien correcte."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "334bb424",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix(3, 3, [-1, 0, 2, 0, 1, 1, 1, -2, -5])\n",
    "b = vector([1, 2, 3])\n",
    "x = A.solve_right(b)\n",
    "print(x)\n",
    "print(A*x == b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf2dffa6",
   "metadata": {},
   "source": [
    "**Question 2 :** Décrire l'ensemble des solutions du système d'équations linéaires\n",
    "\n",
    "$$\n",
    "    \\left\\{\n",
    "    \\begin{array}{cccccccccc}\n",
    "        - &x &  &    & + &2 z & - & t & = & 1 \\\\\n",
    "          &3x & + &2y    & + &z & +  & 2t & = & 2 \\\\\n",
    "         &x & - &2 y & - &5z  && & = & 3\n",
    "    \\end{array}\n",
    "    \\right.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e8704f22",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix(3, 4, [-1, 0, 2, -1, 3, 2, 1, 2, 1, -2, -5, 0])\n",
    "b = vector([1, 2, 3])\n",
    "x = A.solve_right(b)\n",
    "K = A.right_kernel()\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": "7fdabe34",
   "metadata": {},
   "source": [
    "## Exercice 4 : transposée et matrice symétrique\n",
    "\n",
    "**Question 1.** Créer la matrice $V$ de taille $8 \\times 8$ ayant comme coefficient $(i, j)$ l'entier $j^{i-1}$ pour $1 \\le i \\le 8$ et $1 \\le j \\le 8$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dd30d2bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "n = 8\n",
    "L = [ [j**i for j in range(1, n+1)] for i in range(0, n) ]\n",
    "V = matrix(QQ, L)\n",
    "print(V)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5dbab053",
   "metadata": {},
   "source": [
    "**Question 2.** Calculer la transposée  $V^\\top$ de la matrice $V$. Puis, vérifier avec le mot-clef `all` que $V_{i,j} = V^\\top_{j ,i}$ pour tous $1 \\le i \\le 8$ et $1 \\le j \\le 8$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6175322",
   "metadata": {},
   "outputs": [],
   "source": [
    "Vt = V.transpose()\n",
    "test = all( V[i,j] == Vt[j,i] for i in range(8) for j in range(8) )\n",
    "print(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fdff682",
   "metadata": {},
   "source": [
    "**Question 3.** Calculer $S = V \\cdot V^\\top$ et vérifier que $S$ est symétrique avec la méthode `is_symmetric()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9d98bd22",
   "metadata": {},
   "outputs": [],
   "source": [
    "S = V * Vt\n",
    "print(S.is_symmetric())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "975d6d34",
   "metadata": {},
   "source": [
    "La matrice $V$ est une **matrice de Vandermonde**. On sait donc théoriquement que son déterminant est\n",
    "\n",
    "$$\n",
    "{\\rm det}(V) = \\prod_{1 \\le k < j \\le 8} (j - k)\n",
    "$$\n",
    "\n",
    "**Question 4.** Vérifier le résultat énoncé ci-dessus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7c5c30a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "D = 1\n",
    "for k in range(1, 9):\n",
    "    for j in range(k+1, 9):\n",
    "        D *= (j-k)\n",
    "det = V.determinant()\n",
    "print(det)\n",
    "print(D)\n",
    "print(D == det)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0881f837",
   "metadata": {},
   "source": [
    "## Exercice 5 : base et famille libre\n",
    "\n",
    "Soient $u, v, w$ les trois vecteurs suivants :\n",
    "\n",
    "$$\n",
    "u = \\begin{pmatrix} -104 \\\\ 242 \\\\ -17 \\\\ 330 \\end{pmatrix}, \\quad\n",
    "v = \\begin{pmatrix} 322 \\\\ -744 \\\\ 90 \\\\ -1119 \\end{pmatrix}, \\quad\n",
    "w = \\begin{pmatrix} -19 \\\\ 43 \\\\ -9 \\\\ 76 \\end{pmatrix}\n",
    "$$\n",
    "\n",
    "**Question 1 :** Les trois vecteurs $u$, $v$ et $w$ forment-ils une famille libre dans $\\mathbb{Q}^4$ ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63144e3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "u = [-104, 242, -17, 330]\n",
    "v = [322, -744, 90, -1119]\n",
    "w = [-19, 43, -9, 76]\n",
    "\n",
    "M = matrix(QQ, [u, v, w])\n",
    "print(M.rank())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b80117db",
   "metadata": {},
   "source": [
    "Le rang est $3$, donc la famille est libre.\n",
    "\n",
    "\n",
    "**Question 2 (plus ouverte) :** Compléter $(u, v, w)$ avec un vecteur $z \\in \\mathbb{Q}^4$ pour former une base de $\\mathbb{Q}^4$, de sorte que la matrice $M$ formée des $4$ vecteurs $(u, v, w, z)$ soit de déterminant égal à $1$.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Idée :** on tire des vecteurs $z$ aléatoires dans l'espace $\\mathbb{Q}^4$, puis on teste si $z$ complète la famille libre $(u, v, w)$ en une base. Si ce n'est pas le cas, on recommence. si c'est le cas, il ne reste plus qu'à normaliser $z$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0faa5d5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "z = vector(QQ, [randint(-5, 5) for i in range(4)])\n",
    "while (z in M.row_space()):\n",
    "    z = vector(QQ, [randint(-5, 5) for i in range(4)])\n",
    "N = matrix(QQ, [u, v, w, z])\n",
    "print(N.det())\n",
    "z = z/N.det()\n",
    "N = matrix(QQ, [u, v, w, z]) \n",
    "print(N)\n",
    "print(N.det())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Sagemath",
   "language": "python",
   "name": "sagemath"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
