Potencia de un divisor en el factorial
Se dan dos números y . Hallar el mayor entero tal que divide a .
primo {data-toc-label=“k primo”}
Consideremos primero el caso de primo. La expresión explícita del factorial
Nótese que cada -ésimo elemento del producto es divisible por , es decir, suma a la respuesta; la cantidad de tales elementos es .
Luego, cada -ésimo elemento es divisible por , es decir, suma otro a la respuesta (la primera potencia de ya se contó en el párrafo anterior). La cantidad de tales elementos es .
Y así sucesivamente, para cada cada -ésimo elemento suma otro a la respuesta, y hay de esos elementos.
La respuesta final es
Este resultado también se conoce como fórmula de Legendre . La suma es por supuesto finita, ya que solo aproximadamente los primeros elementos no son ceros. Así, el tiempo de ejecución de este algoritmo es .
Implementación
int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
compuesto {data-toc-label=“k compuesto”}
La misma idea no se puede aplicar de forma directa. En su lugar podemos factorizar , representándolo como . Para cada , hallamos la cantidad de veces que está presente en usando el algoritmo descrito arriba; llamemos a este valor . La respuesta para compuesto será