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