Informatique Introduction à l’algorithmique Introduction à l’algorithmique MPSI B Hoche Dans un schéma conventionnel (Fig 2), on utilise des rectangles et des flèches. On peut aussi introduire la notion de couche, chaque commande est en fait un Un algorithme est un enchaînement d’actions. Autres mots pour "action" : commande, instruction. On décrit un algorithme à l’aide de diverses conventions de langage : langage naturel, schéma , pseudo-code, code. Les documents de la liste du dessus respectent des conventions de plus en plus précises. Un code est un texte respectant la syntaxe d’un langage de programmation. L’objet de cette introduction est de présenter diverses notions et conventions à partir d’un exemple d’algorithme totalement évident. On utilisera ensuites ces notions et convention pour décrire un algorithme de numération. Partie I : la cuisson des coquillettes Fig. 2 – Un schéma simpliste Partons de la description de l’algorithme dans un livre de cuisine (figure 1) qui date des années 60. On se propose de traduire (implémenter) l’algorithme de enchaînement de commandes plus simples (faisant partie d’une couche d’un niveau inférieur) que l’on choisit de ne pas préciser. On va maintenant détailler certaines des commandes précédentes et introduire la notion de variable. Une variable est un nom qui sert à désigner quelque chose. On va introduire aussi la notion d’affectation (on dit aussi assignation) qui sera codée par une flèche <-- ainsi que la notion d’opération et celle de fonction. Nous allons utiliser deux variables : Cassy et Eg et former un nouveau schéma : Dans ce schéma les instructions Fig. 1 – Un algorithme en langage "naturel" (Ginette Mathiot) cuisson des pâtes en utilisant des conventions plus modernes et qui se prêtent mieux à la généralisation. On peut simplement aller à la ligne entre chaque commande Fig. 3 – affectations, opérations, fonctions utiliser : 250 g de pâtes, 35 g de sel, 3 litres d’eau -faire bouillir de l’eau salée -mettre les pâtes dans l’eau -laisser cuire 5mn Cette création est mise à disposition selon le Contrat Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ "faire bouillir" Cassy "chauffer" Cassy, 5mn "vider" Cassy "vider" Eg 1 Rémy Nicolai Aintroalgo Informatique Introduction à l’algorithmique sont des appels de fonction contenant des paramètres comme Cassy ou Eg. L’appel d’une fonction exécute un enchaînement de commandes qui peut modifier ou non les objets désignés par les paramètres et renvoyer ou non un autre objet. Par exemple, les fonctions "faire bouillir" , "chauffer" "secouer" modifient l’état de l’objet désigné par Cassy ou Eg. En revanche "vider" ne modifie pas l’objet désigné par le paramètre mais renvoie quelque chose obtenu à partir de ce paramètre (le contenu de la casserole ou de l’égouttoir). Introduisons maintenant la notion de structure de contrôle dans l’enchaînement des commandes. On va évaluer quelque chose à "vrai" ou "faux" et diriger vers des enchaînements différents suivant le résultat. Détaillons ainsi la commande "faire bouillir" Cassy suivant la figure 4 MPSI B Hoche nombre d’éléments. Pour une telle application, l’injectivité entraîne la surjectivité donc la bijectivité. La démonstration de l’injectivité est constructive. Si un entier est décomposé alors chaque ai se calcule algorithmiquement en fonction de x et de b. Ceci assure l’unicité de la décomposition donc l’injectivité de la fonction. Considérons la fonction ( {0, 1, · · · , b − 1}n →{0, 1, · · · , bn − 1} Φ (a0 , a1 , · · · , an−1 ) →a0 + a1 b + · · · + an−1 bn−1 En fait, il faut commencer par montrer que a0 + a1 b + · · · + an−1 bn−1 ∈ {0, 1, · · · , bn − 1} Ceci résulte de l’encadrement 0 ≤ a0 + a1 b + · · · + an−1 bn−1 ≤ (b − 1) + (b − 1)b + · · · + (b − 1)bn−1 ≤ (b − 1)(1 + b + · · · + bn−1 ) = bn − 1 On démontre exactement de la même manière que, pour des m ≤ n : Fig. 4 – structure de contrôle a0 + a1 b + · · · + am−1 bm−1 ∈ {0, 1, · · · , bm − 1} Ceci servira plus loin pour justifier un des deux algorithmes proposés. La proposition est exactement équivalente à la bijectivité de la fonction Φ. Les ensembles de départ et d’arrivée ont le même nombre d’éléments à savoir bn . Si la fonction Φ est injective, les images sont deux à deux distinctes. Il y a donc autant d’images distinctes que d’éléments dans l’ensemble de départ. Mais alors tous les bn éléments de l’ensemble d’arrivée sont des images puisque cet ensemble ne contient que bn éléments. Démontrons maintenant l’injectivité3 . On suppose Partie II : numération en base b Proposition. Soit b un entier naturel supérieur ou égal à 2. Pour tout entier naturel x entre 0 et bn − 1, il existe un unique n-uplet (a0 , a1 , · · · , an−1 ) ∈ {0, 1, · · · , b − 1}n tel que x = a0 + a1 b + · · · + an−1 bn−1 x = a0 + a1 b + · · · + an−1 bn−1 Cette proposition traduit l’existence et l’unicité de la décomposition d’un entier dans une base arbitraire. On utilise en particulier les bases b = 2 (binaire), b = 10 (décimale), b = 16 (héxadécimal), b = 20 1 , b = 60 (sexagésimale) 2 On peut adopter un algorithme "glouton" en cherchant d’abord les "plus gros morceaux" c’est à dire le nombre an−1 de bn−1 contenus dans x. Comme Preuve. Pour démontrer cette proposition, on va remarquer qu’elle est équivalente à la bijectivité d’une certaine application entre deux ensembles finis ayant le même 0 ≤ a0 + a1 b + · · · + an−2 bn−2 ≤ bn−1 − 1 1 voir le système de numération maya. Cette base semble aussi avoir été utilisée par les Gaulois, le 80 quatre-vingt en serait un lointain vestige (ref wikipédia) 2 utilisé par les mésopotamiens voir en particulier les tablettes cuneiformes de Plimpton 3 On peut présenter cette démonstration comme une analyse-synthèse. L’analyse correspond à l’injectivité ou à l’unicité, son argumentation est algorithmique. La synthèse correspond à la surjectivité ou à l’existence, son argumentation repose sur la théorie des ensembles Cette création est mise à disposition selon le Contrat Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ 2 Rémy Nicolai Aintroalgo Informatique Introduction à l’algorithmique MPSI B Hoche ce nombre est le reste de la division de x par bn−1 et an−1 en est le quotient. Ceci assure l’unicité de an−1 et on peut poursuivre le raisonnement en divisant le reste précédent par bn−2 . On peut aussi procéder en partant du bas. Dans la division par b de On remarquera l’assignation arbitraire d’un objet quelconque à la variable res (résultat) au début du processus. On remarquera aussi dans l’instruction x = a0 + a1 b + · · · + am−1 bm−1 = a0 + (a1 + a2 b + · · · + an−1 bn−2 )b la place des deux variables par rapport à la virgule pour assurer que les différents termes s’écrivent bien de droite à gauche comme dans une écriture décimale usuelle. res <-- restediv(x,b) , res le reste est a0 et le quotient est a1 + a2 b + · · · + an−1 bn−2 . Ceci assure l’unicité du a0 et le raisonnement se poursuit en divisant par b le quotient précédent. Le schéma conventionnel de cet algorithme est présenté en figure 5 Fig. 5 – algorithme de numération Cette création est mise à disposition selon le Contrat Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ 3 Rémy Nicolai Aintroalgo