Académique Documents
Professionnel Documents
Culture Documents
Algorithme
1. Une définition
Un algorithme est la description d'une succession de directives permettant de passer, en un
nombre fini d'étapes, d'un état initial comportant un nombre fini de données à un état final qui
est son objectif.
L'exécution d'un algorithme ne doit pas laisser place à l'interprétation ou à l'imagination.
Exemple :
Trier en ordre croissant les listes T = [1,6,1,8,0,3,3,9,8,8,7,5] et U = [7,6,5,4,3,2,1].
Le tri de la liste U se fait sans problème mentalement, alors que ce sera le pire cas dans
certains algorithmes de tri.
Remarque :
Les problèmes algorithmiques ne sont pas spécifiques aux mathématiques.
Par exemple : trier une liste de noms par ordre alphabétique, trouver un mot dans un
dictionnaire, sortir d'un labyrinthe ...
{ u 0 =0 et u 1 =1
∀ n ∈ℕ ,u n 2 = u n u n 1
.
Exemple 1:
Dans l'algorithme de calcul des termes de la suite de Fibonacci, pour évaluer le temps
d'exécution du programme, on s'intéresse à Tn, le nombre de fois où la boucle est exécutée
pour le calcul de un . Or on a Tn = n – 2 ; si on ne tient pas compte de la taille des opérandes
(qui devient ici rapidement très grande), le temps d'exécution est donc de la forme a + bn. La
complexité de cet algorithme est linéaire.
Exemple 2 :
Si on dispose d'un langage récursif, on peut proposer un autre algorithme de calcul des termes
de la suite de Fibonacci : définition de f(n)
si n < 2, f(n) ← n
sinon f(n) ← f(n-1) + f(n-2)
Si on note Tn le nombre d'appels récursifs pour calculer f(n), on a T0 = T1 = 0 et
∀ n 2, T n =2 T n −1T n −2 .
On peut démontrer par récurrence que :
→ Tn = 2un – 2, pour tout entier n > 0, où (un) est la suite de Fibonacci
→ ∀ n ∈ℕ ,u n =n −−1 n , où Ф désigne le nombre d'or.
Donc lorsque n est grand, Tn est de l'ordre de Фn. Cet algorithme, bien que très court dans son
écriture, a une complexité exponentielle.
2. Bases de numération
Exercice 1 :
1°) Écrire un algorithme permettant d'obtenir l'écriture en base 2 d'un nombre n à partir de
son écriture décimale.
2°) Même exercice avec la base 60. Donner une application de ce calcul.
3°) Généraliser l'algorithme obtenu au 1°) à une base b, où 1< b < 10 et construire une feuille
de calcul permettant d'effectuer la conversion d'un nombre de la base 10 à la base b.
Exercice 2 :
Deux temps t1 et t2 sont donnés en heures, minutes et
secondes. Les valeurs sont rentrées dans un tableur.
Trouver les formules permettant d'exprimer sur la ligne
4 le temps t1 + t2 en heures, minutes et secondes.
4. Algorithme d'Euclide
Cet algorithme permet de déterminer le PGCD de deux entiers naturels a et b :
1. Déterminer le reste r de la division euclidienne de a par b.
2. Si r = 0, alors l'algorithme se termine et PGCD(a ; b) = r
3. Sinon, remplacer a par b, b par r et recommencer à partir de (1).
Remarques :
- L'étape 3 est basée sur le fait que PGCD(a ; b) = PGCD(b ; r).
- L'algorithme se termine après un nombre fini de pas puisque les restes obtenus forment une
suite strictement décroissante d'entiers naturels.
1°) Écrire un programme sur calculatrice correspondant à l'algorithme précédent.
2°) Utiliser ce programme pour :
- déterminer le PGCD de 1569872 et de 16436.
- déterminer les diviseurs communs de 33264 et 222222.
En Pascal-Kylix-Delphi "Borland" En C
program fibonacci; /* Suite de Fibonacci en C */
{$APPTYPE CONSOLE}
uses
SysUtils; float Fibo (int n)
var resultat: int64; {
/* un+2=un+1+un */
function Fibo(n:integer):int64; int i;
var un2,un1,un,i : int64; float un,un1,un2;
begin un=0;
un:=0; un1=1;
un1:=1; un2=1;
un2:=1; i=2;
i:=2; while (i<n)
while (i<n) do {
begin un=un1;
un:=un1; un1=un2;
un1:=un2; un2=un1+un;
un2:=un1+un; i++;
i:=i+1; }
end; return un2;
Fibo:=un2; }
end;
void main()
begin {
// corps du programme float resultat=Fibo(50);
resultat:=Fibo(50); printf("fibo(50)=%E \n",resultat);
writeln('Fibo(50)='+inttostr(resultat)); }
end.
En Perl Calculatrice TI 89
#!/usr/bin/perl -w Fibo()
sub Fibo{ Prgm
# un+2=un+1+un Prompt n
my $un=0; 0→u
my $un1=1; 1→v
my $un2=1; 1→w
my $n=$_[0]; 2→i
my $i=2; While i<n
while ($i<$n) { v→u
$un=$un1; w→v
$un1=$un2; v+u→w
$un2=$un1+$un; i+1→i
$i=$i+1; Endwhile
} Disp w
return $un2; Endprgm
}
my $resultat=&Fibo(50);
print"Fibo(50)=$resultat \n";