Si el número es grande, usa la factorización prima, luego encuentra todas las potencias posibles que se pueden hacer, entonces tienes todos los divisores.
Tomemos por ejemplo el número 120:
[matemáticas] 120 = 2 ^ {3} \ veces 5 ^ {1} \ veces 3 ^ {1} \\ 40 = 2 ^ {3} \ veces 5 ^ {1} \ veces 3 ^ {0} \\ 24 = 2 ^ {3} \ veces 5 ^ {0} \ veces 3 ^ {1} \\ 8 = 2 ^ {3} \ veces 5 ^ {0} \ veces 3 ^ {0} \\ 60 = 2 ^ { 2} \ veces 5 ^ {1} \ veces 3 ^ {1} \\ 20 = 2 ^ {2} \ veces 5 ^ {1} \ veces 3 ^ {0} \\ 12 = 2 ^ {2} \ veces 5 ^ {0} \ veces 3 ^ {1} \\ 4 = 2 ^ {2} \ veces 5 ^ {0} \ veces 3 ^ {0} \\ 30 = 2 ^ {1} \ veces 5 ^ {1 } \ times 3 ^ {1} \\ 10 = 2 ^ {1} \ times 5 ^ {1} \ times 3 ^ {0} \\ 6 = 2 ^ {1} \ times 5 ^ {0} \ times 3 ^ {1} \\ 2 = 2 ^ {1} \ veces 5 ^ {0} \ veces 3 ^ {0} \\ 15 = 2 ^ {0} \ veces 5 ^ {1} \ veces 3 ^ {1} \\ 5 = 2 ^ {0} \ times 5 ^ {1} \ times 3 ^ {0} \\ 3 = 2 ^ {0} \ times 5 ^ {0} \ times 3 ^ {1} \\ 1 = 2 ^ {0} \ veces 5 ^ {0} \ veces 3 ^ {0} \\ [/ matemáticas]
Esos son los 16 divisores de 120, producidos al observar las potencias posibles (de 3,1,1 a 0,0,0).
- Cómo encontrar la transformada de Fourier de esta función
- ¿Cómo podemos encontrar la suma de dos números sin usar ningún operador aritmético o uninario en C / C ++?
- ¿Hay algún factorial grande conocido que pueda representarse como una expresión razonablemente pequeña usando solo la suma, resta, multiplicación, división y exponenciación de enteros?
- Cómo demostrar que una función puede expresarse como una suma de series de potencia cercanas a 0
- ¿Cuál es la diferencia entre la teoría de números y el análisis numérico?
Si observa las posibilidades de los exponentes posibles, es 4 para 3 (0,1,2,3), 2 para 1 (0,1) y 2 para el otro 1 (0,1), por lo que hay un total de 16 divisores .
Todo lo que debe hacer es primero factorizar primero, luego recorrer todos los exponentes posibles.
Con este método, puede obtener los divisores de incluso números muy grandes con relativa rapidez, pero aún así no funcionaría tan bien para productos de números primos muy grandes, ya que la factorización prima todavía tomaría un tiempo.
Encontrar los divisores del número [matemática] 10 ^ {12} [/ matemática] tomaría iteraciones [matemática] 10 ^ {6} [/ matemática] usando el otro método, pero usando este método solo tomaría menos de 300 iteraciones .
Este es el método que se me ocurrió para pasar los problemas del concurso de programación.
Alguien más en el pasado debe haber descubierto algo similar, creo.