您如何找到前m个双素数?

时间:2019-11-24 19:06:03

标签: python python-3.x primes

我的程序应该找到第一个m个素数并打印它们。

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)

当前,它可以正常运行,但也无法正常运行。我将检查程序运行了多少次,并且只运行了一次。我不知道为什么因为o小于m应该再次运行。同样对于3和5,它们是双素数,但不适用于它们。 isItPrime已经实现以检查数字是否为质数。它返回答案。

3 个答案:

答案 0 :(得分:2)

请发布带有功能和错误的代码

否则,请尝试以下操作:

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) 

答案 1 :(得分:1)

一些评论:

  • 您需要将if o < m更改为while循环:while o < m。仅使用if测试,findTwinPrimes仅被调用一次。您需要一次又一次地调用它,直到您有足够的双素数。在while循环内部,仅当您真正发现了双素数时才需要递增o。因此,findTwinPrimes在找到孪生素数时应返回True,在找不到孪生素数时应返回False。另外,k=3; l=5应该放在while循环的开始之前,以便可以在循环内递增。
  • 只写if isItPrime(a) == True:if isItPrime(a):更好。这具有相同的效果,并且更具可读性。
  • 您有一个变量i,您只给出了一个值1并打印,但没有任何用处。您可以忽略它。
  • 如果缩进四个空格而不是仅两个空格,则Python代码更具可读性

以下是改编的代码:

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)

输出:

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

PS:如果需要,您可以写

    if isItPrime(a):
        if isItPrime(b):
            if b - a == 2:

    if isItPrime(a) and isItPrime(b) and b - a == 2:

答案 2 :(得分:1)

正如@JayMody所指出的,您的isItPrime()已损坏。我们可以使它按预期工作,但是依赖于以越来越多的参数进行调用的方式以及它对全局素数列表的使用都存在问题。 (即考虑先致电isItPrime(22),然后再致电isItPrime(6)

您已经接受的

@JohanC的答案并没有维护全局素数列表,而是通过测试从2到数字的所有数字来进行不必要的除法运算。这远没有您尝试实现的效率高。我认为我们可以通过将一个函数置入另一个函数来挽救您的初衷,而不暴露非通用isItPrime()测试:

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

在测试上下限数字时,我们必须注意不要将质数两次添加到列表中。当M超过100时,您会发现此方法比@JohanC的答案快几个数量级。您走在正确的轨道上。

发布的基于筛子的解决方案@AlokMishra的速度仍然更快,但是它旨在查找不超过您指定的对数的所有对。