MP{931,932}Lycée Masséna
Exercice 6. Fonction M91. On considère la fonction suivante :
def f(n):
assert n>=0
if n>100:
return n-10
else:
return f(f(n+11))
Montrer sa terminaison, et déterminer les valeurs prises par f.
Exercice 7. Algorithme de Strassen. On cherche à multiplier rapidement deux matrices carrées à coefficients dans un
anneau commutatif Aquelconque, et on considérera les opérations dans Acomme unitaires.
1. Quelle est, en nombre d’opérations dans A, la complexité du calcul du produit de deux matrices Aet Bde taille
n×nà coefficients dans A, à l’aide des formules classiques ? Écrire une fonction prod_matrices prenant en
entrée deux matrices qu’on supposera de même taille et qui retourne le produit. Une matrice est stockée sous la
forme de la liste de ses lignes, par exemple :
M=
123
456
789
M=[[1,2,3], [4,5,6], [7,8,9]]
En particulier, on accède au coefficient en case (i, j)de Mpar M[i][j]. Attention, lignes et colones sont indexées
à partir de 0. On récupère la taille d’une matrice carrée via len(M).
2. Vérifiez les formules suivantes, valables pour deux matrices de taille 2,2.
a1,1a1,2
a2,1a2,2×b1,1b1,2
b2,1b2,2=P1+P4−P5+P7P3+P5
P2+P4P1−P2+P3+P6
où : P1= (a1,1+a2,2)(b1,1+b2,2)
P2= (a2,1+a2,2)b1,1
P3=a1,1(b1,2−b2,2)
P4=a2,2(b2,1−b1,1)
P5= (a1,1+a1,2)b2,2
P6= (a2,1−a1,1)(b1,1+b1,2)
P7= (a1,2−a2,2)(b2,1+b2,2)
3. En déduire un algorithme récursif (on ne demande pas de le coder !) pour multiplier deux matrices carrées, de
taille une puissance de 2, qui exploite une stratégie diviser pour régner. C’est l’algorithme de Strassen (1969).
4. Justifier que la complexité C(n)de l’algorithme vérifie (en nombre d’opérations dans A) :
C(n)=7×Cn
2+O(n2)
5. Qu’en déduisez-vous sur la complexité de l’algorithme de Strassen ? (Il n’est pas très difficile de passer de nune
puissance de 2 à nquelconque).
6. Imaginons qu’on sache multiplier deux matrices de taille 3×3avec pmultiplications. Quel est la valeur maximale
de pqui permettrait de faire mieux (asymptotiquement) que l’algorithme de Strassen ?
Il est conjecturé que pour tout ε > 0, il existe un algorithme permettant le calcul de deux matrices n×nnécessitant
O(n2+ε)opérations dans A. La meilleure borne connue aujourd’hui (obtenue en 2014 !) est ε= 0.3726639. La
question de la complexité du produit de deux matrices est un problème crucial : on peut montrer que de nombreux
problèmes (résolution de systèmes linéaires, inversion de matrices...) ont la même complexité. En pratique, seul
l’algorithme de Strassen est utilisable (pour faire mieux que l’algorithme naïf) pour des tailles de matrices
réalistes. Le nombre minimal de multiplications nécessaires pour multiplier deux matrices carrées de taille 3 est
également un problème ouvert.
Svartz Page 2/3 2015/2016