Nous souhaitons implémenter une bibliothèque de représentation des
fonctiosn polynômes. La plupart des opérations sont relativement
simples à rédiger. La plus délicate est la multiplication. Prenons un
exemple, pour multiplier
et
, il y a deux façons de procéder.
Chacune de ces méthoes requiert
opérations. Il est
cependant possible d'affiner la deuxième en choisissant judicieusement
les points servant à évaluer puis à interpoler. En prenant
comme
ensemble de points, on ramène les évaluations de ces points à des
transformées de Fourier et l'interpolation à une transformation
inverse de Fourier. Cela permet de multiplier des polynômes en
. Voyez [2] pour un exposé
davantage détaillé. Ecrivez les fonctions du fichier
polynomes.c correspondant au fichier polynomes.h
ci-dessous. Vous prendrez soin de vous assurer que la multiplication à
l'aide de la transformée de Fourier est plus rapide que la version
pour boeufs.
#ifndef POLYNOME_H #define POLYNOME_H #include"linkedList.h" #include"complexe.h" #include"fourier.h" /* Nous representerons un polynome avec une liste chainee contenant les coefficients du polynome par ordre de degre croissant. */ /* Retourne un polynome vide. */ linkedList* makePolynome(); /* Retourne une copie de l, copie aussi les coefficients. */ linkedList* copyPolynome(linkedList* l); /* Detruit le polynome l et ses coefficients. */ void destroyPolynome(linkedList* l); /* Affiche polynome le plus proprement possible. */ void printPolynome(linkedList* polynome); /* Retourne le degre de l. */ int degreePolynome(linkedList *l); /* Ajoute un monome de coefficient coeff a la fin du polynome, faisant ainsi croutre son degre de 1. */ void appendCoeffPolynome(linkedList* polynome, double coeff); /* Cree et retourne le polynome de degre n-1 dont les coefficients sont passes dans le tableau d. */ linkedList* makeArrayPolynome(double* d, int n); /* Retourne le polynome nul. */ linkedList* zeroPolynome(); /* Retourne le polynome unite. */ linkedList* unitPolynome(); /* Ajoute la constante d au polynome l. */ void addRealPolynome(linkedList* l, double d); /* Multiplie le polynome l par le reel d. */ void multRealPolynome(linkedList* l, double d); /* Multiplie le polynome l par X^n */ void multXNPolynome(linkedList* l, int n); /* Multiplie le polynome l par coeff*X^exp */ void multMonomePolynome(linkedList* l, double coeff, int exp); /* Additione les deux polynomes a et b, retourne cette somme. */ linkedList* addPolynome(linkedList* a, linkedList* b); /* Multiplie a et b avec la recurrence (a_0 + a_1X + ... + a_nX^n)Q(X) = a_0 * Q(X) + X * (a_1 + a_2 X...+ a_n X^(n-1)) * Q(X) */ linkedList* slowMultPolynome(linkedList* a, linkedList* b); /* Multiple a et b en passant par une transformee de fourier. */ linkedList* multPolynome(linkedList* a, linkedList* b); /* Evalue le polynome l en x avec la methode de Horner. */ double evaluatePolynome(linkedList *l, double x); #endif