TP 2

Anuncio
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
Descargar