El no divisor menos común puede ser tan grande como N log C, pero si los números N se distribuyen al azar, entonces el no divisor menos común es probablemente mucho más pequeño, probablemente mucho menos que N. Construiría tablas de las cuales los primos son divisores de los cuales números.
Para cada número primo p tenemos un índice que significa que todos los números hasta ese índice han sido examinados por divisibilidad por p, y tenemos una lista de todos esos números que fueron divisibles por.kp
Entonces para d = 2, 3, 4, ... tratamos de encontrar un número divisible por d, o mostramos que no hay ninguno. Tomamos el mayor factor primo p de d. Luego verificamos todos los números que fueron divisibles por p si también son divisibles por d. Si no se encuentra ninguno, verificamos más números con índices> para la divisibilidad por p, actualizando y la lista de números divisibles por p, y verificando si cada número es divisible por d.k pkpkp
Para verificar si hay un número divisible por p, verificamos en promedio los números p. Más adelante, si verificamos si hay un número divisible por 2p, hay un 50% de posibilidades de que necesitemos verificar solo un número (el que es divisible por p), y un 50% de posibilidades de verificar en promedio 2p más números. Encontrar un número divisible por 3p es bastante rápido y así sucesivamente, y nunca verificamos la divisibilidad por más de N números por p, porque solo hay N números.
Espero que esto funcione con aproximadamente comprobaciones de divisibilidad.N2/logN
PD. ¿Qué tan grande sería el resultado para números aleatorios?
Supongamos que tengo N números aleatorios. La probabilidad de que uno de los N números sea divisible por d es 1 - (1 - 1 / d) ^ N. Supongo que la probabilidad de que cada uno de los números 1 ≤ d ≤ k sea un factor de uno de los números aleatorios se calcula multiplicando estas probabilidades (Ok, eso es un poco dudoso, porque estas probabilidades probablemente no sean del todo independientes).
Con esa suposición, con N = 1000, hay un 50% de posibilidades de que uno de los números 1..244 no divida ningún número, y uno entre mil millones de que cada número hasta 507 divida uno de los números. Con N = 10,000 hay un 50% de posibilidades de que uno de los números 1..1726 no divida ningún número, y uno entre mil millones de que cada número hasta 2979 divida uno de los números.
Yo propondría que para N entradas aleatorias, el tamaño del resultado es un poco mayor que N / ln N; tal vez algo como N / ln N * (ln ln N) ^ 2. Este es el por qué:
La probabilidad de que al menos uno de los números aleatorios n es divisible por un azar d es . Si d está alrededor de N, entonces es aproximadamente 1 - exp (-1) ≈ 0.6321. Eso es para un solo divisor; las posibilidades de que cada uno de varios números d ≈ N sea un divisor de al menos uno de los N números son bastante delgados, por lo que el máximo d será significativamente menor que N. 1 - ( 1 - 1 / d ) N1−(1−1/d)N1−(1−1/d)N
Si d << N, entonces .1−(1−1/d)N≈1−exp(−N/d)
Si d ≈ N / ln N entonces .1−exp(−N/d)≈1−exp(−lnN)=1−1/N
Agregaríamos estas probabilidades para aproximadamente N / ln N valores d, pero para la mayoría de d el resultado será significativamente mayor, por lo que la mayor d será de alguna manera mayor que N / ln N pero significativamente menor que N.
PD. Encontrar un número divisible por d:
Elegimos el factor primo más grande p de d, y luego examinamos primero los números que ya eran divisibles por p. Di d = kp. Luego, en promedio, solo verificamos k números que son divisibles por p mientras verificamos esta d particular, y verificamos como máximo todos los valores de N para la divisibilidad por p en general, para todos los d divisibles por p. En realidad, lo más probable es que verifiquemos menos de N valores para la mayoría de los primos p, porque después de verificar todos los valores de N, el algoritmo probablemente termina. Entonces, si el resultado es R, entonces espero que se dividan menos de N valores por cada primo menos que R. Suponiendo que R ≤ N, se trata de N ^ 2 / log N verificaciones.
PD. Ejecutando algunas pruebas
Ejecuté este algoritmo varias veces con N = 1,000,000 números aleatorios> 0. El no divisor menos común estaba entre 68,000 y 128,000 con la gran mayoría de corridas entre 100,000 y 120,000. El número de divisiones fue entre 520 millones y 1800 millones, que es mucho menor que (N / ln N) ^ 2; La mayoría de los casos utilizan entre 1000 y 1500 millones de divisiones.