Comment puis-je test de primalité?

Je suis en train d'écrire une petite bibliothèque avec un certain nombre de méthodes connexes. Comme je l'ai fait le travail de base (aka méthodes de travail) et maintenant je suis à la recherche pour certains d'optimisation.
Bien sûr, l'internet est un excellent endroit pour le faire. J'ai, cependant, suis tombé sur un problème d'arrondi et je me demandais comment résoudre ce problème.

Dans la boucle j'utilise pour tester un certain nombre de c'est de primalité il est plus efficace de chercher jusqu'à ce sqrt(n) au lieu de n/2 ou n - 1. Mais en raison de l'arrondissement des problèmes un certain nombre obtenir sauté et donc certains nombres premiers sont ignorés! Par exemple, le 10000th premier devrait être: 104729, mais le "optimisé" version se termine par: 103811.

Du code (il est ouvert pour plus d'optimisation, je sais, mais je peut gérer qu'une seule chose à la fois):

///<summary>
///Method for testing the primality of a number e.g.: return IsPrime(29);
///History:
///1. Initial version, most basic form of testing: m smaller then n -1
///2. Implemented m smaller then sqrt(n), optimization due to prime factoring
///</summary>
///<param name="test">Number to be tested on primality</param>
///<returns>True if the number is prime, false otherwise</returns>
public static bool IsPrime(int test)
{
    //0 and 1 are not prime numbers
    if (test == 0 || test == 1) return false;

    //2 and 3 are prime numbers
    if (test == 2) return true;

    //all even numbers, save 2, are not prime
    if (test % 2 == 0) return false;

    double squared = Math.Sqrt(test);
    int flooredAndSquared = Convert.ToInt32(Math.Floor(squared));

    //start with 5, make increments of 2, even numbers do not need to be tested
    for (int idx = 3; idx < flooredAndSquared; idx++)
    {
        if (test % idx == 0)
        {
            return false;
        }
    }
    return true;
}

Je sais que le carré de la partie d'échec de moi (ou j'échoue), a essayé de Mathématiques.Plafond ainsi, avec les mêmes résultats.

Votre pour la boucle semble commencer à 3, et de l'incrément de 1; votre commentaire indique qu'il commence à 5 et s'incrémente de 2.
Cette question semble être hors-sujet, car il est à propos de la théorie des nombres. essayez math.stackexchange.com.
squared n'est pas le bon nom de variable pour le résultat d'une racine carrée. "Au carré" signifie élevé à la seconde puissance; racine carrée est élever à la 1/2 de la puissance. Peut-être l'appeler sqrt_test ou quelque chose.

OriginalL'auteur Oxymoron | 2009-03-09