• Aucun résultat trouvé

Une version pratique

Nous venons de voir dans ce d´ebut de chapitre un algorithme qui uti- lise une d´ecomposition de f en sous-fonctions de mani`ere `a prouver que f n’admet pas d’annulateur de degr´e donn´e. La d´ecomposition consid´er´ee ´etait de profondeur fixe, mais il est possible de faire varier cette profondeur. Pour une fonction f donn´ee, la meilleure d´ecomposition est celle la plus profonde possible telle qu’aucune sous-fonction n’admette d’annulateur du degr´e maximum requis.

On va utiliser l’ordre usuel sur les monˆomes qui va en fait nous per- mettre de travailler sur cette meilleure d´ecomposition. Cela va nous conduire `

a un nouvel algorithme plutˆot efficace en pratique et qui va mˆeme nous permettre de calculer les annulateurs s’ils existent. Malheureusement, une analyse pr´ecise de la complexit´e de cet algorithme est d´elicate, nous avons juste une borne sup´erieure de la complexit´e quand l’algorithme 13.5 aurait r´epondu oui, et mˆeme dans ce cas la borne est l´eg`erement sup´erieure `a O(k). L’algorithme est donn´e ci-dessous, ses relations avec l’algorithme 13.5 peuvent sembler obscures mais elles seront ´eclaircies plus loin.

Algorithme 13.11 (Algorithme incr´emental [DT06]). L’entr´ee est une fonc- tion bool´eenne en m variables et un param`etre r. La sortie est une base de l’espace des annulateurs de f de degr´e au plus r. Ces fonctions sont stock´ees sous la forme des coefficients de leur ANF. On utilise l’ordre usuel sur Fm2 et l’on num´erote les monˆomes de poids au plus r de 1 `a k.

1. [initialisation] Initialiser une pile S vide, cette pile va finir par contenir une base des annulateurs de f . Mettre l’indice du monˆome courant i `a 0. Choisir x comme la premi`ere valeur de Fm

2 telle que f (x) = 1.

2. [Empiler ?] Tant que le monˆome d’indice (i + 1) est plus petit ou ´egal `a x, empiler dans S la fonction monˆome correspondante et incr´ementer i. 3. [D´epiler ?] S’il y en a, trouver la fonction la plus proche du sommet de

S qui s’´evalue en 1 au point x. L’additionner `a toutes les autres fonctions de S qui valent 1 au point x et la retirer de S.

4. [Saut ?] Si S est vide, mettre dans x la valeur du (i + 1) monˆome moins 1.

5. [Boucle ?] Si possible, incr´ementer x jusqu’`a ce que f (x) = 1 et aller en 2.

6. [Fin] Ex´ecuter une derni`ere fois l’´etape 2 et retourner la base courante stock´ee dans S.

La preuve que cet algorithme renvoie bien une base de l’espace des an- nulateurs de f d´ecoule directement du lemme suivant.

Lemme 13.12. D´efinissons A<x(et respectivement A≤x) comme l’ensemble

des fonctions bool´eennes g `a m variables engendr´ees par les monˆomes de degr´e au plus r et plus petits ou ´egaux `a x qui v´erifient f (y)g(y) = 0 pour tous les points y strictement plus petits que x (respectivement inf´erieurs ou ´egaux `a x). Alors :

– [´Etape 2] L’ensemble S apr`es la fin de l’´etape 2 est une base de A<x.

– [´Etape 3] L’ensemble S apr`es la fin de l’´etape 3 est une base de A≤x. – [´Etape 4] L’ensemble S apr`es la fin de l’´etape 4 est une base de A≤x,

mˆeme si x a chang´e durant l’´etape 4.

– [´Etape 5] Soit x−la valeur de x `a l’entr´ee de l’´etape 5, apr`es ex´ecution de cette ´etape on a f (x−) = f (x) = 1 et f (y) = 0 pour y dans ]x−, x[. D´emonstration. Le point clef est que la valeur d’une fonction bool´eenne aux points x ne d´epend que des monˆomes inf´erieurs ou ´egaux `a x comme on l’a vu au chapitre 3 dans la proposition 3.10.

Tout d’abord les assertions pour les ´etapes 4 et 5 sont claires. Pour l’´etape 4, avancer le x comme on le fait n’introduit aucun nouveau monˆome dans la d´efinition de A≤x qui reste donc l’espace r´eduit `a la fonction nulle. Maintenant raisonnons par r´ecurrence sur le nombre de fois que l’on ex´ecute l’´etape 2 pour montrer les assertions des ´etapes 2 et 3.

L’initialisation est claire, consid´erons donc une nouvelle ´etape 2 pour la- quelle toutes les assertions du lemme sont valides avant son ex´ecution. Dans l’´etape 2, on empile dans S toutes les fonctions monˆomes u de poids au plus r comprises dans l’intervalle ]x−, x]. D’apr`es l’hypoth`ese de r´ecurrence, f (y) vaut justement 0 pour tout y dans ]x−, x[, il est alors facile de v´erifier que tous les ´el´ements dans S appartiennent `a A<x. Ils sont ´egalement clairement

ind´ependants.

Consid´erons maintenant un ´el´ement g de A<x et d´ecomposons le par

g = g≤x−+ g>x−, o`u les monˆomes de l’ANF de ces deux fonctions v´erifient

les in´egalit´es donn´ees en indice. g≤x− appartient n´ecessairement `a A

≤x−

(c’est le point clef rappel´e en d´ebut de d´emonstration), il est donc g´en´er´e par les ´el´ements de S. La fonction g>x− est ´egalement engendr´ee par les

´el´ements dans S que nous venons de rajouter. S est donc bien une base de A<x. L’assertion de l’´etape 3 en d´ecoule, d’o`u le lemme.

Remarque 1 L’´etape 4 peut sembler surprenante car son omission ne change en rien le d´eroulement de l’algorithme. N´eanmoins elle est essentielle pour obtenir une faible complexit´e car elle permet d’´eviter de tester un grand nombre de points pour lesquels f (x) vaut pourtant 1 mais qui n’apportent rien.

Remarque 2 Dans l’´etape 3, prendre l’´el´ement le plus proche du sommet de la pile est une heuristique qui permet d’am´eliorer le temps d’ex´ecution de l’algorithme. En d´efinissant le monˆome de queue d’une fonction f comme le plus petit monˆome apparaissant dans son ANF, plus on est pr`es du sommet de la pile, plus grand est ce monˆome de queue. Au final, prendre l’´el´ement le plus proche du sommet aura tendance `a r´eduire le nombre de monˆomes dans l’ANF de la fonction choisie qui sera donc plus facile `a additionner avec les autres.

Remarque 3 Sur des applications pratiques, il arrive qu’une fonction ad- mette un annulateur de faible degr´e, il existe alors plusieurs fa¸cons de mo- difier l’algorithme pour le trouver plus vite. Quand on sait qu’il y a un annulateur, on peut modifier l’´etape 4 pour sauter au monˆome suivant d`es que S est de dimension 1 (o`u mˆeme un peu plus), cela nous fait vraiment gagner beaucoup de temps comme on le verra dans la derni`ere section. On peut aussi r´eduire artificiellement le poids de f , on aura alors `a la fin un espace de candidats pour les annulateurs qui sera souvent de petite dimen- sion, on pourra alors retrouver les vrais annulateurs en essayant les divers candidats de cet espace.

Int´eressons-nous maintenant `a la complexit´e de cet algorithme. Dans le pire des cas, il a la mˆeme complexit´e qu’une ´elimination gaussienne classique

en O(|f|k2). En effet, pour chaque point x tel que f (x) = 1 il faut ´evaluer toutes les fonctions de S en x, cette complexit´e est born´ee par un O(|S|k). Il arrive aussi que l’on doive ajouter certaines fonctions de S entre elles, ce qui se fait en O(|S|k). Comme S contient au plus k fonctions, on obtient bien une complexit´e dans le pire des cas de O(|f|k2). Bien sˆur en pratique, |S| reste faible et l’algorithme se comporte beaucoup mieux.

On a d’ailleurs un r´esultat th´eorique sur ce comportement moyen grˆace aux relations avec l’algorithme 13.5 lorsqu’il renvoie “Oui j’ai prouv´e que la fonction f n’avait pas d’annulateur de degr´e au plus r”. Ap- pelons algorithme 13.5∗une version modifi´ee de l’algorithme 13.5 qui utilise `a

l’´etape 2 (c’est celle qui ´evalue l’immunit´e alg´ebrique sur les sous-fonctions) l’algorithme 13.11 `a la place de l’´elimination gaussienne paresseuse. On a alors le r´esultat suivant :

Proposition 13.13 (Complexit´e de l’algorithme incr´emental). La com- plexit´e de l’algorithme 13.11 est born´ee sup´erieurement par la plus petite complexit´e de l’algorithme 13.5∗ lorsque ce dernier renvoie Oui, le mini- mum sur la complexit´e ´etant pris sur toutes les d´ecompositions de f pour lesquelles les sous-fonctions n’ont pas d’annulateur.

D´emonstration. Supposons donc que l’on applique l’algorithme 13.5∗ sur

une d´ecomposition de f pour laquelle il renvoie oui. Consid´erons la premi`ere sous-fonction (la plus `a gauche) pour laquelle on recherche des annulateurs de degr´e au plus r. Cette sous-fonction n’est rien d’autre que la restriction de f sur l’intervalle [0, a[ o`u a est de la forme 2m′ avec m′ le nombre de variables de la sous-fonction. L’algorithme 13.5∗ co¨ıncide avec l’algorithme 13.11 sur cette sous-fonction et trouve qu’il n’y a pas d’annulateur.

La seconde sous-fonction consid´er´ee par l’algorithme 13.5∗ est une res- triction de f sur un intervalle de la forme [a, b[, et ce sera aussi le cas pour toutes les autres sous-fonctions consid´er´ees. Ces intervalles sont cons´ecutifs et sont ´egalement examin´es par l’algorithme 13.5∗ de mani`ere cons´ecutive. Comme ce dernier va prouver qu’il n’existe pas d’annulateur du degr´e voulu pour chacun de ces intervalles, l’algorithme 13.11 va de lui mˆeme s’appliquer ind´ependamment `a chacun de ces intervalles. En fait, chaque fois que x pas- sera l’une des bornes de ces intervalles, S ne contiendra aucun monˆome et toutes les fonctions consid´er´ees par la suite ne d´ependront plus des monˆomes avant x. On en d´eduit la proposition.

Malgr´e cette r´eduction, il reste le probl`eme que l’algorithme 13.11 est moins efficace que l’algorithme d’´elimination gaussienne paresseuse (algo- rithme 13.1) sur les sous-fonctions. La complexit´e moyenne de ce dernier est en effet de O(rk3) alors que la complexit´e dans le pire des cas de l’algorithme

13.11 est de O(2mk2). En revanche sur les fonctions associ´ees `a un r′ de 0 on a bien une complexit´e moyenne en O(1) grˆace `a l’´etape 4, on en d´eduit donc le r´esultat suivant :

Proposition 13.14. La complexit´e de l’algorithme 13.5∗ appliqu´e `a la d´ecomposition utilis´ee pr´ec´edemment est de O(k log2m).

D´emonstration. La d´emonstration est la mˆeme que pour le th´eor`eme 13.7 en rempla¸cant la complexit´e de l’algorithme de Gauss paresseux par O(2m′

k′2)

`

a la place de O(rk′3).