{"id":8075,"date":"2023-04-27T06:00:29","date_gmt":"2023-04-27T04:00:29","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=8075"},"modified":"2023-04-20T16:34:34","modified_gmt":"2023-04-20T14:34:34","slug":"27-abr-23","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/27-abr-23\/","title":{"rendered":"TAD de los polinomios: Producto de polinomios"},"content":{"rendered":"<p>Usando el <a href=\"https:\/\/bit.ly\/3KwqXYu\">tipo abstracto de los polinomios<\/a>, definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   multPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a\n<\/pre>\n<p>tal que <code>multPol p q<\/code> es el producto de los polinomios <code>p<\/code> y <code>q<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> ejPol1 = consPol 4 3 (consPol 2 (-5) (consPol 0 3 polCero))\n   \u03bb> ejPol2 = consPol 5 1 (consPol 2 5 (consPol 1 4 polCero))\n   \u03bb> ejPol1\n   3*x^4 + -5*x^2 + 3\n   \u03bb> ejPol2\n   x^5 + 5*x^2 + 4*x\n   \u03bb> multPol ejPol1 ejPol2\n   3*x^9 + -5*x^7 + 15*x^6 + 15*x^5 + -25*x^4 + -20*x^3 + 15*x^2 + 12*x\n<\/pre>\n<p>Comprobar con QuickCheck las siguientes propiedades<\/p>\n<ul>\n<li>El producto de polinomios es conmutativo.<\/li>\n<li>El producto es distributivo respecto de la suma.<\/li>\n<\/ul>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nimport TAD.Polinomio (Polinomio, polCero, esPolCero, consPol, grado,\n                      coefLider, restoPol)\nimport Pol_Termino_lider (termLider)\nimport Pol_Suma_de_polinomios (sumaPol)\nimport Test.QuickCheck\n\nmultPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a\nmultPol p q\n  | esPolCero p = polCero\n  | otherwise    = sumaPol (multPorTerm (termLider p) q)\n                           (multPol (restoPol p) q)\n\n-- (multPorTerm t p) es el producto del t\u00e9rmino t por el polinomio\n-- p. Por ejemplo,\n--    ejTerm                     ==  4*x\n--    ejPol2                     ==  x^5 + 5*x^2 + 4*x\n--    multPorTerm ejTerm ejPol2  ==  4*x^6 + 20*x^3 + 16*x^2\nmultPorTerm :: (Num t, Eq t) => Polinomio t -> Polinomio t -> Polinomio t\nmultPorTerm term pol\n  | esPolCero pol = polCero\n  | otherwise     = consPol (n+m) (a*b) (multPorTerm term r)\n  where n = grado term\n        a = coefLider term\n        m = grado pol\n        b = coefLider pol\n        r = restoPol pol\n\n-- El producto de polinomios es conmutativo.\nprop_conmutativaProducto :: Polinomio Int -> Polinomio Int -> Bool\nprop_conmutativaProducto p q =\n  multPol p q == multPol q p\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_conmutativaProducto\n--    OK, passed 100 tests.\n\n-- El producto es distributivo respecto de la suma.\nprop_distributivaProductoSuma :: Polinomio Int -> Polinomio Int\n                                 -> Polinomio Int -> Bool\nprop_distributivaProductoSuma p q r =\n  multPol p (sumaPol q r) == sumaPol (multPol p q) (multPol p r)\n\n-- Comprobaci\u00f3n:\n--    \u03bb> quickCheck prop_distributivaProductoSuma\n--    OK, passed 100 tests.\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom typing import TypeVar\n\nfrom hypothesis import given\n\nfrom src.Pol_Suma_de_polinomios import sumaPol\nfrom src.Pol_Termino_lider import termLider\nfrom src.TAD.Polinomio import (Polinomio, coefLider, consPol, esPolCero, grado,\n                               polCero, polinomioAleatorio, restoPol)\n\nA = TypeVar('A', int, float, complex)\n\n# multPorTerm(t, p) es el producto del t\u00e9rmino t por el polinomio\n# p. Por ejemplo,\n#    ejTerm                     ==  4*x\n#    ejPol2                     ==  x^5 + 5*x^2 + 4*x\n#    multPorTerm ejTerm ejPol2  ==  4*x^6 + 20*x^3 + 16*x^2\ndef multPorTerm(term: Polinomio[A], pol: Polinomio[A]) -> Polinomio[A]:\n    n = grado(term)\n    a = coefLider(term)\n    m = grado(pol)\n    b = coefLider(pol)\n    r = restoPol(pol)\n    if esPolCero(pol):\n        return polCero()\n    return consPol(n + m, a * b, multPorTerm(term, r))\n\ndef multPol(p: Polinomio[A], q: Polinomio[A]) -> Polinomio[A]:\n    if esPolCero(p):\n        return polCero()\n    return sumaPol(multPorTerm(termLider(p), q),\n                   multPol(restoPol(p), q))\n\n# El producto de polinomios es conmutativo.\n@given(p=polinomioAleatorio(),\n       q=polinomioAleatorio())\ndef test_conmutativaProducto(p: Polinomio[int], q: Polinomio[int]) -> None:\n    assert multPol(p, q) == multPol(q, p)\n\n# El producto es distributivo respecto de la suma.\n@given(p=polinomioAleatorio(),\n       q=polinomioAleatorio(),\n       r=polinomioAleatorio())\ndef test_distributivaProductoSuma(p: Polinomio[int],\n                                  q: Polinomio[int],\n                                  r: Polinomio[int]) -> None:\n    assert multPol(p, sumaPol(q, r)) == sumaPol(multPol(p, q), multPol(p, r))\n\n# La comprobaci\u00f3n es\n#    > poetry run pytest -v Pol_Producto_polinomios.py\n#    test_conmutativaProducto PASSED\n#    test_distributivaProductoSuma PASSED\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Usando el tipo abstracto de los polinomios, definir la funci\u00f3n multPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a tal que multPol p q es el producto de los polinomios p y q. Por ejemplo, \u03bb> ejPol1 = consPol 4 3 (consPol 2 (-5) (consPol 0 3 polCero)) \u03bb>&#8230;<\/p>\n","protected":false},"author":1,"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":[581],"tags":[265],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8075"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=8075"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8075\/revisions"}],"predecessor-version":[{"id":8076,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8075\/revisions\/8076"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=8075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=8075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=8075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}