? He estado interesado en el problema de encontrar un mejor reconocedor de números primos durante años. Me doy cuenta de que esta es una gran área de investigación académica y estudio; mi interés en esto es solo por diversión. Aquí estaba mi primer intento de una posible solución, en C (abajo).¿Es usted primer número
Mi pregunta es, ¿pueden sugerir una mejora (sin citar alguna otra referencia en la red, estoy buscando el código C real)? Lo que intento obtener de esto es una mejor comprensión de la determinación de la complejidad del rendimiento de una solución como esta.
¿Estoy en lo cierto al concluir que la complejidad de esta solución es O (n^2)?
#include <stdio.h>
#include <math.h>
/* isprime */
/* Test if each number in the list from stdin is prime. */
/* Output will only print the prime numbers in the list. */
int main(int argc, char* argv[]) {
int returnValue = 0;
int i;
int ceiling;
int input = 0;
int factorFound = 0;
while (scanf("%d", &input) != EOF) {
ceiling = (int)sqrt(input);
if (input == 1) {
factorFound = 1;
}
for (i = 2; i <= ceiling; i++) {
if (input % i == 0) {
factorFound = 1;
}
}
if (factorFound == 0) {
printf("%d\n", input);
}
factorFound = 0;
}
return returnValue;
}
En realidad es 'O (n^0,5)'. – st0le
En realidad es 'O (n)'. El algoritmo es 'O (n^0.5)' pero el bucle while lo convierte en 'O (m * n^0.5)' o 'O (m)'. – Ishtar
Esta es una forma del generador de números primos más básico. El problema es que, como N es muy grande, este algoritmo se ejecuta muy lentamente. Busque la prueba AKS que se menciona a continuación, así como la teoría de tamices en general. También usaría diferentes enfoques para diferentes usos, dependiendo de lo que esté tratando de hacer: ¿necesita números primos pequeños o grandes? ¿Probablemente primos o primos "reales"? El algoritmo y la implementación variarán en función de los requisitos. –