Algorithmique pour l'algèbre linéaire Cours 2. Multiplication de polynômes et diviser pour régner Mario Valencia e-mail : valencia@lipn.univ-paris13.fr 18/03/2016 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.
survol du cours Rappels : complexité algorithmique et "Diviser pour Régner" Multiplication classique de polynômes Algorithme naïf de multiplication de polynômes Algorithme de Karatsuba
survol du cours CM1 : Diviser pour régner et multiplication rapide de matrices CM2 : Diviser pour régner et multiplication rapide de polynômes. Évaluation : 2 TPs notés : TP2 et TP4 Cours, Tds et TPs : http ://www-lipn.univ-paris13.fr/ valencia/algo-algebre.html
Rappel Complexité algorithmique (1) : Ordres de grandeur des fonctions On s'intéressera que à borner supérieurement une fonction par une autre : Notation "grand O". On dit qu'une fonction f est un "grand O d'une fonction g " ssi c, n 0 > 0 : n n 0, f (n) c.g(n). Exemple 1 : f (n) = n 3 /2 est un O(n 3 ), avec c = 1 et n 0 = 1. Exemple 2 : f (n) = 5n 2 + 3n est un O(n 2 ), avec c = 8 et n 0 = 1.
Rappel Complexité algorithmique (2) : Propriétés de O O(c.f ) = O(f ) si c est une constante. O(f + g) = O(f ) + O(g) = O(max{f, g}) d i=0 a in i = O(n d+1 ), où les a i sont des coecients d'un polynome de degré d. log a n = O(log 2 n), pour n'importe quelle base a > 0.
Rappel Complexité algorithmique (3) : algorithmes itératifs Les instructions élémentaires (aectation, comparaison) sont en temps constant : O(1). Séquence de blocs : I 1 ; I 2 est de complexité O(max{f 1 (n), f 2 (n)}), où O(f j (n)) est la complexité de I j, avec j {1, 2}. "if (C ) I 1 else I 2 " est de complexité O(max{f (n), f 1 (n), f 2 (n)}), où f (n) est la complexité de C. "for (i=0 ; i<n ; i++) I ;" est de complexité O(nf (n)), où f (n) est la complexité de I. Si la complexité de I dépend de i, alors n 1 la complexité est en O(f (i)). i=0 "while (C ) I ;" est de complexité O(g(n). max{f 1 (n), f 2 (n)}), où f 1 (n) est la complexité de C, f 2 (n) est la complexité de I et g(n) est le nombre de fois que la boucle "while" est exécutée.
Rappel Diviser pour régner (1) De l'adage politique divide ut imperes à une stratégie fondamentale de l'algorithmique. Résoudre le problème P par un algorithme A qui, pour chaque instance I de taille n : 1. coupe l'instance I en 2 (ou plus!) instances I 1 et I 2 2. résout le problème P pour I 1 et I 2 avec l'algorithme A (récursivement!) 3. compose les solutions P(I 1 ) et P(I 2 ) pour produire la solution P(I )
Rappel Diviser pour régner (2) Un algorithme récursif (paradigme "diviser pour régner") a un temps d'exécution : T (n) = at (n/b) + f (n) où n est la taille des entrées, a est le nombre de sous-problèmes, n/b (= n/b ou n/b ) est la taille de sous-problèmes, et f (n) est le temps requis pour diviser et combiner.
Introduction Le produit de polynômes et d'entiers est une opération élémentaire, qui intervient dans un nombre impressionnant d'algorithmes de calcul formel. Exemples d'applications de la multiplication de polynômes : Algorithmes de calcul de pgcd Algorithmes de factorisation en une ou plusieurs variables Algorithmes de composition de séries formelles Algorithmes d'évaluation multipoint et d'interpolation, etc. Certains problèmes, en cryptologie ou en théorie des nombres, nécessitent de manipuler des polynômes de degré de l'ordre de 100000, tailles auxquelles les algorithmes rapides sont indispensables.
Introduction Dans ce cours, on s'intéresse a la complexité arithmétique de la multiplication de polynômes à une variable où les coecients appartient à un anneau commutatif et unitaire. Un anneau (A, +, x) est un ensemble A muni de deux opérations : + et x, appelées usuellement "addition" et "multiplication" resp., vériant : (A, +) est un groupe Abélien ; la multiplication est associative, distributive par rapport à l'addition, et elle possède un élément neutre. Si la multiplication est aussi commutative, alors (A, +, x) est appelé un anneau commutatif. Ex. (Z, +, x), (R, +, x), etc.
Multiplication de polynômes et multiplication d'entiers Considerons les deux exemples suivants : Polynômes : Soient à multiplier 3X 2 + 2X + 1 et 6X 2 + 5X + 4 dans Z[X ]. (3X 2 + 2X + 1) (6X 2 + 5X + 4) = (3.6)X 4 + (3.5 + 2.6)X 3 + (3.4 + 2.5 + 1.6)X 2 + (2.4 + 1.5)X + (1.4) = 18X 4 + 27X 3 + 28X 2 + 13X + 4 Nombres entiers : Soient a multiplier 321 et 654 en base 10. (3.10 2 + 2.10 + 1) (6.10 2 + 5.10 + 4) = (3.6)10 4 + (3.5 + 2.6)10 3 + (3.4 + 2.5 + 1.6)10 2 + (2.4 + 1.5)10 + (1.4) = 18.10 4 + 27.10 3 + 28.10 2 + 13.10 + 4 = 2.10 5 + 9.10 3 + 9.10 2 + 3.10 + 4 = 209934. Dans le deux cas, nous avons retranscrit l'algorithme naïf, et la suite de calculs est essentiellement la même, sauf que pour les entiers, il faut en outre gérer les retenues.
Multiplication de polynômes : algorithme naïf (1) À partir d'ici, on travaillera avec des polynomes F et G à coecients dans un anneau A, ayant un degré au plus n 1. Formellement, F = f 0 + f 1 X +... + f n 1 X n 1 et G = g 0 + g 1 X +... + g n 1 X n 1 ; le probleme est alors de calculer (les coecients de) H = F.G = h 0 + h 1 X +... + h 2n 2X 2n 2.
Multiplication de polynômes : algorithme naïf (2) Ex. H = FG = (1 + 2X + 3X 2 ) (4 + 5X + 6X 2 ) = 4+ 5X + 6X 2 + 8X + 10X 2 + 12X 3 + 12X 2 + 15X 3 + 18X 4 = 4+ 13X + 28X 2 + 27X 3 + 18X 4 L'algorithme : H = FG = 2n 2 i=0 h i X i avec h i = j+k=i f j g k. Complexité : calculer les h i demande O(n 2 ) opérations dans A.
Algorithme de Karatsuba (1) Il est possible de gagner "une" multiplication pour le produit de polynômes de degré 1. Soient les polynomes F = f 0 + f 1 X et G = g 0 + g 1 X. Le produit H = FG s'écrit H = f 0 g 0 + (f 0 g 1 + f 1 g 0 )X + f 1 g 1 X 2. Eectuer les 4 produits f 0 g 0, f 0 g 1, f 1 g 0, f 1 g 1 correspond à l'algo. naïf. Mais, Karatsuba a remarqué que le coecient de X s'écrit f 0 g 1 + f 1 g 0 = (f 0 + f 1 )(g 0 + g 1 ) f 0 g 0 f 1 g 1. Cette écriture mène à un algorithme qui eectue 3 multiplications et 4 additions.
Algorithme de Karatsuba (2) Cas général : On suppose que F et G sont de degré au plus n 1, et que n = 2k (pour l'instant). On pose alors F = F (0) + F (1) X k, G = G (0) + G (1) X k, F (0), F (1), G (0), G (1) ayant de degrés au plus k 1. Le produit H = FG s'écrit H = F (0) G (0) + (F (0) G (1) + F (1) G (0) )X k + F (1) G (1) X 2k
Algorithme de Karatsuba (3) Supposons que n est une puissance de 2. L'algorithme est le suivant Entrée : F, G de degré au plus n 1, n puissance de 2. Sortie : H = FG. 1. Si n = 1, renvoyer FG. 2. Calculer A 1 = F (0) G (0) et A 2 = F (1) G (1) récursivement. 3. Calculer A 3 = F (0) + F (1) et A 4 = G (0) + G (1). 4. Calculer A 5 = A 3.A 4 récursivement. 5. Calculer A 6 = A 5 A 1 et A 7 = A 6 A 2. 6. Renvoyer A 1 + A 7 X n 2 + A 2 X n.
Algorithme de Karatsuba (4) Complexité : T (n) le nombre de multiplications dans A. T (1) = 1. T (n) = 3T (n/2) + 4n. T (n) 9n log 2 3. Donc, T (n) = O(n 1,59 )