• Aucun résultat trouvé

Identit´ e de polynˆ omes

Dans le document Notes de programmation (C) et d'algorithmique (Page 135-139)

Soient p et q deux polynˆomes (en plusieurs ind´etermin´ees). On cherche `a d´eterminer s’ils sont identiques, ou de fa¸con ´equivalente `a savoir si le polynˆome p − q est z´ero partout. Une fa¸con de r´esoudre ce probl`eme est d’´ecrire les polynˆomes p et q comme somme de monˆomes et d’en comparer les coefficients. Cette approche peut demander un nombre exponentiel de multiplications. Par exemple, consid´erez le polynˆome :

Πi=1,...,n(xi+ xi+1) .

Par contre, l’´evaluation d’un polynˆome sur un point demande un nombre de multiplications qui est lin´eaire dans la taille du polynˆome. La strat´egie pour d´eterminer si un polynˆome est z´ero partout consiste donc `a l’´evaluer sur un certain nombre de points choisis de fa¸con al´eatoire. On a donc besoin d’estimer la probabilit´e de tomber sur un z´ero du polynˆome. Le point de d´epart est un r´esultat standard sur les racines d’un polynˆomes.

Proposition 18 Soit p(x) un polynˆome dans une ind´etermin´ee x et de degr´e d. Si p(x) 6= 0 alors p(x) admet au plus d racines diff´erentes.

Preuve. On peut utiliser la proposition 9 qui passe par les matrices de Vandermonde. On pr´esente ici une preuve alternative par r´ecurrence sur d. Si d = 0 alors p(x) est constant et si p(x) 6= 0 alors il a 0 racines. Si d > 0 et p(a) = 0 alors par la propri´et´e de la division sur les polynˆomes ils existent uniques p0(x) et r(x) tels que p(x) = p0(x)(x − a) + r, le degr´e de p0(x) est d − 1 et le degr´e de r est 0. De plus on doit avoir : p(a) = r = 0. Par hypoth`ese de r´ecurrence, p0(x) a au plus d − 1 racines et donc p(x) a au plus d racines. 2 Notation Soit X un ensemble fini. On utilise la notation x ← X pour affecter `a la variable x un ´el´ement de l’ensemble X avec probabilit´e uniforme.

Corollaire 1 Soit p(x) 6= 0 un polynˆome avec une ind´etermin´ee x et degr´e d sur un corps F . Soit F0 ⊆ F tel que ]F0 = f . Alors :

P (a ← F0: p(a) = 0) ≤ d f .

Preuve. Le polynˆome a au plus d racines dans F et donc au plus d racines dans F0. 2 Par exemple, si l’on prend f = 2d la probabilit´e de tomber sur une racine du polynˆome est au plus 1/2. Si l’on r´ep`ete le test 100 fois en choisissant des ´el´ements a1, . . . , a100de F0 de fa¸con ind´ependante alors si p(ai) = 0 pour i = 1, . . . , n on peut affirmer que p = 0 avec une probabilit´e d’erreur born´ee par 2−100. Ce r´esultat se g´en´eralise `a des polynˆomes en plusieurs ind´etermin´ees (un r´esultat connu aussi comme lemme de Schwartz-Zippel).

Proposition 19 Soit p(x1, . . . , xm) 6= 0 un polynˆome en m ind´etermin´ees x1, . . . , xm avec d comme degr´e maximal de chaque ind´etermin´ee. Le polynˆome ´etant sur un corps F , soit F0 ⊆ F tel que ]F0 = f . Alors :

P (a1, . . . , am← F0 : p(a1, . . . , am) = 0) ≤ m · d

Algorithmes probabilistes 135

Preuve. Par r´ecurrence sur m. Pour m = 1 on applique le corollaire 1. Pour m > 1 on peut r´e´ecrire p(x1, . . . , xm) en factorisant la variable x1 :

p(x1, . . . , xm) = Σi=0...,d x1i · pi(x2, . . . , xm) . (17.3) Comme p 6= 0 il existe j tel que pj 6= 0. Tirons a1, a2, . . . , am avec probabilit´e uniforme. On pose :

p0(x1) = p(x1, a2, . . . , am) . Si p(a1, . . . , am) = 0 alors on a deux situations possibles :

1. pi(a2, . . . , am) = 0 pour i = 0, . . . , d.

2. ∃ i pi(a2, . . . , am) 6= 0 et p0(a1) = 0 (avec p0(x1) 6= 0 car pi(a2, . . . , am) 6= 0). La probabilit´e de la premi`ere situation est born´ee par :

P (a2, . . . , am ← F0: pj(a2, . . . , am) = 0) ≤ d · (m − 1)

f ,

et la probabilit´e de la deuxi`eme est born´ee par :

P (a1 ← F0: p0(a1) = 0) ≤ d f , et on conclut en observant : d · (m − 1) f + d f = d · m f . 2 Exemple 59 Les polynˆomes ont une propri´et´e remarquable : s’ils sont diff´erents alors ils sont diff´erents presque partout. Cette propri´et´e est souvent utilis´ee pour amplifier les diff´erences entre deux structures discr`etes (par exemple, dans le cadre des codes correcteurs d’erreurs). On donne un petit exemple de cette application. Consid´erez les expressions bool´eennes suivantes :

A = (¬x1· x2+ x1· ¬x2) · x3+ x1· x2 , B = (¬x1· x2+ x1) · x3 .

Dans une expression bool´eenne, les variables varient sur l’ensemble 2 = {0, 1}. Les symboles ¬, · et + indiquent la n´egation, la conjonction et la disjonction logique, respectivement. On aimerait savoir si pour toute affectation de valeurs bool´eennes aux variables, A et B produisent toujours le mˆeme r´esultat.

Si on ´echantillonne x1, x2, x3 dans 2 de fa¸con uniforme, la probabilit´e de distinguer ces expressions est 1/23(il y a une seule affectation qui distingue les deux expressions). Il se trouve qu’on peut voir ces expressions comme des polynˆomes. Pour ce faire, on replace la n´egation ¬x par (1 − x) et la conjonction et la disjonction par le produit et la somme, respectivement. On obtient ainsi :

pA= ((1 − x1) · x2+ x1· (1 − x2)) · x3+ x1· x2 , pB= ((1 − x1) · x2+ x1) · x3 . Les expressions en question sont dans une classe d’expressions pour laquelle on peut montrer que deux expressions sont ´equivalentes ssi elles induisent le mˆeme polynˆome. Ainsi, pour distinguer A et B, on peut ´echantillonner x1, x2, x3 dans Z7= {0, 1, . . . , 6} et dans ce cas la probabilit´e de distinguer pA de pB est 216/343 !

Remarque 19 C’est un probl`eme ouvert important de savoir s’il existe un algorithme d´eterministe polynomial en temps pour d´ecider de l’identit´e de deux polynˆomes `a plusieurs variables.

Chapitre 18

Arbres binaires de recherche

Soit A un ensemble fini d’´el´ements que l’on peut comparer avec un ordre total. On cherche une fa¸con de repr´esenter A qui nous permet d’effectuer (au moins) les op´erations suivantes de fa¸con efficace :

— insertion d’un ´el´ement dans A, — test d’appartenance,

— ´elimination d’un ´el´ement de A.

Si l’on repr´esente un ensemble avec n ´el´ements comme une liste (ordonn´ee ou non-ordonn´ee) ces op´erations coˆutent O(n). On va ´etudier une repr´esentation bas´ee sur des arbres binaires de recherche (binary search trees en anglais, ABR en abr´eg´e) qui permet d’effectuer les op´erations en O(h) o`u h est la hauteur de l’arbre qui repr´esente l’ensemble.

18.1 Op´erations

D´efinition 16 (ABR) Un ABR est un arbre dans le sens de la d´efinition 6 et qui en plus satisfait la condition suivante : la valeur de chaque noeud est sup´erieure `a la valeur de chaque noeud dans le sous-arbre gauche et est inf´erieure `a la valeur de chaque noeud dans le sous-arbre droit.

On fait l’hypoth`ese que chaque noeud est repr´esent´e par une structure avec 3 champs : val valeur

left pointeur fils gauche right pointeur fils droit

Un ABR vide nil est typiquement repr´esent´e par un pointeur NULL. On ´etudie un certain nombre d’op´erations dont la programmation est directe si l’on utilise les appels r´ecursifs. Avec l’exception de l’op´eration d’impression qui est lin´eaire dans la taille de l’ABR, toutes les autres op´erations sont lin´eaires dans la hauteur de l’ABR.

Impression L’impression par ordre croissant d’un ABR correspond `a une visite en pro-fondeur d’abord et de gauche `a droite de l’arbre. R´ecursivement :

— On imprime le sous-arbre gauche. — On imprime le noeud.

— On imprime le sous-arbre droit.

Insertion Pour ins´erer un ´el´ement x on navigue dans l’ABR jusqu’`a trouver :

— soit x : dans ce cas on ne fait rien. — soit la feuille nil o`u il faut placer x.

Appartenance Pour d´eterminer si un ´el´ement x est dans l’ABR on navigue dans l’arbre jusqu’`a trouver :

— soit x : dans ce cas on peut rendre un pointeur au noeud. — soit nil : dans ce cas on peut rendre un pointeur NULL.

Minimum Pour trouver le minimum de l’ABR il suffit de suivre toujours le branchement gauche jusqu’`a trouver un noeud dont le fils gauche est nil.

´

Elimination du minimum Pour ´eliminer l’´el´ement minimum on commence par suivre le branchement gauche jusqu’`a trouver un noeud dont le fils gauche est nil. Ensuite on remplace ce noeud par son fils droit (il peut ˆetre nil).

´

Elimination Pour ´eliminer un ´el´ement x dans l’ABR on navigue dans l’arbre jusqu’`a trouver :

— soit nil et on ne fait rien. — soit x et on distingue 3 cas :

1. x a 0 fils. Le p`ere de x va pointer vers NULL. 2. x a 1 fils. Le p`ere de x va pointer vers le fils de x. 3. x a 2 fils. On transforme l’arbre comme suit :

(x, l, r) → (min(r), l, mindel(r)) `

a savoir le minimum du sous-arbre droite remplace x et on ´elimine le minimum du sous-arbre droite alors que le sous-arbre gauche n’est pas modifi´e. Une so-lution sym´etrique o`u on modifie le sous-arbre gauche est possible. Il est aussi possible de combiner en une seule op´eration la recherche du minimum avec son ´elimination.

D’autres op´erations comme la recherche de l’´el´ement maximum et la recherche du successeur (ou du pr´ed´ecesseur) d’un ´el´ement donn´e peuvent ˆetre r´ealis´ees en suivant les mˆemes id´ees. On peut aussi se compliquer un peu la tˆache en impl´ementant toutes les op´erations sans appels r´ecursifs et/ou en g´erant explicitement la r´ecup´eration de la m´emoire.

Dans le document Notes de programmation (C) et d'algorithmique (Page 135-139)