M1 MFA année 2013–2014. Algorithmique : notes de cours

M1 MFA ann´ee 2013–2014. Algorithmique : notes de cours
Version du 8 d´ecembre 2013
Programme. Notion d’algorithme, complexit´e d’un algorithme. Notation dite de Landau :
O, Ω, Θ. Rappels sur la comparaison des fonctions.
Algorithmes de tri : tri par insertion, tri rapide.
Op´erations arithm´etiques de base sur les entiers : addition, soustraction, multiplication, ex-
ponentiation, division euclidienne avec reste.
Algorithmes arithm´etiques : calcul du pgcd, algorithme d’Euclide ´etendu, B´ezout, utilisation
du th´eor`eme chinois.
FFT, multiplication rapide.
Op´erations sur les polynˆomes (en principe en une variable), algorithme d’Euclide, calcul du
pgcd, th´eor`eme chinois, multiplication rapide.
Alg`ebre lin´eaire : solution d’un syst`eme d’´equation lin´eaires, calcul d’un d´eterminant, . . ..
Racines d’un polynˆome `a coefficients r´eels et complexes : localisation, s´eparation, approxima-
tion.
Public vis´e : agr´egation de math´ematiques (option C calcul formel, ´eventuellement utile pour
option D info) et math-info (surtout algorithmique en th´eorie des nombres et cryptologie).
Quelques r´ef´erences : Pierre Damphouse : Petite introduction `a l’algorithmique, Ellipses
(2005). Maurice Mignotte : Math´ematiques pour le calcul formel, PUF (1988). Maurice Mignotte :
Alg`ebre concr`ete, Ellipses, (2003). Joachim von zur Gathen, J¨urgen Gerhard : Modern computer
algebra, Cambridge University Press, deuxi`eme ´edition (2003). Donald E. Knuth : The art of
computer programming, (4 volumes), Addison Wesley, plusieurs ´editions (plus avanc´e).
Notion d’algorithme. Je ne donnerai pas de d´efinition pr´ecise. Il s’agit d’une s´erie d’ins-
tructions faisant intervenant des op´erations simples , dites ´el´ementaires.
Sauf indication contraire, les algorithmes sont d´eterministes, c’est-`a-dire, le r´esultat de
chaque op´eration est uniquement d´etermin´ee. Il y a aussi des algorithmes probabilistes, o`u
les op´erations font intervenir un choix au hasard (par exemple un entier choisi au hasard). Une
autre forme d’algorithme qui font intervenir une hypoth`ese que nous ne savons pas d´emontrer dans
l’´etat des connaissances math´ematiques actuelles, mais qui, dans la pratique, sont tr`es efficaces.
Un exemple est la recherche du plus petit nombre premier sup´erieur `a un entier ndonn´e. Pour
cela, on utilise la m´ethode la plus na¨ıve imaginable : on test successivement pour primalit´e chacun
les entiers n+ 1, n+ 2, . . .. En pratique, on constate qu’il suffit — en moyenne — de tester envi-
ron log nentiers avant de rencontrer un nombre premier, mais nos connaissances math´ematiques
actuelles permettent seulement de d´emontrer qu’il suffit de tester au plus ncentiers, o`u c > 0 est
une constante qui, il est vrai, diminue avec le temps. Un tel algorithme est appel´e un algorithme
heuristique.
Exemples (i) L’instruction factoriser(n) (o`u n2 un entier naturel) n’est pas un algo-
rithme, car l’instruction de factoriser un entier n’est pas une instruction ´el´ementaire (et il y a
1
en fait plusieurs algorithmes de factorisation d’un entier). Un algorithme de factorisation est
une s´equence d’instructions simples (telles addition, multiplication, division, comparaison de deux
entiers) que, si l’on les appliquent `a n, fournit la factorisation de n.
(ii) De mˆeme, l’instruction trier(L), o`u Lest une liste de mots (par exemple de la langue
fran¸caise), n’est pas un algorithme. Ici, instruction simple pourrait signifier interchangement de
deux mots (transposition).
(iii) On peut objecter que l’addition, la multiplication, . . ., de deux entiers ne sont pas des
op´erations ´el´ementaires, mais deviennent de plus en plus complexes avec les grandeurs. C’est vrai.
En r´ealit´e, les op´erations ´el´ementaires arithm´etiques sont l’addition, la multiplication, . . ., de deux
puissances de 2.
Ici, on peut encore objecter qu’un grand entier est plus complexe qu’un petit. Cela est une
question de taille de m´emoire, alors que nous nous limiterons `a des questions de complexit´e
d’ex´ecution qui influencer surtout le temps de calcul.
Nous allons donc parfois supposer que l’addition, la multiplication, . . ., peuvent se faire en
temps constant, surtout lorsque les algorithmes ont une complexit´e beaucoup plus importante que
log n(par ex. une puissance de n).
Parmi des op´erations ´el´ementaires, il faut aussi tenir compte du nombre de cas `a ex´ecuter dans
un pour ou dans un tantque, le tests ´el´ementaires dans un si, les retourner. Et, bien entendu,
si un programme fait appel `a un autre, les instructions ex´ecut´ees par ce dernier.
Par exemple, dans le pseudoprogramme (pas de langage de programmation dans ce cours) :
pour ide 1`a n
si 2divise iretourner i/2
sinon retourner i
finsi
finpour
chaque valeur de iutilise un test de parit´e. Lorsque iest pair il faut le diviser par 2 et il y a donc le
test plus la division plus le retourner `a ex´ecuter, ce qui fait 3 op´erations ´el´ementaires. Par contre,
lorsque iest impair, il y n’y a que le test et le retourner `a ex´ecuter, soit 2 op´erations ´el´ementaires.
Le nombre total d’op´erations ´el´ementaires est donc n+ 3Np(n) + 2Ni(n) (Np(n), Ni(n) le nombre
d’entiers pairs, impairs entre 1 et n).
Ici, j’ai compt´e le test de parit´e et la division par 2 comme des op´erations ´el´ementaires,
car, sur machine, elle correspond `a regarder si le dernier bit de iest nul et `a d´ecaler tous les
bits de iun pas `a droite. On pourrait objecter, avec raison, que d´ecaler un bit un pas `a droite
est une op´eration ´el´ementaire mais que, comme iest repr´esent´e par blog2ic+ 1 bits, la division
n´ecessite ce nombre d’op´eration ´el´ementaires. Le pseudoprogramme n´ecessiterait alors n+2Np(n)+
Pipair (blog2ic+ 1) + 2Ni(n) op´erations ´el´ementaires.
Remarque. L’algorithmique ´etudie aussi l’existence ou la non existence d’algorithmes. Un
exemple c´el`ebre est le Th´eor`eme de Matijasevich, qui a pour cons´equence qu’il n’existe pas
d’algorithme pour d´ecider si oui on non une famille d’´equations polynˆomiales `a coefficients entiers
poss`ede une solution en entiers. Dans ce cours, nous serons plutˆot int´eress´es par des probl`emes qui
poss`edent un algorithme trivial dont l’existence est en g´en´erale ´evidente (par exemple, il suffit
d’effectuer de tests ou d’op´erations sur un ensemble fini explicite). Le but est la recherche d’algo-
rithmes plus efficaces, et surtout plus rapide. Un exemple typique est le probl`eme de d´eterminer
si oui ou non un entier naturel n2 donn´e est un nombre premier. L’algorithme trivial consiste
alors `a tester si nest divisible par un entier mtel que 2 mn1, et un algorithme trivial
consiste donc de tester successivement si 2 divise n, si 3 divise net ainsi de suite. Ici l’op´eration de
division n’est pas une op´eration ´el´ementaire, mais peut ˆetre r´eduite `a une s´equence d’op´erations
2
´el´ementaires, par exemple en appliquant la division euclidienne avec reste et en constatant si le
reste est nul ou non. Le but est de trouver un algorithme plus rapide.
Complexit´e, notation de Landau
Dans ce cours, log d´esigne le logarithme n´ep´erien, logale log en base a,a > 0 ´etant un r´eel.
Il y a donc place pour discussion concernant le nombre exact d’op´eration ´el´ementaires. Mon
point de vue est assez rigoureux ; j’essaie de compter tous qui pourrait compter qui est propre `a
l’algorithme (c.-`a.-d. `a l’exclusion de l’entr´ee et la sortie des donn´ees).
Complexit´e d’un algorithme.`
A nouveau, pas de d´efinition pr´ecise toute de suite (`a revoir
vers la fin du cours). Id´ee la plus simple : c’est le nombre d’instructions ´el´ementaires execut´ees, vu
comme fonction de n(pour factorisation), ou comme fonction du nombre de mots dans L(pour
une liste), . . ..
En pratique, il n’y a pas de formule exacte explicite pour le nombre d’instruction ´el´ementaires
(sauf quelques algorithmes tr`es particuliers). On se contente de l’ordre de magnitude (croissance
de la fonction avec n, avec le nombre de mots dans la liste). Combien d’instructions simples faut-
t-il pour factoriser n(`a peu pr`es) ? log(n), n2,n,en. . . ? Combien en faut-il pour trier une liste
`a n´el´ements ?
Notations O,,Θ. Soit f:NR+une fonction (peut-ˆetre non d´efinie en quelques petites
nN). On note
O(f) = {g:NR+|g(n)Cf (n) pour tout nassez grand et une constante convenable C > 0},
Ω(f) = {g:NR+|g(n)Cf (n) pour tout nassez grand et une constante convenable C > 0},
Θ(f) = O(f)Ω(f).
On utilise une notation analogue pour des fonctions f: [a, +[R+, des fonctions f:N2
R+etc. Par exemple, si f:N2R+,g:N2R+, alors gO(f) s’il existe C > 0 telle
que g(m, n)Cf (m, n) pour tout (m, n) avec ||(m, n)|| assez grand, ||.|| ´etant n’importe quelle
norme sur R2. (Toutes les normes sur R2´etant ´equivalentes, cette d´efinition est ind´ependente du
choix de la norme.)
Remarques. (1) C’est la notation dite de Landau, mais d´ej`a utilis´ee (dans le cas de O) par
P. Bachmann en 1894, alors que ni Bachmann ni Landau n’utilisaient les notations Ω(f) et Θ(f).
(2) La d´efinition de Ω(f) n’est pas celle utilis´ee en th´eorie analytique des nombres, o`u gΩ(f)
signifie (f(n), g(n)>0 pour tout nassez grand) et lim sup g(n)/f(n)>0. (3) On rencontre
souvent l’´ecriture g=O(f) `a la place de gO(f). Cette pratique est `a ´eviter devant un jury de
concours.
Exemples. (i)nO(n), (log n)aO(nc) quelque soit a,c > 0, O(en)O(en2).
(ii) Le pseudoprogramme ci-dessus s’ex´ecute en n+ 3Np(n)+2Ni(n) op´erations ´el´ementaires.
Comme Np(n) = bn
2cet Ni(n) = bn+1
2c, on constate qu’il est dans Θ(n) (sauf si on prend en
compte le temps de division de ipar 2 comme blog2ic+ 1).
La formule de Stirling. Elle permet d’ins´erer la fonction factorielle et les coefficients bino-
miaux dans l’hierarchie des fonctions. Le r´esultat suivant est un peu plus pr´ecis, car elle fournit
un encadrement de la fonction factorielle par des fonctions de forme exponentielle.
3
Th´eor`eme.Pour tout entier n1,ona:
n
en2πn e1/(12n+1) n!n
en2πn e1/12n.
Corollaire (formule de Stirling). Onan!n
en2πn lorsque n→ ∞.
La formule de Stirling permet ´egalement de donner des ´equivalences `a certaines familles de
coefficients binomiaux et de les ins´erer dans l’hierarchie des fonctions. Par exemple :
2n
n22n
πn, n!O(nn), enO(n!).
La d´emonstration du th´eor`eme rel`eve de l’analyse et elle est donc d’un esprit diff´erent des id´ees
d´evelopp´ees dans ce cours. Elle est donc report´ee en annexe et se trouve `a la fin de ce document.
L’´etude des algorithmes
Pendant le reste de ce cours, nous allons pour la plupart du temps ´etudier diff´erents algorithmes
ou parfois comparer plusieurs algorithmes ayant la mˆeme finalit´e. En r`egle g´en´erale, l’´etude d’un
algorithme consiste en les points suivants (dont certains pourraient ˆetre laiss´es en partie ou en
totalit´e en exercice) :—
(1) d´escription informelle de l’algorithme, parfois `a l’aide d’exemples ;
(2) redaction de l’algorithme en pseudocode ,
(3) preuve que l’algorithme se termine et estimation de sa complexit´e ;
(4) preuve que l’algorithme fournit effectivement le r´esultat d´esir´e ;
(5) ´eventuellement, quelques remarques diverses, par exemple comparaison avec d’autres al-
gorithmes ayant la mˆeme finalit´e.
Remarque. Le plus souvent, on connaˆıt plusieurs algorithmes ayant la mˆeme finalit´e. Par
exemple, on connaˆıt plusieurs algorithmes de factorisation d’entiers. De mˆeme, la plupart algo-
rithmes poss`edent plusieurs variantes et les discriptions peuvent varier l´eg`erement selon les au-
teurs. On veillera `a ce que le pseudocode dans l’´etape (2) correspond bien `a l’algorithme d´ecrit
informellement au point (1), et non pas `a une variante ou `a un autre algorithme ayant la mˆeme
finalit´e.
Algorithmes de tri
Il y en a beaucoup. Le choix d’utilisation d´epend du contexte. Soit Eun ensemble muni
d’un ordre total . Un tableau d’´el´ements de Eest une application T: [[1, n]] E(ou d’un
autre ensemble d’entiers cons´ecutifs vers E). Ici, comme ailleurs, [[d, f]] (o`u d < f sont deux
r´eels) d´esigne l’ensemble des entiers ierifiant dif. Un sous-tableau d’un tableau T
est un tableau T0param´etr´e par une partie [[d, f]] de [[1, n]] form´ee d’entiers cons´ecutifs tel que
T0[i] = T[i] lorsque i[[d, f]]. Si Test un tableau d’´el´ements de E,trier Tsignifie ranger les
´el´ements de Ten ordre croissant (ou d´ecroissant), c’est-`a-dire trouver (algorithmiquement) une
permutation πde [[1, n]] telle que T[π(1)] T[π(2)] ≤ ··· ≤ T[π(n)]).
4
Les algorithmes qui nous allons d´ecrire s’appliquent `a un ensemble totalement ordonn´e Eet
`a un tableau Tdont les coefficients sont des ´el´ements arbitraires de E. Le principe de base de ces
algorithmes est le test de comparaison de deux ´el´ements de Eet il est sous-entendu qu’on dispose
d’une m´ethode d’effectuer un tel test. Par hypoth`ese donc, ces algorithmes sont g´en´eriques. Voir
le paragraphe Quelques autres algorithmes de tri un peu plus loin pour une discussion br`eve
de quelques algorithmes sp´eciaux, adapt´es aux ensembles Eposs´edant des propri´et´es particuli`eres
ou dont les ´el´ements poss`edent une repr´esentation particuli`ere.
Op´erations ´el´ementaires : test de comparaison de deux ´el´ements de E, ´echange de deux
´el´ements d’un tableau, extraction d’un sous-tableau.
Remarque. Une liste Ld’´el´ements d’un ensemble Equelconque est une famille de tableaux
d’´el´ements de E(de longueur variable) index´ee par N(ou par les sommets d’un arbre A), tel que
L(n+1) est obtenu de L(n) (ou L(s0) est obtenu de L(s) si (s, s0) est une arˆete de A) par l’ajout ou
la suppression d’un ´el´ement de E(y compris la cr´eation ou suppression d’une liste `a un ´el´ement).
Ce sont des op´erations ´el´ementaires sur une liste.
L’´echange de deux ´el´ements d’un tableau est fait par la suppression de l’un des ´el´ements, puis
de l’autre, puis par l’ajout du deuxi`eme ´el´ement dans l’ancienne position du premier et l’ajout du
premier ´el´ement dans l’ancienne position du second. Cela fait 4 op´erations ´el´ementaires sur une
liste, un nombre ind´ependant du tableau.
La complexit´e d’un algorithme de tri est donc mesur´ee par le nombre de tests de comparaison.
Si on y ajoute les ´echanges nec´essaires, on reste dans le mˆeme ordre de complexit´e Θ.
Tri par insertion. C’est l’algorithme le plus souvent utilis´e par des joueurs de cartes. La
premi`ere ´etape est le tri du sous-tableau (T[1], T [2]). On commence donc en comparant T[2] `a
T[1] : si T[2] < T [1], on ´echange T[2] et T[1] ; dans le cas contraire, on laisse T[1] et T[2] en
place. En g´en´eral, si j2, alors apr`es j1 ´etapes on a une permutation πj1de {1,2, . . . , j 1}
telle que T[πj1(1)] T[πj1(2)] ≤ ··· ≤ T[πj1(j1)] et le reste du tableau est inchang´e. Si
T[j]T[πj1(i)] pour tout ij1, on ne fait rien. Sinon, on bouge T[j] `a gauche pas `a pas
jusque tous les ´el´ements `a gauche de T[j] sont T[j].
Cela signifie qu’on interchange T[j] et T[πj1(j1)], puis T[j] et T[πj1(j2)] et ainsi
de suite jusqu’`a ce que T[j] arrive en bonne position. (Si celle-ci est la position i, on a alors
πj=πj1(j, i, i + 1,··· , j 1).)
Apr`es n1 ´etapes, on obtient une permutation πndes indices tel que T[πn(1)] T[πn(2)]
··· ≤ T[πn(n)] (uniquement d´etermin´e par l’algorithme et unique si les T[i] sont deux-`a-deux
distincts).
Dans la redaction du pseudocode on se sert d’un tableau variable X, (donc X[i] vaut T[i] au
d´ebut et T[πn(i)] `a la fin).
proc´edure: triins(T)(entr´ee : T, un tableau `a n´el´ements ; sortie : Ttri´e par ordre crois-
sant)
variables locales: X(un tableau `a n´el´ements), j,k(entiers v´erifiant 1 k < j
n)
XT
pour jde 2`a n
k=j1
tantque (k > 0et X[k]> X[k+ 1])
´echanger X[k+ 1] et X[k]
kk1
fintantque
5
1 / 66 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !