{"id":1942,"date":"2012-03-14T16:39:02","date_gmt":"2012-03-14T16:39:02","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1942"},"modified":"2013-03-08T05:48:17","modified_gmt":"2013-03-08T05:48:17","slug":"i1m2011-resolucion-de-una-ecuacion-con-factoriales-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2011-resolucion-de-una-ecuacion-con-factoriales-en-haskell\/","title":{"rendered":"I1M2011: Resoluci\u00f3n de una ecuaci\u00f3n con factoriales en Haskell"},"content":{"rendered":"<p>En la primera parte de la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han explicado las soluciones de los ejercicios de la  <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2011G1\/images\/0\/0a\/Rel_23.hs\">23\u00aa relaci\u00f3n<\/a>, cuyo objetivo es resolver la ecuaci\u00f3n<br \/>\n       <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=a%21+%2A+b%21+%3D+a%21+%2B+b%21+%2B+c%21&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"a! * b! = a! + b! + c!\" class=\"latex\" \/><br \/>\ndonde a, b y c son n\u00fameros naturales.<\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas auxiliares                                --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Test.QuickCheck \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    factorial :: Integer -> Integer\r\n-- tal que (factorial n) es el factorial de n. Por ejemplo,\r\n--    factorial 5  ==  120\r\n-- ---------------------------------------------------------------------\r\n\r\nfactorial :: Integer -> Integer\r\nfactorial n = product [1..n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la constante\r\n--    factoriales :: [Integer]\r\n-- tal que factoriales es la lista de los factoriales de los n\u00fameros\r\n-- naturales. Por ejemplo,\r\n--    take 7 factoriales  ==  [1,1,2,6,24,120,720]\r\n-- ---------------------------------------------------------------------\r\n\r\nfactoriales :: [Integer]\r\nfactoriales = [factorial n | n <- [0..]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir, usando factoriales, la funci\u00f3n\r\n--    esFactorial :: Integer -> Bool\r\n-- tal que (esFactorial n) se verifica si existe un  n\u00famero natural m\r\n-- tal que n es m!. Por ejemplo,\r\n--    esFactorial 120  ==  True\r\n--    esFactorial  20  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nesFactorial :: Integer -> Bool\r\nesFactorial n = n == head (dropWhile (<n) factoriales)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la constante\r\n--    posicionesFactoriales :: [(Integer,Integer)]\r\n-- tal que posicionesFactoriales es la lista de los factoriales con su\r\n-- posici\u00f3n. Por ejemplo,\r\n--    *Main> take 7 posicionesFactoriales\r\n--    [(0,1),(1,1),(2,2),(3,6),(4,24),(5,120),(6,720)]\r\n-- ---------------------------------------------------------------------\r\n\r\nposicionesFactoriales :: [(Integer,Integer)]\r\nposicionesFactoriales = zip [0..] factoriales \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    invFactorial :: Integer -> Maybe Integer\r\n-- tal que (invFactorial x) es (Just n) si el factorial de n es x y es\r\n-- Nothing, en caso contrario. Por ejemplo,\r\n--    invFactorial 120  == Just 5\r\n--    invFactorial 20   == Nothing\r\n-- ---------------------------------------------------------------------\r\n\r\ninvFactorial :: Integer -> Maybe Integer\r\ninvFactorial x \r\n    | esFactorial x = Just (head [n | (n,y) <- posicionesFactoriales, y==x])\r\n    | otherwise     = Nothing\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la constante\r\n--    pares :: [(Integer,Integer)]\r\n-- tal que pares es la lista de todos los pares de n\u00fameros naturales. Por\r\n-- ejemplo, \r\n--    *Main> take 11 pares\r\n--    [(0,0),(0,1),(1,1),(0,2),(1,2),(2,2),(0,3),(1,3),(2,3),(3,3),(0,4)]\r\n-- ---------------------------------------------------------------------\r\n\r\npares :: [(Integer,Integer)]\r\npares = [(x,y) | y <- [0..], x <- [0..y]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la constante\r\n--    solucionFactoriales :: (Integer,Integer,Integer)\r\n-- tal que solucionFactoriales es una terna (a,b,c) que es una soluci\u00f3n\r\n-- de la ecuaci\u00f3n \r\n--    a! * b! = a! + b! + c!\r\n-- Calcular el valor de solucionFactoriales.\r\n-- ---------------------------------------------------------------------\r\n\r\nsolucionFactoriales :: (Integer,Integer,Integer)\r\nsolucionFactoriales = (a,b,c)\r\n    where (a,b)  = head [(x,y) | (x,y) <- pares,\r\n                                 esFactorial (f x * f y - f x - f y)]\r\n          f      = factorial \r\n          Just c = invFactorial (f a * f b - f a - f b)\r\n\r\n-- El c\u00e1lculo es\r\n--    *Main> solucionFactoriales\r\n--    (3,3,4)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Comprobar con QuickCheck que solucionFactoriales es la\r\n-- \u00fanica soluci\u00f3n de la ecuaci\u00f3n\r\n--    a! * b! = a! + b! + c!\r\n-- con a, b y c n\u00fameros naturales\r\n-- ---------------------------------------------------------------------\r\n\r\nprop_solucionFactoriales :: Integer -> Integer -> Integer -> Property\r\nprop_solucionFactoriales x y z =\r\n    x >= 0 && y >= 0 && (x,y,z) \/= solucionFactoriales \r\n    ==> not (esFactorial (f x * f y - f x - f y))\r\n    where f = factorial\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Nota: El ejercicio se basa en el art\u00edculo \"Ecuaci\u00f3n con factoriales\"\r\n-- del blog Gaussianos publicado en\r\n--    http:\/\/gaussianos.com\/ecuacion-con-factoriales\r\n-- ---------------------------------------------------------------------\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la primera parte de la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han explicado las soluciones de los ejercicios de la 23\u00aa relaci\u00f3n, cuyo objetivo es resolver la ecuaci\u00f3n donde a, b y c son n\u00fameros naturales. Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[1],"tags":[295],"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\/1942"}],"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=1942"}],"version-history":[{"count":8,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1942\/revisions"}],"predecessor-version":[{"id":2843,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1942\/revisions\/2843"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}