Menu Close

Menor número triangular con más de n divisores

La sucesión de los números triangulares se obtiene sumando los números naturales.

   *     *      *        *         *   
        * *    * *      * *       * *  
              * * *    * * *     * * * 
                      * * * *   * * * *
                               * * * * * 
   1     3      6        10        15

Así, el 7º número triangular es

   1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.

Los primeros 10 números triangulares son

   1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

Los divisores de los primeros 7 números triangulares son:

    1: 1
    3: 1,3
    6: 1,2,3,6
   10: 1,2,5,10
   15: 1,3,5,15
   21: 1,3,7,21
   28: 1,2,4,7,14,28

Como se puede observar, 28 es el menor número triangular con más de 5 divisores.

Definir la función

   menorTriangularConAlMenosNDivisores :: Int -> Integer

tal que (menorTriangularConAlMenosNDivisores n) es el menor número triangular que tiene al menos n divisores. Por ejemplo,

   menorTriangularConAlMenosNDivisores 5    ==  28
   menorTriangularConAlMenosNDivisores 50   ==  25200
   menorTriangularConAlMenosNDivisores 500  ==  76576500

Nota: Este ejercicio está basado en el problema 12 del Proyecto Euler

Soluciones

import Data.List (group)
import Data.Numbers.Primes (primeFactors)
 
menorTriangularConAlMenosNDivisores :: Int -> Integer
menorTriangularConAlMenosNDivisores n = 
  head [x | x <- triangulares, nDivisores x >= n]
 
-- Nota: Se usarán las funciones
-- + triangulares definida en [Números triangulares](http://bit.ly/2rtr6a3) y
-- + nDivisores definida en [Número de divisores](http://bit.ly/2DgVh74)
 
-- triangulares es la sucesión de los números triangulares. Por ejemplo,
--    take 10 triangulares  ==  [1,3,6,10,15,21,28,36,45,55]
triangulares :: [Integer]
triangulares = scanl1 (+) [1..]
 
-- (nDivisores x) es el número de divisores de x. Por ejemplo,
--    nDivisores 28  ==  6
nDivisores :: Integer -> Int
nDivisores = product . map ((+1) . length) . group . primeFactors

Pensamiento

“La Matemática es una ciencia experimental y la computación es el experimento.” ~ Rivin

Inicial

2 soluciones de “Menor número triangular con más de n divisores

  1. juabaerui
    import Data.List (genericLength, group)
    import Data.Numbers.Primes (primeFactors)
     
    menorTriangularConAlMenosNDivisores :: Integer -> Integer
    menorTriangularConAlMenosNDivisores n =
      head [y | (x,y) <- divisoresTriangulares, x >= n]
      where divisoresTriangulares = [(numeroDivisores x,x) | x <- triangulares]
     
    numeroDivisores :: Integer -> Integer
    numeroDivisores =
      product . map ((+1) . genericLength) . group . primeFactors
     
    triangulares :: [Integer]
    triangulares = [x*(x+1) `div` 2 | x <- [1..]]
  2. pabquirod

    En Python

    from itertools import count, islice
    from sympy import divisor_count
     
     
    def take(n, xs):
        """
        es la lista formada por los n primeros elementos de xs. Por
        ejemplo,
           >>> take(3,count(1))
           [1, 2, 3]
        """
        return list(islice(xs, n))
     
     
    def triangulares():
        """
        es la lista de los números triangulares. Por ejemplo,
           >>> take(5,triangulares())
           [1, 3, 6, 10, 15]
        """
        return (sum(range(1, n+1)) for n in count(1))
     
     
    def menorTriangularConAlMenosNDivisores(n):
        return take(1, (x for x in triangulares() if divisor_count(x) >= n))[0]

Escribe tu solución

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