• Aucun résultat trouvé

2.3 Approximation polynomiale sous contrainte discrète

2.3.7 Algorithme FPminimax

Nous pouvons à présent revenir coller les morceaux qui permettent de résoudre notre problème initial. On se donne n+ 1 fonctions de base ϕ0, . . . , ϕn continues sur un intervalle [a, b] et une fonction continue à approcher g. En outre, on se donne une liste de n+ 1 formats (virgule fixe, virgule flottante ou expansions de flottants). On cherche à obtenir rapidement un « polynôme » p = Pnj=0ajϕj dont les coefficients soient représentables sur les formats demandés et tel que kp−gk soit petit.

Voici tout d’abord le schéma général de l’algorithme (nous le détaillerons ensuite point par point) : 1. Avant tout, on calcule le « polynôme » de meilleure approximation à coefficients réelsp (voir

sections2.2.5et2.2.6).

2. On se ramène au cas où les coefficients sont des entiers.

3. On choisit (au moins) n+ 1 points (ou éventuellement plus)z0, . . . , zn : on cherche à inter-poler p aux points zi de manière approchée.

4. Formellement, il s’agit d’un problème de plus proche vecteur dans un réseau euclidien Γ : on le résout de façon approchée avec l’algorithme de Babai.

Heuristique pour se ramener au cas entier

Nous avons vu en section 2.3.3 une méthode rigoureuse pour nous ramener au cas où les co-efficients sont entiers : nous avons construit un polytope P (voir page 102 et suivantes) et nous nous sommes servis des projections orthogonales du polytopeP pour encadrer la valeur de chaque coefficient.

Ceci nous a permis de déterminer la partie haute des expansions de flottants (voir exemple2.32) : ainsi nous nous sommes ramenés au cas où les coefficients étaient tous des nombres en virgule fixe ou en virgule flottante.

De même, les encadrements fournis par les projections orthogonales nous ont permis de déter-miner les exposants des nombres flottants (voir exemple 2.35). Nous nous sommes ainsi ramenés au cas où les coefficients étaient tous en virgule fixe. En remplaçant les fonctions de base ϕj par des fonctions de la forme ϕj/2Ej, on est alors ramené au cas où les coefficients inconnus sont des entiers.

Cette méthode présente l’avantage de la rigueur. Cependant, elle est un peu lourde à mettre en œuvre. En effet, il faut :

– choisir avec soin les pointsxi qui servent à construire le polytopeP;

– choisir une erreurεcible suffisamment petite pour que les projections orthogonales fournissent des encadrements fins ;

– et réaliser lesn+ 1 projections (soit 2n+ 2 appels à l’algorithme du simplexe).

Si, comme c’est le cas désormais, on ne cherche pas à obtenir la liste des polynômes optimaux mais seulement à avoir rapidement de bons polynômes, on peut accepter de mettre en place une heuristique pour se ramener au cas de coefficients entiers. Si, au bout du compte, on obtient un polynôme p de bonne qualité et dont les coefficients respectent les formats, il n’y a pas lieu de chercher à être plus rigoureux. D’ailleurs, si p est vraiment de bonne qualité, il est toujours possible d’utiliser la méthode des projections en prenant εcible = kp−gk et en choisissant les extrema de p−g pour points xi (à la manière de ce que nous avons fait dans l’exemple 2.35) :

les encadrements obtenus sont alors généralement de bonne qualité et permettent de conclure rigoureusementa posteriori.

Expansions de flottants. Pour gérer les expansions de flottants, on utilise simplement la re-marque suivante : tout nombre flottant sur 107 bits est représentable sur un double-double et tout nombre flottant de 161 bits est représentable sur un triple-double. La réciproque est fausse : par exemple 1 + (2531) 2−115 est un double-double mais n’est pas représentable sur moins de 116 bits. Ceci correspond à un « trou » entre les deux termes du double-double. Plus précisément, considérons un double-double xh+x (avec |xh| ≥ |x|) : si le bit de poids faible de xh est plus grand que le bit de poids fort de x, le développement binaire de x = xh +x contient une série de 0 consécutifs (ou de 1 consécutifs sixh etx sont de signes différents). Dans notre exemple :

1 +2531

2115 = 1,0· · ·0

| {z }

xh

0· · ·0

| {z }

10 zéros

11· · ·1

| {z }

x

.

Si un coefficientaj doit être représenté sur un double-double, on peut souvent faire l’hypothèse que le trou entre les deux doubles sera relativement petit. En choisissant de représenter aj sur un nombre flottant de 107 bits, on perd donc un peu en précision, mais sans doute pas trop.

Détermination des exposants. Pour déterminer les exposants, nous proposons l’heuristique suivante. On peut penser que p n’est pas très différent de p (c’est l’hypothèse que nous faisons lorsque nous cherchons p comme polynôme interpolateur approché de p). Par conséquent, nous pouvons supposer que le coefficient aj inconnu sera assez proche du coefficient aj de p. Ainsi, l’exposant de ej est probablement le même que l’exposant de aj. Ceci donne donc un premier jeu d’exposants e0, . . . , en. On est alors ramené à un problème à coefficients entiers que l’on résout à l’aide de l’algorithme de Babai.

On obtient ainsi un polynômep. Il se peut que nous nous soyons trompés : certains coefficientsaj

de p peuvent alors avoir un exposant ej différent de celui qu’on avait initialement deviné. Dans ce cas, on peut imaginer que les exposants ej sont corrects et recommencer avec ce nouveau jeu d’exposants. Et ainsi de suite jusqu’à ce que les exposants se stabilisent. En pratique, cette stratégie s’arrête en une ou deux étapes la plupart du temps.

Remarque 2.53. Les trous dans les expansions peuvent être traités avec la même heuris-tique. Supposons qu’un coefficientaj doive être représenté sur un double-double. Si on fait l’hypothèse suivant laquelleaj ≃aj, on peut regarder s’il y a un trou dansaj après le53ebit et quelle est sa taille (pour reprendre notre exemple, supposons un trou de taille 10). On peut alors chercheraj comme un nombre flottant sur 116bits.

Si l’hypothèse était correcte, on va effectivement obtenir un coefficientaj sur116bits faisant apparaître un trou de10 bits. Il sera donc représentable exactement par un double-double.

Choix des points d’interpolation

Si la condition de Haar est remplie, le théorème d’alternance (théorème2.5 page80) est vérifié et p −g oscille donc au moins n+ 2 fois entre ses valeurs extrêmes. En appliquant le théorème des valeurs intermédiaires entre deux extrema successifs, on en déduit quep−ga au moins n+ 1 zéros dans l’intervalle [a, b]. Notonszi ces zéros : alors par définitionp(zi) =g(zi). Autrement dit, p interpole la fonction g aux points zi. Il est alors raisonnable de prendre ces points-là pour la construction du réseau Γ : en effet, une solutionp du problème d’interpolation approchée vérifiera

alors pour tout i, p(zi) ≃p(zi) = g(zi). Autrement dit, p sera proche non seulement de p mais aussi deg, ce que nous voulons en fin de compte.

Évidemment, lorsque la condition de Haar n’est pas remplie, p −g peut ne pas avoir n+ 1 racines. Dans ce cas, il semble raisonnable d’utiliser des points bien répartis dans l’intervalle. Les points correspondants aux zéros du polynôme de Tchebychev de degré n+ 1 sont généralement un bon choix pour faire de l’interpolation [Che82, Chap. 3, Sec. 2] :

zi = a+b

Une fois qu’on s’est ramené à un problème à coefficients entiers et qu’on a choisi des pointszi, il nous reste à interpoler p de manière approchée aux points zi. Formellement, en posant

bj = tj(z0), . . . , ϕj(zn)) et v= t(p(z0), . . . , p(zn)), proche de v. Pour résoudre ce problème, nous réduisons la base B en une base B à l’aide de l’algorithme LLL, puis nous utilisons l’algorithme de Babai avec la base B pour trouver une approximationtdu CVP. Ceci nous donne l’expression du vecteurtdans la baseB:t=Pnj=0ajbj. Pour résoudre le problème initial, il suffit alors de changer de base et d’écrire t dans la base B : t = Pnj=0ajbj. Les coefficients aj ainsi obtenus fournissent une solution approchée au problème d’interpolation.

Évidemment, cet algorithme est uniquement heuristique ; nous commettons deux approxima-tions :

– d’abord nous remplaçons le problème d’approximation en norme sup par un problème d’in-terpolation approchée au sens de la norme euclidienne. Une solution approchée au problème d’interpolation fournit en général un bon polynôme, mais il n’a aucune raison d’être optimal au sens de la norme sup ;

– ensuite, nous ne résolvons même pas exactement le problème CVP :a priori, l’algorithme de Babai ne fournit qu’une solution approchée au problème CVP.

En pratique, nous avons remarqué que l’algorithme LLL se comporte remarquablement bien sur les réseaux liés aux problèmes d’approximation. Pour un réseau quelconque, si on note B la famille de Gram-Schmidt associée à une base LLL-réduite, on observe en général une décroissance des kbik :

kb0k ≥ kb1k ≥ · · · ≥ kbnk.

L’algorithme LLL est là pour limiter cette décroissance à une vitesse au plus géométrique.

Sur les réseaux que nous manipulons dans le cadre de l’interpolation approchée, ce compor-tement est complècompor-tement inversé : les kbik ont tendance à croître. Ils croissent même souvent à une vitesse exponentielle. La figure 2.13représente un cas typique de la taille des kbiken fonction de i. Elle correspond à la base réduite qu’on obtient pour l’exemple 2.26 (approcher la fonction log2(1 + 2−x) en erreur absolue par un polynôme de degré 6 sur [0,1] avec des coefficients en simple précision). Le comportement qu’on observe sur cet exemple est représentatif de tous les cas que nous avons traités. Nous n’avons pas, à l’heure actuelle, d’argument pour expliquer cette croissance

Figure 2.13 : Croissance des kbik en fonction de i dans l’exemple 2.26. On notera que l’échelle est logarithmique : la croissance est donc très rapide (au moins pour les dernières valeurs dei).

de kbik en fonction de i. Ce phénomène singulier a une conséquence heureuse : l’algorithme de Babai donne une très bonne approximation du CVP lorsqu’on l’utilise sur ce genre de bases (voir remarque2.52).

Rayonner autour du CVP

Même si, sur les réseaux qui proviennent de notre problème, l’algorithme de Babai donne une très bonne approximation du CVP, il demeure que la solutionpdu problème d’interpolation approchée ne constitue pas nécessairement une solution optimale au problème d’approximation en norme sup.

Cependant, on s’attend (et c’est ce qu’on observe en pratique) à ce quepsoit d’assez bonne qualité.

On rappelle qu’on notevle vecteur correspondant auxp(zi) ettla solution du CVP. Les points du réseau qui sont proches det sont également proches dev et les polynômes associés constituent aussi de bonnes approximations deg. Il peut donc être intéressant de se promener, dans le réseau Γ, autour du pointt: peut-être les polynômes correspondants sont-ils meilleurs en norme sup. Comme la base LLL est formée de vecteurs assez courts et assez orthogonaux, on peut l’utiliser pour explorer le voisinage det. Ainsi, lest±bj fournissent d’autres polynômesppour lesquelskp−gkest petit.

Exemple 2.54. Considérons l’exemple2.26. On applique la méthode heuristique pour trou-ver un bon polynôme d’approximation en suivant le schéma général décrit en page 123 : calcul dep, détermination heuristique des exposants en utilisant les coefficients dep, choix des points zi tels que p(zi) = g(zi), construction du réseau Γ associé, réduction LLL et algorithme de Babai.

Notons t le vecteur trouvé par l’algorithme de Babai et (b0, . . . , b6) la base réduite. Les coefficients de t dans la base des bj fournissent le polynôme p0 défini dans l’exemple 2.35 page106. Ce polynôme donne une erreur d’environ10,33e−10.

En calculant les 14 polynômes correspondants aux vecteurs (t ±bj) et en mesurant la norme sup de l’erreur correspondante, on s’aperçoit que le polynôme correspondant àt−b5

fournit une erreur d’environ10,24e−10, ce qui est légèrement mieux.

Implantation dans Sollya

L’approche heuristique utilisant les réseaux euclidiens a été implémentée dans Sollya. Pour effectuer la réduction du réseau, nous utilisons la bibliothèque FpLLL9écrite par Damien Stehlé. La commande correspondante dans Sollya s’appellefpminimax. Comme toutes les autres commandes de Sollya, sa syntaxe est entièrement documentée dans le manuel de Sollya [CJJL] et le lecteur intéressé pourra s’y reporter. La commande a été conçue dans le double but suivant :

– permettre une utilisation aisée et rapide avec des heuristiques par défaut correspondant à ce qui nous semble être l’usage le plus courant ;

– mais permettre aussi à ceux qui connaissent bien l’algorithme de jouer sur tous les paramètres.

Ainsi par défaut,fpminimax cherche à optimiser l’erreur relative : il suffit de donner une fonc-tion g, un degré n (ou une liste d’entiers (α0, . . . , αn) si on veut chercher un polynôme dans la base des ϕj(x) = xαj), un intervalle [a, b] et une liste d’entiers (t0, . . . , tn) indiquant la précision en bits voulue pour chaque coefficient. La commande renvoie un polynôme p de degré inférieur ou égal à ndont le coefficientaj est un nombre flottant représentable sur tj bits.

Exemple 2.55. Pour traiter l’exemple2.27avec Sollya, il suffit de reproduire la session sui-vante. La commandefpminimax renvoie le polynômepindiqué dans le tableau2.7page101.

> p=fpminimax(cos(pi*x), [|0,2,4,6|], [|53...|], [0;1/256]);

Warning in Remez: a slower algorithm is used for this step

> dirtyinfnorm(p-cos(pi*x), [0;1/256]);

3.3380575760874489924505801975622174414061312388058e-22

Sollya calcule automatiquement le polynôme de meilleure approximation de g, trouve les exposants de façon heuristique, choisit une liste de points pour l’interpolation approchée, construit le réseau associé, lance l’algorithme LLL, trouve une approximation du plus proche vecteur, fait le changement de base entre la base réduite et la base initiale, vérifie que le polynôme reconstruit a des coefficients avec les bons exposants, etc.

Bien sûr, il est très facile d’optimiser l’erreur absolue plutôt que relative. Ainsi, on peut traiter l’exemple 2.26de la façon suivante :

> p=fpminimax(log2(1+2^(-x)), 6, [|24...|], [0;1], absolute);

> dirtyinfnorm(p-log2(1+2^(-x)), [0;1]);

1.03308071982601256132750316409754073352748906544385e-9

On trouve le polynôme p0 présenté dans l’exemple 2.35 page 106. Son erreur est bien envi-ron 10,33 e10.

Récapitulatif de l’exemple fil rouge

Reprenons une dernière fois notre exemple fil rouge (exemple2.29). Au départ, nous ne connais-sions que l’erreur du minimaxpet celle du polynômepbobtenu en arrondissant les coefficients dep.

9distribuée sous licence LGPL et disponible à l’adressehttp://perso.ens-lyon.fr/damien.stehle/#software

> g = (2^x-1)/x;

> pstar=remez(g, 9, [-1/16; 1/16]);

> pchap= doubledouble(coeff(pstar,0));

> for i from 1 to 9 do pchap = pchap + doubleextended(coeff(pstar,i))*x^i;

>

> dirtyinfnorm(pstar-g, [-1/16;1/16]);

7.8971688450870606720689329733602943736816524360645e-25

> dirtyinfnorm(pchap-g, [-1/16;1/16]);

4.0352938542282725512629083738028619885889078706386e-22

Puisqu’on a déjà calculép, on peut le passer en argument àfpminimaxqui n’a donc pas besoin de le recalculer. En utilisant fpminimax, on peut alors obtenir un premier polynôme qui fournit une erreur bien meilleure.

> p=fpminimax(g, 9, [|DD,DE...|], [-1/16;1/16],absolute,default,default,pstar);

> dirtyinfnorm(p-g,[-1/16;1/16]);

5.3260426715961244875550987402904057117727108619255e-23

Mais on peut faire mieux : en utilisant les projections orthogonales, on montre que la partie haute du coefficient constant est fixée (exemple 2.32). De plus le coefficient d’ordre 1 n’a qu’une seule valeur possible (exemple 2.33). On peut en tenir compte en indiquant à fpminimax qu’on cherche un polynôme avec une partie contrainte. Plus précisément, on veut que p soit de la forme

p(x) = 6243314768165359

253 +a0+17725587574382949699

266 x+a2x2+· · ·+a9x9a0 est undoubleeta2, . . . , a9 sont desdoubleétendus.

> p2=fpminimax(g, [|0,2,...,9|], [|D,DE...|], [-1/16;1/16], absolute,62433147681 65359*2^(-53) + 17725587574382949699*2^(-66)*x);

> dirtyinfnorm(p2-g,[-1/16;1/16]);

4.4491011959899316253376347993965102876526017183982e-23

L’utilisateur expérimenté peut également utiliser fpminimax en choisissant lui-même les expo-sants (ce qui correspond à des coefficients en virgule fixe), ou encore en fixant lui-même la liste des pointszi d’interpolation.