Question

Je l'ai fait quelques recherches et n'a pas été en mesure de trouver des informations au sujet de cette mise en œuvre par rapport à tous les autres que je l'ai vu.

function sieve($top)
{
    for($i = 11; $i<$top; $i+=2)
    {
         if($i % 3 == 0 || $i % 5 == 0 
            ||  $i % 7 == 0)
          {
             continue;
          }
       echo "$i <br />";
   }
}

Ouais je sais juste imprime, mais ce n'est pas la partie importante. Quel est l'écueil majeur que ce soit le temps ou autre?

EDIT: Y at-il d'autres questions au-delà de l'évolutivité? Encore une fois Aussi merci pour les commentaires sur aller de l'avant avec la conclusion de premier choix.

Était-ce utile?

La solution

L'écueil majeur de c'est ne pas à l'échelle. Une fois que les chiffres sont assez grand tout sera retourné. Vous liste des excluders module doit croître avec la recherche.

Autres conseils

Vous pouvez consulter Sieve d'Eratosthène sur Wikipédia; et ce lien pour une implémentation PHP .

Il est limité aux nombres premiers jusqu'à 11. Pour étendre plus loin, vous devez ajouter || $u % 11 == 0 || $i % 13 == 0 ... etc

Tout d'abord, vous vérifiez que contre trois numéros (3, 7 et 11). Pour la Sieve de Erathosthenes, vous devriez commencer par une liste de numéros, 2..i. Puis boucle à travers cette liste, et supprimer les numéros qui sont des facteurs du numéro que vous itérer sur. Par exemple, une fois que vous obtenez à 7, qui est premier, vous devrez supprimer 49, 56, et d'autres multiples de 7.

En second lieu, la méthode que je viens de décrire escaladeraient très mal - si vous avez essayé la recherche de nombres premiers de 1..10 ^ 9, vous aurez besoin de 10 ^ 9 valeurs dans votre liste. Il existe d'autres moyens en plus de la Sieve de Erathosthenes pour trouver des nombres premiers - voir http://en.wikipedia.org / wiki / Prime_number

Cette utilisation de la fonction "Sieve d'Eratosthène algorithme"

function getPrimaryNumbers($n)
{
    $sieve = [];
    for($i = 1; $i <= $n; $i++) {
        $sieve[$i] = $i;
    } 

    $i =2;
    while($i * $i <= $n) {      
        if(isset($sieve[$i])) {
            $k = $i;
            while ($k * $i <= $n) {         
                unset($sieve[$k * $i]);
                $k++;
            }   
        }
    $i++;
    }           
    return $sieve;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top