Número primo de Sheldon

En el episodio número 73 de la serie «The Big Bang Theory», Sheldon Cooper enuncia lo siguiente:

«El mejor número es el 73. El 73 es el 21-ésimo número primo. Al invertir sus cifras obtenemos 37, que es el primo número 12. Y al invertir este obtenemos 21, que es el producto de, agarraos fuerte, 7 y 3.»

Se define un número primo de Sheldon como: el n-ésimo número primo p(n) será un primo de Sheldon si cumple que el producto de sus dígitos es n y si, además, el número que se obtiene al invertir sus cifras, rev(p(n)), es el rev(n)-ésimo número primo; es decir, si rev(p(n)) = p(rev(n)).

Definir la función

tal que (esPrimoSheldon x) se verifica si x un primo de Sheldon. Por ejemplo,

Comprobar con QuickCheck que 73 es el único primo de Sheldon.

Referencia: Este ejercicio está basado en la noticia Descubierta una nueva propiedad de los números primos gracias a The Big Bang Theory donde podéis leer más información sobre el tema, entre ello la prueba de que el 73 es el único número primo de Sheldon.

Nota: Este ejercicio ha sido propuesto por Ángel Ruiz Campos.

Soluciones

[schedule expon=’2019-06-12′ expat=»06:00″]

  • Las soluciones se pueden escribir en los comentarios hasta el 12 de junio.
  • El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>

Pensamiento

El mejor número es el 73. El 73 es el 21-ésimo número primo. Al invertir sus cifras obtenemos 37, que es el primo número 12. Y al invertir este obtenemos 21, que es el producto de, agarraos fuerte, 7 y 3.

Sheldon Cooper

[/schedule]

[schedule on=’2019-06-12′ at=»06:00″]

[/schedule]

10 Comentarios

  1. Complicándose un poco más…

  2. esPrimoSheldon = (==73)

    O(1)

    *Main> :main
    +++ OK, passed 100000 tests (0.304% = 73).

  3. esPrimoSheldon :: Int -> Bool
    esPrimoSheldon x | not(isPrime x) || not(isPrime (inverso x)) = False
    |otherwise = posicion x == inverso (posicion (inverso x)) &&
    sort (primeFactors (posicion x)) == sort (digitos x)

    posicion :: Int -> Int
    posicion x | not (isPrime x) = error «no es primo»
    | otherwise = head [n | n <- [0..], primes !! n == x] + 1

    inverso :: Int -> Int
    inverso x = aDigito (reverse (digitos x))
    aDigito :: [Int] -> Int
    aDigito [] = 0
    aDigito (x:xs) = x *10^length(xs) + aDigito xs

    digitos :: Int -> [Int]
    digitos x = [read [y] | y <- show x]

    prop_primoSheldon :: Int -> Property
    prop_primoSheldon n = isPrime n && n /= 73 ==> not (esPrimoSheldon n)

Escribe tu solución