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 n≥2 donn´e est un nombre premier. L’algorithme trivial consiste
alors `a tester si nest divisible par un entier mtel que 2 ≤m≤n−1, 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