{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Valeurs propres et vecteurs propres"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La forme générale d'un système d'équation s'écrit\n",
    "\n",
    "\\begin{align*}\n",
    "    a_{11} x_1  &+ \\cdots & + a_{1n} x_n & = b_1 \\\\\n",
    "          & \\vdots      &  & = \\vdots\\\\\n",
    "    a_{m1} x_1  &+ \\ldots  &+ a_{mn} x_n & = b_m \n",
    "\\end{align*}\n",
    "\n",
    "\n",
    "avec $a_{ij} \\in \\mathbb{R}$ et $b_i \\in \\mathbb{R}$ des constantes connues, \n",
    "  et $x_j \\in \\mathbb{R}$ les inconnues, $1\\leq i\\leq m$, $1\\leq j\\leq n$.\n",
    "  \n",
    "Les matrices permettent de représenter sous forme compacte les systèmes d'équations linéaires."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Les systèmes d'équations linéaires peuvent s'écrire sous la forme\n",
    "\n",
    "\\begin{equation}\n",
    "  A {\\bf x} = {\\bf b},\n",
    "\\end{equation}\n",
    "\n",
    "avec $A\\in\\mathbb R^{m\\times n}$ une matrice connue, ${\\bf b\\in \\mathbb R^m}$ un vecteur connu, et ${\\bf x\\in \\mathbb R^n}$ le vecteur solution inconnu et que l'on cherche à déterminer."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Avant de chercher à résoudre ce système linéaire, il est important de rappeler qu'ils ne possèdent pas tous une unique solution :\n",
    "- si $m>n$, le système est surdéterminé et ne possède pas de solution. Dans ce cas là, nous chercherons une solution optimale au problème.\n",
    "- si $m<n$, le système est sousdéterminé. Si le rang $r$ de la matrice est tel que $r\\leq m$ et que nous avons une relation de compatibilité pour le second membren alors le système possède une infinité de solution.\n",
    "- si $m=n$, la matrice est carrée. Si la matrice est singulière, c'est-à-dire que $\\det(A) = 0$, alors le système ne peut pas être résolu. Dans le cas contraire, la solution est unique."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Normes de vecteurs et de matrices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Afin de mesurer la qualité des solutions obtenues, nous avons besoin d'introduire la notion de conditionnement. Le conditionnement se définit à l'aide des normes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Normes de vecteurs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Une norme est la définition mathématique de la distance. Dans le cas discret, les normes sont liées à la taille des vecteurs. Dans le contexte de l'algèbre linéaire, les normes les plus utilisées sont les normes $1, 2, \\infty$ :\n",
    "\\begin{align}\n",
    "  \\| x \\|_{1} & = \\sum_{j = 1}^n | x_j |, \\\\\n",
    "  \\| x \\|_{2} & = \\sqrt{\\sum_{j = 1}^n ( x_j )^2}, \\\\\n",
    "  \\| x \\|_{\\infty} & = \\max_{j} | x_j |.\n",
    "\\end{align}\n",
    "\n",
    "Lorsque l'on compare différents vecteurs, il est nécessaire de toujours utiliser la même norme."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Il est possible de visualiser les boules unités associées à chacune des normes en utilisant des vecteurs de dimension 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAAEaCAYAAAAIZSbbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABJ/ElEQVR4nO3dd3iUZd7F8e896R2SQCih994hWFFExYZdiiIixO6udd1Vd123uaura1dAmtLsoIK9gCV0Qu81hA4JnZS53z8SfFEDpMzMM+V8risXk5knMydD8suceZqx1iIiIiIiIiKe43I6gIiIiIiISLBR0RIREREREfEwFS0REREREREPU9ESERERERHxMBUtERERERERD1PREhERERER8TAVLREREREREQ9T0RIREREREfEwFS2pEmPME8aYJzy9rIjIr2neiIivaN6IJ6hoSVAxxtxtjJlnjDlmjBnrdB4RCV6aNyLia5o7gSXc6QAiHpYL/B24CIhxOIuIBDfNGxHxNc2dAKI1WuIxxpgbjTHWGJNtjIkwxjQzxhw2xhwwxjTxRQZr7fvW2g+BPb54PBFxhuaNiPiKP8yb4zR3AovWaInHWGvfMsZcDlwPPAJcQMm7LZnW2nXGmArdnzHmY+Csk9z8vbX2sqrkFZHApXkjIr7i6XlznOZO8FPREk+7g5Kh8VfAAJ9Ya0f+eiFjTBLwBdAayLDWLv31MhowInIa5Z03PYFngQJKNrsZbK0tPHEZzRsROY1yzZuK0NwJftp0UDzKWrsXGEXJEAL470kWPQxcCrzri1wiEnwqMG82Aedba88F1gP9fBBPRIJIBeaNyM9UtMSjjDGNgPuAo6VXPWuMifj1ctbaQmvtrtPc1wxjzMGTfMzwQnwRCSAVmDe51tojpZ8WAe4y7kvzRkROqrzzpoL3qbkT5LTpoHiMMcYFjAMSgGHAhZRsz/xX4E8VvT9rbd9KZAin5Oc6DAgzxkQDRdbaoorel4j4r8rMm9IXSn2Bf/z6Ns0bETmZiswbU7LD1lggvfTfocBSa+09v75fzZ3gpzVa4kkPAWcDX1pr3wDuAnYCDxtjzvBRhseAI5TsrHpj6eXHfPTYIuI7FZo3xphESl4o3WStLfBQBs0bkdBQkXlTA5gFXAk8Skkp22KMCfNQFs2dAKKiJR5jrf23tdZYa/uUfr7bWptmrQ231v7oowxPlGY48eMJXzy2iPhOReZN6TvAk4AnrLWrPJhB80YkBFTw9c0u4BzgfeBJ4FOgobW22ENZNHcCiDYdFMcYY6YDHYEWxpjXrbVjnU0kIkFqANAD+LMx5s/Aq9baKQ5nEpEgZK21wOATrproVBZxnuNFyxgzGrgM2GmtbVvG7b2AqcCG0qvet9Y+6bOAcjrfVnZZa+0lHk0iUg6aOQHt28osa619E3jT02FEykMzJ2B966VlJYSYkuLtYABjzgEOAuNPMYAe1LkGRMQTNHNExJc0c0RCl+P7aFlrZwJ7nc4hIqFBM0dEfEkzRyR0Ob7pYDn1NMZkA7mUvOuzrKyFjDGZQCZAXFxcl5YtW/owokjomj9//m5rbQ2nc3iQZo6IH9PM0cwR8ZWqzBvHNx0EMMY0BD4+ySr1RMBtrT1ojLkEeN5a2+x099m1a1c7b948z4cVkd8wxsy31nZ1Okd5aeaIBDbNHM0cEV+pyrxxfNPB07HW7rfWHiy9PB2IMMakOhxLRIKUZo6I+JJmjkjw8vuiZYypVXqWbYwx3SnJvMfZVCISrDRzRMSXNHNEgpfj+2gZYyYBvYBUY0wO8BcgAsBa+xpwLXCHMaaIkrNf97f+sL2jiAQkzRwR8SXNHJHQ5XjRstYOOM3tLwEv+SiOiAQ5zRwR8SXNHJHQ5febDoqIiIiIiAQaFS0REREREREPU9ESERERERHxMBUtERERERERD1PREhERERER8TAVLREREREREQ9T0RIREREREfEwFS0REREREREPU9ESERERERHxMBUtERERERERD1PREhERERER8TAVLREREREREQ9T0RIREREREfEwFS0REREREREPU9ESERERERHxMBUtERERERERD1PREhERERER8TAVLREREREREQ9T0RIREREREfEwFS0REREREREPU9ESERERERHxMBUtERERERERD1PREhERERER8TAVLREREREREQ9T0RIREREREfEwFS0REREREREPU9ESERERERHxMMeLljFmtDFmpzFm6UluN8aYF4wxa40xi40xnX2dUUSCh2aOiPiSZo5I6HK8aAFjgYtPcXtfoFnpRybwqg8yiUjwGotmjoj4zlg0c0RCUrjTAay1M40xDU+xSD9gvLXWAlnGmGrGmNrW2m2+SSi+Uuy2FLstkeH+0P8lWGnmhCZrLQXF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",
      "text/plain": [
       "<Figure size 864x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.linalg as la\n",
    "\n",
    "# Definition des coordonées \n",
    "alpha = np.linspace(0, 2*np.pi, 2000, endpoint=True)\n",
    "x = np.cos(alpha)\n",
    "y = np.sin(alpha)\n",
    "\n",
    "# Construction des vecteurs de coordonnées\n",
    "vecs = np.array([x,y])\n",
    "\n",
    "p = 1\n",
    "norms = np.sum(np.abs(vecs)**p, axis=0)**(1/p)\n",
    "N1 = vecs/norms\n",
    "\n",
    "p = 2\n",
    "norms = np.sum(np.abs(vecs)**p, axis=0)**(1/p)\n",
    "N2 = vecs/norms\n",
    "\n",
    "p = 99\n",
    "norms = np.sum(np.abs(vecs)**p, axis=0)**(1/p)\n",
    "Ninf = vecs/norms\n",
    "\n",
    "plt.figure(figsize=(12, 4))\n",
    "plt.subplot(1, 3, 1)\n",
    "plt.plot(N1[0], N1[1])\n",
    "plt.title(r\"$\\| {\\bf x} \\|_{1} = 1$\")\n",
    "plt.xlabel(r\"$x_1$\")\n",
    "plt.ylabel(r\"$x_2$\")\n",
    "plt.xlim([-1.5, 1.5])\n",
    "plt.ylim([-1.5, 1.5])\n",
    "\n",
    "plt.subplot(1, 3, 2)\n",
    "plt.plot(N2[0], N2[1])\n",
    "plt.title(r\"$\\| {\\bf x} \\|_{2} = 1$\")\n",
    "plt.xlabel(r\"$x_1$\")\n",
    "plt.ylabel(r\"$x_2$\")\n",
    "plt.xlim([-1.5, 1.5])\n",
    "plt.ylim([-1.5, 1.5])\n",
    "\n",
    "plt.subplot(1, 3, 3)\n",
    "plt.plot(Ninf[0], Ninf[1])\n",
    "plt.title(r\"$\\| {\\bf x} \\|_{\\infty} = 1$\")\n",
    "plt.xlabel(r\"$x_1$\")\n",
    "plt.ylabel(r\"$x_2$\")\n",
    "plt.xlim([-1.5, 1.5])\n",
    "plt.ylim([-1.5, 1.5])\n",
    "\n",
    "plt.tight_layout(pad = 1.0)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Normes de matrices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pour calculer la norme d'une matrice, $\\| A \\|$, on peut utiliser n'importe quel vecteur ${\\bf y}$ associé à une norme de vecteur pour définir une norme matricielle induite\n",
    "\n",
    "$$\n",
    "  \\| A \\|_{\\bf y} = \\| A {\\bf y} \\|\n",
    "$$\n",
    "\n",
    "où la norme dans le membre de droite est une norme de vecteur. Cette norme dépend du choix de ${\\bf y}$. En maximisant sur l'ensemble des des vecteurs ${\\bf y}$. Pour éviter que la norme dépendent de la taille du vecteur, on normalise par la norme du vecteur. Ceci nous permet de défnir une **norme matricielle induite**.\n",
    "\n",
    "$$\n",
    "  \\| A \\| = \\max_{{\\bf y}: \\| {\\bf y} \\| = 1} \\| A {\\bf y} \\|.\n",
    "$$\n",
    "\n",
    "Les normes vectorielles utilisées doivent toutes être identiques. Ainsi pour la norme $2$ matricielle induite s'écrit\n",
    "\n",
    "$$\n",
    "  \\| A \\|_2 = \\max_{{\\bf y}: \\| {\\bf y} \\|_2 = 1} \\| A {\\bf y} \\|_2.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pour certaines normes, il existe des méthodes beaucoup plus simple à mettre en oeuvre pour réaliser les calculs \n",
    "\n",
    "1. la norme matricielle $1$ est donnée par le maximum des normes $1$ des colonnes de $A$.\n",
    "\n",
    "2. la norme matricielle $\\infty$ est donnée par le maximum des normes $1$ des lignes de $A$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "L'ensemble des matrices de $\\mathbb{R}^{n\\times m}$ forme un espace vectoriel normé de dimension finie. La loi interne est l'addition de deux matrices. La loi externe est la multiplication par $\\lambda \\in \\mathbb{R}$. L'élément neutre pour la loi est interne est la matrice nulle."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Démontrer que l'ensemble des matrices de $\\mathbb{R}^{n\\times m}$ forme un espace vectoriel normé de dimension finie."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Déterminant"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le déterminant est un objet mathématique, une application multilinéaire de $\\mathbb{R}^{n\\times m}$ dans $\\mathbb{R}$, utilisé dans l'analyse et les solutions des systèmes d'équations linéaires. Le déterminant permet notamment de vérifier si un système est inversible."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> \n",
    "> 1. Si $A\\in\\mathbb{R}^{1\\times 1}$, alors $A=a \\Rightarrow A^{-1} = \\dfrac{1}{a}$. Ainsi, $a\\dfrac{1}{a} = 1$ si et seulement si $a\\neq 0$.\n",
    "2. Si $A\\in\\mathbb{R}^{2\\times 2}$, par définition de l'inverse, nous savons que $A^{-1} A = I$. Alors, si il exsite, l'invese de $A$ s'écrit \n",
    "\\begin{align}\n",
    "A^{-1} = \\dfrac{1}{a_{11}a_{22} - a_{21}a_{12}} \\begin{bmatrix}  a_{22} & -a_{12}\\\\  -a_{21} & a_{22} \\end{bmatrix}. \n",
    "\\end{align}\n",
    "On a donc que la matrice $A$ est invesible si et seulement si ${a_{11}a_{22} - a_{21}a_{12}} \\neq 0$, ce qui est le déterminant de $A\\in \\mathbb{R}^{2\\times 2}$.\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Pour toute matrice $A\\in \\mathbb{R}^{n\\times n}$, $A$ est inversible si et seulement si $\\det(A) \\neq 0$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La calcul du déterminant permet donc de vérifier l'inversibilité d'une matrice. Dans le cas général, calculer le déterminant d'une matrice $n\\times n$ se réduit au calcul de déterminants de matrices $(n-1)\\times (n-1)$. En appliquant de manière récursive les développements de Laplace, nous obtenons une formule pour le calcul du déterminant. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Théorème\n",
    "> Soit $A\\in\\mathbb{R}^{n\\times n}$. Alors, $\\forall 1\\leq j \\leq n$,\n",
    "> 1. Par développement selon la colonne $j$\n",
    "\\begin{equation}\n",
    "det(A) = \\sum_{k=1}^n (-1)^{k+j} a_{kj} det(A_{kj})\n",
    "\\end{equation}\n",
    ">2.  Par développement selon la ligne $j$\n",
    "\\begin{equation}\n",
    "det(A) = \\sum_{k=1}^n (-1)^{k+j} a_{jk} det(A_{jk})\n",
    "\\end{equation}\n",
    "\\end{enumerate}\n",
    "où $A_{kj} \\in \\mathbb{R}^{(n-1) \\times (n-1)}$ est une sous matrice de $A$ obtenu en rayant la ligne $k$ et la colonne $i$ de $A$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Example\n",
    "> Calculer le déterminant de \n",
    "\\begin{align}\n",
    "A = \n",
    "\\begin{bmatrix}\n",
    "3 & 2 & 1 \\\\\n",
    "1 & 2 & 3 \\\\\n",
    "0 & 0 & 1\n",
    "\\end{bmatrix}\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En pratique, le calcul de déterminants par les développements de Laplace s'avère extrêment couteux. Dans le cas général, la complexité est $\\mathcal O(n!)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Implementation naïve du calcul de déterminant en utilisant les développements de Laplace\n",
    "import time\n",
    "\n",
    "def laplace(matrix, mul=1):\n",
    "\n",
    "    # Recuperation de la taille de la matrice\n",
    "    width = len(matrix)\n",
    "    \n",
    "    # On exclut le cas trivial\n",
    "    if width == 1:\n",
    "        return mul * matrix[0][0]\n",
    "    else:\n",
    "        sign = -1\n",
    "        answer = 0\n",
    "        # On parcours les lignes \n",
    "        for i in range(width):\n",
    "            m = []\n",
    "            # On supprrime les éléments de la ligne\n",
    "            for j in range(1, width):\n",
    "                buff = []\n",
    "                for k in range(width):\n",
    "                    if k != i:\n",
    "                        buff.append(matrix[j][k])\n",
    "                m.append(buff)\n",
    "            \n",
    "            # Le signe du multiplicateur dépend de la position dans la matrice\n",
    "            sign *= -1\n",
    "            \n",
    "            # Appel récursif pour le calcul des déterminants des sous matrices\n",
    "            answer = answer + mul * laplace(m, sign * matrix[0][i])\n",
    "    return answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'temps (s)')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAApFklEQVR4nO3deXhU5d3/8feXNWFL2Alr2ARB9pjgUncf913qAigCKtJata3Wqj+1tT5qW219ausGiBIELcWl1FrXaltlC/suskPYIQRCQpb798cc7BCSYQiZnFk+r+vKlZk5Z858zzLzmXPOPec25xwiIiKVqeV3ASIiEt0UFCIiEpKCQkREQlJQiIhISAoKEREJSUEhIiIhKSgkosws2cz+amZ5ZvbnGnzd75nZyhp6rXVmdkEVnneOmW2KRE0VvNYRyyO4ZjN73Myyq+l1JprZr6r4XGdm3aqjjkirye0rGigoaoiZ7Q/6KzOzg0H3h/pdXwRdD7QGmjvnhkTqRcp/yDjn/uWc6xGp1/Pb8X64x/vyqE7hBFaiLc86fheQKJxzjQ7fNrN1wGjn3Cf+VVRjOgGrnHMlfhciUh3MrE6ibc/ao/CZmdUyswfN7Fsz22Vmb5tZM29Yuvft5jYz22hme8xsjJmdamaLzGyvmb0QNK0RZvYfM/uDd6hnhZmdX274GjPLN7O1le3JhFnTrWa2wcx2mtnDlUznF8CjwA3entMob9qPmNl6M9tuZm+YWUo40zaz2mb2kFdXvpnlmFkHM/vSG2Wh9zo3lD+sY2Ynm9k/vWW21MyuDBo20cz+aGZ/86Y7y8y6hlhnw736d5Wf91DL7liCnpdvZsvM7JpKxrsYeChouS70Hr/NzJZ7z19jZncGPSfsw1xmNtjMvvKW1UIzOyfEuAPMbJ73mm8BSeWGX25mC7xpfWVmfcOs4TIzm29m+7xt//EQ455jZpvM7AFvm8o1s6vN7FIzW2Vmu83soaDxM83sa6+mXDN7wczqecMq3ZbM7GdmthV4rYLtq4OZTTezHd56D35fjvTWyx4z+4eZdQpnGUQV55z+avgPWAdc4N2+F5gJtAfqAy8DU7xh6YADXiLwBvwfoBB4F2gFtAO2A2d7448ASoD7gLrADUAe0AxoCOwDenjjpgG9K6kvnJpeBZKBfkARcHIl03ocyA66PxJYDXQBGgHTgUnhTBu4H1gM9ADMG97cG+aAbkGvcw6wybtd13vNh4B6wHlAftCymAjsBjIJ7GVPBqZWMj+9gP3AWd6yec5b5sdcnxVM67savftDgLYEvsDdABwA0sJZrt5jlwFdvWVzNlAADKzktdYF1fzdtAhsU7uAS706LvTut6yghnrAev67vV0PFAO/8oYPJLB9ZgG1gVu9161fyTx9tw69evt4NfQFtgFXh1iOJQS+lNQFbgd2AG8CjYHeBN43XbzxBwGDvXWdDiwH7q2ojnLTf8Zbp8kcuX3VBhYCvyPwPksCzvSGXU1g2zvZe71HgK/8/gw67s8svwtIxL9yb9LlwPlBw9K8N9vhjdgB7YKG7wJuCLr/l8MbOYGg2AJY0PDZwHBvA94LXAckH6O+cGpqX+41bqxkWo9zZFB8CowNut8j3GkDK4GrKnmdUEHxPWArUCto+BTgce/2RGBc0LBLgRWVvM6jBIWIt1wPhbM+K5jWdzVW8loLQszvEcu1knHeBe6p6LWoPCh+hhfcQeP+A7i1gumfVcH29hX/DYoXgSfKPWcl3hebY63DcsN+D/yukmHnAAeB2t79xt60soLGyaHyoLkXeOcY29IhIKmS7es0AsFU0Tr+OzAq6H4tAgHeKdS6i7Y/HXryXyfgHW83eC+BD5pSAieAD9sWdPtgBfcbBd3f7Lwt0rMeaOucO0DgW+oYINc7zNLzBGraGnS7oFwNobT1agqur06Y0+4AfBvm65R/zY3OubJyr9sujNescFqH73jLdVfQ8HCWXYXM7JagwzR7gVOAFsd6XtDzLzGzmd6hlr0EAi/s5wfVP+RwDd50ziQQeOW1peLtLXhaPyk3rQ7e8441L1lm9rl3KCePwHYbal52OedKvdsHvf8Vvk/M7CQzm2FmW81sH/C/x5g2wA7nXGElwzoA613F5y06Ac8Hzf9uAnt87SoYN2opKPy3EbjEOZca9JfknNtcxem1MzMLut+RwLc+nHP/cM5dSOBNv4LAIZ6aqCnYFgJvnuD6SjjyTV2ZjQQOrVTlNTuYWfD23hGoyvzkEvhgAMDMGgDNy9V43MvOO279KvBDAofTUoElBD5UKnLEZZ/NrD6BvcvfAq29538Q4vmV2UhgjyK4/obOuacrGDeXire34Gk9WW5aDZxzU8Ko403gfaCDcy6FwOHX452XyrxIYPvv7pxrQuCQ5LGmHeoy2xuBjmZWUeOgjcCd5ZZBsnPuqypV7hMFhf9eAp48fILLzFqa2VUnML1WwI/MrK6ZDSFwbPQDM2ttZleaWUMCx/33E/imWxM1BZsC3Gdmnc2sEYFvc29V8m2svHHAE2bW3QL6mtnhD+ltBM57VGQWgeP9D3jL5RzgCmBqFeqfBlxuZmd6J0B/yZHvo6ouu4YEPox2eM+7jcAeRWW2AelB4VePwPHzHUCJmV1C4JzW8coGrjCziyzQeCDJO3HbvoJxvyYQ8j8yszpmdi2B8zyHvQqM8fYOzMwaeiepG4dRR2Ngt3Ou0MwygZurMC+hpr0P2O/tVd9VbniobakiswmE5tPePCaZ2RnesJeAn5tZbwAzS/HelzFFQeG/5wl8c/rIzPIJnAjNOoHpzQK6AzuBJ4HrnXO7CKzrnxD4dr2bwMnOsTVUU7AJwCTgS2AtgZOMd4f53OeAt4GPCLzRxxM4sQiB4+yve7v43w9+knPuEHAlcAmB5fIn4Bbn3IrjLd45txT4AYFvvLnAHiC4NVGVlp1zbhnwLIEP320ETuT+J8RTDv94cZeZzXPO5QM/IrB89hD4YH0//Dn7ro6NwFUEvmXvIPCN+H4q+Kzwluu1BM6N7SFwaHN60PC5BE4sv+ANX+2NG46xwC+9ZfioN1/V5acElk8+gTB7q9zwx6lkW6qId8jrCqAbsIHA9nCDN+wdAifBp3qHuZYQ2A5jih15eFFimZmNIPD7jDP9rkVE4of2KEREJCQFhYiIhBQTh568E7BfAo8552b4XY+ISCKJ6B6FmU2wwE/ql5R7/GIzW2lmq83swTAm9TOq92SWiIiEKaJ7FGZ2FoFmmG84507xHqsNrCJwaYBNwBzgJgI/g3+q3CRGEvj5fgsCP4vfGc4eRYsWLVx6eno1zYWISGLIycnZ6ZxrWf7xiF491jn3pZmll3s4E1jtnFsDYGZTCVym4Cng8vLTMLNzCbQx7wUcNLMPyv3C9ijp6enMnTu3OmZBRCRhmNn6ih734zLj7Qi6BAKBvYpK25k75x6G75p+7qwsJMzsDuAOgI4dO1Y0ioiIVIEfrZ4q+qn8MY9/Oecmhjrs5Jx7xTmX4ZzLaNnyqD0nERGpIj+CYhNB18ohcDnmLT7UISIiYfAjKOYA3b1r/dQDbqQKlxoQEZGaEenmsVMIXLumhwV6iBrlXfzthwSucb8ceNu7fo6IiEShSLd6uqmSxz8gcAlkERGJcrqEh4iIhKSgEBGJA/mFxTz+/lL2F4XTtcvxiaugMLMrzOyVvLw8v0sREakxBw+VMur1uWTPXM+iTXurffpxFRTOub865+5ISUnxuxQRkRpRVFLKmOwc5qzbzXM39Of0rsfbTfqxxVVQiIgkkpLSMu6ZsoAvVu3g6Wv7cGW/thF5HQWFiEgMKitzPDBtER8u3cqjl/fihlMjd+kiBYWISIxxzvHo+0uYPn8zP7nwJEae2Tmir6egEBGJIc45nv5wBdkzN3Dn2V344XndIv6aCgoRkRjywmerefmLNQwf3IkHL+6JWUXXWa1eCgoRkRgx/t9refbjVVw7sB2/uLJ3jYQEKChERGLCW3M28MSMZVxySht+fV1fatWqmZAABYWISNR7f+EWHpy+mLNPasnzNw6gTu2a/eiOq6DQL7NFJN58smwbP35rAaemN+OlYYOoV6fmP7bjKij0y2wRiSf/Wb2TsW/Oo3fbJoy/NYPkerV9qSOugkJEJF7krN/N6Nfn0qVFQ14fmUnjpLq+1aKgEBGJMks25zHitTm0SUli0qgsUhvU87UeBYWISBT5Zls+t0yYTZOkumSPzqJl4/p+l6SgEBGJFht2FTBs/Cxq1zImj86iXWqy3yUBCgoRkaiQm3eQm8fNpKikjOxRWaS3aOh3Sd9RUIiI+Gzn/iKGjpvF3oJi3hiZSY82jf0u6QgKChERH+UVFDN8/Gy27D3IhBGn0rd9qt8lHUVBISLik/1FJYyYOJtvt+/nleEZZHZu5ndJFarjdwEiIomosLiU21+fy6JNefxp6EDOOqml3yVVKq72KHQJDxGJBcWlZYydPI+Za3fx7JB+XNS7jd8lhRRXQaFLeIhItCstc9z31gI+W7GdJ6/uw9UD2vld0jHFVVCIiESzsjLHz6cvYsaiXB6+9GRuzopcP9fVSUEhIlIDnHP8csYy3p67iXvO787tZ3Xxu6SwKShERGrAsx+tYuJX6xh9ZmfuvaC73+UcFwWFiEiEvfjPb3nh89XclNmBhy87uca6MK0uCgoRkQh64+t1PPPhCq7q35ZfXd0n5kICFBQiIhEzLWcTj763lAt7tea3Q/pRuwb7ua5OCgoRkQj4YHEuD0xbyJndWvCHmwZQt4b7ua5OsVu5iEiU+nzFdu6ZOp+BHZvyyi2DSKrrTxem1UVBISJSjb7+dhdjsnPo0aYxE247lQb1Yv9KSQoKEZFqMn/DHka/PoeOzRrwxsgsmvjYz3V1iqug0LWeRMQvy3P3MeK1ObRoXJ/s0Vk0a+hvP9fVKa6CQtd6EhE/fLtjP8PHz6JBvdpkj8qidZMkv0uqVnEVFCIiNW3j7gKGjZsFQPboLDo0a+BzRdVPQSEiUkXb9xUybPwsDhSV8MbILLq2bOR3SRGhoBARqYLdBw4xdNwsduYX8frITHq1beJ3SRET++22RERq2L7CYm6ZMIsNuwuYeFsmAzo29bukiNIehYjIcSg4VMLI1+awcms+Lw0bxGldm/tdUsQpKEREwlRYXMqdk3KYt2EPz984gHN7tvK7pBqhQ08iImEoLi3j7inz+dc3O/ntkH5c2ifN75JqjPYoRESOobTM8dM/L+TjZdv45VW9uX5Qe79LqlEKChGREJxzPPLuYt5bsIUHLu7BLael+11SjVNQiIhUwjnHk39bzpTZG/nBuV0Ze043v0vyhYJCRKQSv//kG8b9ey0jTk/np//Tw+9yfKOgEBGpwKtfruH5T79hyKD2PHp5r5jswrS6KChERMqZPGs9T36wnMv6pvH0dX2pFaNdmFaXuAoKXWZcRE7UO/M38ci7SzivZyt+9/3+MdvPdXWKq6DQZcZF5ER8uGQrP/3zIgZ3bs6fhg6kXp24+oisMi0FERHgy1U7+NGU+fRtn8K4WzNivp/r6qSgEJGEN3vtbu6YNJdurRoxcUQmDevrohXBFBQiktAWbdrLyIlzaJeazBujMklpEB/9XFcnBYWIJKyVW/O5ZcJsUhvUJXt0Fi0a1fe7pKikoBCRhLR25wGGjZ9F/Tq1eHP0YNJSkv0uKWopKEQk4Wzee5Bh42ZRWuaYPDqLjs3jr5/r6qSgEJGEsj2/kGHjZrGvsJg3RmbSrVVjv0uKegoKEUkYewsOccv42WzbV8jE207llHb6zVU4FBQikhDyC4u5dcJs1uw4wKu3ZDCoUzO/S4oZaiwsInHv4KFSRr0+lyVb9vHSsEGc0a2F3yXFFO1RiEhcKyopZUx2DnPW7ea57/fjwl6t/S4p5igoRCRulZSWcc+UBXyxagdPXdOHq/q387ukmKSgEJG4VFbmeGDaIj5cupX/d3kvbszs6HdJMUtBISJxxznHo+8vYfr8zfz4wpMYdWZnv0uKaQoKEYkrzjme/nAF2TM3cOdZXbj7vMTs57o6KShEJK688NlqXv5iDcMGd+TBS3omdBem1SWugkI93IkktvH/XsuzH6/i2gHt+OWVpygkqklcBYV6uBNJXG/N2cATM5Zxce82/Pp69XNdneIqKEQkMb2/cAsPTl/M2Se15Pmb+lOntj7aqpOWpojEtE+WbePHby3g1PRmvDRsEPXrqAvT6qagEJGY9Z/VOxn75jx6t23C+FszSK6nkIgEBYWIxKSc9bsZ/fpcOjdvyMTbMmmcpC5MI0VBISIxZ8nmPEa8Noc2KUlMGp1J04b1/C4prikoRCSmfLMt0M91k6RAP9etGif5XVLcU1CISMzYsKuAYeNnUcuM7NFZtEtVP9c1QUEhIjEhN+8gN4+bSVFJGZNHZ9G5RUO/S0oYCgoRiXo79xcxdNws9hYE+rnu0Ub9XNckBYWIRLW8gmKGj5/Nlr0HmTDiVPq2T/W7pIRzzK5QzawVcAbQFjgILAHmOufKIlybiCS4A0UljJg4m2+37+fVWzPI7Kx+rv1QaVCY2bnAg0AzYD6wHUgCrga6mtk04Fnn3L4aqFNEEkxhcSm3vzGXRZvy+OPNAzn7pJZ+l5SwQu1RXArc7pzbUH6AmdUBLgcuBP4SodpEJEEVl5bxg8nz+HrNLp77fj8uPqWN3yUltEqDwjl3f4hhJcC7kShIRBJbaZnjvrcW8OmK7Tx5zSlcM6C93yUlvGOezDaze8ysiQWMN7N5ZvY/NVGciCSWsjLHz6cvYsaiXB66tCdDszr5XZIQXqunkd55iP8BWgK3AU9HtCoRSTjOOX45Yxlvz93Ej87vzh1ndfW7JPGEExSHe/+4FHjNObcw6DERkWrx7EermPjVOkad2Zn7LujudzkSJJygyDGzjwgExT/MrDGgprEiUm1e/Oe3vPD5am7K7MAjl52sLkyjzDF/RwGMAvoDa5xzBWbWnMDhJxGRE/bG1+t45sMVXNW/Lb+6uo9CIgpVukdhZukAzrky59w859xe7/4u59wi7+S2miOISJVNy9nEo+8t5cJerfntkH7UVj/XUSnUHsVvzKwW8B6QA+wg8IO7bsC5wPnAY8CmSBcpIvHng8W5PDBtIWd2a8EfbhpAXfVzHbVC/Y5iiJn1AoYCI4E0oABYDnwAPOmcK6yRKsNkZlcAV3Tr1s3vUkQkhM9XbOeeqfMZ2LEpr9wyiKS66sI0mplzzu8aql1GRoabO3eu32WISAW+/nYXI16bTffWjXjz9sE0URemUcPMcpxzGeUf176eiNSY+Rv2MPr1OXRo1oDXb8tUSMQIBYWI1IjlufsY8docmjeqz+TRWTRvVN/vkiRMCgoRibhvd+xn+PhZJNetzeTRWbRuon6uY0k413o6w8waereHmdlzZqYLsIhIWDbuLmDYuFk4B9mjs+jQrIHfJclxCmeP4kWgwMz6AQ8A64E3IlqViMSF7fsKGTZ+FgeKSpg0KoturRr5XZJUQThBUeICTaOuAp53zj0PqMNaEQlp94FDDB03ix35RUwcmUmvtk38LkmqKJxLeOSb2c+B4cD3zKw2oKYKIlKpfYXF3DJhFht2F/DabacysGNTv0uSExDOHsUNQBGBy41vBdoBv4loVSISswoOlTDytTmsyM3nxWEDOb1rC79LkhN0zKDwwuFNoKn3y+dDzjmdoxCRoxQWl3LnpBzmbdjD8zcO4Lyerf0uSapBOK2eRgOzgWuB64GZZjYy0oWJSGwpLi3j7inz+dc3O3nmur5c1jfN75KkmoRzjuJ+YIBzbheAd5nxr4AJkSxMRGJHaZnjp39eyMfLtvGLK3szJKOD3yVJNQrnHMUmID/ofj6wMTLliEiscc7xyLuLeW/BFu6/qAe3np7ud0lSzcLZo9gMzDKz94DDzWRnm9mPAZxzz0WwPhGJYs45nvzbcqbM3sjYc7ryg3N15eZ4FE5QfOv9Hfae91+/pRBJcL//5BvG/XstI05P5/6LevhdjkTIMYPCOfeLmihERGLLq1+u4flPv+H6Qe159PJe6sI0jh0zKMwsA3gY6BQ8vnOubwTrEpEo5Zxj4lfrePKD5VzWJ41nrutLLXVhGtfCOfQ0mUDLp8VAWWTLEZFoVlhcyiPvLmFaziYuOLk1v7uhv/q5TgDhBMUO59z7Ea9ERKLaxt0FjMnOYemWffzovG7cc8FJCokEEU5QPGZm44BPCVzKAwDn3PSIVSUiUeXzldu5d+oCypxj/K0ZnH+yfnGdSMIJituAngQuBHj40JMDFBQica6szPGHz1bz+09X0aN1Y14ePohOzRv6XZbUsHCCop9zrk/EKxGRqJJXUMx9by/gsxXbuWZAO/73mj4k16vtd1nig3CCYqaZ9XLOLYt4NSISFZZuyeOu7Hnk5h3kiat6M2xwJzV/TWDhBMWZwK1mtpbAOQoDnJrHisSn6fM28fPpi0ltUJepd5zGoE7qSyLRhRMUF0e8ChHx3aGSMp6YsYxJM9eT1bkZL9w8kJaN6/tdlkSBcH6Zvd7MzgS6O+deM7OWgDq+FYkjuXkHGTt5HvM37OWOs7rwwEU9qFM7nGuGSiII55fZjwEZQA/gNQKtn7KBMyJbmojUhK+/3cXdU+Zx8FApfxo6kEv7qB8JOVI4h56uAQYA8wCcc1vMTBcEFIlxzjle/dcanvlwJenNGzD1jsF0a6W3thwtnKA45JxzZuYAzEyNqEVi3P6iEu7/80L+vmQrl5zSht8M6Uej+uF8HEgiCmfLeNvMXgZSzex2YCQwLrJliUikrN6ez52Tcli78wAPXdqT27/XRU1fJaRwTmb/1swuBPYROE/xqHPu44hXJiLV7m+Lcnlg2kKS6tYme3QWp3dt4XdJEgPCOZn9jHPuZ8DHFTwmIjGgpLSMX/9jJa98uYYBHVP509CBpKUk+12WxIhw2r9dWMFjl1R3IdXBzK4ws1fy8vL8LkUkauzIL2LY+Fm88uUahg/uxNQ7Bisk5LhUukdhZncBY4EuZrYoaFBj4D+RLqwqnHN/Bf6akZFxu9+1iESDnPV7GDs5h70FxTw7pB/XDWrvd0kSg0IdenoT+DvwFPBg0OP5zrndEa1KRE6Ic47smev55YxlpKUkM33sqfRum+J3WRKjKg0K51wekAfcVHPliMiJOniolIffWcz0+Zs5r2crfvf9/qQ0qOt3WRLD1HBaJI6s33WAOyflsHJbPvddcBJ3n9dN/VnLCVNQiMSJT5dv4963FlDLjAkjTuXcHq38LknihIJCJMaVljme/2QV//fZanq3bcJLwwbRoVkDv8uSOKKgEIlhewsOcc/UBXyxagfXD2rPr64+haS66oVOqpeCQiRGLdmcx5jsHLbvK+LJa07h5syOuhSHRISCQiQGvT13I4+8u4TmDevx9pjT6N8h1e+SJI4pKERiSFFJKY+/v4wpszdwetfm/OGmATRvpF7oJLIUFCIxYvPeg4zNzmHhpjzuOqcrP7nwJPVCJzVCQSESA/6zeid3T5nPoZIyXho2iItPaeN3SZJAFBQiUcw5x4tffMtv/7GSri0b8dLwQXRtqS7rpWYpKESi1L7CYn769kI+WraNy/um8cx1fWmoXujEB9rqRKLQqm35jJmUw/rdBfy/y3sx8ox0NX0V3ygoRKLM+wu38LNpi2hYvw5Tbh9MZudmfpckCU5BIRIlikvLeOqDFUz4z1oyOjXlj0MH0rpJkt9liSgoRKLB9n2F/ODNecxZt4cRp6fz0KUnU6+Omr5KdFBQiPhszrrdjJ08j/2FJTx/Y3+u6t/O75JEjqCgEPGJc46JX63jyb8tp33TZCaNyqRnmyZ+lyVyFAWFiA8KDpXw4F8W8/7CLVxwcmue/X4/UpLVC51EJwWFSA1bu/MAYyblsGp7Pvdf1IO7zu6qXugkqikoRGrQR0u38pO3F1KntvH6bZmcdVJLv0sSOSYFhUgNKC1zPPfxSv74+bf0bZ/Cn4YOpH1T9UInsUFBIRJhuw8c4kdT5vPv1Tu58dQOPH5lb/VCJzFFQSESQQs37mXs5Hns2F/E09f24cbMjn6XJHLcFBQiETJl9gYee28pLRvXZ9qY0+jbPtXvkkSqREEhUs0Ki0t57L2lvDV3I9/r3oLnbxxAs4b1/C5LpMoUFCLVaOPuAsZOnsfizXncfV437r3gJGqr6avEOAWFSDX5YtUO7pk6n9JSx6u3ZHBhr9Z+lyRSLRQUIieorMzxx89X89wnq+jRujEvDhtE5xYN/S5LpNooKEROQN7BYn7y9gI+Wb6dq/q35alr+9Cgnt5WEl+0RYtU0fLcfYzJzmHznoM8fkUvbj1dvdBJfFJQiFTBO/M38fPpi2mSVJepdwwmI1290En8UlCIHIdDJWU8+bdlvP71ejI7N+OFmwfQqrF6oZP4pqAQCdO2fYWMnTyPnPV7GH1mZ352SU/q1lYvdBL/FBQiYZi5Zhc/fHM+BYdKeOHmAVzet63fJYnUGAWFSAjOOcb/ey1P/X0FnZo1YMrtWXRv3djvskRqlIJCpBL7i0r42bRF/G1xLhf1bs1vh/SjcZJ6oZPEo6AQqcDq7fsZk53Dmh37efCSntx5Vhc1fZWEpaAQKefDJbn89M+LqFenFtmjsji9Wwu/SxLxlYJCxFNSWsZvPlrJy1+soV+HVF4cOpC2qcl+lyXiOwWFCLBzfxF3vzmfr9fsYmhWRx69ohf166gXOhFQUIgwf8Mexk6ex+4Dh/jN9X0ZktHB75JEooqCQhKWc47Jszbwi78upU1KEn+563ROaZfid1kiUUdBIQmpsLiUh99Zwl/mbeKcHi35/Q39SW2gXuhEKqKgkISzYVcBY7JzWL51H/ec3517zu9OLfVCJ1IpBYUklM9XbOeeqfMBmHDrqZzbs5XPFYlEPwWFJISyMsfzn37D/332DT3bNOHlYYPo2LyB32WJxAQFhcS9vQWHuO+tBXy+cgfXDmzHk1f3Ibmemr6KhEtBIXFtyeY87pqcw9a8Qp64+hSGZXXUpThEjpOCQuLWtJxNPPzOYpo2qMdbd57GwI5N/S5JJCZFfVCY2TnAE8BSYKpz7p9+1iPRr6iklCdmLCN75gZO69KcP9w8gBaN6vtdlkjMimj3XGY2wcy2m9mSco9fbGYrzWy1mT14jMk4YD+QBGyKVK0SH3LzDnLDyzPJnrmBO8/uwqRRmQoJkRMU6T2KicALwBuHHzCz2sAfgQsJfPDPMbP3gdrAU+WePxL4l3PuCzNrDTwHDI1wzRKjvlq9k7unzKewuJQXhw7kkj5pfpckEhciGhTOuS/NLL3cw5nAaufcGgAzmwpc5Zx7Crg8xOT2AJV+NTSzO4A7ADp27HgiZUuMcc7x8pdr+PWHK+jSshEvDRtEt1aN/C5LJG74cY6iHbAx6P4mIKuykc3sWuAiIJXA3kmFnHOvAK8AZGRkuOooVKJffmEx9/95ER8u3cplfdJ45vq+NKof9afeRGKKH++oitomVvrB7pybDkyPXDkSq77Zls+d2Tms31XAI5edzKgzO6vpq0gE+BEUm4Dg6zi3B7b4UIfEsBmLtvDAtEU0qFebyaOzGNylud8licQtP4JiDtDdzDoDm4EbgZt9qENiUElpGU//fQXj/r2WgR1T+dPQQbRJSfK7LJG4FtGgMLMpwDlACzPbBDzmnBtvZj8E/kGgpdME59zSSNYh8WF7fiF3vzmfWWt3c+tpnXj4sl7UqxPRFt4iQuRbPd1UyeMfAB9E8rUlvuSs383YyfPIO1jM727oxzUD2vtdkkjCUPMQiVr5hcXk5hXyxcodPPPhCto1TWbibZmcnNbE79JEEoqCQnxx8FApW/IOkru38Lv/uXkH2ZJXSO7eg2zNKyS/qOS78c/v2YrnbuhPSnJdH6sWSUxxFRRmdgVwRbdu3fwuJaEVlZSyNa+QLd6Hf25eIVv2/vf/1n2F7C0oPup5LRrVp21qEl1aNuSMbi1IS0kiLTWZDk2T6dc+Vb3QifjEnIu/36ZlZGS4uXPn+l1GXCouLWPbvsIjPvxz93p7AnmBPYGd+w8d9bymDeqSlpJM29Qk2qQkfXc7LSWZtinJtE6pT/066iNCxE9mluOcyyj/eFztUciJKS1z7MgvOvJQULlDQjv2F1H+u0XjpDq0TUkmLTWJPu1SSEtJJi0libapgf9pKcnqKEgkhikoEkRZmWPXgUNHfPiX3yvYll9EadmRKdCgXu3vPvRPOqklaanJtPUOCR3+r0tmiMQ3vcPjgHOOvQXFFZ4UPnxIaFteEYdKy454Xr06tQIf9inJDO7SnLTUow8JNUmuo8tiiCQ4BUUM2FdYfHTroKC9gty8gxQWHxkCdWqZdy4giQEdmpLWJylweCjokFCzhvUUAiJyTAoKnxUcKvnvh35QGGzxQmBrXiH7g5qJAtQyaNU4ibTUJHqlNeH8nq2OOiTUolF9tRISkWqhoIigwmKvmWgFh4QOnx/YV1hy1PMONxPt2rIhZ3Zr8d9DQd7/Vo3rU6e2Ll0hIjVDQVFFh0r+20z0iNZBQYeEdh+ovJlo+6bJnJrejLTUIw8JtW6SpOsXiUhUUVBUoLTMsT2/sMJDQof3CnYeo5lo3/apR7UOatMkSc1ERSTmxFVQnOgvs3/94Qremb+Z7cdoJtqjTeMjWwelJtEmRc1ERSQ+xdUnm3Pur8BfMzIybq/K89NSkjita/Pv9grapiTTJiVJzURFJKHFVVCcqOGnpTP8NL+rEBGJLjprKiIiISkoREQkJAWFiIiEpKAQEZGQFBQiIhKSgkJEREJSUIiISEhxFRRmdoWZvZKXl+d3KSIicSMu+8w2sx3A+io+vQWwsxrL8ZPmJfrEy3yA5iUaneh8dHLOtSz/YFwGxYkws7kVdS4eizQv0Sde5gM0L9EoUvMRV4eeRESk+ikoREQkJAXF0V7xu4BqpHmJPvEyH6B5iUYRmQ+doxARkZC0RyEiIiEpKEREJKSEDAozm2Bm281sSSXDzcz+z8xWm9kiMxtY0zWGK4x5OcfM8sxsgff3aE3XGA4z62Bmn5vZcjNbamb3VDBOTKyXMOclVtZLkpnNNrOF3rz8ooJxon69hDkfMbFODjOz2mY238xmVDCseteJcy7h/oCzgIHAkkqGXwr8HTBgMDDL75pPYF7OAWb4XWcY85EGDPRuNwZWAb1icb2EOS+xsl4MaOTdrgvMAgbH2noJcz5iYp0E1ftj4M2Kaq7udZKQexTOuS+B3SFGuQp4wwXMBFLNLK1mqjs+YcxLTHDO5Trn5nm384HlQLtyo8XEeglzXmKCt6z3e3fren/lW8BE/XoJcz5ihpm1By4DxlUySrWuk4QMijC0AzYG3d9EjL7RPad5u9x/N7PefhdzLGaWDgwg8K0vWMytlxDzAjGyXrxDHAuA7cDHzrmYXC9hzAfEyDoBfg88AJRVMrxa14mComJWwWOx+u1jHoHrt/QD/gC86285oZlZI+AvwL3OuX3lB1fwlKhdL8eYl5hZL865Uudcf6A9kGlmp5QbJSbWSxjzERPrxMwuB7Y753JCjVbBY1VeJwqKim0COgTdbw9s8amWE+Kc23d4l9s59wFQ18xa+FxWhcysLoEP1snOuekVjBIz6+VY8xJL6+Uw59xe4J/AxeUGxcx6gcrnI4bWyRnAlWa2DpgKnGdm2eXGqdZ1oqCo2PvALV7LgcFAnnMu1++iqsLM2piZebczCazzXf5WdTSvxvHAcufcc5WMFhPrJZx5iaH10tLMUr3bycAFwIpyo0X9eglnPmJlnTjnfu6ca++cSwduBD5zzg0rN1q1rpM6VS83dpnZFAItHFqY2SbgMQInt3DOvQR8QKDVwGqgALjNn0qPLYx5uR64y8xKgIPAjc5rFhFlzgCGA4u948gADwEdIebWSzjzEivrJQ143cxqE/jgfNs5N8PMxkBMrZdw5iNW1kmFIrlOdAkPEREJSYeeREQkJAWFiIiEpKAQEZGQFBQiIhKSgkJEREJSUIiISEgKChERCUlBIVIDzCzdAv1TvOr1h/CR9wthkainoBCpOd2BPzrnegN7gev8LUckPAoKkZqz1jm3wLudA6T7V4pI+BQUIjWnKOh2KQl6rTWJPQoKEREJSUEhIiIh6eqxIiISkvYoREQkJAWFiIiEpKAQEZGQFBQiIhKSgkJEREJSUIiISEgKChERCen/A0jfsl+CM54sAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tic = []\n",
    "n = 5 # Taille de la matrice la plus grande. Pour n=10, le temps est supérieur à 2s\n",
    "for k in range(1,n) :\n",
    "    A = np.random.random((k,k))\n",
    "    t0 = time.time()\n",
    "    laplace(A)\n",
    "    t1 = time.time()\n",
    "    tic.append(t1-t0)\n",
    "\n",
    "plt.semilogy(range(1,n),tic)\n",
    "plt.title(\"Temps en fonction de la taille de la matrice\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"temps (s)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le déterminant de $A$ possède les propriétés suivantes\n",
    "- le déterminant d'un produit est le produit des déterminants : soient $A, B \\in \\mathbb{R}^{n\\times n}$, alors $det(AB) = det(A) det(B)$.\n",
    "- les déterminants sont invariants par transposition : $det(A) = det(A^T)$.\n",
    "- si $A$ est inversible, $det(A^{-1})=\\dfrac{1}{det(A)}$.\n",
    "- les matrices semblables possèdent le même déterminant.\n",
    "- ajouter une ligne ou une colonne un multiple d'une autre laisse le déterminant invariant.\n",
    "- multiplier une ligne ou colonne par $\\lambda \\in \\mathbb{R}$ revient à multiplier le déterminant par $\\lambda$. En particulier, $det(\\lambda A) = \\lambda^n det(A)$.\n",
    "- échanger deux lignes ou colonnes modifie le signe de $det(A)$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Trace"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> Definition\n",
    "Une matrice carrée $A\\in \\mathbb{R}^{n\\times n}$ a pour trace\n",
    "$$\n",
    "tr(A) = \\sum_{i=1}^n a_{ii}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "L'application trace est une application linéaire et $tr(I_n) = n$, $tr(A+B) = tr(A)+tr(B)$, $A,B\\in \\mathbb{R}^{n\\times n}$. De plus, la trace est insensible aux changements de base.\n",
    "\n",
    "> Exercice\n",
    "Montrer que la trace est insensible aux changements de base.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Valeurs propres et vecteurs propres"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nous allons maintenant nous intéresser à une autre caractérisation d'une matrice et des opérateurs linéaires associés."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Définition__\n",
    "> \n",
    ">    Soit $A\\in \\mathbb{R}^{n\\times n}$ une matrice carrée. Alors $\\lambda \\in \\mathbb{R}$ est valeur propre et $x \\in \\mathbb{R}^n\\setminus\\{0\\}$ un vecteur propre correspondant si \n",
    ">    $$ Ax = \\lambda x $$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "C'est ce que l'on appelle l'équation de la valeur propre. En général, les valeurs propres sont classées par ordre croissant. On appelle la première valeur propre la plus grande des valeurs propres en module."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Théorème__\n",
    "> \n",
    "> Les propriétés suivantes sont équivalentes\n",
    "> 1. $\\lambda \\in \\mathbb{R}$ est valeur propre de $A \\in \\mathbb{R}^{{n\\times n}}$.\n",
    "> 2.  $\\exists x \\in \\mathbb{R}^{n\\times n}$ tel que $Ax = \\lambda x$ ou ($ (A-\\lambda I)x = 0$) peut être résolu pour $x \\neq 0$.\n",
    "> 3. $rg(A - \\lambda I) < n$.\n",
    "> 4. $det(A - \\lambda I) = 0$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pour chaque valeur propre, il n'existe pas un unique vecteur propre, mais une famille. On dit que les vecteurs sont colinéaires. La famille des vecteurs propres associés à une valeur propre $\\lambda$ forme un espace vectoriel normé de dimension finie, un espace propre de $A$, que l'on note $E_\\lambda$.\n",
    "\n",
    "Un espace propre est un invariant de $A$, c'est à dire  que $\\forall x \\in E_\\lambda$, $Ax \\in E_\\lambda$.\n",
    "\n",
    "La dimension de $E_\\lambda$ peut être interpré comme le nombre maximum de vecteurs linéaires indépendants associés à $\\lambda$. C'est ce que l'on appelle la multiplicité géométrique de $\\lambda$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Théorème__\n",
    "> \n",
    "> $\\lambda$ est une valeur propre de $A \\in \\mathbb{R}^{{n\\times n}}$ si et seulement si $\\lambda$ est racine du polynôme caractéristique $p_A(\\lambda)$ de $A$. Le polynôme caractéristique de $A$ est défini par $p_A(\\lambda) = det(A - \\lambda I)$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Trouver les valeurs propres de $A$ est donc équivalent à identifier les racines du polynôme caractéristique."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Exercice__\n",
    "> \n",
    "> Calculer les valeurs propres et une base de vecteurs propres \n",
    "> \\begin{equation*}\n",
    "> A = \n",
    "> \\begin{bmatrix}\n",
    "> 4 & 2 \\\\\n",
    "> 1 & 3\n",
    "> \\end{bmatrix}\n",
    "> \\end{equation*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le polynôme caractéristique est un outils théorique qui ne permet pas de déterminer dans la pratique les valeurs propres d'une matrice de grande dimension. Les méthodes de recherche de racines de polynômes ont une complexité trop élevées. Il reste un outils qui permet d'identifier les propriétés des valeurs, vecteurs et espaces propres.\n",
    "\n",
    "Le polynôme caractéristique se factorise sous la forme\n",
    "\\begin{align}\n",
    "p_A(x) &= (x-\\lambda_1)^{m_1} (x-\\lambda_2)^{m_2} \\ldots (x-\\lambda_r)^{m_p} \\\\\n",
    "& = \\prod_{k=1}^p (x- \\lambda_k)^{m_k}\n",
    "\\end{align}\n",
    "avec $p = \\sum_{k=1}^p m_k$.\n",
    "L'entier $m_k$ s'appelle la multiplicité algébrique de la valeur propre $\\lambda_k$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Théorème__\n",
    "> \n",
    "> La multiplicité algébrique d'une valeur propre est au moins égale à sa multiplicité géométrique. \n",
    "> De plus, si la multiplicité algèbrique et la multiplicité artihmétique de chacune des valeurs propres sont égales, alors la matrice est diagonalisable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> __Exercice__\n",
    "> \n",
    "> Calculer la multiplicité algébrique et la multiplicité géométrique des matrices suivantes\n",
    "> \\begin{equation}\n",
    "> A = \n",
    "> \\begin{bmatrix}\n",
    "> 2 & 0 & 0 \\\\\n",
    "> 0 & 2 & 0 \\\\\n",
    "> 0 & 0 & 2\n",
    "> \\end{bmatrix},\n",
    "> B = \n",
    "> \\begin{bmatrix}\n",
    ">  2 & 1 & 0 \\\\\n",
    "> 0 & 2 & 1 \\\\\n",
    ">  0 & 0 & 2\n",
    "> \\end{bmatrix}\n",
    "> \\end{equation}\n",
    "> Que peut-on en déduire?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Les valeurs propres et vecteurs propres sont des caractéristiques importantes des matrices. Elles permettent d'étudier leur comportement et le comportement des applications dont elles sont issues.\n",
    "\n",
    "Certaines matrices possèdent des propriétés très particulières qui facilitent le calcul des valeurs propres.\n",
    "\n",
    "> Théorème : [Theorème spectral]\n",
    "Soit $A\\in \\mathbb{R}^{{n\\times n}}$, une matrice symétrique. Il existe une base orthonormale correspondant à l'espace généré par les vecteurs propres de $A$ et chaque valeur propre est réelle."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ce théorème permet de garantir, sous certaines conditions, que la matrice est diagonalisable. Peut-on se ramener à une matrice symétrique à partir de n'importe quelle matrice? En quelque sorte, oui.\n",
    "\n",
    "> __Théorème__\n",
    "> \n",
    "> Soit $A\\in \\mathbb{R}^{{m\\times n}}$. Il est toujours possible d'obtenir une matrice symétrique, semi-définie, positive $S\\in \\mathbb{R}^{n\\times n}$, (respectivement $S\\in \\mathbb{R}^{m\\times m}$), en définissant \n",
    "> \\begin{equation}\n",
    "> S = A^T A \\; \\;\\; (resp. S=A A^T)\n",
    "> \\end{equation}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Avant de parler des méthodes pratiques de calcul des valeurs propres, nous pouvons évoquer le lien avec la trace et le déterminant.\n",
    "\n",
    "> __Théorème__\n",
    "> - Le déterminant d'une matrice $A\\in \\mathbb{R}^{n\\times n}$ est le produit de ses valeurs propres, éventuellement répétées plusieurs fois.\n",
    "> - Le trace d'une matrice $A\\in \\mathbb{R}^{n\\times n}$ est la somme de ses valeurs propres, éventuellement répétées plusieurs fois.\n",
    "\n",
    "La notion de valeur propre, vecteur propre est utilisée notamment pour classer les recherches google par ordre d'importance (i.e. par rapport à la probabilité qu'une personne clique sur un lien donné)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quelques exercices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.  Soit ${A} = \\begin{bmatrix} 1 & 2 \\\\ 0 & 1\\end{bmatrix}$.\n",
    "\n",
    "    a.  Écrivez $\\chi_{{A}}(\\lambda)$ sous la forme $a\\lambda^2 + b\\lambda +\n",
    "        c$, où $a,b,c\\in\\mathbb{R}$.\n",
    "\n",
    "    b.  Trouvez toutes les valeurs propres de ${A}$.\n",
    "\n",
    "    c.  Pour chaque valeur propre trouvée, trouvez un vecteur propre associé.\n",
    "\n",
    "2.  Déterminez toutes les valeurs propres de\n",
    "    $\\begin{bmatrix} 7 & 12 & 4 \\\\ -8 & -13 & -4 \\\\ 16 & 24 & 7 \\end{bmatrix}$.\n",
    "    \n",
    "1.  Soit ${A} = \\begin{bmatrix} 1 & 2 \\\\ 3 & 2 \\end{bmatrix}$.\n",
    "\n",
    "    a.  Déterminez les valeurs propres de ${A}$.\n",
    "\n",
    "    b.  Déterminez la multiplicité algébrique et la multiplicité géométrique de chacune des valeurs propres. \n",
    "\n",
    "2.  Soit ${A} = \\begin{bmatrix} 8 & -9 \\\\ 4 & -4 \\end{bmatrix}$.\n",
    "\n",
    "    a.  Déterminez toutes les valeurs propres de ${A}$.\n",
    "\n",
    "    b.  Déterminez la multiplicité algébrique et la multiplicité géométrique de chacune des valeurs propres. \n",
    "\n",
    "3.  Soient ${A}, {B} \\in \\mathbb{C}^{n\\times n}$. On dit que ${A}$ et ${B}$  sont **similaires** si ${B}= {S}^{-1}{A}{S}$ pour une matrice inversible ${S}\\in\\mathbb{C}^{n\\times n}$.\n",
    "\n",
    "    a.  Démontrez que $\\chi_{A}(\\lambda) = \\chi_{B}(\\lambda).$\n",
    "\n",
    "    b.  Soit $\\lambda'$ une valeur propre de ${A}$.  Démontrez que la multiplicité géométrique de $\\lambda'$ est au moins la multiplicité algébrique de $\\lambda'$.\n"
   ]
  }
 ],
 "metadata": {
  "author": "me",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "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.11.3"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": true,
   "autocomplete": true,
   "bibliofile": "",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": true
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
