Estoy trabajando en un problema de Project Euler que requiere la factorización de un número entero. Puedo obtener una lista de todos los números primos que son el factor de un número dado. El teorema fundamental de la aritmética implica que puedo usar esta lista para derivar cada factor del número.Tengo una lista de Python de los factores primos de un número. ¿Cómo encuentro (pythonically) todos los factores?
Mi plan actual es tomar cada número en la lista de primos de base y aumentar su potencia hasta que ya no sea un factor entero para encontrar los exponentes máximos para cada primo. Luego, multiplicaré todas las combinaciones posibles de pares de exponente principal.
Así, por ejemplo, de 180:
Given: prime factors of 180: [2, 3, 5]
Find maximum exponent of each factor:
180/2^1 = 90
180/2^2 = 45
180/2^3 = 22.5 - not an integer, so 2 is the maximum exponent of 2.
180/3^1 = 60
180/3^2 = 20
180/3^3 = 6.6 - not an integer, so 2 is the maximum exponent of 3.
180/5^1 = 36
180/5^2 = 7.2 - not an integer, so 1 is the maximum exponent of 5.
continuación, hacer todas las combinaciones de éstos hasta el máximo exponente para obtener los factores:
2^0 * 3^0 * 5^0 = 1
2^1 * 3^0 * 5^0 = 2
2^2 * 3^0 * 5^0 = 4
2^0 * 3^1 * 5^0 = 3
2^1 * 3^1 * 5^0 = 6
2^2 * 3^1 * 5^0 = 12
2^0 * 3^2 * 5^0 = 9
2^1 * 3^2 * 5^0 = 18
2^2 * 3^2 * 5^0 = 36
2^0 * 3^0 * 5^1 = 5
2^1 * 3^0 * 5^1 = 10
2^2 * 3^0 * 5^1 = 20
2^0 * 3^1 * 5^1 = 15
2^1 * 3^1 * 5^1 = 30
2^2 * 3^1 * 5^1 = 60
2^0 * 3^2 * 5^1 = 45
2^1 * 3^2 * 5^1 = 90
2^2 * 3^2 * 5^1 = 180
Así que la lista de factores = [1 , 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]
Aquí está el código que tengo hasta ahora. Dos problemas: Primero, no creo que sea muy pitónico. Me gustaría arreglar eso. En segundo lugar, I realmente no tengo una forma pitonica para hacer el segundo paso combinatorio. Por vergüenza, te evité el ridículo conjunto de bucles.
n es el número que queremos factorizar. listOfAllPrimes es una lista precalculada de los números primos de hasta 10 millones.
def getListOfFactors(n, listOfAllPrimes):
maxFactor = int(math.sqrt(n)) + 1
eligiblePrimes = filter(lambda x: x <= maxFactor, listOfAllPrimes)
listOfBasePrimes = filter(lambda x: n % x ==0, eligiblePrimes)
listOfExponents = [] #(do I have to do this?)
for x in listOfBasePrimes:
y = 1
while (x**(y+1)) % n == 0:
y += 1
listOfExponents.append(y)
Tu código es incorrecto. Podría haber un primo elegible mayor que la raíz cuadrada de n. Por ejemplo, n = 7 o n = 22. –
@Sheldon L. Cooper Gracias, definitivamente equivocado. Mezclé algoritmos. –
por curiosidad, ¿qué problema numérico estás resolviendo? – tokland