Menu Close

Etiqueta: Haskell

Números de Lychrel

Según la Wikipedia, un número de Lychrel es un número natural para el que nunca se obtiene un capicúa mediante el proceso de invertir las cifras y sumar los dos números. Por ejemplo, los siguientes números no son números de Lychrel:

  • 56, ya que en un paso se obtiene un capicúa: 56+65=121.
  • 57, ya que en dos pasos se obtiene un capicúa: 57+75=132, 132+231=363
  • 59, ya que en dos pasos se obtiene un capicúa: 59+95=154, 154+451=605, 605+506=1111
  • 89, ya que en 24 pasos se obtiene un capicúa.

En este ejercicio, pensado para la asignatura de Informática (del Grado de Matemáticas) vamos a buscar con Haskell el primer número de Lychrel.

El número de Mersenne 47 en Haskell

En el artículo Cruce de listas abordamos el tema de la simplicidad y eficiencia de las soluciones. En este artículo deseo mostrar la capacidad de Haskell para calcular con grandes números enteros. Para ello, he elegido calcular el último primo de Mersenne descubierto.

Los números primos de Mersenne son los primos de la forma 2^n-1. El último primo de Mersenne descubierto es M_{47}=2^{43112609}-1 que es un número con más de 12 millones de cifras. El descubrimiento lo realizó Edson Smith el 23 de agosto de 2008. Dicho número es el 47 primo de Mersenne conocido.

Cruce de listas

En esta entrada comento las soluciones en Haskell y Maxima de un problema planteado por Adam Majewski en la lista de Maxima en forma de ejercicio para I1M y PD. Además, añadiré soluciones en otros lenguajes conforme las vaya recibiendo.

1. Solución en Haskell

En este ejercico se usarán las siguientes librerías

import Data.List
import Test.QuickCheck

Ejercicio 1. Definir la función

cruce :: Eq a => [a] -> [a] -> [[a]]

tal que (cruce xs ys) es la lista de las listas obtenidas con uniendo las listas de xs sin un elemento con las de ys sin un elemento. Por ejemplo,

*Main> cruce [1,5,3] [2,4]
[[5,3,4],[5,3,2],[1,3,4],[1,3,2],[1,5,4],[1,5,2]]
*Main> cruce [1,5,3] [2,4,6]
[[5,3,4,6],[5,3,2,6],[5,3,2,4],[1,3,4,6],[1,3,2,6],
 [1,3,2,4],[1,5,4,6],[1,5,2,6],[1,5,2,4]]

Cero elevado a cero y errores informáticos

Es muy frecuente los errores que se comenten al calcular el valor de “cero elevado a cero”. De esta forma, hay quienes piensan erróneamente que es un operación “prohibida”, que es una indeterminada o que su valor es 0.

En el artículo Cero elevado a la cero de Gustavo Piñeiro se explica detalladamente porqué cero elevado a cero es igual a uno.

Los errores sobre cero elevado a cero no sólo se dan entre los humanos, sino que también se dan en los sistemas informáticos. Maxima lo calcula erróneamente como se puede observar en la siguiente sesión

El problema de los números felices

1. El problema de los números felices

Según la Wikipedia, un número feliz se define por el siguiente proceso. Se comienza reemplazando el número por la suma del cuadrado de sus cifras y se repite el proceso hasta que se obtiene el número 1 o se entra en un ciclo que no contiene al 1. Aquellos números para los que el proceso termina en 1 se llaman números felices y los que entran en un ciclo sin 1 se llaman números desgraciados.

Por ejemplo, 7 es un número feliz porque

  7 ~> 7^2                              =  49
     ~> 4^2 + 9^2          = 16 + 81    =  97
     ~> 9^2 + 7^2          = 81 + 49    = 130
     ~> 1^2 + 3^2 + 0^2    =  1 + 9 + 0 =  10
     ~> 1^2 + 0^2          =  1 + 0     =   1

Pero 17 es un número desgraciado porque

   17 ~> 1^2 + 7^2           =  1 + 49        =  50
       ~> 5^2 + 0^2          = 25 +  0        =  25
       ~> 2^2 + 5^2          =  4 + 25        =  29
       ~> 2^2 + 9^2          =  4 + 81        =  85
       ~> 8^2 + 5^2          = 64 + 25        =  89
       ~> 8^2 + 9^2          = 64 + 81        = 145
       ~> 1^2 + 4^2 + 5^2    =  1 + 16 + 25   =  42
       ~> 4^2 + 2^2          = 16 +  4        =  20
       ~> 2^2 + 0^2          =  4 +  0        =   4
       ~> 4^2                                 =  16
       ~> 1^2 + 6^2          = 1 + 36         =  37
       ~> 3^2 + 7^2          = 9 + 49         =  58
       ~> 5^2 + 8^2          = 25 + 64        =  89

que forma un bucle al repetirse el 89.

El objetivo del ejercicio es definir una función que calcule todos los números felices hasta un límite dado.