Ma fonction initiale pour déterminer si un nombre est premier était:Vérifiez si le premier grand-o
bool is_prime(int x) {
for (int y = 2; y < x; ++y) {
if (x % y == 0) {
return false;
}
}
return true;
}
Ce couru avec une complexité de O(x)
que vous avez peut-être dû aller à x
.
J'ai appris quelques optimisations et j'ai besoin de vérifier mon big-o. Voici le programme amélioré:
bool is_prime(int x)
{
if (x % 2 == 0 && x > 2) {
return false;
}
for (int y = 3; y*y <= x; y += 2) {
if (x % y == 0) {
return false;
}
}
return true;
}
Est-ce que le fait que je vais maintenant jusqu'au changement sqrt()
cela O(sqrt(x))
?
@MattTimmermans Accord avec vous et la suggestion d'AndyG. J'ai écrit la fonction avec 'x', donc ça aurait dû être' x' et non 'n'. – datta
Une autre optimisation serait de pré-calculer la racine carrée entière de 'x' (ie trouver un entier' m', de sorte que 'm * m' soit entre' x-1' et 'x' pour 'x' positif) . Il existe des algorithmes efficaces (complexité O (log (x)) ou mieux) pour calculer une racine carrée entière, sans recourir au point flottant. – Peter
@Peter J'avais à l'origine pas la conversion en virgule flottante, mais les mathématiques ont montré que 'm * m' servirait son but ici. – datta