Vérifier si un entier est premier plus efficacement

J'ai récemment été en partie d'un petit langage de programmation java de la concurrence à mon école. Mon partenaire et moi venons de terminer notre premier pure de la programmation orientée objet classe et la plupart des questions étaient hors de notre ligue nous nous sommes donc installées sur celui-ci (et je paraphrase un peu): "compte tenu de l'entrée n entier revenir le lendemain int qui est le premier et son inverse est également le premier par exemple, si n = 18 votre programme doit imprimer 31" parce que le 31 et 13 sont premiers. Votre .fichier de classe serait alors un cas de test de tous les nombres de 1 à 2,000,000,000 passé et il a dû retourner la bonne réponse dans les 10 secondes pour être considéré comme valide.

Nous avons trouvé une solution mais avec un plus grand cas de test, il faudrait plus de 10 secondes. Je suis assez certain qu'il y est un moyen pour déplacer la plage de la boucle de n,..2,000,000,000 bas que le capot probable de devoir en boucle que la loin où n est un faible nombre est petit, mais de toute façon, nous avons cassé la boucle quand un nombre est premier dans les deux conditions est trouvé. Au départ, nous étions en boucle de 2,..n, peu importe comment grand il a été ensuite je me suis souvenu de la règle de la " seulement en boucle à la racine carrée de n. Toutes les suggestions sur la façon de faire mon programme le plus efficace? J'ai eu pas de cours traitant de l'analyse de la complexité des algorithmes. Voici notre tentative.

public class P3
{

   public static void main(String[] args){

    long loop = 2000000000;
    long n = Integer.parseInt(args[0]);
    for(long i = n; i<loop; i++)
    {
      String s = i +"";
      String r = "";
      for(int j = s.length()-1; j>=0; j--)
        r = r + s.charAt(j);
      if(prime(i) && prime(Long.parseLong(r)))
      {
          System.out.println(i);
          break;
      }
    }
    System.out.println("#");
  }

  public static boolean prime(long p){


for(int i = 2; i<(int)Math.sqrt(p); i++)
    {
      if(p%i==0)
        return false;
    }
    return true;
  }
}

ps désolé si j'ai fait la mise en forme de code de mal c'est ma première fois de poster ici. Également la sortie devait avoir un '#' après chaque ligne c'est ce que la ligne après la boucle est d'environ Merci pour toute aide que vous les gars!!!

Notez que pour un problème comme celui-ci, la grande variété de réponses peuvent être combinées de diverses façons.
Cette question semble être hors-sujet, car il est à propos de la théorie des nombres. Essayez math.stackexchange.com.

OriginalL'auteur SipSop | 2010-05-05