Cómo generar todos los números primos de un número dentro de un rango

Interesante problema! A veces, los algoritmos de fuerza bruta son más seguros si es factible.

En este caso, supongamos que el rango dado es [a, b] es sensato y el número es n. Queremos encontrar todos los coprimos de n dentro de [a, b]. Ahora, una solución directa sería iterar sobre todo k, de modo que a <= k <= b y, determinar si k y n son coprimos. Dos números xey son coprimos si su máximo común divisor (MCD) es 1. Podemos calcular MCD usando el método de Euclides que tiene una complejidad de tiempo logarítmico.

Otra forma podría ser utilizar la factorización prima. Primero generamos la factorización prima de todos los números, k en [a, b]. Entonces dado n, también lo factorizamos. Ahora el problema se reduce a encontrar todos los números k donde no hay primo común entre k y n. En realidad no necesitamos el poder de cada primo dentro de la factorización prima; solo necesitamos los números primos. La búsqueda sigue siendo lineal, pero podemos acelerarla utilizando alguna función hash. Este método es más aplicable cuando tenemos un montón de n y el rango es fijo. Como paso previo al proceso, calculamos la factorización prima de todos los números en el rango dado y los almacenamos en una estructura de datos.

#include
int gcd (int a, int b)
{
si (a == 0)
volver b;
devuelve mcd (b% a, a);
}
vacío principal()
{
int minRange;
int maxRange;
int número;
// código para escanear los tres vars anteriores
int i, cuenta = 0,
// código para probar si minRange <= maxRange y generar error
para (i = minRange; i <= maxRange; i ++)
{
if (mcd (número, i) == 1)
{
recuento ++;
printf (“% d”, i);
}
}
(cuenta == 0)? printf (“Sin coprimos”): printf (“% d coprimes generados”);
}