Operaciones con polinomios como diccionarios
Los polinomios se pueden representar mediante diccionarios con los exponentes como claves y los coeficientes como valores.
El tipo de los polinomios con coeficientes de tipo a se define por
| 1 |    type Polinomio a = M.Map Int a | 
Dos ejemplos de polinomios (que usaremos en los ejemplos) son
| 1 2 |    3 + 7x - 5x^3    4 + 5x^3 + x^5 | 
se definen por
| 1 2 3 |   ejPol1, ejPol2 :: Polinomio Int   ejPol1 = M.fromList [(0,3),(1,7),(3,-5)]   ejPol2 = M.fromList [(0,4),(3,5),(5,1)] | 
Definir las funciones
| 1 2 3 |    sumaPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a    multPorTerm :: Num a => (Int,a) -> Polinomio a -> Polinomio a    multPol :: (Eq a, Num a) => Polinomio a -> Polinomio a -> Polinomio a | 
tales que
- (sumaPol p q) es la suma de los polinomios p y q. Por ejemplo,
| 1 2 3 4 |      λ> sumaPol ejPol1 ejPol2      fromList [(0,7),(1,7),(5,1)]      λ> sumaPol ejPol1 ejPol1      fromList [(0,6),(1,14),(3,-10)] | 
- (multPorTerm (n,a) p) es el producto del término ax^n por p. Por ejemplo,
| 1 2 |      λ> multPorTerm (2,3) (M.fromList [(0,4),(2,1)])      fromList [(2,12),(4,3)] | 
- (multPol p q) es el producto de los polinomios p y q. Por ejemplo,
| 1 2 3 4 5 6 |      λ> multPol ejPol1 ejPol2      fromList [(0,12),(1,28),(3,-5),(4,35),(5,3),(6,-18),(8,-5)]      λ> multPol ejPol1 ejPol1      fromList [(0,9),(1,42),(2,49),(3,-30),(4,-70),(6,25)]      λ> multPol ejPol2 ejPol2      fromList [(0,16),(3,40),(5,8),(6,25),(8,10),(10,1)] | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import qualified Data.Map as M type Polinomio a = M.Map Int a  ejPol1, ejPol2 :: Polinomio Int ejPol1 = M.fromList [(0,3),(1,7),(3,-5)] ejPol2 = M.fromList [(0,4),(3,5),(5,1)] sumaPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a sumaPol p q =      M.filter (/=0) (M.unionWith (+) p q) multPorTerm :: Num a => (Int,a) -> Polinomio a -> Polinomio a multPorTerm (n,a) p =     M.map (*a) (M.mapKeys (+n) p) multPol :: (Eq a, Num a) => Polinomio a -> Polinomio a -> Polinomio a multPol p q     | M.null p  = M.empty     | otherwise = sumaPol (multPorTerm t q) (multPol r q)     where (t,r) = M.deleteFindMin p | 


