Débogage d'un détecteur de nombres premiers défectueux
Un programme conçu pour identifier les nombres premiers dans une plage définie par une variable longue ne parvient à produire aucun résultat. L'analyse du code révèle deux failles critiques :
prime_num()
contient une condition défectueuse (i
), provoquant une boucle infinie.if (i != j && i % j == 0)
classe incorrectement les nombres avec des diviseurs supplémentaires comme premiers.Un algorithme amélioré de recherche de nombres premiers
Une solution plus efficace utilise une méthode de « tamisage par division d'essai » :
<code class="language-csharp">Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate( Enumerable.Range(2, num-1).ToList(), (result, index) => { var bp = result[index]; var sqr = bp * bp; result.RemoveAll(i => i >= sqr && i % bp == 0); return result; } );</code>
Cet algorithme amélioré utilise une approximation pour minimiser le nombre de candidats principaux testés, ce qui entraîne des gains de performances significatifs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!