Implementación de algoritmos de teoría de números/Números primos
Descripción formal
[editar]Un algoritmo que busca números primos dentro de un rango se basa en el principio de que todo número primo mayor que 3 se encuentra en el conjunto:
es decir, pertenece como subconjunto al conjunto de todos los números naturales no divisibles por 2 y 3. Para generar un número primo de la forma , solo basta recorrer (e ir dividiendo) por todos los números primos que se generan en las iteraciones anteriores del algoritmo, ahorrándose tiempo en la búsqueda. Si el resto de la división es distinto de cero en toda la fase de iteración, ese número será primo, en cambio si el resto es 0 en alguna fase de la iteración, el número es compuesto y se descarta.[1]
Optimizaciones
[editar]Extensión de la expresión de números no divisibles por con :
Implementación en distintos lenguajes de programación
[editar]En C
[editar]Este es un ejemplo de un programa que obtiene los primeros 1000 números primos de menor a mayor en lenguaje C, compilado con Visual Studio 2022:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define MAX_PRIMOS 1000
int main(int argc, char* argv[])
{
unsigned long c, t, n, detect1, detect_1;
unsigned long f[65536] = { 0 };
n = 1;
t = 3;
f[0] = 2;
f[1] = 3;
f[2] = 5;
printf("%u, %u, ", f[0], f[1]);
for (n = 1; n <= MAX_PRIMOS; n++)
{
detect_1 = FALSE;
detect1 = FALSE;
for (c = 2; f[c] <= (unsigned)sqrt(6 * n + 1); c++)
{
if (((6 * n - 1) % f[c]) == 0)
detect_1 = TRUE;
if (((6 * n + 1) % f[c]) == 0)
detect1 = TRUE;
if (detect_1 && detect1)
break;
}
if (!detect_1)
{
printf("%u, ", (6*n - 1));
f[t++] = 6 * n - 1;
}
if (!detect1)
{
printf("%u, ", (6 * n + 1));
f[t++] = 6 * n + 1;
}
}
printf("\n");
system("PAUSE");
return 0;
}
Referencias
[editar]- ↑ Anthony J. Pettofrezzo, Donald R. Byrkit. «Elements of Number Theory»(ISBN: 9789996753787)