Menu Close

Sucesión de sumas de dos números abundantes

 

Un número n es abundante si la suma de los divisores propios de n es mayor que n. El primer número abundante es el 12 (cuyos divisores propios son 1, 2, 3, 4 y 6 cuya suma es 16). Por tanto, el menor número que es la suma de dos números abundantes es el 24.

Definir la sucesión

   sumasDeDosAbundantes :: [Integer]

cuyos elementos son los números que se pueden escribir como suma de dos números abundantes. Por ejemplo,

   take 10 sumasDeDosAbundantes  ==  [24,30,32,36,38,40,42,44,48,50]

Soluciones

sumasDeDosAbundantes :: [Integer]
sumasDeDosAbundantes = [n | n <- [1..], esSumaDeDosAbundantes n]
 
-- (esSumaDeDosAbundantes n) se verifica si n es suma de dos números
-- abundantes. Por ejemplo,
--    esSumaDeDosAbundantes 24           ==  True
--    any esSumaDeDosAbundantes [1..22]  ==  False
esSumaDeDosAbundantes :: Integer -> Bool
esSumaDeDosAbundantes n = (not . null) [x | x <- xs, n-x `elem` xs] 
  where xs = takeWhile (<n) abundantes
 
-- abundantes es la lista de los números abundantes. Por ejemplo,
--    take 10 abundantes  ==  [12,18,20,24,30,36,40,42,48,54]
abundantes :: [Integer]
abundantes = [n | n <- [2..], abundante n]
 
-- (abundante n) se verifica si n es abundante. Por ejemplo,
--    abundante 12  ==  True
--    abundante 11  ==  False
abundante :: Integer -> Bool
abundante n = sum (divisores n) > n
 
-- (divisores n) es la lista de los divisores propios de n. Por ejemplo,
--    divisores 12  ==  [1,2,3,4,6]
divisores :: Integer -> [Integer]
divisores n = [x | x <- [1..n `div` 2], n `mod` x == 0]

Pensamiento

¿Dices que nada se crea?
Alfarero, a tus cacharros.
Haz tu copa y no te importe
si no puedes hacer barro.

Antonio Machado

Inicial

6 soluciones de “Sucesión de sumas de dos números abundantes

  1. frahidzam
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes = [x | x <- [12..], esSumaDeDosAbundantes x]
     
    esSumaDeDosAbundantes :: Integer -> Bool
    esSumaDeDosAbundantes n = not (null (sumaAbundantes n))
     
    sumaAbundantes :: Integer -> [(Integer,Integer)]
    sumaAbundantes n =
      [(a,b)| a <- takeWhile (<= n) abundantes
            , b <- takeWhile (<= n) abundantes
            , a + b == n]
     
    abundantes :: [Integer]
    abundantes = [a | a <- [1..], abundante a]
     
    abundante :: Integer -> Bool
    abundante n = n < sum [a | a <- [1..div n 2], mod n a == 0]
  2. adogargon
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes = filter esSumaDeDosAbundantes [24..]
     
    esSumaDeDosAbundantes :: Integer -> Bool
    esSumaDeDosAbundantes n =
      or [abundante (n-k) | k <- listaAbundante n ]
     
    listaAbundante :: Integer -> [Integer]
    listaAbundante n = filter abundante [2..n]
     
    abundante :: Integer -> Bool
    abundante n = sum (divisoresPropios n) > n
     
    divisoresPropios :: Integer -> [Integer]
    divisoresPropios n = [k | k <- [2..n `div` 2] , n `mod` k == 0 ]
  3. lucsanand
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes = filter esSumaDeDosAbundantes [12..]
     
    esSumaDeDosAbundantes :: Integer -> Bool
    esSumaDeDosAbundantes x = elem x [a+b | a <- xs, b <- xs]
      where xs = takeWhile (<x) abundantes
     
    abundantes :: [Integer]
    abundantes = filter abundante [1..]
     
    abundante :: Integer -> Bool
    abundante n = n < sum (factores n)
     
    factores :: Integer -> [Integer]
    factores n = [x | x <- [1..div n 2], n `mod` x == 0]
  4. luipromor
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes =
      [x | x <- [1..], any esAbundante [x - n | n <- abundantes x]]
      where abundantes n  = [x | x <- [1..n], esAbundante x]
            esAbundante x = sum (factores x) > x
            factores n    = [x | x <- [1..n-1] , mod n x == 0]
  5. ireprirod
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes = [n | n <- [24..], esSumaDeDosAbundantes n]
     
    esSumaDeDosAbundantes :: Integer -> Bool
    esSumaDeDosAbundantes x =
      (not . null) [x-n | n <- takeWhile (<x) abundantes
                        , abundante (x-n)]
     
    abundantes :: [Integer]
    abundantes = [x | x <- [1..], abundante x]
     
    abundante :: Integer -> Bool
    abundante x = sum (divisoresPropios x) > x
     
    divisoresPropios :: Integer -> [Integer]
    divisoresPropios n = [x | x <- [2..n-1] ,  n `mod` x == 0]
  6. javmarcha1
    sumasDeDosAbundantes :: [Integer]
    sumasDeDosAbundantes = [x | x <- [1..], esSuma x]
     
    esSuma :: Integer -> Bool
    esSuma n = or [n == x+y | x <- [1..n]
                            , y <- [1..n]
                            , esAbundante x
                            , esAbundante y]
     
    esAbundante :: Integer -> Bool
    esAbundante n = sum (divisoresPropios n) > n
     
    divisoresPropios :: Integer -> [Integer]
    divisoresPropios 1 = []
    divisoresPropios n = [x | x <- [1..n-1], rem n x == 0]

Los comentarios están cerrados.