Revista Comunicación

Números perfectos

Publicado el 05 julio 2013 por Dracux @isladelmono

Euclides

Ultimamente estamos hablando bastante de programación y matemática, más que nada sobre números primos y la verdad que parece ser un tema que interesa. Por eso me decidí a seguir escribiendo artículos sobre estos temas. Hoy le toca a los números perfectos, unos números que también tienen unas cualidades más que interesantes.

¿Qué debe tener un número para ser perfecto?

Básicamente, la suma de todos sus divisores tiene que ser igual al número (ni es necesario aclarar que no hay que incluir al mismo número dentro de los divisores).

Por ejemplo, el 6 es perfecto, ya que si sumamos sus divisores que son 1, 2 y 3, nos da 6.

¿Y qué pasa con los números que no son perfectos?

  • Si la suma de los divisores es inferior al número, entonces es un número defectivo.
  • Si la suma de los divisores es superior al número, entonces es un número abundante.

Algunas cuestiones a tener en cuenta sobre estos números

Euclides se encontró con algo bastante interesante, y es que los números perfectos vienen en el formato 2n-1 . (2n-1)

Por ejemplo, para los primeros números:

n = 2:   21 × (22 – 1) = 6
n = 3:   22 × (23 – 1) = 28
n = 5:   24 × (25 – 1) = 496
n = 7:   26 × (27 – 1) = 8128

Entonces, Euclides se dio cuenta que si 2n-1 es primo, entonces en esta fórmula el número siempre es perfecto. Y como ya vimos antes 2n-1 es un número de Mersenne.

En la actualidad, se conocen 48 números perfectos, para n= 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917, 20996011, 24036583, 25964951,30402457, 32582657, 37156667, 42643801, 43112609, and 57885161.

Si quieren los números, perfectos, agarren una calculadora con múchos dígitos, usen Python o cualquier cosa que les deje generar números realmente enormes.

Vamos a programarlo

Como siempre, elijo usar Python para estas cuestiones.

Vamos a ir paso a paso.

1-Una primera aproximación podría ser algo así:

from datetime import *
def esPerfecto(numero):
    sumador=1
    for i in range(2,numero/2+1):
        if numero%i==0:
            sumador=sumador+i
    if sumador==numero:
        return True
    else:
        return False

n=input("Ingrese numero: ")

print datetime.today()
if esPerfecto(n)==True:
    print "El numero: "+str(n)+" es Perfecto"
else:
    print "El numero: "+str(n)+" no es Perfecto"
print datetime.today()

Parece bastante rápido para los primeros, a 6 lo sacó en solo media centésima. y 8126 en 6 centésimas.

2-Esta aproximación puede andar, el tema puede ser que uno no tenga exactamente el número final o sea muy largo, entonces podemos usar n (recuerden que el formato de Euclides era 2n-1 . (2n-1)

Entonces podemos armar el número a partir de esto.

from datetime import *
def esPerfecto(numero):
    sumador=1
    for i in range(2,numero/2+1):
        if numero%i==0:
            sumador=sumador+i
    if sumador==numero:
        return True
    else:
        return False

numero=input("Ingrese numero: ")
n=(2**(numero-1))*((2**numero)-1)
print datetime.today()
if esPerfecto(n)==True:
    print "El numero: "+str(n)+" es Perfecto"
else:
    print "El numero: "+str(n)+" no es Perfecto"
print datetime.today()

Es más sencillo para el usuario ingresar n que el número a analizar en si mismo. Existe solo una contra, se puede hacer más lento ya que hay que calcular el número a analizar. Pero bueno, en los números más pequeños no parece hacerlo más lento. Por ejemplo, para n=13

 Ingrese numero: 13
2013-07-05 14:26:00.179000
El numero: 33550336 es Perfecto
2013-07-05 14:26:01.433000


Volver a la Portada de Logo Paperblog