Lo primero que debe tener en cuenta es que es suficiente para encontrar todos los factores primos. Una vez que tenga estos, es fácil encontrar la cantidad de divisores totales: para cada primo, agregue 1 a la cantidad de veces que aparece y multiplíquelos. Entonces para 12 = 2 * 2 * 3 tienes (2 + 1) * (1 + 1) = 3 * 2 = 6 factores.
Lo siguiente se sigue del primero: cuando encuentre un factor, divídalo para que el número resultante sea más pequeño. Cuando combina esto con el hecho de que solo necesita verificar la raíz cuadrada del número actual, esta es una gran mejora. Por ejemplo, considere N = 10714293844487412. Ingenuamente tomaría N pasos. Verificar hasta su raíz cuadrada requiere sqrt (N) o aproximadamente 100 millones de pasos. Pero dado que los factores 2, 2, 3 y 953 se descubren desde el principio, en realidad solo se necesita consultar un millón: ¡una mejora de 100 veces!
Otra mejora: no necesita verificar cada número para ver si divide su número, solo los números primos. Si es más conveniente, puede usar 2 y los números impares, o 2, 3, y los números 6n-1 y 6n + 1 (un tamiz de rueda básico).
Aquí hay otra buena mejora. Si puede determinar rápidamente si un número es primordial, puede reducir aún más la necesidad de división. Supongamos que, después de eliminar factores pequeños, tiene 120528291333090808192969. Incluso el chequeo hasta su raíz cuadrada llevará mucho tiempo: 300 mil millones de pasos. Pero una prueba de Miller-Rabin (muy rápido, quizás de 10 a 20 nanosegundos) mostrará que este número es compuesto. ¿Cómo ayuda esto? Significa que si revisas su raíz cúbica y no encuentras factores, entonces quedan exactamente dos primos. Si el número es un cuadrado, sus factores son primos; si el número no es un cuadrado, los números son primos distintos. Esto significa que puede multiplicar su "total acumulado" por 3 o 4, respectivamente, para obtener la respuesta final, ¡incluso sin conocer los factores! Esto puede marcar más una diferencia de lo que imaginaba: la cantidad de pasos necesarios pasa de 300 mil millones a solo 50 millones, ¡una mejora de 6000!
El único problema con lo anterior es que Miller-Rabin solo puede probar que los números son compuestos; si se le da un primo no puede probar que el número es primo. En ese caso, puede escribir una función de prueba de primalidad para ahorrarse el esfuerzo de factorizar a la raíz cuadrada del número. (Alternativamente, podría hacer algunas pruebas más de Miller-Rabin, si estuviera satisfecho con la confianza de que su respuesta es correcta en lugar de una prueba de que sí lo es. Si un número supera las 15 pruebas, entonces es compuesto con una probabilidad inferior a 1 . en mil millones)
Un nombre de método mejor sería 'GetFactorCount'. – SLaks
posible duplicado de http://stackoverflow.com/questions/110344/algorithm-to-calculate-the-number-of-divisors-of-a-given-number – empi