« INFO614 : Mathématiques pour l'informatique » : différence entre les versions
m (→Nouvelles) |
m (→Nouvelles) |
||
Ligne 21 : | Ligne 21 : | ||
Les nouvelles récentes sont en haut de la liste... |
Les nouvelles récentes sont en haut de la liste... |
||
* [[Utilisateur:Hyvernat|Hyvernat]] 22 janvier 2008 à 10:28 (CET) : '''deuxième séance''' (rappels sur les "grands O", suite du TD0) |
* [[Utilisateur:Hyvernat|Hyvernat]] 22 janvier 2008 à 10:28 (CET) : '''deuxième séance''' (rappels sur les "grands O", suite du TD0) |
||
* [[Utilisateur:Hyvernat|Hyvernat]] 22 janvier 2008 à 10:28 (CET) : '''première séance''' (TD0 : récurrences...) |
* [[Utilisateur:Hyvernat|Hyvernat]] 22 janvier 2008 à 10:28 (CET) : '''première séance''' (TD0 : récurrences...) |
Version du 22 janvier 2008 à 09:28
Ce wiki est un complément de cours pour le cours "info-614, mathématiques pour l'informatique". La participation au wiki n'est pas obligatoire mais fortement encouragée. Pour pouvoir modifier les pages, inscrivez-vous (lien en haut à droite) pour obtenir un login et mot de passe. (Utilisez votre vrai nom...)
Vous pouvez aller voir ce guide pour vous familiariser avec les wikis.
Exercice : si vous n'en avez pas, créez-vous un compte et essayez de modifier cette page (correction de fôtes d'aurtograffe, rajout de détails, mise en page, ...)
Vous pouvez aussi utiliser la page de discussion pour ... discuter. (Ou poser des questions, faire des commentaires etc.)
Détails techniques sur le cours
Organisation des séances
Comme il n'y a qu'un seul groupe, le cours sera entièrement en mode cours / TD.
Nouvelles
Les nouvelles récentes sont en haut de la liste...
- Hyvernat 22 janvier 2008 à 10:28 (CET) : deuxième séance (rappels sur les "grands O", suite du TD0)
- Hyvernat 22 janvier 2008 à 10:28 (CET) : première séance (TD0 : récurrences...)
- Hyvernat 14 janvier 2008 à 15:50 (CET) création du wiki
Les support de TD et TP
- le TD 0 : fichier pdf
Introduction
Edsger Wybe Dijkstra, un grand monsieur de l'informatique a dit "Computer Science is not about computers, any more than astronomy is about telescopes." Autrement dit l'informatique ne peut pas se réduire à l'étude des ordinateurs.
Le but de de ce cours est de regarder comment deux domaines des mathématiques pures sont devenues incontournables dans la société de l'internet et du multimédia :
- la cryptographie, issue de la théorie des nombres,
- les codes correcteurs d'erreur, issus des l'algèbre sur les corps finis.
Les technologies résultantes sont utilisées lors de chaque transaction électronique, pour l'échange de mails ou à chaque fois que vous écoutez un CD. La plus grosse partie du cours est un cours de mathématiques. Si le temps le permet, nous déménageront une ou deux séances de TP en salle machine pour appliquer le cours, mais nous n'aurons pas suffisamment de temps pour regarder les détails d'implantation. Je vous encourage à tester, programmer ou utiliser les concepts mentionnés pour vous les approprier...
Complexité, approximations asymptotiques
La notion de complexité d'un programme est fondamentale pour pouvoir évaluer l'intérêt pratique d'un programme. La complexité observée lors de test ou de benchmark est parfois suffisante mais ne prend en compte que certaines exécutions (celles qui sons testées par les tests). Il est souvent nécessaire de se faire une idée de la complexité théorique d'un programme pour pouvoir prédire son temps d'exécution (ou ses besoins en ressources) pour les exécutions futures.
Première approche de la complexité
Tout d'abord, nous ne nous intéresserons qu'à la complexité en temps, et (presque) jamais à la complexité en espace. Il ne faut pas en déduire que seule la complexité en temps est importante !
L'idée de base est de compter en combien de temps va s'exécuter un programme donné, mais la question elle même est mal posée :
- comment compte-t'on ?
- et surtout, que compte-t'on ?
Chronométrer le temps d'exécution ne permet pas de faire d'analyse fine, et ne permet pas facilement de prédire le comportement général de votre programme. Comme le temps dépend beaucoup du processeur utilisé, l'idéal serait de pouvoir compter le nombre de cycle nécessaires au programme. Cela est généralement impossible car cela dépend du type de processeur utilisé ainsi que des optimisations faites par le compilateur.
La complexité en temps d'un algorithme, c'est une estimation du nombre d'opérations atomiques effectuées par cette algorithme avant qu'il ne termine. Cette estimation doit être donnée comme une fonction dépendant de la taille de l'entrée sur laquelle est lancé l'algorithme.
La notion d'opération atomique est assez intuitive : c'est une opération algorithmique qui n'est pas divisible en sous-opérations. En première approximation, une opération est atomique si elle ne porte que sur des objets de type entier, caractère ou booléen. (Les types codés sur un ou deux mots). Un test (si (n==42) alors ...
) ou une affectation (x:=3,1415926536
) sont des opérations atomiques ; mais l'initialisation d'un tableau n'est pas atomique. (Il y a autant d'opérations qu'il y a d'éléments dans le tableau...)
Exemple : la recherche du maximum dans un tableau d'entiers positifs peut se faire comme suit
max := 0 pour i:=1 à taille faire si (max < Tab[i]) alors max:=Tab[i] finfaire affiche("Le maximum est %i.\n",max)
Le nombre d'opérations est le suivant :
- une opération pour l'initialisation de
max
- une opération pour l'initialisation de
i
à1
- un test pour voir si
i==taille
- une opération pour le test
max < Tab[1]
- "peut-être" une opération pour l'affectation
max:=Tab[1]
- puis, pour chaque élément suivant du tableau :
- un incrément du compteur
- une affectation du compteur
- un test pour voir si on a atteint la fin du tableau
- un test
- peut-être une affectation
Au total, si est la taille du tableau, on obtient entre et opérations. De manière générale, on s'intéresse surtout au pire cas ; on dira donc que cet algorithme s'exécute en "au plus opérations".
Approximations asymptotiques
On ne peut habituellement pas compter de manière aussi précise le nombre d'opérations ; et ça n'a pas toujours du sens de vouloir être trop précis. (Est-ce que i:=i+1
correspond à une ou deux opérations atomiques ?) Nous allons donc utiliser les approximations asymptotique pour compter la complexité... Le but sera alors de distinguer les algorithmes "rapides", "lents", ou "infaisables". La notion de "grand O" permet de faire ça de manière systématique.
- définition
- si et sont des fonctions de dans , on dit que est un "grand O" de , et on écrit si le quotient est borné. Plus précisément, ça veut dire que
Le but de cette définition est multiple :
- elle cache une borne "au pire"
- elle permet d'identifier des complexités qui ne diffèrent que par une constante multiplicative (" et , c'est presque la même chose")
- elle permet d'ignorer les cas initiaux et autres phénomènes négligeables
- elle permet de simplifier les calculs de complexité
- Propriétés
- si et alors
- si et alors
- si et alors
- si et alors
Pour pouvoir simplifier les expressions, il est important de connaître les liens entre les fonctions usuelles : , les fonctions linéaires, les polynômes, les exponentielles, les doubles exponentielles...
Pour très grand :
Avec et .
---À compléter ? C'est vous qui voyez...---
Un exemple
---???---