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 |