Déterminer si un nombre est premier
J'ai lu beaucoup de code sur ce sujet, mais la plupart d'entre eux produisent les numéros qui sont le premier tout le chemin jusqu'à le nombre d'entrée. Cependant, j'ai besoin de code qui vérifie uniquement si la donnée d'entrée nombre est premier.
Voici ce que j'ai pu écrire, mais il ne fonctionne pas:
void primenumber(int number)
{
if(number%2!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
Je vous serais reconnaissant si quelqu'un pouvait me donner des conseils sur la façon de faire ce travail correctement.
Mise à jour
Je l'ai modifié pour vérifier tous les numéros dans une boucle for.
void primenumber(int number)
{
for(int i=1; i<number; i++)
{
if(number%i!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
}
Tout votre code n'est à signaler si le nombre est divisible par 2. Ce que l'approche générale de l'utiliser pour détecter les nombres premiers? Commençons par cela, et de l'artisanat dans le code de l'exécutable.
Avez-vous pensé à ce que cela signifie pour un nombre premier? L'écrire en pseudo-code, puis de le transformer en véritable code.
double possible de de décider si un nombre est parfait ou premier
Avez-vous pensé à ce que cela signifie pour un nombre premier? L'écrire en pseudo-code, puis de le transformer en véritable code.
double possible de de décider si un nombre est parfait ou premier
OriginalL'auteur carla | 2010-12-12
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de faire un peu plus de la vérification. Maintenant, vous êtes seulement de vérifier si le nombre est divisible par 2. Faire de même pour 2, 3, 4, 5, 6, ... jusqu'à
number
. Astuce: utilisez un boucle.Après vous résoudre ce problème, essayez de regarder pour les optimisations.
Astuce: Vous n'avez qu'à vérifier tous les numéros jusqu'à la racine carrée du nombre
Et puis il y a beaucoup d'optimisations. Vous avez seulement besoin de tester jusqu'à SQRT(n), puisque si n peut être pris en compte dans 2 numéros de l'un d'eux doit être <= SQRT(n). Vous pouvez ignorer tous le même nombre (sauf 2), car si un nombre divise n, alors il en sera de 2.... juste pour vous obtenir a commencé.
quand il arrive à l'optimisation de penser le plus grand nombre à tester. a-t-elle d'être "numéro" ou peut-il être un peu moins? 😉 edit: arrrgh, les gens sont vite aujourd'hui 😉
Ou même mieux que de sauter des numéros, vous pouvez ignorer tous les nombres qui ne sont pas un de moins ou de plus grand que un multiple de 6. (multiple de 6 + 2 ou 4 est divisible par 2 et multiple de 6 + 3 est divisible par 3, ne laissant que des multiples de 6 + 1 ou 5)
Vous pouvez également prendre une étape supplémentaire et vérifier les numéros en fonction de leur valeur modulo 30, ce qui est toujours possible de le faire comme un déroulé de la boucle. Même si bien sûr, vous obtenez des rendements décroissants que vous aller plus haut...(pas de vérification des multiples de 2 coupes le nombre de contrôles dans la moitié, basé sur 6 ne prend qu'un autre 1/3e, va 30 seulement élimine un autre 1/5ème...)
OriginalL'auteur Pablo Santa Cruz
nécessaire, parce que le nombre pourrait venir de la place, par exemple, 49 = 7^2.
OriginalL'auteur Toomtarm Kung
Mon propre IsPrime() de la fonction, écrit et basé sur la déterministe variante de la célèbre Rabin-Miller algorithme, combiné avec l'optimisation de l'étape de force brute, de vous en donner un de la manière la plus rapide de premier les fonctions de test.
D'utiliser, de copier et de coller le code dans le haut de votre programme. L'appeler, et elle renvoie une valeur BOOLÉENNE (true ou false).
Si vous avez un problème de compilation avec "__int64", remplacer "long". Il compile bien sous VS2008 et VS2010.
Comment il fonctionne:
Il ya trois parties à la fonction. La partie contrôle pour voir si c'est une des rares exceptions (les nombres négatifs, 1), et intercepte l'exécution du programme.
La deuxième partie commence si le nombre est plus petit que 1373653, qui est théoriquement numéro de Rabin-Miller algorithme va battre mon optimisé la force brute de la fonction. Puis vient deux niveaux de Rabin-Miller, conçu pour réduire le nombre de témoins nécessaires. Comme la plupart des numéros que vous allez tester sont de moins de 4 milliards de dollars, la probabiliste de Rabin-Miller algorithme peut être fait déterministe en cochant les témoins 2, 7 et 61. Si vous avez besoin d'aller sur les 4 milliards de bouchon, vous aurez besoin d'un grand nombre de la bibliothèque, et d'appliquer un module ou de décalage de bits de modification de l'alimentation() fonction.
Si vous insistez sur la force brute de la méthode, ici, c'est juste mon optimisé force brute IsPrime() fonction:
Comment cette force brute morceau:
Tous les nombres premiers (à l'exception des 2 et 3) peut être exprimée sous la forme 6k+1 ou 6k-1, où k est un nombre entier positif. Ce code utilise ce fait, et les tests de tous les nombres de la forme 6k+1 ou 6k-1 inférieur à la racine carrée du nombre en question. Cette pièce est intégré dans ma plus grande IsPrime() fonction (la fonction apparaît en premier).
Si vous avez besoin de trouver tous les nombres premiers ci-dessous un certain nombre, de trouver tous les nombres premiers en dessous de 1000, regarder dans le Crible d'Eratosthène. Un autre de mes préférés.
Comme une note complémentaire, je serais ravi de voir quelqu'un mettre en œuvre les Vélos Méthode de la Courbe de l'algorithme, envie de voir que implémenté en C++ pour un certain temps maintenant, j'ai perdu ma mise en œuvre. En théorie, il est même plus rapide que le déterministe Rabin-Miller algorithme j'ai mis en place, bien que je ne suis pas sûr si c'est vrai pour les nombres de moins de 4 milliards de dollars.
OriginalL'auteur LostInTheCode
Je suppose de prendre racine et de l'exécution de foreach frpm 2 à sqrt+1 si(entrée% nombre!=0) return false;
une fois que vous atteignez sqrt+1, vous pouvez être sûr de son premier.
OriginalL'auteur Valentin Kuzub
Si vous connaissez la plage des entrées (dont vous avez fait depuis votre fonction prend un
int
), vous pouvez précalculer une table de nombres premiers inférieur ou égal à la racine carrée de l'entrée max (2^31-1 dans ce cas), puis de tester pour la divisibilité par chaque premier dans le tableau inférieur ou égal à la racine carrée du nombre donné.Il ya seulement environ 4300 ou les numéros que vous auriez besoin dans le tableau. Relire ce que j'ai écrit. Je ne le dis pas pour créer une table en disant: si chaque nombre de 1 à 2^31 est le premier -- je l'ai dit à stocker uniquement les nombres premiers de 1 à sqrt(2^31) et de tester le nombre de divisibilité par chacun de ces numéros.
OriginalL'auteur user470379
vérifie, pour tout nombre si c'est un nombre premier
OriginalL'auteur user6449382
C++
Javascript
Python
OriginalL'auteur un33k
Ce code vérifie seulement si le nombre est divisible par deux. Pour un nombre premier, il ne doit pas être divisible par tous les entiers inférieurs à lui-même. Cela peut être naïvement mis en œuvre par vérifier si il est divisible par tous les entiers inférieurs à
floor(sqrt(n))
dans une boucle. Si vous êtes intéressé, il y a un certain nombre de beaucoup d'algorithmes plus rapides dans l'existence.OriginalL'auteur Michael Koval
Si vous êtes paresseux, et beaucoup de RAM, créer un crible d'Eratosthène qui est pratiquement un tableau géant à partir de laquelle vous coups de pied tous les nombres qui ne sont pas le premier.
À partir de là, chaque premier "probabilité" test sera super rapide.
La limite supérieure de cette solution pour des résultats rapides est la quantité de vous RAM. La limite supérieure de cette solution pour superslow résultats de votre disque dur de capacité.
sqrt
de votre limite supérieure. Le tableau de segment peut encore être diminué en utilisant les bits, de travail avec des cotes seulement, ou même 2-3-5-sont premiers entre eux.Mettre le tout à des bits from bytes vous gagnez un 2^3 de se multiplier de votre espace, ce qui est insignifiant si vous êtes de chasse pour les grands nombres premiers. Et si vous stockez 2,3,5 et 7 et de tels nombres premiers nombres entiers, vous devez les stocker ces nombres au moins un entier de 32 bits, ce qui est un gaspillage.
de travail segment par des segment ... le stockage de
sqrt(N)
int
nombres premiers en vaut la peine.OriginalL'auteur karatedog
Je suis même algorithme, mais différents de mise en œuvre de cette boucle à sqrt(n) à l'étape 2 seuls les nombres impairs parce que j'ai vérifier si il est divisible par 2 ou 2*k c'est faux. Voici mon code
OriginalL'auteur
Utiliser les mathématiques d'abord trouver la racine carrée d'un nombre, puis démarrer en boucle jusqu'à ce que le numéro se termine que vous obtenez après l'carrés d'enracinement.
vérifier, pour chaque valeur, si le nombre donné est divisible par l'itération de la valeur .si aucune valeur divise le nombre donné, alors il n'est pas un nombre premier sinon le premier.
Voici le code
Plutôt que de comparer i à sqrt(n), il peut être plus rapide de comparer les i*i n.
OriginalL'auteur Dev Kumar
Quelqu'un au-dessus, était le suivant.
Ce la plupart du temps travaillé. Je l'ai juste testé dans Visual Studio 2017. Il serait dire que rien de moins que 2 a également été le premier (donc 1, 0, -1, etc.)
Ici est une légère modification pour corriger cela.
OriginalL'auteur Joe C
Il y a plusieurs manières d'aborder ce problème.
Le "Naïf" de la Méthode: Essayez-les tous (impair) les nombres jusqu'à (la racine de) le nombre.
Amélioration de la "Naïve" de la Méthode: n'essayer chaque 6n ± 1.
Probabiliste tests: de Miller-Rabin, Solovay-Strasse, etc.
L'approche qui vous convient dépend de ce que vous faites avec le premier.
Vous devriez au moins lire sur Les Tests De Primalité.
Oui je n'ai pas la liste de tous les types de tests. J'ai laissé comme exercice pour le lecteur. 😉
Un test pour tous les 6n+1 nombres d'ignorer beaucoup de nombres premiers. Beaucoup de nombres premiers ne sont que 4 ou 2 de moins que le meilleur premier. (Voir les articles de Wikipédia sur les premiers jumeaux et le cousin de nombres premiers.)
Vous avez besoin de lire ma réponse encore une fois... je n'ai pas d'état que vous ne devriez tester
6n + 1
les numéros de téléphone... j'ai de l'état, vous devez tester chaque6n ± 1
... c'est6n + 1
ET6n - 1
... Cela a été prouvé pour être correct...Si il est une preuve que 6n +/- 1 fonctionne, pouvez-vous mettre un lien pour que la preuve?
OriginalL'auteur Sani Singh Huttunen
OriginalL'auteur Aleksey Bykov
Si n est 2, c'est le premier.
Si n est de 1, ce n'est pas le premier.
Si n est pair, il n'est pas premier.
Si n est impair, plus grand que 2, il faut vérifier tous les nombres impairs 3..sqrt(n)+1, si l'un de ces numéros peut diviser n, n n'est pas premier, d'ailleurs, n est premier.
Pour de meilleures performances, je recommande crible d'eratosthène.
Voici l'exemple de code:
Bon. Mais même les meilleurs seront
for (int i = 3; i < sqrt(n)+1; i=i+2) {
Résolu 🙂
n+1 c'est le même que
i < sqrt(n)+1
.i*i < n+1
esti < sqrt(n+1)
au lieu de nécessairei < sqrt(n) + 1
je ne suis pas sûr s'il y a des valeurs possibles den
il importe donc peut-être que vous avez raison et c'est ok.OriginalL'auteur izanbf1803
J'Ai Utiliser Cette Idée Pour Trouver Si Les Pas De. Est Premier ou Non:
Il va revenir
1
pour11
qui est premier.OriginalL'auteur Ratnesh Aroskar
Je suis venu avec cette:
OriginalL'auteur Mr. Frank
C'est un moyen rapide efficace:
Il va commencer à trouver un nombre divisible de n, en commençant par 2. Dès qu'il en trouve un, si ce nombre est égal à n, puis c'est le premier, sinon il ne l'est pas.
OriginalL'auteur Jordi Goyanes
OriginalL'auteur Frazar Ngosa
for( i = 3; (i*i) < num; i += 2 )
Note le(i*i) < num
par rapport à votre code original basé sur la simplei < num
Laissez-moi savoir si vous mettez à jour votre réponse... CheersOriginalL'auteur Kapil
Le code est incroyablement faux. 33 divisé par 2 est 16 avec rappel de 1, mais ce n'est pas un nombre premier...
J'espère qu'ils n'étaient pas attendre 4 ans pour que
OriginalL'auteur Jojo Jkee