{"id":4192,"date":"2014-03-14T22:06:13","date_gmt":"2014-03-14T21:06:13","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4192"},"modified":"2014-03-18T22:07:42","modified_gmt":"2014-03-18T21:07:42","slug":"i1m2103-ejercicios-con-el-tad-de-los-polinomios-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2103-ejercicios-con-el-tad-de-los-polinomios-en-haskell\/","title":{"rendered":"I1M2103: Ejercicios con el TAD de los polinomios en Haskell"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han explicado las soluciones del ejercicios con el TAD de los polinomios presentados en la <a href=\"http:\/\/bit.ly\/1g6hzmc\">clase del d\u00eda 11<\/a>.<\/p>\n<p>Los ejercicios de la relaci\u00f3n 22 son<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas                                           --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport PolOperaciones\r\nimport Test.QuickCheck\r\nimport Data.Ratio\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    creaPolDispersa :: (Num a, Eq a) => [a] -> Polinomio a\r\n-- tal que (creaPolDispersa xs) es el polinomio cuya representaci\u00f3n\r\n-- dispersa es xs. Por ejemplo,\r\n--    creaPolDispersa [7,0,0,4,0,3]  ==  7*x^5 + 4*x^2 + 3\r\n-- ---------------------------------------------------------------------\r\n\r\ncreaPolDispersa :: (Num a, Eq a) => [a] -> Polinomio a\r\ncreaPolDispersa []     = polCero\r\ncreaPolDispersa (x:xs) = consPol (length xs) x (creaPolDispersa xs)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    creaPolDensa :: (Num a, Eq a) => [(Int,a)] -> Polinomio a\r\n-- tal que (creaPolDensa xs) es el polinomio cuya representaci\u00f3n\r\n-- densa es xs. Por ejemplo,\r\n--    creaPolDensa [(5,7),(4,2),(3,0)]  ==  7*x^5 + 2*x^4\r\n-- ---------------------------------------------------------------------\r\n\r\ncreaPolDensa :: (Num a, Eq a) => [(Int,a)] -> Polinomio a\r\ncreaPolDensa [] = polCero\r\ncreaPolDensa ((n,a):ps) = consPol n a (creaPolDensa ps)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Nota. En el resto de la sucesi\u00f3n se usar\u00e1 en los ejemplos los\r\n-- los polinomios que se definen a continuaci\u00f3n.\r\n-- ---------------------------------------------------------------------\r\n\r\npol1, pol2, pol3 :: (Num a, Eq a) => Polinomio a\r\npol1 = creaPolDensa [(5,1),(2,5),(1,4)]\r\npol2 = creaPolDispersa [2,3]\r\npol3 = creaPolDensa [(7,2),(4,5),(2,5)]\r\n\r\npol4, pol5, pol6 :: Polinomio Rational \r\npol4 = creaPolDensa [(4,3),(2,5),(0,3)]\r\npol5 = creaPolDensa [(2,6),(1,2)]\r\npol6 = creaPolDensa [(2,8),(1,14),(0,3)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n\r\n--    densa :: (Num a, Eq a) => Polinomio a -> [(Int,a)]\r\n-- tal que (densa p) es la representaci\u00f3n densa del polinomio p. Por\r\n-- ejemplo, \r\n--    pol1        ==  x^5 + 5*x^2 + 4*x\r\n--    densa pol1  ==  [(5,1),(2,5),(1,4)]\r\n-- ---------------------------------------------------------------------\r\n\r\ndensa :: (Num a, Eq a) => Polinomio a -> [(Int,a)]\r\ndensa p | esPolCero p = []\r\n        | otherwise   = (grado p, coefLider p) : densa (restoPol p)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n\r\n--    densaAdispersa :: Num a => [(Int,a)] -> [a]\r\n-- tal que (densaAdispersa ps) es la representaci\u00f3n dispersa del\r\n-- polinomio cuya representaci\u00f3n densa es ps. Por ejemplo,\r\n--    densaAdispersa [(5,1),(2,5),(1,4)]  ==  [1,0,0,5,4,0]\r\n-- ---------------------------------------------------------------------\r\n\r\ndensaAdispersa :: Num a => [(Int,a)] -> [a]\r\ndensaAdispersa [] = []\r\ndensaAdispersa [(n,a)] = a : replicate n 0\r\ndensaAdispersa ((n,a):(m,b):ps) = \r\n    a : (replicate (n-m-1) 0) ++ densaAdispersa ((m,b):ps)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    dispersa :: (Num a, Eq a) => Polinomio a -> [a]\r\n-- tal que (dispersa p) es la representaci\u00f3n dispersa del polinomio\r\n-- p. Por ejemplo,\r\n--    pol1           ==  x^5 + 5*x^2 + 4*x\r\n--    dispersa pol1  ==  [1,0,0,5,4,0]\r\n-- ---------------------------------------------------------------------\r\n\r\ndispersa :: (Num a, Eq a) => Polinomio a -> [a]\r\ndispersa = densaAdispersa . densa\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la funci\u00f3n\r\n--    coeficiente :: (Num a, Eq a) => Int -> Polinomio a -> a\r\n-- tal que (coeficiente k p) es el coeficiente del t\u00e9rmino de grado k\r\n-- del polinomio p. Por ejemplo,\r\n--    pol1                ==  x^5 + 5*x^2 + 4*x\r\n--    coeficiente 2 pol1  ==  5\r\n--    coeficiente 3 pol1  ==  0\r\n-- ---------------------------------------------------------------------\r\n\r\ncoeficiente :: (Num a, Eq a) => Int -> Polinomio a -> a\r\ncoeficiente k p | k == n                 = coefLider p\r\n                | k > grado (restoPol p) = 0\r\n                | otherwise              = coeficiente k (restoPol p)\r\n                where n = grado p\r\n\r\n-- Otra definici\u00f3n equivalente es\r\ncoeficiente' :: (Num a, Eq a) => Int -> Polinomio a -> a\r\ncoeficiente' k p = busca k (densa p)\r\n    where busca k ps = head ([a | (n,a) <- ps, n == k] ++ [0])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la funci\u00f3n\r\n--    coeficientes :: (Num a, Eq a) => Polinomio a -> [a]\r\n-- tal que (coeficientes p) es la lista de los coeficientes del\r\n-- polinomio p. Por ejemplo,\r\n--    pol1               ==  x^5 + 5*x^2 + 4*x\r\n--    coeficientes pol1  ==  [1,0,0,5,4,0]\r\n-- ---------------------------------------------------------------------\r\n\r\ncoeficientes :: (Num a, Eq a) => Polinomio a -> [a]\r\ncoeficientes p = [coeficiente k p | k <-[n,n-1..0]]\r\n    where n = grado p\r\n\r\n-- Una definici\u00f3n equivalente es\r\ncoeficientes' :: (Num a, Eq a) => Polinomio a -> [a]\r\ncoeficientes' = dispersa\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir la funci\u00f3n\r\n--    potencia :: (Num a, Eq a) => Polinomio a -> Int -> Polinomio a\r\n-- tal que (potencia p n) es la potencia n-\u00e9sima del polinomio p. Por\r\n-- ejemplo, \r\n--    pol2             ==  2*x + 3\r\n--    potencia pol2 2  ==  4*x^2 + 12*x + 9\r\n--    potencia pol2 3  ==  8*x^3 + 36*x^2 + 54*x + 27\r\n-- ---------------------------------------------------------------------\r\n\r\npotencia :: (Num a, Eq a) => Polinomio a -> Int -> Polinomio a\r\npotencia p 0 = polUnidad\r\npotencia p n = multPol p (potencia p (n-1))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Mejorar la definici\u00f3n de potencia definiendo la funci\u00f3n\r\n--    potenciaM :: (Num a, Eq a) => Polinomio a -> Int -> Polinomio a\r\n-- tal que (potenciaM p n) es la potencia n-\u00e9sima del polinomio p,\r\n-- utilizando las siguientes propiedades:\r\n--    * Si n es par,   entonces x^n = (x^2)^(n\/2)\r\n--    * Si n es impar, entonces x^n = x * (x^2)^((n-1)\/2)\r\n-- Por ejemplo, \r\n--    pol2              ==  2*x + 3\r\n--    potenciaM pol2 2  ==  4*x^2 + 12*x + 9\r\n--    potenciaM pol2 3  ==  8*x^3 + 36*x^2 + 54*x + 27\r\n-- ---------------------------------------------------------------------\r\n\r\npotenciaM :: (Num a, Eq a) => Polinomio a -> Int -> Polinomio a\r\npotenciaM p 0 = polUnidad\r\npotenciaM p n\r\n    | even n    = potenciaM (multPol p p) (n `div` 2)\r\n    | otherwise = multPol p (potenciaM (multPol p p) ((n-1) `div` 2))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Definir la funci\u00f3n\r\n--    integral :: (Fractional a, Eq a) => Polinomio a -> Polinomio a\r\n-- tal que (integral p) es la integral del polinomio p cuyos coefientes\r\n-- son n\u00fameros racionales. Por ejemplo,\r\n--    ghci> pol3\r\n--    2*x^7 + 5*x^4 + 5*x^2\r\n--    ghci> integral pol3\r\n--    0.25*x^8 + x^5 + 1.6666666666666667*x^3\r\n--    ghci> integral pol3 :: Polinomio Rational\r\n--    1 % 4*x^8 + x^5 + 5 % 3*x^3\r\n-- ---------------------------------------------------------------------\r\n\r\nintegral :: (Fractional a, Eq a) => Polinomio a -> Polinomio a\r\nintegral p \r\n    | esPolCero p = polCero\r\n    | otherwise   = consPol (n+1) (b \/ (fromIntegral (n+1))) (integral r)\r\n    where n = grado p\r\n          b = coefLider p\r\n          r = restoPol p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Definir la funci\u00f3n\r\n--    integralDef :: (Fractional t, Eq t) => Polinomio t -> t -> t -> t          \r\n-- tal que (integralDef p a b) es la integral definida del polinomio p\r\n-- cuyos coefientes son n\u00fameros racionales. Por ejemplo,\r\n--    ghci> integralDef pol3 0 1\r\n--    2.916666666666667\r\n--    ghci> integralDef pol3 0 1 :: Rational\r\n--    35 % 12\r\n-- ---------------------------------------------------------------------\r\n\r\nintegralDef :: (Fractional t, Eq t) => Polinomio t -> t -> t -> t          \r\nintegralDef p a b = (valor q b) - (valor q a)\r\n    where q = integral p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12. Definir la funci\u00f3n\r\n--    multEscalar :: (Num a, Eq a) => a -> Polinomio a -> Polinomio a\r\n-- tal que (multEscalar c p) es el polinomio obtenido multiplicando el\r\n-- n\u00famero c por el polinomio p. Por ejemplo, \r\n--    pol2                    ==  2*x + 3\r\n--    multEscalar 4 pol2      ==  8*x + 12\r\n--    multEscalar (1%4) pol2  ==  1 % 2*x + 3 % 4\r\n-- ---------------------------------------------------------------------\r\n\r\nmultEscalar :: (Num a, Eq a) => a -> Polinomio a -> Polinomio a\r\nmultEscalar c p \r\n  | esPolCero p = polCero\r\n  | otherwise   = consPol n (c*b) (multEscalar c r)\r\n  where n = grado p\r\n        b = coefLider p\r\n        r = restoPol p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13. Definir la funci\u00f3n\r\n--    cociente:: (Fractional a, Eq a) => \r\n--               Polinomio a -> Polinomio a -> Polinomio a\r\n-- tal que (cociente p q) es el cociente de la divisi\u00f3n de p entre\r\n-- q. Por ejemplo, \r\n--    pol4  ==  3 % 1*x^4 + 5 % 1*x^2 + 3 % 1\r\n--    pol5  ==  6 % 1*x^2 + 2 % 1*x\r\n--    cociente pol4 pol5  ==  1 % 2*x^2 + (-1) % 6*x + 8 % 9\r\n-- ---------------------------------------------------------------------\r\n\r\ncociente:: (Fractional a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a\r\ncociente p q\r\n    | n2 == 0   = multEscalar (1\/a2) p\r\n    | n1 < n2   = polCero\r\n    | otherwise =  consPol n' a' (cociente p' q)\r\n    where n1 = grado p\r\n          a1 = coefLider p\r\n          n2 = grado q\r\n          a2 = coefLider q\r\n          n' = n1-n2\r\n          a' = a1\/a2\r\n          p' = restaPol p (multPorTerm (creaTermino n' a') q)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. Definir la funci\u00f3n\r\n--    resto:: (Fractional a, Eq a) => \r\n--            Polinomio a -> Polinomio a -> Polinomio a\r\n-- tal que (resto p q) es el resto de la divisi\u00f3n de p entre q. Por\r\n-- ejemplo,  \r\n--    pol4  ==  3 % 1*x^4 + 5 % 1*x^2 + 3 % 1\r\n--    pol5  ==  6 % 1*x^2 + 2 % 1*x\r\n--    resto pol4 pol5  ==  (-16) % 9*x + 3 % 1\r\n-- ---------------------------------------------------------------------\r\n\r\nresto :: (Fractional a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a\r\nresto p q = restaPol p (multPol (cociente p q) q)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 15. Definir la funci\u00f3n\r\n--    divisiblePol :: (Fractional a, Eq a) => \r\n--                    Polinomio a -> Polinomio a -> Bool\r\n-- tal que (divisiblePol p q) se verifica si el polinomio p es divisible\r\n-- por el polinomio q. Por ejemplo,\r\n--    pol6  ==  8 % 1*x^2 + 14 % 1*x + 3 % 1\r\n--    pol2  ==  2*x + 3\r\n--    pol5  ==  6 % 1*x^2 + 2 % 1*x\r\n--    divisiblePol pol6 pol2  ==  True\r\n--    divisiblePol pol6 pol5  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\ndivisiblePol :: (Fractional a, Eq a) => Polinomio a -> Polinomio a -> Bool\r\ndivisiblePol p q = esPolCero (resto p q)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16. El m\u00e9todo de Horner para calcular el valor de un\r\n-- polinomio se basa en representarlo de una forma forma alernativa. Por\r\n-- ejemplo, para calcular el valor de \r\n--    a*x^5 + b*x^4 + c*x^3 + d*x^2 + e*x + f\r\n-- se representa como\r\n--   (((((0 * x + a) * x + b) * x + c) * x + d) * x + e) * x + f\r\n-- y se eval\u00faa de dentro hacia afuera; es decir,\r\n--   v(0) = 0\r\n--   v(1) = v(0)*x+a = 0*x+a = a\r\n--   v(2) = v(1)*x+b = a*x+b \r\n--   v(3) = v(2)*x+c = (a*x+b)*x+c = a*x^2+b*x+c\r\n--   v(4) = v(3)*x+d = (a*x^2+b*x+c)*x+d = a*x^3+b*x^2+c*x+d\r\n--   v(5) = v(4)*x+e = (a*x^3+b*x^2+c*x+d)*x+e = a*x^4+b*x^3+c*x^2+d*x+e\r\n--   v(6) = v(5)*x+f = (a*x^4+b*x^3+c*x^2+d*x+e)*x+f = a*x^5+b*x^4+c*x^3+d*x^2+e*x+f\r\n-- \r\n-- Definir la funci\u00f3n\r\n--    horner :: (Num a, Eq a) => Polinomio a -> a -> a\r\n-- tal que (horner p x) es el valor del polinomio p al sustituir su\r\n-- variable por el n\u00famero x. Por ejemplo, \r\n--    horner pol1 0     ==  0\r\n--    horner pol1 1     ==  10\r\n--    horner pol1 1.5   ==  24.84375\r\n--    horner pol1 (3%2) ==  795 % 32\r\n-- ---------------------------------------------------------------------\r\n\r\nhorner :: (Num a, Eq a) => Polinomio a -> a -> a\r\nhorner p x = hornerAux (coeficientes p) 0 \r\n    where hornerAux [] v     = v\r\n          hornerAux (a:as) v = hornerAux as (v*x+a)\r\n\r\n-- El c\u00e1lculo de (horner pol1 2) es el siguiente\r\n--    horner pol1 2 \r\n--    = hornerAux [1,0,0,5,4,0] 0\r\n--    = hornerAux   [0,0,5,4,0] ( 0*2+1) = hornerAux   [0,0,5,4,0] 1\r\n--    = hornerAux     [0,5,4,0] ( 1*2+0) = hornerAux     [0,5,4,0] 2\r\n--    = hornerAux       [5,4,0] ( 2*2+0) = hornerAux       [5,4,0] 4\r\n--    = hornerAux         [4,0] ( 4*2+5) = hornerAux         [4,0] 13\r\n--    = hornerAux           [0] (13*2+4) = hornerAux           [0] 30 \r\n--    = hornerAux            [] (30*2+0) = hornerAux            [] 60 \r\n\r\n-- Una defininici\u00f3n equivalente por plegado es\r\nhorner' :: (Num a, Eq a) => Polinomio a -> a -> a\r\nhorner' p x = (foldr (\\a b -> a + b*x) 0) (coeficientes p)\r\n<\/pre>\n<p>Los ejercicios de la relaci\u00f3n 23 son<\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas                                           --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport PolOperaciones\r\nimport Test.QuickCheck\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejemplos                                                           --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Adem\u00e1s de los ejemplos de polinomios (ejPol1, ejPol2 y ejPol3) que se\r\n-- encuentran en PolOperaciones, usaremos el siguiente ejemplo.\r\nejPol4 :: Polinomio Int\r\nejPol4 = consPol 3 1 \r\n                 (consPol 2 2 \r\n                          (consPol 1 (-1) \r\n                                   (consPol 0 (-2) polCero)))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    divisores :: Int -> [Int]\r\n-- tal que (divisores n) es la lista de todos los divisores enteros de\r\n-- n. Por ejemplo,\r\n--    divisores 4     ==  [1,-1,2,-2,4,-4]\r\n--    divisores (-6)  ==  [1,-1,2,-2,3,-3,6,-6]\r\n-- ---------------------------------------------------------------------\r\n\r\ndivisores :: Int -> [Int]\r\ndivisores n = concat [[x,-x] | x <- [1..abs n], rem n x == 0]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    coeficiente :: (Num a, Eq a) => Int -> Polinomio a -> a\r\n-- tal que (coeficiente k p) es el coeficiente del t\u00e9rmino de grado k en\r\n-- p. Por ejemplo:\r\n--     coeficiente 4 ejPol1 == 3\r\n--     coeficiente 3 ejPol1 == 0\r\n--     coeficiente 2 ejPol1 == -5\r\n--     coeficiente 5 ejPol1 == 0\r\n-- ---------------------------------------------------------------------\r\n\r\ncoeficiente :: (Num a, Eq a) => Int -> Polinomio a -> a\r\ncoeficiente k p | k == gp      = coefLider p\r\n                | k > grado rp = 0\r\n                | otherwise    = coeficiente k rp\r\n                where gp = grado p\r\n                      rp = restoPol p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n \r\n--    terminoIndep :: (Num a, Eq a) => Polinomio  a -> a\r\n-- tal que (terminoIndep p) es el t\u00e9rmino independiente del polinomio\r\n-- p. Por ejemplo,\r\n--    terminoIndep ejPol1 == 3\r\n--    terminoIndep ejPol2 == 0\r\n--    terminoIndep ejPol4 == -2\r\n-- ---------------------------------------------------------------------\r\n\r\nterminoIndep :: (Num a, Eq a) => Polinomio  a -> a\r\nterminoIndep p = coeficiente 0 p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n \r\n--    coeficientes :: (Num a, Eq a) => Polinomio a -> [a]\r\n-- tal que (coeficientes p) es la lista de coeficientes de p, ordenada\r\n-- seg\u00fan el grado. Por ejemplo,\r\n--     coeficientes ejPol1 == [3,0,-5,0,3]\r\n--     coeficientes ejPol4 == [1,2,-1,-2]\r\n--     coeficientes ejPol2 == [1,0,0,5,4,0]\r\n-- ---------------------------------------------------------------------\r\n\r\ncoeficientes :: (Num a, Eq a) => Polinomio a -> [a]\r\ncoeficientes p = [coeficiente k p | k <- [n,n-1..0]]\r\n    where n = grado p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n \r\n--    creaPol :: (Num a, Eq a) => [a] -> Polinomio a\r\n-- tal que (creaPol cs) es el polinomio cuya lista de coeficientes es\r\n-- cs. Por ejemplo,\r\n--     creaPol [1,0,0,5,4,0] == x^5 + 5*x^2 + 4*x\r\n--     creaPol [1,2,0,3,0]   == x^4 + 2*x^3 + 3*x\r\n-- ---------------------------------------------------------------------\r\n\r\ncreaPol :: (Num a, Eq a) => [a] -> Polinomio a\r\ncreaPol []     = polCero\r\ncreaPol (a:as) = consPol n a (creaPol as)\r\n    where n = length as\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Comprobar con QuickCheck que, dado un polinomio p, el\r\n-- polinomio obtenido mediante creaPol a partir de la lista de\r\n-- coeficientes de p coincide con p.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_coef:: Polinomio Int -> Bool\r\nprop_coef p =\r\n    creaPol (coeficientes p) == p\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_coef\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir una funci\u00f3n \r\n--    pRuffini:: Int -> [Int] -> [Int]\r\n-- tal que (pRuffini r cs) es la lista que resulta de aplicar un paso\r\n-- del regla de Ruffini al n\u00famero entero r y a la lista de coeficientes\r\n-- cs. Por ejemplo,\r\n--    pRuffini 2 [1,2,-1,-2] == [1,4,7,12]\r\n--    pRuffini 1 [1,2,-1,-2] == [1,3,2,0]\r\n-- ya que\r\n--      | 1  2  -1  -2           | 1  2  -1  -2\r\n--    2 |    2   8  14         1 |    1   3   2\r\n--    --+--------------        --+-------------\r\n--      | 1  4   7  12           | 1  3   2   0\r\n-- ---------------------------------------------------------------------\r\n\r\npRuffini :: Int -> [Int] -> [Int]\r\npRuffini r p@(c:cs) = \r\n    c : [x+r*y | (x,y) <- zip cs (pRuffini r p)]\r\n\r\n-- Otra forma:\r\npRuffini' :: Int -> [Int] -> [Int]\r\npRuffini' r = scanl1 (\\s x -> s * r + x)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir la funci\u00f3n \r\n--    cocienteRuffini:: Int -> Polinomio Int -> Polinomio Int\r\n-- tal que (cocienteRuffini r p) es el cociente de dividir el polinomio\r\n-- p por el polinomio x-r. Por ejemplo:\r\n--     cocienteRuffini 2 ejPol4    == x^2 + 4*x + 7\r\n--     cocienteRuffini (-2) ejPol4 == x^2 + -1\r\n--     cocienteRuffini 3 ejPol4    == x^2 + 5*x + 14\r\n-- ---------------------------------------------------------------------\r\n\r\ncocienteRuffini :: Int -> Polinomio Int -> Polinomio Int\r\ncocienteRuffini r p = creaPol (init (pRuffini r (coeficientes p)))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Definir la funci\u00f3n \r\n--    restoRuffini:: Int -> Polinomio Int -> Int\r\n-- tal que (restoRuffini r p) es el resto de dividir el polinomio p por\r\n-- el polinomio x-r. Por ejemplo, \r\n--     restoRuffini 2 ejPol4    == 12\r\n--     restoRuffini (-2) ejPol4 == 0\r\n--     restoRuffini 3 ejPol4    == 40\r\n-- ---------------------------------------------------------------------\r\n\r\nrestoRuffini :: Int -> Polinomio Int -> Int\r\nrestoRuffini r p = last (pRuffini r (coeficientes p))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Comprobar con QuickCheck que, dado un polinomio p y un\r\n-- n\u00famero entero r, las funciones anteriores verifican la propiedad de\r\n-- la divisi\u00f3n eucl\u00eddea.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_diviEuclidea:: Int -> Polinomio Int -> Bool\r\nprop_diviEuclidea r p =\r\n    p == sumaPol (multPol coc div) res\r\n    where coc = cocienteRuffini r p\r\n          div = creaPol [1,-r]\r\n          res = creaTermino 0 (restoRuffini r p) \r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_diviEuclidea\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Definir la funci\u00f3n\r\n--     esRaizRuffini:: Int -> Polinomio Int -> Bool \r\n-- tal que (esRaizRuffini r p) se verifica si r es una raiz de p, usando\r\n-- para ello el regla de Ruffini. Por ejemplo,\r\n--     esRaizRuffini 0 ejPol3 == True\r\n--     esRaizRuffini 1 ejPol3 == False\r\n-- ---------------------------------------------------------------------\r\n\r\nesRaizRuffini:: Int -> Polinomio Int -> Bool \r\nesRaizRuffini r p = restoRuffini r p == 0\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12. Definir la funci\u00f3n \r\n--     raicesRuffini :: Polinomio Int -> [Int]\r\n-- tal que (raicesRuffini p) es la lista de las raices enteras de p,\r\n-- calculadas usando el regla de Ruffini. Por ejemplo,\r\n--    raicesRuffini ejPol1  == []\r\n--    raicesRuffini ejPol2  == [0,-1]\r\n--    raicesRuffini ejPol3  == [0]\r\n--    raicesRuffini ejPol4  == [1,-1,-2]\r\n--    raicesRuffini polCero == []\r\n-- ---------------------------------------------------------------------\r\n\r\nraicesRuffini :: Polinomio Int -> [Int]\r\nraicesRuffini p     \r\n    | esPolCero p = []\r\n    | otherwise   = aux (0 : divisores (terminoIndep p))\r\n    where \r\n      aux [] = []\r\n      aux (r:rs) \r\n          | esRaizRuffini r p = r : raicesRuffini (cocienteRuffini r p) \r\n          | otherwise         = aux rs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13. Definir la funci\u00f3n\r\n--    factorizacion :: Polinomio Int -> [Polinomio Int]\r\n-- tal que (factorizacion p) es la lista de la descomposici\u00f3n del\r\n-- polinomio p en factores obtenida mediante el regla de Ruffini. Por\r\n-- ejemplo, \r\n--  ejPol2                               ==  x^5 + 5*x^2 + 4*x\r\n--  factorizacion ejPol2                 == [1*x,1*x+1,x^3+-1*x^2+1*x+4]\r\n--  ejPol4                               == x^3 + 2*x^2 + -1*x + -2\r\n--  factorizacion ejPol4                 == [1*x + -1,1*x + 1,1*x + 2,1]\r\n--  factorizacion (creaPol [1,0,0,0,-1]) == [1*x + -1,1*x + 1,x^2 + 1]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactorizacion :: Polinomio Int -> [Polinomio Int]\r\nfactorizacion p \r\n    | esPolCero p = [p]\r\n    | otherwise   = aux (0 : divisores (terminoIndep p))\r\n    where \r\n      aux [] = [p]\r\n      aux (r:rs)  \r\n          | esRaizRuffini r p = \r\n              (creaPol [1,-r]) : factorizacion (cocienteRuffini r p) \r\n          | otherwise = aux rs\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han explicado las soluciones del ejercicios con el TAD de los polinomios presentados en la clase del d\u00eda 11. Los ejercicios de la relaci\u00f3n 22 son<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[222],"tags":[270,300],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4192"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=4192"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4192\/revisions"}],"predecessor-version":[{"id":4193,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4192\/revisions\/4193"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}