Junio 24, 2018, 04:58:22 am

Autor Tema: El programa tarda demasiado en finalizar al mostrar números perfectos (python)  (Leído 3238 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Hola, ¿cómo están?
El caso es que no puedo mejorar el tiempo que tarda el programa en mostrar los números
perfectos desde 1 a 100000, estos 4 los muestra en un tiempo aceptable 6-28-496 y 8128 luego no finaliza nunca, espero me puedan ayudar. -

Código: You are not allowed to view links. Register or Login
def n_perfecto(n):
sumatorio = 0
for i in range(1, n):
if n % i == 0:
sumatorio += i
return sumatorio == n

n = 1
print('\n === Números perfectos ===\n')
while n < 100000:
if n_perfecto(n):
print(f'{str(n).rjust(10, " ")}')
n += 1

Daniel.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Al parecer el algoritmo requiere de mucho procesamiento al ser hasta 100.000.
Si haces un print(n) adentro de la función n_perfecto vas a poder ir viendo como efectivamente prueba número por número y cada vez se vuelve más largo el proceso.

En linux probé hacer el print, y darle prioridad con nice -20 al proceso pero ni aun así agarra mucha velocidad..
En Windows podes darle prioridad desde el administrador de tareas >> procesos >> click derecho >> establecer prioridad: Tiempo real.

Claro que lo más sensato sería hardcodear los resultados pero ese no es el fín del ejercicio.
De otro modo podrías ver si es posible implementar threads o algo parecido para agilizar el proceso.

Saludos,
« Última modificación: Marzo 10, 2018, 08:32:54 pm por Solid Water »

Not for the money, not for the fame. Not for the power, just no more games.

Desconectado .:MYTO:.

  • Me das tu IP?
  • *
  • Mensajes: 195
  • Sexo: Masculino
  • Hunt3r m1nd 1s 0nly f0r f3w...
    • Ver Perfil
 A lo mejor sí que finaliza y no te das cuenta: el quinto número perfecto es el 33.550.336 según la You are not allowed to view links. Register or Login así que no entra en tu bucle que llega solo hasta 100.000.


Salu2
Debería estar estudiando...

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Buen día.
Gracias a ambos por ocuparse, luego que me tranquilice un poco( ;)) voy a analizar con detenimiento lo que proponen, ahora les pido un pequeño esfuerzo y favor, encontré este algoritmo y me pareció interesante solo que no logro inplementarlo, no sé dónde poner el print para mostrar los números perfectos y si estoy llamando a la función correcta. -

You are not allowed to view links. Register or Login

Código: You are not allowed to view links. Register or Login
#!/usr/bin/env python

def getPerfect(n) :
return 2**(n - 1) * (2**n - 1)
 
def isPrimal(n) :
for i in range(2, n) :
if (n % i == 0) :
return False
 
return True
 
def getGreaterPerfectNumSmallerThan(num) :
for i in range(num) :
m = 2**i - 1
if (isPrimal(m)) :
if (getPerfect(i) > num) :
return perfect
perfect = getPerfect(i)
 
return perfect

n = 1
while n < 100000:
getGreaterPerfectNumSmallerThan(n)
n += 1

Un abrazo.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Hola sería así:

Código: You are not allowed to view links. Register or Login
#!/usr/bin/env python

def getPerfect(n) :
        return 2**(n - 1) * (2**n - 1)
 
def isPrimal(n) :
        for i in range(2, n) :
                if (n % i == 0) :
                        return False
 
        return True
 
def getGreaterPerfectNumSmallerThan(num) :
        for i in range(num) :
                m = 2**i - 1
                if (isPrimal(m)) :
                        if (getPerfect(i) > num) :
                                return perfect
                        perfect = getPerfect(i)
 
        return perfect

n = 1
i = 1
array =[0.0,1]
while n < 100001:

        a = getGreaterPerfectNumSmallerThan(n)

        array[i] = a

        if( a != array[i - 1] and a != 1) :     
                print (array[i])
                i += 1
                array.append(1)
        n += 1

Saludos,
« Última modificación: Abril 14, 2018, 03:18:11 pm por Solid Water »

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Hola, Solid Water gracias por el código.
En realidad esperaba sacar más provecho, me había entusiasmado con descubrir el octavo número perfecto pero ahora me entero que hay como 20 y unos de los últimos tiene como 26000 dígitos. -
Bueno es todo, gracias . -

Daniel


exclamation
[C]Pascal numeros perfectos

Iniciado por xavik22

2 Respuestas
4092 Vistas
Último mensaje Octubre 31, 2009, 05:22:50 am
por xavik22
xx
Algoritmo "Numeros perfectos"

Iniciado por RockoX

3 Respuestas
2313 Vistas
Último mensaje Abril 13, 2009, 03:09:48 pm
por bolivianito
question
[Problema] Programa para averiguar números pares entre 2 números

Iniciado por Dreamaker

1 Respuestas
2096 Vistas
Último mensaje Mayo 21, 2010, 08:52:03 pm
por EddyW
resuelto
Mostrar imagenes de una webcam en pagia web con python

Iniciado por lleiser

2 Respuestas
1528 Vistas
Último mensaje Marzo 18, 2011, 01:32:57 pm
por lleiser
xx
Generador aleatorio de números en Python

Iniciado por Jairus

0 Respuestas
1705 Vistas
Último mensaje Julio 23, 2012, 04:36:28 pm
por Jairus
xx
Mi primer progrma (Ordena numeros de mayoy a menor)[Python]

Iniciado por jjc400

1 Respuestas
2736 Vistas
Último mensaje Octubre 28, 2011, 08:26:11 pm
por blozzter
question
programa de numeros romanos

Iniciado por mora_fimee

2 Respuestas
1627 Vistas
Último mensaje Junio 16, 2009, 11:53:58 pm
por -Gosw-
exclamation
Programa de números complejos

Iniciado por jbgg

8 Respuestas
4680 Vistas
Último mensaje Agosto 28, 2010, 01:36:58 pm
por myguestp
exclamation
ayuda programa suma numeros

Iniciado por shitoman

8 Respuestas
1753 Vistas
Último mensaje Diciembre 22, 2011, 10:50:12 pm
por .xAk.
exclamation
Manipulación de listas simples (Crear, mostrar, mostrar 3 mayores). [POO]

Iniciado por Ike Array

0 Respuestas
2146 Vistas
Último mensaje Diciembre 02, 2011, 09:22:29 pm
por Ike Array