{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Texte d'oral de modélisation - Agrégation Option Informatique" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Préparation à l'agrégation - ENS de Rennes, 2018-19" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- *Date* : 21 mai 2019\n", "- *Auteur* : [Lilian Besson](https://GitHub.com/Naereen/notebooks/)\n", "- *Texte*: [Jonglage (public2012-D2.pdf)](http://agreg.org/Textes/public2012-D2.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## À propos de ce document" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Ceci est une *proposition* de correction, partielle et probablement non-optimale, pour la partie implémentation d'un [texte d'annale de l'agrégation de mathématiques, option informatique](http://Agreg.org/Textes/).\n", "- Ce document est un [notebook Jupyter](https://www.Jupyter.org/), et [est open-source sous Licence MIT sur GitHub](https://github.com/Naereen/notebooks/tree/master/agreg/), comme les autres solutions de textes de modélisation que [j](https://GitHub.com/Naereen)'ai écrite cette année.\n", "- L'implémentation sera faite en OCaml, version 4+ :" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The OCaml toplevel, version 4.04.2\n" ] }, { "data": { "text/plain": [ "- : int = 0\n" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Sys.command \"ocaml -version\";;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Notez que certaines fonctions des modules usuels [`List`](http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html) et [`Array`](http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html) ne sont pas disponibles en OCaml 3.12.\n", "> J'essaie autant que possible de ne pas les utiliser, ou alors de les redéfinir si je m'en sers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Merci à Pierre et Clarence, élèves de la préparation à l'agrégation en 2018/2019, de m'avoir autorisé à utiliser une partie de leur implémentation pour cette (proposition de) correction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question de programmation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La question de programmation pour ce texte était donnée en page 5, et était assez courte :\n", "\n", "> \"Implanter dans l’un des langages de programmation autorisés l’algorithme de test de permutation.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Réponse à l'exercice requis\n", "\n", "Dans l'ordre, on va :\n", "\n", "1. définir une structure de donnée (mot = tableau d'entier),\n", "2. écrire une fonction qui vérifie qu'un tel tableau est bien une permutation de $\\{0,\\dots,n-1\\}$,\n", "3. transformer une chaîne comme `\"5340\"` en un mot `[|5;4;3;0|]`,\n", "4. calculer le mot $\\omega$ depuis un tel mot, `[|1;0;2;3|]`,\n", "5. vérifier que ce mot $\\omega$ est une permutation (c'est le **test de permutation**).\n", "\n", "En bonus, on implémente aussi le **test de moyenne**, et on illustre le bon fonctionnement de notre implémentation sur les exemples du texte." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Structures de données\n", "\n", "On travaille avec des **mots** représentés comme des tableaux d'entiers." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type mot = int array\n" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type mot = int array ;;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Vérifier qu'un mot est bien une permutation de $\\{0,\\dots,n-1\\}$\n", "\n", "On présente deux implémentations, la première n'est pas très réfléchie et se trouve être avoir une complexité temporelle en $\\mathcal{O}(|mot|^2)$, tandis que la seconde est plus réfléchie et fonctionne en temps linéaire $\\mathcal{O}(|mot|)$.\n", "\n", "On va supposer que chaque valeur du mot d'entrée est bien dans $\\{0,\\dots,n-1\\}$, et on vérifie simplement que chaque valeur est présente une et une seule fois (si $n=|mot|$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Fonction quadratique\n", "\n", "Pour chaque valeur $i\\in\\{0,\\dots,n-1\\}$, on parcourt le mot à la recherche d'une valeur $m[j]=i$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "val est_permut : mot -> bool = x = !i) m );\n",
" incr i\n",
" done;\n",
" !permut_bool;;\n",
"(* Complexité temporelle au pire en O(p^2) *)\n",
"(* Complexité spatiale en O(p) *)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"- : bool = true\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"- : bool = false\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"est_permut [|3; 5; 1; 2; 4; 0|];; (* true ! *)\n",
"est_permut [|3; 5; 1; 3; 4; 0|];; (* false ! il manque le 2, il y a deux fois le 3 *)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Fonction linéaire\n",
"\n",
"Au lieu de parcourir les valeurs à trouver et de les chercher, on peut parcourir les valeurs directement !"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"val est_permut_lineaire : mot -> bool =