Por favor, lea este comentario primero!
Creo que la respuesta de Manash Pal implica un método simple y claro para verificar si el número es factorial de un número o no. Como la pregunta implica una forma eficiente, tuve ganas de introducir otro método.
Este método se basa en el algoritmo factorial inverso que encontré en Stackoverflow [4]. Básicamente, calcula el número a partir de su factorial y comprueba si este número es el mismo que el número de entrada o no. Implica principalmente operaciones a nivel de bit. Incluye solo 1 multiplicación, así como la operación del módulo. Digamos que tenemos que verificar si [math] Q [/ math] es un factorial de [math] Z [/ math] o no.
- Examen de ingreso conjunto (JEE): ¿Quién puede explicar la parte resaltada a continuación?
- ¿Por qué la mayoría de los lenguajes de programación prohíben las "desigualdades sandwich"? En matemáticas, es común ver 'desigualdades en emparedado' que muestran que una cantidad es mayor que otra pero menor que otra, por ejemplo, a <b <c significa lo mismo que a <b && b <c.
- Cómo probar o refutar [math] \ log (n!) \ In \ Theta (n ^ 2) [/ math] en notación asintótica
- En Java, ¿por qué usar un iterador para iterar a través de LinkedList más rápido que usar un bucle for?
- ¿Cómo puede cuantificarse, sumarse y luego compararse métricamente la cantidad de verdad en una declaración compleja con su cantidad de falsedad?
- Cuente el número de ceros al final en la representación binaria de [math] Q [/ math]. Digamos que hay [math] X [/ math] número de ceros finales en la representación binaria de [math] Q [/ math] . El número de ceros finales puede calcularse eficientemente mediante las operaciones SHIFT y AND. Para un método más optimizado, consulte [1]
- Continúe incrementando [matemáticas] X [/ matemáticas] hasta que el número de 1 que ha agregado sea igual al número de 1 en la representación binaria (incrementada) de [matemáticas] X [/ matemáticas]. Esto se basa en el hecho de que – [matemática] Z [/ matemática] puede ser par ([matemática] 2P [/ matemática]) o impar ([matemática] 2P + 1 [/ matemática]). Si [math] Q [/ math] es el factorial de [math] Z [/ math], el valor de [math] X [/ math] que obtenemos en el paso 1 es igual a 2P menos el número de 1s en una representación binaria de 2P. En otras palabras, la diferencia entre un número y el recuento de bits establecidos es igual al número de ceros finales en el factorial del número. Para calcular el número de bits de ajuste, consulte [2] y [3].
- Ahora [math] Q [/ math] puede ser un factorial de [math] X [/ math] o [math] X + 1 [/ math], es decir, [math] Z [/ math] tiene que ser [math] X [/ matemáticas] o [matemáticas] X + 1 [/ matemáticas]. Si [math] Z [/ math] no es ninguno de ellos, [math] Q [/ math] definitivamente NO es un factorial de [math] Z [/ math]. Si Z es igual a [matemática] X [/ matemática] o [matemática] X + 1 [/ matemática], vaya al paso 4 para verificar.
- Si [matemática] Q [/ matemática] es divisible por [matemática] X \ veces (X + 1) [/ matemática] entonces [matemática] Q [/ matemática] es el factorial de [matemática] X + 1 [/ matemática] sino [math] Q [/ math] es el factorial de [math] X [/ math]. Entonces, si obtiene el factorial inverso de [matemáticas] Q [/ matemáticas] igual que el valor de [matemáticas] Z [/ matemáticas], [matemáticas] Q [/ matemáticas] es el factorial de [matemáticas] Z [/ matemáticas] .
Ejemplo:
Compruebe si [math] Q = 3628800 [/ math] es un factorial de [math] Z = 10 [/ math] o no.
1. La representación binaria de [math] 3628800 [/ math] es [math] 1101110101111100000000 [/ math].
Número de ceros finales – [matemática] X = 8 [/ matemática]
2. La representación binaria de 8 es [matemática] 1000 [/ matemática]. Ahora incremente.
[matemáticas] 1: 1001 [/ matemáticas]
[matemática] 2: 1010 [/ matemática] (se detiene ya que el número de incrementos es igual al número de 1s).
3. [matemática] 3628800 [/ matemática] es un factorial de 10 u 11. [matemática] Q [/ matemática] podría ser un factorial de [matemática] Z [/ matemática].
4. [matemática] 3628800 [/ matemática] no es divisible por [matemática] 110 [/ matemática] por lo tanto, es un factorial de 10. Como [matemática] Z [/ matemática] es igual a 10, [matemática] Q [ / math] es un factorial de [math] Z [/ math].
Referencias
[1] Encontrar ceros finales en un número binario.
[2] La respuesta de Murtaza Aliakbar a ¿Cuál es la línea de código más elegante que has visto y por qué?
[3] Cuente el número de 1 en representación binaria.
[4] Factorial inverso.
Nota: Mencione en el comentario o sugiera una edición si encuentra algo incorrecto.