{"id":5373,"date":"2016-03-16T20:12:15","date_gmt":"2016-03-16T19:12:15","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5373"},"modified":"2016-03-22T19:14:07","modified_gmt":"2016-03-22T18:14:07","slug":"i1m2015-soluciones-en-maxima-del-4o-examen","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2015-soluciones-en-maxima-del-4o-examen\/","title":{"rendered":"I1M2015: Soluciones en Maxima del 4\u00ba examen"},"content":{"rendered":"<p>Hoy se ha realizado el 4\u00ba examen del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-15\">Inform\u00e1tica<\/a> (de 1\u00ba de Grado en Matem\u00e1ticas) y sus soluciones en Haskell se han publicado en la <a href=\"http:\/\/bit.ly\/1LBco4N\">entrada anterior<\/a>.<\/p>\n<p>Las soluciones de los ejercicios tambi\u00e9n se pueden definir en Maxima, como se muestra a continuaci\u00f3n<\/p>\n<p><!--more--><\/p>\n<pre lang=\"text\">\n\/* ---------------------------------------------------------------------\n   Ejercicio 1. Definir la funci\u00f3n siguiente tal que siguiente(x,ys) es\n   justo el elemento siguiente a la primera ocurrencia de x en ys o\n   Nothing si x no pertenece a ys. Por ejemplo, \n      siguiente (5,[3,5,2,5,7])  ==  Just(2)\n      siguiente (7,[3,5,2,5,7])  ==  Nothing\n      siguiente (4,[3,5,2,5,7])  ==  Nothing\n   ------------------------------------------------------------------ *\/\n\n\/* 1\u00aa definici\u00f3n\n   =============\n*\/\n\nsiguiente1 (x,ys) :=\n  if     length (ys) <= 1 then Nothing\n  elseif x = first (ys)   then Just (second (ys))\n                          else siguiente1 (x,rest(ys))$\n\n\/* 2\u00aa definici\u00f3n\n   =============\n*\/\n\nsiguiente2 (x,ys) := block ([],\n  unless (first (ys) = x or length (ys) < 2) do\n    ys : rest (ys),\n  if     length (ys) < 2 then Nothing\n  elseif first (ys) = x  then Just (second (ys))\n                         else Nothing)$                    \n                      \n\/* Comparaci\u00f3n de eficiencia\n   =========================\n\n   (%i5) siguiente1 (400, makelist (k,k,1,500));\n   Unrecoverable error: bind stack overflow.\n\n   (%i6) siguiente2 (400, makelist (k,k,1,500));\n   Evaluation took 0.0100 seconds (0.0200 elapsed)\n   (%o6) Just(401)\n*\/\n\n\/* ---------------------------------------------------------------------\n   Ejercicio 2. Un n\u00famero n es k-belga si la sucesi\u00f3n cuyo primer\n   elemento es k y cuyos elementos se obtienen sumando reiteradamente\n   los d\u00edgitos de n contiene a n. Por ejemplo,\n   + El 18 es 0-belga, porque a partir del 0 vamos a ir sumando\n     sucesivamente 1, 8, 1, 8, ... hasta llegar o sobrepasar el 18: 0, 1,\n     9, 10, 18, ... Como se alcanza el 18, resulta que el 18 es 0-belga. \n   + El 19 no es 1-belga, porque a partir del 1 vamos a ir sumando\n     sucesivamente 1, 9, 1, 9, ... hasta llegar o sobrepasar el 19: 1, 2,\n     11, 12, 21, ... Como no se alcanza el 19, resulta que el 19 no es\n     1-belga. \n  \n   Definir la funci\u00f3n esBelga tal que esBelga(k,n) se verifica si n es\n   k-belga. Por ejemplo, \n      esBelga (0,18)    ==  true\n      esBelga (1,19)    ==  false\n      esBelga (0,2016)  ==  true\n   Otros ejemplos,\n      (%i5) sublist (makelist (x,x,1,30), lambda ([x], esBelga (7,x)));\n      (%o5) [7, 10, 11, 21, 27, 29]\n      (%i6) sublist (makelist (x,x,1,30), lambda ([x], esBelga (10,x)));\n      (%o6) [10, 11, 20, 21, 22, 24, 26]\n      (%i7) length (sublist (makelist (x,x,1,9000), lambda ([x], esBelga (0,x))));\n      (%o7) 2857\n   ------------------------------------------------------------------ *\/\n\n\/* 1\u00aa definici\u00f3n\n   =============\n*\/\n\nesBelga1 (k,n) := block (\n  [s:k,\n   sucesion : repite (n,digitos(n))],\n  while s < n do\n    ( s : s + first (sucesion),\n      sucesion : rest (sucesion) ),\n  is (s = n))$\n\n\/* digitos(n) es la lista de los digitos del n\u00famero n. Por ejemplo, \n      digitos (320274) == [3,2,0,2,7,4]\n*\/      \ndigitos (n) := \n  block([q, r, ys:[]],\n    [q,r] : divide(n,10),\n    unless q = 0 do (\n      ys    : cons(r,ys),\n      [q,r] : divide(q,10)),\n    cons(r,ys))$\n\n\/* repite (n,xs) es una lista obtenida concatenando n copias de xs. Por\n   ejemplo,\n      repite (3,[1,5,7])  == [1, 5, 7, 1, 5, 7, 1, 5, 7]\n*\/\nrepite (n,xs) := block ([ys:[]],\n  for i:1 thru n do\n    ys : append (xs,ys),\n  ys)$\n\n\/* 2\u00aa definici\u00f3n\n   =============\n*\/\n\nesBelga2 (k,n) := block ([ds,s,q,r],\n  if k > n then return (false)\n  else\n    ds : digitos (n),\n    s  : lreduce (\"+\",ds),\n    q  : quotient (n-k,s),\n    r  : k + q * s,\n    while r < n do\n       ( r : r + first (ds),\n         ds : rest (ds) ),\n    is (r = n))$\n\n\/* Comparaci\u00f3n de eficiencia\n   =========================\n\n   (%i6) showtime : true$\n   Evaluation took 0.0000 seconds (0.0000 elapsed)\n   \n   (%i7) length (sublist (makelist (x,x,1,1000), lambda ([x], esBelga2 (0,x))));\n   Evaluation took 7.5600 seconds (7.5700 elapsed)\n   (%o7) 362\n   \n   (%i8) length (sublist (makelist (x,x,1,1000), lambda ([x], esBelga3 (0,x))));\n   Evaluation took 0.1700 seconds (0.1600 elapsed)\n   (%o8) 362\n*\/\n\n\/* ---------------------------------------------------------------------\n   Ejercicio 3. Los \u00e1rboles binarios con datos en los nodos y hojas se\n   pueden representar mediante lista donde el primer elemento es la\n   ra\u00edz, el segundo el sub\u00e1rbol izquierdo y el tercero el derecho. Por\n   ejemplo, el \u00e1rbol \n             3\n            \/ \\\n           \/   \\\n          4     7\n         \/ \\   \/ \\\n        5   1 9   3\n       \/ \\\n      2   0   \n   se representa por\n      ejArbol : [3, [4, [5, 2, 0],\n                         1],\n                    [7, 9, 3]]$\n  \n   Anotando cada elemento del \u00e1rbol anterior con su profundidad, se\n   obtiene el \u00e1rbol siguiente  \n             3-0\n             \/ \\\n            \/   \\\n           \/     \\\n         4-1     7-1\n         \/ \\     \/ \\\n       5-2 1-2 9-2 3-2\n       \/ \\\n     2-3 0-3   \n  \n   Definir la funci\u00f3n anotado tal que anotado(x) es el \u00e1rbol obtenido\n   anotando los elementos de x con su profundidad. Por ejemplo,\n      (%i3) anotado (ejArbol);\n      (%o3) [p(3, 0), [p(4, 1), [p(5, 2), p(2, 3), p(0, 3)],\n                                p(1, 2)], \n                      [p(7, 1), p(9, 2), p(3, 2)]]\n   ------------------------------------------------------------------ *\/\n\n\nejArbol : [3, [4, [5, 2, 0],\n                   1],\n              [7, 9, 3]]$\n\nesHoja (a) := atom (a)$\n\nraiz (a) := first (a)$\n\nizquierdo (a) := second (a)$\n\nderecho (a) := third (a)$\n\nanotado (a) :=\n  if esHoja (a)\n  then p(a,0)\n  else anotadoAux (a,0)$\n\nanotadoAux (a,n) :=\n  if esHoja (a)\n  then p a,n) \n  else [p(raiz (a),n),\n        anotadoAux (izquierdo (a), n+1),\n        anotadoAux (derecho (a), n+1)]$\n\n\/* ---------------------------------------------------------------------\n   Ejercicio 4. El pasado 11 de marzo se ha publicado el art\u00edculo\n   \"Unexpected biases in the distribution of consecutive primes\" en el\n   que muestra que los n\u00fameros primos repelen a otros primos que\n   terminan en el mismo d\u00edgito. \n  \n   La lista de los \u00faltimos d\u00edgitos de los 30 primeros n\u00fameros es\n      [2,3,5,7,1,3,7,9,3,9,1,7,1,3,7,3,9,1,7,1,3,9,3,9,7,1,3,7,9,3]\n   Se observa que hay 6 n\u00fameros que su \u00faltimo d\u00edgito es un 1 y de sus\n   consecutivos 4 terminan en 3 y 2 terminan en 7.\n  \n   Definir la funci\u00f3n distribucionUltimos tal que distribucionUltimos(n)\n   es la matriz cuyo elemento (i,j) indica cu\u00e1ntos de los n primeros\n   n\u00fameros primos terminan en i y su siguiente n\u00famero primo termina en\n   j. Por ejemplo, \n      (%i6) distribucionUltimos (30);\n            [ 0  0  4  0  0  0  2  0  0 ]\n            [                           ]\n            [ 0  0  1  0  0  0  0  0  0 ]\n            [                           ]\n            [ 0  0  0  0  1  0  4  0  4 ]\n            [                           ]\n            [ 0  0  0  0  0  0  0  0  0 ]\n            [                           ]\n      (%o6) [ 0  0  0  0  0  0  1  0  0 ]\n            [                           ]\n            [ 0  0  0  0  0  0  0  0  0 ]\n            [                           ]\n            [ 4  0  1  0  0  0  0  0  2 ]\n            [                           ]\n            [ 0  0  0  0  0  0  0  0  0 ]\n            [                           ]\n            [ 2  0  3  0  0  0  1  0  0 ]\n        \n      (%i7) distribucionUltimos (10^4);\n            [ 365  0  833  0  0  0  889  0  397 ]\n            [                                   ]\n            [  0   0   1   0  0  0   0   0   0  ]\n            [                                   ]\n            [ 529  0  324  0  1  0  754  0  907 ]\n            [                                   ]\n            [  0   0   0   0  0  0   0   0   0  ]\n            [                                   ]\n      (%o7) [  0   0   0   0  0  0   1   0   0  ]\n            [                                   ]\n            [  0   0   0   0  0  0   0   0   0  ]\n            [                                   ]\n            [ 655  0  722  0  0  0  323  0  808 ]\n            [                                   ]\n            [  0   0   0   0  0  0   0   0   0  ]\n            [                                   ]\n            [ 935  0  636  0  0  0  541  0  379 ]\n\n   Nota: Se observa c\u00f3mo se \"repelen\" ya que en las filas del 1, 3, 7 y\n   9 el menor elemento es el de la diagonal.\n   ------------------------------------------------------------------ *\/\n\ndistribucionUltimos (n) := block (\n  [r : zeromatrix (9,9),\n   xs : ultimos (n),\n   i, j],\n  unless length (xs) < 2 do\n    ( i : first (xs),\n      j : second (xs),\n      r[i,j] : 1 + r[i,j],\n      xs : rest (xs)),\n  r)$\n\n\/* ultimos(n) es la lista del \u00faltimo d\u00edgito de los n primeros primos.\n      (%i5) ultimos (30);\n      (%o5) [2,3,5,7,1,3,7,9,3,9,1,7,1,3,7,3,9,1,7,1,3,9,3,9,7,1,3,7,9,3,7]\n*\/\nultimos (n) := block ([r:[], p:2],\n  for k from 0 thru n do\n    ( r : cons (mod (p,10), r),\n      p : next_prime (p) ),\n  reverse (r))$  \n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Hoy se ha realizado el 4\u00ba examen del curso de Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas) y sus soluciones en Haskell se han publicado en la entrada anterior. Las soluciones de los ejercicios tambi\u00e9n se pueden definir en Maxima, como se muestra 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":[250],"tags":[310,281],"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\/5373"}],"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=5373"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5373\/revisions"}],"predecessor-version":[{"id":5374,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5373\/revisions\/5374"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}