Sucesiones alícuotas
La sucesión alícuota de un número x es la sucesión cuyo primer término es x y cada otro término es la suma de los divisores propios del término anterior. Por ejemplo, la sucesión alícuota de 10 es [10,8,7,1,0,0,0] ya que
| 1 2 3 4 |    la suma de los divisores propios de 10 es 5 + 2 + 1 = 8    la suma de los divisores propios de  8 es 4 + 2 + 1 = 7    la suma de los divisores propios de  7 es 1    la suma de los divisores propios de  1 es 0 | 
Definir la función
| 1 |    sucAlicuota :: Integer -> [Integer] | 
tal que (sucAlicuota x) es la sucesión alícuota de x. Por ejemplo,
| 1 2 3 4 5 |    take 6 (sucAlicuota 10)       ==  [10,8,7,1,0,0]    take 6 (sucAlicuota 95)       ==  [95,25,6,6,6,6]    take 6 (sucAlicuota 220)      ==  [220,284,220,284,220,284]    sucAlicuota 1184 !! (1+10^7)  ==  1210    sucAlicuota 276 !! 200        ==  2790456740340877466506 | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import Math.NumberTheory.ArithmeticFunctions (sigma) -- 1ª definición -- ============= sucAlicuota :: Integer -> [Integer] sucAlicuota x = x : sucAlicuota (sumaDivisoresPropios x) sumaDivisoresPropios :: Integer -> Integer sumaDivisoresPropios x =   sum [y | y <- [1..x-1], x `mod` y == 0] -- 2ª definición -- ============= sucAlicuota2 :: Integer -> [Integer] sucAlicuota2 = iterate (sum . divisoresPropios) divisoresPropios :: Integer -> [Integer] divisoresPropios x = [y | y <- [1..x-1], x `mod` y == 0] -- 3ª definición -- ============= sucAlicuota3 :: Integer -> [Integer] sucAlicuota3 x = aux x []   where aux y ys | y `elem` ys = us ++ cycle zs                  | otherwise   = aux (sumaDivisoresPropios y) (y:ys)           where us = reverse ys                 zs = dropWhile (/=y) us -- 4ª definición -- ============= sucAlicuota4 :: Integer -> [Integer] sucAlicuota4 x = x : sucAlicuota4 (sumaDivisoresPropios4 x) sumaDivisoresPropios4 :: Integer -> Integer sumaDivisoresPropios4 x =   sigma 1 x - x -- Comparación de eficiencia -- ========================= --    λ> sucAlicuota 1184 !! (1+10^3) --    1210 --    (2.02 secs, 261,081,688 bytes) --    λ> sucAlicuota2 1184 !! (1+10^3) --    1210 --    (2.02 secs, 245,485,568 bytes) --    λ> sucAlicuota3 1184 !! (1+10^3) --    1210 --    (0.02 secs, 0 bytes) --    λ> sucAlicuota4 1184 !! (1+10^3) --    1210 --    (0.05 secs, 0 bytes) |