Esta entrada del blog pertenece a una serie:
- Números primos en Python
- Factorización en Python
- Máximo común divisor (MCD) en Python
- Mínimo común múltiplo (mcm) en Python
La factorización o descomposición en factores primos nos permite, dado un entero positivo, encontrar los números primos que multiplicados entre si nos den el número analizado. Por ejemplo, el número 33.880 se puede expresar como el producto de los siguientes números primos:
33880 = 2 x 2 x 2 x 5 x 7 x 11 x 11 = 23 x 5 x 7 x 112
A este proceso también se le conoce como descomposición factorial.
Descomposición factorial de un número
En Python podemos utilizar el siguiente código para conseguir descomponer números enteros positivos.
#!/bin/python3
# Descomposición en factores primos
def factoring(n): #descomposición en factores primos
text= str(n) + ' = '
i = 1
for i in range(1, int(n/2)+1, 2): # recorre los impares
if i==1: i=2 # salvo el 1 que será 2
counter = 0
while n % i == 0:
n /= i
counter += 1
if counter == 1:
text += str(i)+ ' × '
elif counter > 1:
text += str(i) + '^' + str (counter) + ' × '
if text[-2] == "=": # si no hay divisores
text += str(n) + ' × ' # en ese caso el propio n será primo
text += '1'
return text
if __name__ == "__main__":
while True:
try:
n = int(input('Introduzca el número a factorizar: ') or 202)
if 1 < n <= 1e10:
break
else:
print('Por favor, introduzca un número en el rango [2,10_000_000_000]')
except ValueError:
print('Por favor itroduzca un número entero positivo.')
print(factoring(n))
Se basa en ir dividiendo sucesivamente primero entre 2, hasta que no sea divisible, luego entre 3 hasta que no sea divisible, y así con todos los números siguientes. Si bien, sabemos que si ya hemos dividido entre 2 todo lo posible, el número analizado no será divisible entre 4, por lo que podríamos saltar el 4. Esto es, únicamente tendríamos que dividir entre los primos menores al número analizado. Pero esto nos obligaría a ir calculando previamente los primos, por lo que optamos por dividir entre 2 y entre todos los impares menores que el número analizado.
Factorizar una serie de números
En este caso hemos adaptado el código anterior para poder aplicar la descomposición en factores primos a un rango de números.
#!/bin/python3
# Descomposición en factores primos
def factoring(n): #descomposición en factores primos
global r
r=1 # r es el resultado (variable global), sirve para comprobar que al final se cumple que r = n
text= str(n) + ' = '
for i in range(1,n+1,2): # recorre los impares
if i==1: i=2 # salvo el 1 que será 2
counter = 0
while n%i == 0:
n /= i
r *= i # el resultado r al final ha de coincidir con n. El valor de r se forma multiplicando los factores
counter+=1
if counter == 1:
text += str(i)+ ' × '
elif counter >1:
text += str(i) + '^' + str (counter) + ' × '
text += '1'
return text
for j in range(2,20): # Descomposición en factores primos para los números comprendidos entre 2 y 19
text=factoring(j) # Invocamos la función
print('{} {}'.format(j==r, text)) # Si el número analizado coincide con el resultado r da True. r se obtiene multiplicando sus factores
if j!=r:
print('r = ',r)
break # Si la comprobación da False se muestra el valor de r para ver el posible error.
El valor
True
que figura en cada línea impresa indica que se ha pasado exitosamente la comprobación en la que el resultado r
ha coincidido con el valor analizado en cada línea. El valor r
se obtiene multiplicando todos los factores en los que hemos conseguido descomponer el número analizado.
Quedo bien tu código
ResponderEliminar