¿Por qué este código devuelve la suma de los factores de un número?Buscar suma de factores
En varios problemas de Project Euler, se le pide que calcule la suma de los factores como parte del problema. En uno de los foros, alguien publicó el siguiente código de Java como la mejor manera de encontrar esa suma, ya que en realidad no tiene que encontrar los factores individuales, solo los principales (no necesita saber Java, puede saltarse a mi resumen a continuación):
public int sumOfDivisors(int n)
{
int prod=1;
for(int k=2;k*k<=n;k++){
int p=1;
while(n%k==0){
p=p*k+1;
n/=k;
}
prod*=p;
}
if(n>1)
prod*=1+n;
return prod;
}
Ahora, lo he intentado muchas veces y veo que funciona. La pregunta es, ¿por qué?
Digamos que usted factor 100
: 1,2,4,5,10,20,25,50,100
. La suma es 217
. La factorización prima es 2*2*5*5
. Esta función le da [5*(5+1)+1]*[2*(2+1)+1] = [25+5+1]*[4+2+1] = 217
factorizando 8
: 1,2,4,8
. La suma es 15
. La factorización prima es 2*2*2
. Esta función le da [2*(2*(2+1)+1)+1]=15
El algoritmo se reduce a (usando Fi
en el sentido de que el índice i del factor F o F sub i):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
donde m
es el número de factores primos singulares, Ni
es la cantidad de veces que cada factor único ocurre en la factorización prima.
¿Por qué esta fórmula es igual a la suma de los factores? Supongo que es igual a la suma de cada combinación única de factores primos (es decir, cada factor único) a través de la propiedad distributiva, pero no veo cómo.
Creo que te refieres a [2 * (2 * (2 + 1) +1) +1] = 15 –
@Adrian Petrescu: Sí, gracias. Lo arreglaré –