I1M2012: Operaciones con el TAD de los polinomios en Haskell (1)
En la segunda parte de la clase de hoy de Informática de 1º del Grado en Matemáticas se han resueltolos 5 primeros ejercicios de la relación 24. El objetivo de esta relación es ampliar el conjunto de operaciones
sobre polinomios definidas utilizando las implementaciones del TAD de
polinomio estudiadas en el tema 21. Además, en algunos ejemplos de usan polinomios con coeficientes racionales. En Haskell, el número racional x/y se representa por x%y. El TAD de los números racionales está definido en el módulo Data.Ratio.
En los ejercicios se usan las siguientes librerías, estudiadas en el tema 21,
- PolRepTDA: Implementación de los polinomios mediante tipos de datos algebraicos.
- PolRepDispersa: Implementación de los polinomios mediante listas dispersas.
- PolRepDensa: Implementación de los polinomios mediante listas densas.
- PolOperaciones: Operaciones con el TAD de los polinomios.
Los ejercicios, y sus soluciones, se muestran a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
-- --------------------------------------------------------------------- -- Importación de librerías -- -- --------------------------------------------------------------------- import PolOperaciones import Test.QuickCheck import Data.Ratio -- --------------------------------------------------------------------- -- Ejercicio 1. Definir la función -- creaPolDispersa :: (Num a, Eq a) => [a] -> Polinomio a -- tal que (creaPolDispersa xs) es el polinomio cuya representación -- dispersa es xs. Por ejemplo, -- creaPolDispersa [7,0,0,4,0,3] == 7*x^5 + 4*x^2 + 3 -- --------------------------------------------------------------------- creaPolDispersa :: (Num a, Eq a) => [a] -> Polinomio a creaPolDispersa [] = polCero creaPolDispersa (x:xs) = consPol (length xs) x (creaPolDispersa xs) -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la función -- creaPolDensa :: (Num a, Eq a) => [(Int,a)] -> Polinomio a -- tal que (creaPolDensa xs) es el polinomio cuya representación -- densa es xs. Por ejemplo, -- creaPolDensa [(5,7),(4,2),(3,0)] == 7*x^5 + 2*x^4 -- --------------------------------------------------------------------- creaPolDensa :: (Num a, Eq a) => [(Int,a)] -> Polinomio a creaPolDensa [] = polCero creaPolDensa ((n,a):ps) = consPol n a (creaPolDensa ps) -- --------------------------------------------------------------------- -- Nota. En el resto de la sucesión se usará en los ejemplos los -- los polinomios que se definen a continuación. -- --------------------------------------------------------------------- pol1, pol2, pol3 :: (Num a, Eq a) => Polinomio a pol1 = creaPolDensa [(5,1),(2,5),(1,4)] pol2 = creaPolDispersa [2,3] pol3 = creaPolDensa [(7,2),(4,5),(2,5)] pol4, pol5, pol6 :: Polinomio Rational pol4 = creaPolDensa [(4,3),(2,5),(0,3)] pol5 = creaPolDensa [(2,6),(1,2)] pol6 = creaPolDensa [(2,8),(1,14),(0,3)] -- --------------------------------------------------------------------- -- Ejercicio 3. Definir la función -- densa :: Num a => Polinomio a -> [(Int,a)] -- tal que (densa p) es la representación densa del polinomio p. Por -- ejemplo, -- pol1 == x^5 + 5*x^2 + 4*x -- densa pol1 == [(5,1),(2,5),(1,4)] -- --------------------------------------------------------------------- densa :: Num a => Polinomio a -> [(Int,a)] densa p | esPolCero p = [] | otherwise = (grado p, coefLider p) : densa (restoPol p) -- --------------------------------------------------------------------- -- Ejercicio 4. Definir la función -- densaAdispersa :: Num a => [(Int,a)] -> [a] -- tal que (densaAdispersa ps) es la representación dispersa del -- polinomio cuya representación densa es ps. Por ejemplo, -- densaAdispersa [(5,1),(2,5),(1,4)] == [1,0,0,5,4,0] -- --------------------------------------------------------------------- densaAdispersa :: Num a => [(Int,a)] -> [a] densaAdispersa [] = [] densaAdispersa [(n,a)] = a : replicate n 0 densaAdispersa ((n,a):(m,b):ps) = a : (replicate (n-m-1) 0) ++ densaAdispersa ((m,b):ps) -- --------------------------------------------------------------------- -- Ejercicio 5. Definir la función -- dispersa :: Num a => Polinomio a -> [a] -- tal que (dispersa p) es la representación dispersa del polinomio -- p. Por ejemplo, -- pol1 == x^5 + 5*x^2 + 4*x -- dispersa pol1 == [1,0,0,5,4,0] -- --------------------------------------------------------------------- dispersa :: Num a => Polinomio a -> [a] dispersa = densaAdispersa . densa |