Polinomios
Taller de ´Algebra I
Polinomios
Vamos a pensar en un polinomio como una serie de coeficientes.
Para hacerlo m´as f´acil, vamos a pensar espec´ıficamente en Z[X ]. Es decir, los polinomios con coeficientes enteros.
Entonces, querr´ıamos representar al polinomio
p(x ) = a0+ a1x + a2x2+ a3x3+ · · · + anxn
Como la lista de coeficientes
[a0, a1, a2, . . . , an]
Entonces, queremos que nuestros polinomios sean [Integer ]s. Luego vamos a refinar esta idea, pero por ahora trabajemos con esto.
Polinomios
Vamos a ver c´omo est´an implementadas algunas de las operaciones que vamos a querer hacer con polinomios. Luego vamos a implementar algunas nosotros.
Para sumar, sumamos coeficiente a coeficiente:
s u m a r :: [ I n t e g e r ] - > [ I n t e g e r ] - > [ I n t e g e r ] s u m a r [] x = x
s u m a r x [] = x
s u m a r ( x : xs ) ( y : ys ) = ( x + y ) : s u m a r xs ys
Para negar un polinomio (es decir, de p(x) obtener -p(x)), tambi´en negamos coeficiente a coeficiente:
n e g a r :: [ I n t e g e r ] - > [ I n t e g e r ] n e g a r [] = []
n e g a r ( x : xs ) = ( - x ) : n e g a r xs
Para restar, sumamos y negamos:
r e s t a r :: [ I n t e g e r ] - > [ I n t e g e r ] - > [ I n t e g e r ] r e s t a r x y = s u m a r x ( n e g a r y )
Multiplicaci´
on
Para multiplicar, podemos pensar que si tenemos un polinomio
p(x ) = a0+ a1x + a2x2+ · · · + anxn
Lo podemos escribir como
p(x ) = a0+ x ∗ t(x ) Con t un polinomio.
Entonces, al multiplicar p(x ) ∗ q(x ), lo que tenemos es
p(x ) ∗ q(x ) = (a0+ x ∗ t(x )) ∗ q(x ) = a0∗ q(x) + x ∗ t(x) ∗ q(x)
El ´ultimo paso es multiplicar t(x ) por q(x ), y t(x ) tiene menos coeficientes que p(x ). Si supiera multiplicar a0∗ q(x), y multiplicar polinomios por x , entonces ya sabr´ıa multiplicar polinomios!
Multiplicaci´
on
¿C´omo multiplicarmos por una constante? Pues como siempre, coeficiente a coeficiente :)
m u l t C o n s t a n t e :: I n t e g e r - > [ I n t e g e r ] - > [ I n t e g e r ] m u l t C o n s t a n t e _ [] = []
m u l t C o n s t a n t e k ( x : xs ) = ( k * x ) : m u l t C o n s t a n t e k xs
¿Y c´omo multiplicamos por x ? Poniendo un cero al principio!
m u l t X :: [ I n t e g e r ] - > [ I n t e g e r ] m u l t X xs = 0: xs
Multiplicaci´
on
Finalmente, multiplicamos polinomios siguiendo lo que hicimos antes con ecuaciones: m u l t i p l i c a r :: [ I n t e g e r ] - > [ I n t e g e r ] - > [ I n t e g e r ] m u l t i p l i c a r [] x = [] m u l t i p l i c a r ( a : t ) q = s u m a r aq xtq w h e r e aq = m u l t C o n s t a n t e a q xtq = m u l t X ( m u l t i p l i c a r t q )
Tipo de datos
Nos gustar´ıa poder decir que si p y q son dos polinomios, entonces p + q, p − q, y p ∗ q lo son. Para hacer esto, vamos a usar algo que se llaman “type classes”.
Una type class es un conjunto de tipos, todos los cuales implementan ciertas funciones. Por ejemplo, el typeclass Num, que vamos a ver ahora, es el conjunto de todos los tipos que implementan (a grandes razgos, ahora vamos a ver exactamente) ∗, +, y −.
Lo que queremos, entonces, es que nuestro tipo de datos sea un elemento del typeclass Num. Veamos c´omo se hace esto:
Typeclass
Primero, declaramos nuestro tipo de datos, llamado “Polinomio”.
d a t a P o l i n o m i o = P [ I n t e g e r ]
Ahora, decimos que es miembro de la typeclass “Num”. (No se asusten! Esto es lo ´ultimo “nuevo” que vamos a ver :))
i n s t a n c e Num P o l i n o m i o where −− como sumo d o s p o l i n o m i o s ? (P x s ) + (P y s ) = P ( sumar x s y s ) −− como m u l t i p l i c o d o s p o l i n o m i o s ? (P x s ) ∗ (P ys ) = P ( m u l t i p l i c a r xs ys ) −− como n i e g o un p o l i n o m i o ? n e g a t e (P x s ) = P ( n e g a r x s ) −− s i t e n g o un e n t e r o x , como l o t r a n s f o r m o en un p o l i n o m i o ? f r o m I n t e g e r x = P [ x ] −− p a r a un P o l i n o m i o , e l s i g n o y e l v a l o r a b s o l u t o no t i e n e n −− mucho s e n t i d o , a s i que l o s d e j a m o s como u n d e f i n e d .
signum = u n d e f i n e d abs = u n d e f i n e d
Show
Para hacernos la vida m´as c´omoda, tambi´en hay otro typeclass llamado Show. Es el conjunto de tipos que se pueden mostrar en pantalla, y lo que hace falta definir para ser parte de Show, es una funci´on llamada show. Entonces, hagamos que Polinomio sea un miembro de Show. Esto no es particularmente importante, pero s´ı les hace las cosas m´as lindas, as´ı que se los mostramos por las dudas.
m o s t r a r : : [ I n t e g e r ] −> S t r i n g m o s t r a r [ ] = ” 0 ”
−− como I n t e g e r e s t a en Show , podemos d e c i r ” show x ” m o s t r a r [ x ] = show x m o s t r a r [ x , y ] = show x ++ ” + ” ++ show y ++ ” x ” m o s t r a r ( x : y : z s ) = m o s t r a r [ x , y ] ++ r e s t z s 2 where r e s t [ ] = ” ” r e s t ( x : x s ) k = ” + ” ++ show x ++ ” x ˆ ” ++ show k ++ r e s t x s ( k + 1 ) i n s t a n c e Show P o l i n o m i o where show (P x ) = m o s t r a r x
M´
as comodidad
Por ´ultimo, para hacernos la vida a´un m´as c´omoda, definimos a la variable x, as´ı podemos decir 3*x^2 + 4:
x :: P o l i n o m i o x = P [0 , 1]
Probando...
Probemos esto!
En un archivo con el c´odigo de arriba, escribimos
p :: P o l i n o m i o
p = 3 * x ^2 + 4 * x + 5
Si cargamos este archivo con GHCi, podemos ver
Prelude> p 5 + 4x + 3x^2 Prelude> p^2 25 + 40x + 46x^2 + 24x^3 + 9x^4 Prelude> p^2 - 5*p - 3 -3 + 20x + 31x^2 + 24x^3 + 9x^4
Ejercicios
Para esto, bajen el archivo Polinomios.hs de la p´agina de la materia. Para cada funci´on, elijan si hacerla como parte del archivo (es decir, teniendo acceso al constructor P) o fuera de ´el, usando s´olo las funciones ya exportadas.
1. Hacer una funci´on
evaluar :: Polinomio -> Integer -> Integer que, dado un polinomio entero p y un entero x , devuelva p(x ).
2. Usar la funci´on divPoli y con ella hacer la funci´on mcd poli :: Polinomio -> Polinomio -> Polinomio, que compute el m´aximo com´un divisor entre dos polinomios, usando el algoritmo de Euclides. Notar que no siempre existe!
3. Hacer una funci´on derivar :: Polinomio -> Polinomio que derive el polinomio dado.
4. Hacer una funci´on raicesRacionales :: Polinomio -> Bool que devuelva True exactamente cuando el polinomio tiene ra´ıces en Q.