1
votes

Comment trouvez-vous les m premiers nombres premiers jumeaux?

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.


2 commentaires

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.


3 Réponses :


2
votes

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) 


0 commentaires

1
votes

Quelques remarques:

  • Vous devez changer votre 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.
  • Au lieu de 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.
  • Vous avez une variable i que vous donnez simplement une valeur de 1 et imprimez, mais ne faites rien d'utile. Vous pouvez le laisser de côté.
  • Le code Python est plus lisible si vous indentez avec quatre espaces au lieu de seulement 2

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)


0 commentaires

1
votes

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>


1 commentaires

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.