Menu Close

Primo anterior

Definir la función

   primoAnterior :: Integer -> Integer

tal que (primoAnterior n) es el mayor primo menor que n (donde n > 2). Por ejemplo,

   primoAnterior 10     ==  7
   primoAnterior 17     ==  13
   primoAnterior 30     ==  29
   primoAnterior 2016   ==  2011
   primoAnterior 15726  ==  15683

Calcular el menor número cuya distancia a su primo anterior es mayor que 40.

Soluciones

import Data.Numbers.Primes ( isPrime
                           , primes
                           )
 
-- 1ª definición
primoAnterior1 :: Integer -> Integer
primoAnterior1 n =
  last (takeWhile (<n) primes)
 
-- 2ª definición
primoAnterior2 :: Integer -> Integer
primoAnterior2 3 = 2
primoAnterior2 n =
  head [x | x <- [a,a-2..]
          , isPrime x]
  where a | even n    = n-1
          | otherwise = n-2
 
-- Comparación de eficiencia  
--    λ> primoAnterior1 3000000
--    2999999
--    (1.80 secs, 1,148,572,848 bytes)
--    λ> primoAnterior2 3000000
--    2999999
--    (0.00 secs, 0 bytes)
--    
--    λ> head [n | n <- [3..], n - primoAnterior1 n > 34]
--    9586
--    (28.08 secs, 14,396,008,560 bytes)
--    λ> head [n | n <- [3..], n - primoAnterior2 n > 34]
--    9586
--    (1.10 secs, 625,247,632 bytes)
 
-- El cálculo es
--    λ> head [n | n <- [3..], n - primoAnterior2 n > 40]
--    15724
Medio

5 soluciones de “Primo anterior

  1. Xopre (josrodgal7)
     
    import Data.Numbers.Primes
     
    primoAnterior :: Integer -> Integer
    primoAnterior x | isPrime (x-1) = x-1
                    | otherwise = primoAnterior (x-1)
  2. Chema Cortés
    import Data.Numbers.Primes
     
    paresPrimos :: [(Integer, Integer)]
    paresPrimos = zip primes (tail primes)
     
    primoAnterior :: Integer -> Integer
    primoAnterior n = head [x | (x,y) <- paresPrimos, y >= n]
     
    menor :: Integer -> Integer
    menor n = head [x | (x,y) <- paresPrimos, x+n < y]
  3. Juanjo Ortega (juaorture)
     
    import Data.Numbers.Primes
     
    primoAnterior :: Integer -> Integer
    primoAnterior n = head [ a | a <- [ n-1, n-2..2 ]
                               , isPrime a ]
     
    distanciaPrimo :: Integer -> Integer
    distanciaPrimo n = n - (primoAnterior n)
     
    menorNumero :: Integer -> Integer
    menorNumero n =  head [ a | a <- [3..]
                             , distanciaPrimo a == n]
     
    -- *Main> menorNumero 40
    -- 15723
    -- (0.63 secs, 1,382,131,256 bytes)
    • Juanjo Ortega (juaorture)

      El ejercicio pide el menor número tal que la distancia a su primo anterior sea mayor que 40, no exactamente 40. Para ello, he creado la siguiente función:

       
      numeroMenorMayorQue :: Integer -> Integer
      numeroMenorMayorQue n = head [ a | a <- [3..]
                                       , distanciaPrimo a > n]
       
      -- *Main> numeroMenorMayorQue 40
      -- 15724
      -- (0.63 secs, 1,382,891,928 bytes)
  4. migibagar
    import Data.Numbers.Primes
     
    primoAnterior n = last [x | x <- take (n-1) primes, x < n]
     
    -- Si los números son demasiado grandes, es ineficiente.

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.