Taller de Álgebra I - Primer cuatrimestre de 2014 Trabajo práctico 2 En este trabajo práctico trabajaremos con polinomios de una variable y coeficientes racionales. Los racionales los representamos mediante el tipo Racional visto en clase, reemplazando el tipo Int por Integer, de manera de no tener problemas de overflow. Trabajaremos con 2 representaciones distintas para los polinomios. La primera representación es mediante listas de coeficientes, representada mediante el tipo [Racional]. La lista representa los coeficientes en orden, poniendo en la cabeza de la lista el coeficiente independiente, y en el último elemento el coeficiente principal, que siempre debe ser distinto de 0. Por ejemplo, la lista (crearR 1 3):(crearR 2 5):(crearR 0 1):(crearR 1 1):[] representa al polinomio 1 2 + x + x3 . 3 5 El polinomio nulo se representa mediante la lista vacı́a. La segunda representación es mediante un tipo de Haskell. El tipo representa la definición inductiva de polinomios: una constante racional es un polinomio, una variable es un polinomio, y la suma o el producto de dos polinomios es un polinomio. Este tipo lo llamamos Poli y su definición es la siguiente: data Poli = Cte Racional | Var | Suma Poli Poli | Prod Poli Poli Por ejemplo, la instancia de tipo Poli Suma (Cte (crearR 1 3)) (Prod Var (Suma (Cte (crearR 2 5)) (Prod Var Var) )) representa al polinomio 1 2 1 2 +x + x · x = + x + x3 . 3 5 3 5 En el archivo provisto esqueleto.hs se encuentran las definiciones básicas de los tipos Racional y Poli, junto con varias funciones útiles, y el código para poder comparar los racionales usando los operadores ==, /=, <, etc y para que tanto racionales como instancias de Poli se muestren en la consola automáticamente cuando son resultados. Además se definen en dicho archivo para usar en los ejemplos tres polinomios poli1, poli2 y poli3, y los tipos de las funciones solicitadas en los ejercicios. Su tarea es completar dicho archivo de Haskell con la implementación de las funciones especificadas en los ejercicios. Ejercicio 1. Escribir una función coeficientes :: Poli -> [Racional] que dado un polinomio representado por una instancia del tipo Poli retorne su lista de coeficientes, como se especifica arriba. Ejercicio 2. Escribir una función polinomio :: [Racional] -> Poli que dada una lista de coeficientes, retorne una instancia del tipo Poli que represente un polinomio cuyos coeficientes son los dados por el parámetro. Este ejercicio es la pseudo-inversa del anterior. Dado que un mismo polinomio se puede representar de muchas maneras por instancias del tipo Poli, cualquiera de ellas se aceptará cómo válida. 1 Ejercicio 3. Escribir una función evaluar :: Poli -> Racional -> Racional que dado un polinomio y un racional, devuelva el resultado de evaluar dicho polinomio en el racional especificado. Ejercicio 4. Escribir una función raicesRacionales :: [Racional] -> [Racional] que dado un polinomio especificado como lista de coeficientes, devuelva la lista (posiblemente vacı́a) de sus raı́ces racionales. La lista debe devolverse ordenada de forma ascendente y sin elementos repetidos (ignoramos la multiplicidad de las raı́ces). Se recomienda aprovechar que se provee el orden del tipo Racional para utilizar la función sort del módulo Data.List. Ejemplos del uso de las funciones: Escribiendo en la consola ceroR sumaR unoR (crearR 6 10) coeficientes poli2 coeficientes (polinomio poli1) raicesRacionales poli1 raicesRacionales (coeficientes poli2) raicesRacionales [crearRI (-4),ceroR,unoR] raicesRacionales poli3 Debe retornar 0 8/5 [1/3,2/5,0,1] [1/9,-5/18,-5/9,5/6,1,0] [-1,-2/3,1/3,1/2] [] [-2,2] [1] Condiciones de entrega: • El trabajo práctico se debe hacer en grupos de exactamente dos personas. No es necesario que sean las mismas parejas que para el primer trabajo. • Se debe enviar el código como archivo adjunto en un único mail por grupo. Para hacerlo, se debe enviar dicho mail a la dirección [email protected], colocando como subject del mismo “Entrega TP2”. Se debe incluir un único archivo de Haskell (.hs) como adjunto. El nombre completo de dicho archivo debe ser tp2-AAA-BB-CCC-DD.hs, de manera que AAA/BB y CCC/DD representen los números de libreta de los integrantes de la pareja autora del tp. Usar siempre exactamente 3 dı́gitos para el número anterior a la barra y 2 dı́gitos para el número posterior (año de ingreso), completando con ceros adelante de ser necesario. El texto del mail no es importante, pudiendo incluso quedar vacı́o. Por ejemplo, si los números de libreta de los integrantes del grupo son “589/02” y “13/99” el nombre de archivo puede ser tp2-589-02-013-99.hs o tp2-013-99-589-02.hs indistintamente. • La fecha de entrega es hasta el domingo 29 de junio, inclusive. Se puede entregar antes si ası́ lo desean, pero no después. 2