{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ec4ecc43",
   "metadata": {},
   "source": [
    "# Feuille d'exercices 4\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "```{admonition} Objectifs\n",
    "* Fonctions natives\n",
    "* Bibliothèques python : math, random, matplotlib\n",
    "```\n",
    "\n",
    "\n",
    "## Exercice 1 : manipulations élémentaires\n",
    "\n",
    "\n",
    "**Question 1 :** En important (ou non) les bibliothèques appropriées, réaliser les instructions suivantes :\n",
    "- calculer la partie entière inférieure de $\\sqrt{1000}$\n",
    "- calculer l'arrondi de $\\tan(\\frac{101\\pi}{200})$\n",
    "- tirer aléatoirement un nombre décimal parmi $\\{ 0, 0.01, 0.02, 0.03, \\dots, 0.98, 0.99 \\}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7b493045",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c225c6c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df9f6c14",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "253532c1",
   "metadata": {},
   "source": [
    "**Question 2 :** Observer et expliquer les erreurs dans les calculs suivants."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0f69f878",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "math.sqrt(-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "47e063e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "math.log(exp(-10), 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3d94948",
   "metadata": {},
   "source": [
    "**Question 3 :** Essayer de calculer $\\tan(\\pi/2)$ grâce à la fonction `tan` et au nombre `pi` de la bibliothèque `math`. Obtient-on une erreur ? Pourquoi ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a969405",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "220afc9e",
   "metadata": {},
   "source": [
    "**Question 4 (optionnelle) :** Écrire une fonction `maxabs(L)` qui retourne la plus grande valeur absolue de la liste `L`. Si possible, votre fonction utilisera un parcours de liste **par compréhension**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "33e92810",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37099b01",
   "metadata": {},
   "source": [
    "## Exercice 2 : affichage graphique\n",
    "\n",
    "**Question 1 :** En utilisant `matplotlib.pyplot`, tracez le graphe de la fonction $\\sin(x)$ pour $x$ entre $0$ et $4 \\pi$. Pour tracer la fonction, on utilisera un pas de $0.01$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5461d245",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ddddc895",
   "metadata": {},
   "source": [
    "**Question 2 :** On rappelle que dans le plan, un cercle de centre $(x, y)$ et de rayon $r$ a pour équation paramétrique :\n",
    "\n",
    "$$\n",
    "    \\Big\\{ \\begin{pmatrix} x + r \\cos(t) \\\\ y + r \\sin(t)  \\end{pmatrix} ,\\; t \\in [0, 2\\pi] \\Big\\}\n",
    "$$\n",
    "\n",
    "Écrire une fonction `cercle(x, y, r)` qui trace un cercle dont le centre est le point de coordonnées $(x,y)$ et dont le rayon est $r$. Votre fonction n'aura pas de valeur de retour : elle tracera simplement le cercle.\n",
    "\n",
    "*Indication : pour que les axes de la figure soient à la même échelle (et ne pas observer une ellipse lors de l'affichage), il faut utiliser l'instruction `plt.axis('equal')` avant d'afficher le graphique.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "393aea53",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35f69b26",
   "metadata": {},
   "source": [
    "## Exercice 3 : pgcd\n",
    "\n",
    "\n",
    "**Question 1 :** Écrire une fonction `pgcd(a, b)` qui retourne le pgcd de deux entiers `a` et `b`. Pour cela, rappelons l'algorithme d'Euclide :\n",
    "\n",
    "- **Tant que** $b \\ne 0$:\n",
    "  - Calculer $q$ et $r$ le quotient et le reste de la division euclidienne de $a$ par $b$\n",
    "  - Remplacer $a$ par $b$ et $b$ par $r$\n",
    "- **Retourner** $a$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3d7b7c33",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee94c645",
   "metadata": {},
   "source": [
    "**Question 2 :** En utilisant la fonction `gcd` de la bibliothèque `math`, vérifier que votre fonction est correctement implémentée. Pour cela, on pourra tirer des entiers $a$ et $b$ aléatoirement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4151a8f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae0243af",
   "metadata": {},
   "source": [
    "## Exercice 4 : La suite de Syracuse\n",
    "\n",
    "La **suite de Syracuse** est une suite récursive de nombres naturels définie par un premier terme $s_0 \\ge 1$, et par la relation de récurrence suivante (pour $n \\ge 0$) :\n",
    "- si $s_n$ est pair, alors $s_{n+1} = s_n/2$,\n",
    "- si $s_n$ est impair, alors $s_{n+1} = 3 s_n + 1$.\n",
    "\n",
    "Par exemple, les $15$ premiers termes de la suite de terme initial $s_0 = 6$ sont :\n",
    "\n",
    "$$\n",
    "    (6, 3, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1).\n",
    "$$\n",
    "\n",
    "On observe alors que, lorsque la suite atteint le nombre $1$, la suite devient périodique : le motif $(4, 2, 1)$ se répète indéfiniment. On appelle **prépériode** les termes $(s_0, s_1, \\dots, s_m)$ de la suite de Syracuse, où $s_m$ est la première occurence de la valeur $1$ dans la suite.\n",
    "\n",
    "**Question 1 :** Implanter une fonction `syracuse(s)` qui prend en entrée un entier $s \\ge 1$, et qui retourne la liste des termes de prépériode de la suite de Syracuse de terme initial $s$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5dda27ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fae3c8c9",
   "metadata": {},
   "source": [
    "**Question 2 :** Parmi les termes initiaux $s_0$ compris entre $1$ et $1000$, lequel produit une suite de Syracuse de plus grande prépériode ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ca1bbc8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aef78559",
   "metadata": {},
   "source": [
    "**Question 3 :** À l'aide de la bibliothèque ``matplotlib``, tracer le graphe de la prépériode de la suite de Syracuse (c'est-à-dire, $s_n$ en fonction de $n$) pour $s_0 = 7$. Si on le souhaite, on pourra afficher seulement des points (et non la ligne continue les reliant) avec les arguments optionnels `linestyle='', marker='o'` de `plot()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d39ef6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c986cba",
   "metadata": {},
   "source": [
    "**Question 4 :** Tracer sur un même graphe les prépériodes des suites de Syracuse de termes initiaux $s_0 = 8192$ et $s_0 = 1234$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d34a59bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python",
   "language": "python",
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
