Esta es la forma más tonta:
def divisorGenerator(n):
for i in xrange(1,n/2+1):
if n%i == 0: yield i
yield n
El resultado que me gustaría obtener es similar a este, pero me gustaría un algoritmo más inteligente (este es demasiado lento y tonto :-)
Puedo encontrar factores primos y su multiplicidad lo suficientemente rápido. Tengo un generador que genera factor de esta manera:
(factor1, multiplicidad1)
(factor2, multiplicidad2)
(factor3, multiplicidad3)
y así sucesivamente ...
es decir, la salida de
for i in factorGenerator(100):
print i
es:
(2, 2)
(5, 2)
No sé cuánto es esto útil para lo que quiero hacer (lo codifiqué para otros problemas), de todos modos me gustaría una forma más inteligente de hacer
for i in divisorGen(100):
print i
salida esto:
1
2
4
5
10
20
25
50
100
ACTUALIZACIÓN: Muchas gracias a Greg Hewgill y su "manera inteligente" :) Calcular todos los divisores de 100000000 tomó 0.01s con su camino contra los 39s que el modo tonto tomó en mi máquina, muy bueno: D
ACTUALIZACIÓN 2: Deja de decir que esto es un duplicado de esta publicación. Calcular el número de divisores de un número dado no necesita calcular todos los divisores. Es un problema diferente, si cree que no lo es, busque "Función divisor" en wikipedia. Lea las preguntas y la respuesta antes de publicar, si no entiende cuál es el tema, simplemente no agregue respuestas que no sean útiles y que ya hayan dado.