• Aucun résultat trouvé

Exercice III : polynôme creux

N/A
N/A
Protected

Academic year: 2022

Partager "Exercice III : polynôme creux"

Copied!
5
0
0

Texte intégral

(1)

Exercice III : polynôme creux

Dans cet exercice, on se propose de développer un module permettant de manipuler des polynômes creux. Un polynôme creux est un polynôme contenant très peu de monômes non nuls.

Exemple : P(x) = 5.6 x1280 + 0.8 x – 9 contient 1281 termes dont 3 seulement sont non nuls.

enreg Tmonome entier deg réel coef Tmonome *suiv finenreg

Chaque monôme est décrit par un enregistrement de type Tmonome comportant les 3 champs suivants :

deg : entier représentant le degré du monôme ;

coef : réel représentant le coefficient du monôme ;

suiv : pointeur sur le monôme suivant.

enreg Tpolynome Tmonome *prem finenreg

Un polynôme sera décrit par une structure Tpolynome contenant un seul champ prem :

Si prem est nul, le polynôme correspondant sera le polynôme zéro ;

Si prem est non nul, il pointera sur le monôme de plus haut degré dont le coefficient est non nul. Les monômes de coefficient non nuls sont chaînés par ordre de degré décroissant.

Proposez un algorithme pour la procédure ajouter :

••••

Procédure ajouter (résultat Tpolynome pol, valeur entier deg, valeur réel coef)

qui ajoute à un polynôme (pol) la valeur d’un monôme défini par son degré (deg) et son coefficient (coef).

On s’intéresse maintenant à l’implémentation des opérations additionner et multiplier dont les déclarations sont données ci-dessous. Ces opérations construisent le polynôme résultat somme (respectivement produit) de deux polynômes :

procédure additionner (valeur Tpolynome1 pol1, valeur Tpolynome1 pol2, résultat Tpolynome1 pol3)

procédure multiplier (valeur Tpolynome1 pol1, valeur Tpolynome1 pol2, résultat Tpolynome1 pol3)

Proposez des algorithmes pour les opérations additionner et multiplier utilisant la procédure ajouter de la question précédente.

Proposez un autre algorithme pour l’opération additionner sans utiliser la procédure ajouter, en remarquant que chaque fois que l’on ajoute un monôme au polynôme résultat, il est toujours placé à la fin puisque les monômes sont rangés dans un ordre décroissant

1280 5.6

1 0.8

0 -9 P

(2)

Procédure ajouter

1. Procédure ajouter (résultat Tpolynome pol, valeur entier deg, valeur réel coef) 2. Tmonome *pmon

3. Tmonome *pmon_avant 4. Tmonome *pmon_apres 5. début

6. si coef <> nul alors

7. pmon_apres ← pol.premier 8. pmon_avant ← nul

9. tantque pmon_apres <> nul et (*pmon_apres).deg > deg faire 10. pmon_avant ← pmon_apres

11. pmon_apres ← (*pmon_apres).suiv 12. fintantque

13. /* Cas pmon_apres = nul ou bien (*pmon_ apres).deg <= deg */

14. si (pmon_apres = nul) ou (*pmon_apres).deg <> deg alors 15. /* on a soit pmon_apres = nul soit (*pmon_ apres).deg < deg */

16. pmon ← allouer(taille(Tmonome))

17. si pmon = nul alors Ecrire(" erreur allocation mémoire ") 18. sinon

19. (*pmon).deg ← deg 20. (*pmon).coef ← coef

21. (*pmon).suiv ← pmon_apres 22. si pmon_avant <> nul alors 23. (*pmon_avant).suiv ← pmon 24. sinon

25. pol.prem ← pmon 26. finsi

27. finsi

28. sinon /* on a (*pmon_ apres).deg = deg */

29. (*pmon_ apres).coef ← (*pmon_ apres).coef + coef

30. si (*pmon_ apres).coef = 0 alors /* il faut le supprimer */

31. si pmon_avant <> nul alors

32. (*pmon_ avant).suiv ← (*pmon_ apres).suiv 33. sinon

34. pol.prem ← (*pmon_ apres).suiv 35. finsi

36. libérer(pmon_apres) 37. finsi

38. finsi 39. finsi 40. fin

Procédure additionner : solution 1

Dans cette version, on utilise la procédure ajouter de la question précédente.

1. Procédure additionner ( valeur Tpolynome pol1, 2. valeur Tpolynome pol2, 3. résultat Tpolynome pol3) 4. Tmonome *pmon1, *pmon2

5. début

6. pol3.prem ← nul 7. pmon1 ← pol1.prem 8. pmon2 ← pol2.prem

9. tantque pmon1 <> nul et pmon2 <> nul faire 10. si (*pmon1).deg = (*pmon2).deg alors

11. ajouter (pol3, (*pmon1).deg, (*pmon1).coef + (*pmon2).coef)

(3)

12. pmon1 ← (*pmon1).suiv 13. pmon2 ← (*pmon2).suiv 14. sinon

15. si (*pmon1).deg > (*pmon2).deg alors

16. ajouter (pol3, (*pmon1).deg, (*pmon1).coef) 17. pmon1 ← (*pmon1).suiv

18. sinon

19. ajouter (pol3, (*pmon2).deg, (*pmon2).coef) 20. pmon2 ← (*pmon2).suiv

21. finsi 22. finsi 23. fintantque

24. /* Cas pmon1 = nul ou pmon2 = nul */

25. si pmon1 = nul alors 26. pmon1← pmon2 27. finsi

28. tantque pmon1 <> nul faire

29. ajouter (pol3, (*pmon1).deg, (*pmon1).coef) 30. pmon1 ← (*pmon1).suiv

31. fintantque 32. fin

Procédure additionner : solution 2

Dans cette version, on n'utilise pas la procédure ajouter

1. Procédure additionner ( valeur Tpolynome pol1,

2. valeur Tpolynome pol2,

3. résultat Tpolynome pol3) 4. Tmonome *pmon1, *pmon2, *pmon3, *pmon

5. réel coef 6. entier deg 7. début

8. pol3.prem ← nul 9. pmon1 ← pol1.prem 10. pmon2 ← pol2.prem 11. pmon3 ← nul

12. tantque pmon1 <> nul et pmon2 <> nul faire 13. si (*pmon1).deg = (*pmon2).deg alors 14. coef ← (*pmon1).coef + (*pmon2).coef) 15. deg ← (*pmon1).deg

16. pmon1 ← (*pmon1).suiv 17. pmon2 ← (*pmon2).suiv 18. sinon

19. si (*pmon1).deg > (*pmon2).deg alors 20. deg ← (*pmon1).deg

21. coef ← (*pmon1).coef 22. pmon1 ← (*pmon1).suiv 23. sinon

24. deg ← (*pmon2).deg 25. coef ← (*pmon2).coef 26. pmon2 ← (*pmon2).suiv 27. finsi

28. finsi

29. si coef <> 0 alors

30. pmon ← allouer(taille(Tmonome))

31. si pmon = nul alors Ecrire("erreur allocation mémoire") 32. sinon

(4)

33. (*pmon).deg ← deg 34. (*pmon).coef ← coef 35. (*pmon).suiv ← nul 36. si pmon3 <> nul alors 37. (*pmon3).suiv ← pmon 38. sinon

39. pol3.prem ← pmon 40. finsi

41. pmon3 ← pmon 42. finsi

43. finsi 44. fintantque

45. si pmon1 = nul alors 46. pmon1 ← pmon2 47. finsi

48. tantque pmon1 <> nul faire

49. pmon ← allouer(taille(Tmonome))

50. si pmon = nul alors Ecrire("erreur allocation mémoire") 51. sinon

52. (*pmon).deg ← deg 53. (*pmon).coef ← coef 54. (*pmon).suiv ← nul 55. si pmon3 <> nul alors 56. (*pmon3).suiv ← pmon 57. sinon

58. pol3.prem ← pmon 59. finsi

60. pmon3 ← pmon 61. finsi

62. pmon1 ← (*pmon1).suiv 63. fintantque

64. fin

Procédure multiplier : première version

1. Procédure multiplier ( valeur Tpolynome pol1, 2. valeur Tpolynome pol2, 3. résultat Tpolynome pol3) 4. Tmonome *pmon1, *pmon2

5. début

6. pol3.prem ← nul 7. pmon1 ← pol1.prem

8. tantque pmon1 <> nul faire 9. pmon2 ← pol2.prem

10. tantque pmon2 <> nul faire

11. ajouter (pol3, (*pmon1).deg, (*pmon2).deg, (*pmon1).coef * (*pmon2).coef) 12. pmon2 ← (*pmon2).suiv

13. fintantque

14. pmon1 ← (*pmon2).suiv 15. fintantque

16. fin

(5)

Procédure multiplier : deuxième version

1. Procédure multiplier ( valeur Tpolynome pol1, 2. valeur Tpolynome pol2, 3. résultat Tpolynome pol3) 4. Tmonome *pmon1, *pmon2, *pmon3, *pmon, *pmon_apres 5. booléen fini

6. entier deg 7. réel coef 8. début

9. pol3.prem ← nul 10. pmon1 ← pol1.prem 11. pmon2 ← pol2.prem 12. pmon3 ← nul

13. si pmon2 <> nul alors 14. fini ← faux

15. sinon 16. fini ← vrai 17. finsi

18. tantque pmon1 <> nul et fini = faux faire 19. pmon2 ← pol2.prem

20. pmon3 ← pol3.premier

21. tantque pmon2 <> nul et fini = faux faire 22. deg ← (*pmon1).deg + (*pmon2).deg 23. coef ← (*pmon).coef * (*pmon).coef 24. pmon_apres ← pmon3

25. tantque pmon_apres <> nul et (*pmon_apres).deg > deg faire 26. pmon3 ← pmon_apres

27. pmon_apres ← (*pmon_apres).suiv 28. fintantque

29. si pmon_apres = nul ou (*pmon_apres).deg <> deg alors 30. pmon ← allouer(taille(Tmonome))

31. si pmon = nul alors Ecrire("erreur allocation mémoire") 32. fini ← vrai

33. sinon

34. (*pmon).deg ← deg 35. (*pmon).coef ← coef 36. si pmon3 = nul alors 37. pmon3 ← pmon 38. pol3.prem ← pmon 39. (*pmon).suiv ← nul 40. sinon

41. (*pmon).suiv ← pmon_apres 42. (*pmon3).suiv ← pmon 43. finsi

44. sinon

45. /* Cas (*pmon_apres).deg = deg */

46. (*pmon_apres).coef ← (*pmon_apres).coef + coef 47. si (*pmon_apres).coef = 0 alors

48. (*pmon3).suiv ← (*pmon_apres).suiv 49. libérer(pmon_apres)

50. finsi 51. finsi

52. pmon2 ← (*pmon2).suiv 53. fintantque

54. pmon1 ← (*pol1).suiv 55. fintantque

56. fin

Références

Documents relatifs

Pour chaque ensemble de carreaux algébriques, écris le polynôme représenté et indique ses facteurs.. Décompose chaque expression en facteurs à l’aide des plus grands

Ecrire une fonction Python ValidLU qui recevra comme arguments un tableau numpy M et renverra un booléen selon que la matrice M, supposée inversible, admet ou non une..

[r]

Le sujet comporte quatre exercices indépendants, qui peuvent être traités dans l’ordre souhaité.. Chaque étudiant ·e doit porter son nom dans le coin supérieur droit de la copie

Lorsque A admet deux valeurs propres distinctes, donner leur valeur en fonction du paramètre m..

On l’utilise pour factoriser un polynôme lorsqu’une de ses racines

On suppose que E est de dimension nie ; soit u ∈ L (E) ; la trace de la matrice de u est la même dans toute base, c'est par dénition la trace de

Dans le paragraphe A nous montrons comment la connaissance du degré en s d'un tel opérateur permet (via l'algorithme de division par l'idéal jacobien J(/) de /) de