对于大值高达 1 亿,如何使我的代码运行得更快?

问题描述

好的背景:我正在解决一个问题,该问题要求我找到一个数字“n”,使得 n-9、n-3、n+3、n+9 是连续的质数,而 n-8、n -4,n+4,n+8 是实际数字,然后我必须将满足此条件的前四个 n 相加。

问题:代码的逻辑正确与否在这里无关紧要,因为我的代码在达到1亿之前就崩溃了。我什至无法检查代码的输出,它适用于 100 万,但不适用于更大的数字。

我做了什么: 我使用了时代的筛子......得到了高达 1 亿的质数,我们称之为 M。由于实际数字可以被 6 或 4 整除,我创建了另一个集合来存储这些数字,然后从该列表中创建了一个包含满足此条件的数字的集合:“n-8、n-4、n+4、n+8 是实用数字”,我们将其称为 N。最后,我遍历 N 中的每个元素 a,然后检查 a - 9,a - 3,a + 3,a + 9 是否是质数集的一部分。

如果有人对我如何加快速度或任何更好的算法有任何建议,我们将不胜感激

代码

def SieveOfEratosthenes(n):
    m = set()
    prime = [True for i in range(n + 1)]
    p = 2
    while (p * p <= n):
        if (prime[p] == True):
            for i in range(p * 2,n + 1,p):
                prime[i] = False
        p += 1
    prime[0]= False
    prime[1]= False
    for p in range(n + 1):
        if prime[p]:
            m.add(p)
    return m

#creates set that stores multiples of 4 and 6

def ps1(n):
    s = set()
    for i in range(1,n+1):
        if i%4 == 0 and i%6 == 0:
            s.add(i)
    return s

#checks whether any number satisfies n -8,n-4,n+8 must be practical and stores it in a set

def ps2(l):
    q = set()
    for i in l:
        if ((i-8) in l) and ((i-4) in l) and ((i+4) in l) and ((i+8) in l):
            q.add(i)
    return q

#using the numbers stored in the prev set,i check the last condition n-9,n-3,n+3,n+9 must be in the 
prime list
def TotalSieve(k,l):
    q = set()
    inc = 0
    for i in k:
        if inc != 4:
            if ((i-9) in l) and ((i-3) in l) and ((i+3) in l) and ((i+9) in l):
                inc = inc + 1
                q.add(i)
        else:
            print("Found 4")
    return q
                                                                       
# driver program
if __name__=='__main__':
    n = 1000000000
    m = SieveOfEratosthenes(n)
    p = ps1(n)
    p = ps2(p)
    f = TotalSieve(p,m)
    elem1 = f.pop()
    elem2 = f.pop()
    elem3 = f.pop()
    elem4 = f.pop()
#add the first four numbers that satisfy the conditions
    tot = elem1 + elem2 + elem3 + elem4
    print(tot)
    

解决方法

首先,ps1 是错误的。测试应显示 or,而不是 and

接下来,如果 n 可以被 4 整除,则所有 n-8,n-4,n+4,n+8 也可以被 4 整除。如果 n 不能被 4 整除,没有可以被 4 整除,一些也不能被 4 整除。这意味着您只对 n 是 4 的倍数感兴趣。 >

最后,我知道这个问题意味着一些严肃的数论作业。蛮力不行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...