Solución a la Tarea 4: Primos gemelos

Una recomendación para resolver esta tarea es la de primero definir una función que decida si un número es primo o no. De las muchas formas de hacer esto, abajo mostramos una que es más o menos rápida, pues sólo revisa posibles divisores hasta la raíz cuadrada de la entrada. No olvide que ningún número menor que 2 es primo. Una vez leída m, lo primero que hace el programa de abajo es calcular el menor impar que vale al menos m. ¿Porqué funciona m = 2*(m/2) + 1? Observe que ninguno de dos primos gemelos puede ser par ¿porqué? Finalmente, buscamos el primer valor de m para el cual tanto m como m+2 son primos. Si m no satisface esta condición la incrementamos en 2 ¿porqué?

#include <stdio.h>
 
int primo(long p)
{
  long i;
 
  if (p < 2)
    return 0;
  for (i = 2; i*i <= p; i++)
    if (p % i == 0)
      return 0;
  return 1;
}

int main(void)
{
 
  long m;
 
  scanf("%ld", &m);
  m = 2*(m/2)+1;
  while (!(primo(m) && primo(m+2)))
    m += 2;
  printf("%ld %ld\n", m, m+2);
  return 0;
}


Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada  Salida
1        3 5
10       11 13
12       17 19
21       29 31
123      137 139
321      347 349
1234     1277 1279
4321     4337 4339
12345    12377 12379
54321    54401 54403


Para probar su tarea en UNIX, escriban la instrucción gcc -lm prigemNN.c -o prigem para compilar su programa, y la instrucción ./prigem para correrlo. Algunos errores comúnes fueron: (a) Olvidarse de que el 1 no es primo e incluso no considerar que su programa se bloquearía con esa entrada, (b) Olvidarse de probar por todos los divisores posibles, y no sólamente por 2, 3 y 5, (c) No verificar que los dos números de la salida deben ser primos. Además, les recuerdo que sólo deben enviar el archivo .c y que éste debe tener el nombre correcto.