Simple Premier Générateur en Python
Quelqu'un pourrait-il me dire ce que je fais de mal avec ce code? C'est juste l'impression de "comte" de toute façon. Je veux juste un de très simple, le premier générateur (rien de compliqué).
import math
def main():
count = 3
one = 1
while one == 1:
for x in range(2, int(math.sqrt(count) + 1)):
if count % x == 0:
continue
if count % x != 0:
print count
count += 1
- pouvez-vous poster quelques sortie?
- N'est-il pas mettre fin? Pas surprenant avec un "tout en un == 1:" en elle. N'est-il pas de produire une sortie à tous? Elle produit non-nombres premiers? Est-il trop lent? N'est-il pas en C#? Quel est le problème?
- Si ce n'est pas le travail que vous voudrez peut-être regarder dans le Crible d'Eratosthène: en.wikipedia.org/wiki/Sieve_of_Eratosthenes
- Je seconde CTT commentaire. Il sera tout aussi facile, si pas plus facile à code de trop.
- pour les implémentations simples de Crible d'Eratosthène voir: stackoverflow.com/questions/2068372/...
Vous devez vous connecter pour publier un commentaire.
Il y a quelques problèmes:
continue
se déplace à la prochaine itération de boucle - mais vous voulez vraiment arrêter à l'aide debreak
Voici votre code avec quelques corrections, il imprime uniquement les nombres premiers:
Pour beaucoup plus efficace premier génération, voir le Tamis de Erastothenes, comme d'autres l'ont suggéré. Voici une belle, optimisé mise en œuvre avec de nombreux commentaires:
Remarque qu'il renvoie d'un générateur.
Nous permettra d'obtenir tous les nombres premiers jusqu'à 20 dans une liste.
J'aurai pu utiliser un Crible d'Eratosthène, mais vous avez dit
vous voulez quelque chose de très simple. 😉
for x in range(2, num)
enfor x in range(2, math.trunc(math.sqrt(num)) + 1)
, puis vous obtenez les mêmes résultats, mais plus rapide.re est puissant:
Pour tester si un nombre est premier:
Voici un simple (Python 2.6.2) solution... qui est en ligne avec les OP de la demande d'origine (maintenant six mois); et devrait être une très bonne solution dans un "programmation 101" bien sûr... d'Où ce post.
Ce simple "brute force" la méthode est "assez rapide" pour les nombres jusqu'à environ 16 000 sur un PC moderne de l' (a pris environ 8 secondes sur mon 2GHz encadré).
De toute évidence, cela pourrait être fait de manière beaucoup plus efficace, de ne pas avoir à recalculer la primeness de chaque nombre pair, ou tout multiple de 3, 5, 7, etc pour chaque numéro unique... Voir la Crible d'Eratosthène (voir eliben de mise en œuvre ci-dessus), ou encore la Crible d'Atkin si vous vous sentez particulièrement courageux et/ou fou.
Caveat Emptor: je suis un python de noob. Merci de ne pas prendre ce que je dis comme parole d'évangile.
À mon avis, il est toujours préférable de prendre de l'approche fonctionnelle,
J'ai donc créer une fonction afin de savoir si le nombre est premier ou non, puis l'utiliser dans la boucle ou à une autre place que nécessaire.
Puis exécutez une simple liste de compréhension ou de générateur d'expression pour obtenir votre liste de prime,
Cela semble devoirs-y, donc, je vais donner un indice plutôt qu'une explication détaillée. Corrigez-moi si j'ai supposé mal.
Vous vous débrouillez bien que la mesure de renflouer quand vous voyez un même diviseur.
Mais vous avez l'impression de "compter" dès que vous voyez, même un nombre qui ne divise pas en elle. 2, par exemple, de ne pas répartir uniformément dans 9. Mais cela ne fait pas 9 un nombre premier. Vous voudrez peut-être garder jusqu'à ce que vous êtes sûr pas nombre dans la plage de matchs.
(comme d'autres ont répondu, le Tamis est une façon beaucoup plus efficace de s'en aller... juste essayer de vous aider à comprendre pourquoi ce code n'est pas de faire ce que vous voulez)
Comment à ce sujet si vous voulez calculer le premier directement:
Un autre exemple simple, avec une simple optimisation de ne tenir compte que des nombres impairs. Tout ce qui est fait avec lazy flux (python générateurs).
Utilisation: amorce = liste(create_prime_iterator(1, 30))
Ici est un numpy version du Crible d'Eratosthène avoir tous les deux d'accord complexité (plus bas que le tri d'un tableau de longueur n) et la vectorisation.
Horaires:
L'instruction continue est anormal.
Vous souhaitez démarrer à 2 car 2 est le premier nombre premier.
Vous pouvez écrire "while True:" pour obtenir une boucle infinie.
Vous devez vous assurer que tous les diviseurs de ne pas répartir uniformément le numéro que vous désirez vérifier. Dans ce cas, vous allez imprimer le nombre que vous êtes à la vérification de tous les temps juste l'un des diviseurs de ne pas répartir uniformément le nombre.
Aussi, vous ne voulez pas utiliser une instruction continue parce que a va juste provoquer des afin de vérifier la prochaine diviseur quand vous l'avez déjà constaté que le nombre n'est pas un nombre premier.
Voici ce que j'ai:
Il est assez rapide pour un grand nombre, comme il vérifie seulement contre déjà le premier nombre de diviseurs d'un nombre.
Maintenant, si vous voulez générer une liste de nombres premiers, vous pouvez le faire:
à l'aide de générateurs ici peut-être souhaité pour plus d'efficacité.
Et juste pour la référence, au lieu de dire:
vous pouvez simplement dire:
Vous pouvez créer une liste de nombres premiers en utilisant la liste des compréhensions et d'une manière très élégante manière. Prises de ici:
Similaire à user107745, mais l'utilisation de "tous" au lieu de la double négation (un peu plus lisible, mais je pense que même performance):
Fondamentalement, il parcourt le x dans la gamme de (2, 100) et de la cueillette seulement ceux qui n'ont pas mod == 0 pour tout t in range(2,x)
Une autre façon est probablement juste de peupler le premier des nombres, comme nous allons:
SymPy est une bibliothèque Python pour le calcul symbolique. Il offre plusieurs fonctions pour générer des nombres premiers.
Voici quelques exemples.
Si vous vouliez trouver tous les nombres premiers dans une gamme que vous pourriez faire ceci:
Juste ajouter
while its <=
et votre numéro de pour la plage.SORTIE:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101
À l'aide du générateur:
Utilisation:
Pour moi, ci-dessous la solution semble simple et facile à suivre.