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
type Polinomio a = M.Map Int a |
type Polinomio a = M.Map Int a
Dos ejemplos de polinomios (que usaremos en los ejemplos) son
3 + 7x - 5x^3
4 + 5x^3 + x^5 |
3 + 7x - 5x^3
4 + 5x^3 + x^5
se definen por
ejPol1, ejPol2 :: Polinomio Int
ejPol1 = M.fromList [(0,3),(1,7),(3,-5)]
ejPol2 = M.fromList [(0,4),(3,5),(5,1)] |
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
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 |
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,
ghci> sumaPol ejPol1 ejPol2
fromList [(0,7),(1,7),(5,1)]
ghci> sumaPol ejPol1 ejPol1
fromList [(0,6),(1,14),(3,-10)] |
ghci> sumaPol ejPol1 ejPol2
fromList [(0,7),(1,7),(5,1)]
ghci> 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,
ghci> multPorTerm (2,3) (M.fromList [(0,4),(2,1)])
fromList [(2,12),(4,3)] |
ghci> 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,
ghci> multPol ejPol1 ejPol2
fromList [(0,12),(1,28),(3,-5),(4,35),(5,3),(6,-18),(8,-5)]
ghci> multPol ejPol1 ejPol1
fromList [(0,9),(1,42),(2,49),(3,-30),(4,-70),(6,25)]
ghci> multPol ejPol2 ejPol2
fromList [(0,16),(3,40),(5,8),(6,25),(8,10),(10,1)] |
ghci> multPol ejPol1 ejPol2
fromList [(0,12),(1,28),(3,-5),(4,35),(5,3),(6,-18),(8,-5)]
ghci> multPol ejPol1 ejPol1
fromList [(0,9),(1,42),(2,49),(3,-30),(4,-70),(6,25)]
ghci> multPol ejPol2 ejPol2
fromList [(0,16),(3,40),(5,8),(6,25),(8,10),(10,1)]
Soluciones
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 |
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