Mon programme est censé trouver les m premiers nombres premiers jumeaux et les afficher.
def isItPrime(n): tests = primes.copy() while len(tests) != 0: if n % tests[-1] == 0: return False elif n % tests[-1] != 0: tests.pop() if len(tests) == 0: primes.append(n) return True def findTwinPrimes(a , b): if isItPrime(a) == True: if isItPrime(b) == True: if b - a == 2: print(a, "-", b, "is a twin prime") def firstMTwinPrimes(m): o = 0 i = 1 if o < m : print(i) k = 3 l = 5 findTwinPrimes(k,l) k += 1 l += 1 o += 1 firstMTwinPrimes(7)
Actuellement, il fonctionne sans erreur mais ne fonctionne pas non plus. Le i est de vérifier combien de fois le programme s'exécute et il ne s'exécute qu'une fois. Je ne sais pas pourquoi car si o est inférieur à m, il devrait fonctionner à nouveau. Aussi pour 3 et 5, ce sont des nombres premiers jumeaux mais cela ne fonctionne pas pour eux. isItPrime est déjà implémenté pour vérifier si un nombre est premier ou non. Il renvoie la réponse.
3 Réponses :
s'il vous plaît, publiez votre code avec la fonction et l'erreur
sinon, essayez ceci:
def printTwinPrime(n): prime = [True for i in range(n + 2)] p = 2 while (p * p <= n + 1): # If prime[p] is not changed, # then it is a prime if (prime[p] == True): # Update all multiples of p for i in range(p * 2, n + 2, p): prime[i] = False p += 1 # check twin prime numbers # display the twin prime numbers for p in range(2, n-1): if prime[p] and prime[p + 2]: print("(",p,",", (p + 2), ")" ,end='') # driver program if __name__=='__main__': # static input n = 7 # Calling the function printTwinPrime(n)
Quelques remarques:
if o en une boucle while: while o . Avec seulement le test if, findTwinPrimes
n'est appelé qu'une seule fois. Vous devez l'appeler encore et encore jusqu'à ce que vous ayez suffisamment de nombres premiers jumeaux. Dans cette boucle while, vous devez incrémenter o
uniquement lorsque vous avez vraiment trouvé des nombres premiers jumeaux. Par conséquent, findTwinPrimes
devrait renvoyer True quand il a trouvé un jumeau premier, et False quand ce n'est pas le cas. Aussi, k = 3; l = 5
doit être placé avant le début de la boucle while, afin qu'ils puissent être incrémentés à l'intérieur de la boucle.
if isItPrime (a) == True:
il est préférable d'écrire simplement if isItPrime (a):
. Cela a le même effet et est plus lisible. i
que vous donnez simplement une valeur de 1
et imprimez, mais ne faites rien d'utile. Vous pouvez le laisser de côté. Voici le code adapté:
if isItPrime(a) and isItPrime(b) and b - a == 2:
Sortie:
if isItPrime(a): if isItPrime(b): if b - a == 2:
PS: Si vous voulez , vous pouvez écrire
3 - 5 is a twin prime 5 - 7 is a twin prime 11 - 13 is a twin prime 17 - 19 is a twin prime 29 - 31 is a twin prime 41 - 43 is a twin prime 59 - 61 is a twin prime
comme
def isItPrime(p): for i in range(2, p): if p % i == 0: return False return True def findTwinPrimes(a, b): if isItPrime(a): if isItPrime(b): if b - a == 2: print(a, "-", b, "is a twin prime") return True return False def firstMTwinPrimes(m): o = 0 k = 3 l = 5 while o < m: if findTwinPrimes(k, l): o += 1 k += 1 l += 1 firstMTwinPrimes(7)
Comme le note @JayMody, votre isItPrime ()
est cassé. Nous pouvons le faire fonctionner comme prévu, mais la façon dont il repose sur le fait d'être appelé avec des arguments croissants et son utilisation d'une liste globale de nombres premiers posent des problèmes. (Ie considérez d'abord appeler isItPrime (22)
suivi de isItPrime (6)
)
La réponse de @ JohanC, que vous avez acceptée, ne maintient pas de liste principale globale, faites plutôt plus de divisions que nécessaire en testant tous les nombres de 2 au nombre. C'est beaucoup moins efficace que ce que vous tentiez de mettre en œuvre. Je pense que nous pouvons récupérer votre intention initiale, et ne pas exposer un test isItPrime ()
non général, en rendant une fonction interne à l'autre:
def firstMTwinPrimes(m): primes = [2] def isItPrime(n): for prime in primes: if prime * prime > n: break if n % prime == 0: return False primes.append(n) return True number = 3 count = 0 while count < m: for n in range(number, number + 3, 2): if n == primes[-1]: continue if not isItPrime(n): break else: # no break print(number, "-", number + 2, "are twin primes") count += 1 number += 2
Nous devons faire attention à ne pas ajouter deux fois un nombre premier à la liste lorsqu'elle est testée comme un nombre inférieur et supérieur. Vous constaterez que cette approche est de quelques ordres de grandeur plus rapide que la réponse de @ JohanC lorsque M
dépasse cent. Vous étiez sur la bonne voie.
La solution basée sur tamis @AlokMishra publiée est encore plus rapide, mais elle est conçue pour trouver toutes les paires jusqu'à un certain nombre, pas un certain nombre de paires comme vous l'avez spécifié. p>
Mon code n'était pas destiné à être rapide, seulement pour être aussi proche que possible de la question, afin qu'OP puisse comparer son code et voir où s'améliorer. Bien sûr, de nombreuses optimisations sont possibles, mais cela ferait partie de l'idée d'avoir un code aussi simple que possible qui fonctionne. Par exemple, vous pouvez facilement passer par étapes de 6 au lieu de 2. À part les 3 premiers, tous les premiers nombres premiers d'un jumeau sont nécessairement 5 modulo 6.
votre code a fonctionné pour moi lorsque j'ai utilisé ma propre fonction isItPrime, je pense que le problème est dans votre fonction
isItPrime
.À l'exception de {3, 5}, toutes les paires de jumeaux premiers sont de la forme {6n-1, 6n + 1}, comme {5, 7} ou {29, 31}. Cela vous aidera à accélérer votre recherche.