Feuille d`exercices 3

publicité
Algorithmique
Feuille d’exercices 3: Complexité
1. Écrire un algorithme prenant en argument deux listes d’entiers, et retournant la liste des éléments
communs aux deux listes. Étudier.... sa complexité
2. Pour cette question on s’interdit d’utiliser l’opérateur d’exponentiation **. On pourra quand même
calculer des puissances, mais à l’aide d’une fonction programmée par nos soins. Écrire un algorithme
calculant P (x) pour P ∈ R[X] et x ∈ R. Votre fonction prendra en argument x et la liste des
coefficients de P (le coefficient dominant en premier). Combien d’additions effectue-t-on ? Combien
de multiplications ?
3. SANS utiliser la fonction L.insert, écrire une fonction qui insère une valeur x au bon endroit dans
une liste triée L, et étudier sa complexité dans le pire et dans le meilleur cas.
4. Le tri par insertion d’une liste L consiste à créer une liste G qui est initialement vide donc triée, puis
à y insérer un à un les éléments de L en la maintenant triée. Quelle est sa complexité dans le pire et
dans le meilleur cas ?
5. La fonction divmod de python calcule reste et quotient d’une division euclidienne : (q,r)=divmod(a,b).
Considérons l’algorithme suivant, appelé Exponentiation rapide :
def expo_rapide(x,e):
# Calcule x**e, avec ’x’ entier ou réel et ’e’ naturel
p=1
while e>0 :
q,r=divmod(e,2)
if r==1 :
p=p*x
e=q
x=x*x
return p
— Terminaison et Complexité
(a) Montrer la terminaison de cet algorithme.
(b) En toute généralité la division euclidienne n’est pas une opération élémentaire. Expliquer pourquoi on peut considérer que la division euclidienne par 2 en est une.
(c) Justifier le fait que blog2 (e)c est un variant de la boucle.
(d) En déduire la complexité dans le pire et le meilleur cas, en nombre de multiplications et de
divisions euclidiennes par 2. Justifier le nom donné à cet algorithme.
— Correction
(e) Quelles sont les valeurs successives de p,x,e dans le calcul de expo rapide(α,11), pour un
réel α donné ?
(f) Identifier un invariant de boucle et montrer la correction de l’algorithme.
(g) Écrire une version récursive de l’exponentiation rapide.
1
6. Méthode de Horner (suite de l’exercice 2). Notons P = a1 X n−1 + ... + an−1 X + an .
k
X
Pour tout k ∈ [[0, n]], on pose Dk = a1 X k−1 + ... + ak =
ai X k−i (le quotient de P divisé par X n−k )
i=1
(a) Donner une relation simple liant Dk et Dk+1 , et en déduire une relation liant Dk (x) et Dk+1 (x).
(b) En remarquant que D0 = 0 et Dn = P , proposer un algorithme de calcul de P (x) reposant sur la
relation précédente. Quelle est sa complexité ?
Remarque : William George Horner était anglais, son nom ne s’écrit pas “Hörner”, même si de
nombreux auteurs et enseignants font cette faute.
7. Recherche de zéro par dichotomie.
(a) Écrire une fonction trouve zero(f,a,b,epsilon) qui prend en argument une fonction f et trois
réels a b et ε, avec la garantie que f (a) et f (b) sont de signe opposé. Elle devra retourner un réel
c ∈ [a, b] tel que f s’annule ou change de signe dans l’intervalle [c − ε, c + ε] (ou None si c’est
impossible)
(b) Quelle est sa complexité, en fonction de a, b, et ε ?
(c) Pour quelle raison cette tâche pourrait-elle être impossible ?
(
n si n ∈ {0, 1}
8. Fibonacci rapide. Fn =
On a vu en TP (avec une définition de Fn légèrement
Fn−1 + Fn−2 sinon
différente) un algorithme récursif de calcul de Fn de complexité linéaire.
0 1
Fn−1
Fn
(a) On pose A =
. Vérifier que ∀n ∈ N, An =
(en posant F−1 = 1)
1 1
Fn
Fn+1
(b) Proposer un algorithme de calcul de Fn de complexité logarithmique.
9. Algorithme d’Euclide et suite de Fibonacci
(a) Montrer par récurrence que pour tout n ≥ 1, si a > b et l’algorithme d’Euclide (voir feuille
d’exercices 2) effectue n divisions euclidiennes pour calculer pgcd(a, b), alors a ≥ Fn+2 et b ≥
Fn+1 .
On fixe un n ≥ 1.
(b) En déduire que si Fn+2 > a > b, le calcul de pgcd(a, b) effectue au plus n−1 divisions euclidiennes.
(c) En déduire que ∀a, b si a < Fn+2 et b < Fn+2 , le calcul de pgcd(a, b) effectue au plus n divisions
euclidiennes.
(d) Conclure quant à la complexité de l’algorithme
d’Euclide, en utilisant le fait que
√
1+ 5
n
−n
Fn = k(ϕ − (−ϕ) ), avec ϕ = 2 et k = ϕ2ϕ+1 .
10. Opérations dans R[X]. On représentera un polynôme par la liste de ses coefficients (coefficient dominant en premier)
(a) Écrire une fonction calculant le produit d’un polynôme par un scalaire, et étudier sa complexité.
(b) Écrire une fonction calculant la somme de deux polynômes, et étudier sa complexité.
(c) Écrire une fonction calculant le produit de deux polynômes, et étudier sa complexité.
(d) Écrire une fonction effectuant la division euclidienne de deux polynômes, et étudier sa complexité.
2
Téléchargement