在列表中寻找孪生素数并记录它们出现的顺序

2024-04-18 23:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在做一个程序,它的目标是以某种方式分析双素数(双素数是以(p,p+2)的形式存在的素数)。现在我有一个代码,它以%10的形式计算双素数余数。在

这是密码:

def twin_prime_counter_type10(n):
    not_prime = []
    prime = []
    A = range(n + 1)
    B = range(n + 1)
    for i in xrange(2, n+1):
        if i not in not_prime:
            prime.append(i)
            for j in xrange(i*i, n+1, i):
                not_prime.append(j)   
    for n,i in enumerate(prime):
        if not A[n] == prime[n]:
            A[i] = 1
    count1_3 = 0
    count7_9 = 0
    count9_1 = 0
    for i in B:
        if B[i] % 10 == 3 and B[i - 2] % 10 == 1:
            if A[i] * A[i-2] == 1:
                count1_3 += 1
        elif B[i] % 10 == 9 and B[i - 2] % 10 == 7:
            if A[i] * A[i-2] == 1:
                count7_9 += 1
        elif B[i] % 10 == 1 and B[i - 2] % 10 == 9:
            if A[i] * A[i-2] == 1:
                count9_1 += 1
    print count1_3
    print count7_9
    print count9_1

印刷筛(万)

这部分代码工作得很好,但我想知道有没有人知道一种方法,当我找到(1)对(孪生素数)时,我也可以记录它们在列表中出现的顺序。我不需要任何人来实际编写执行此任务的代码,我只想问是否有人知道python中的一个内置工具,我可以用它来完成这项任务。在

谢谢你的帮助。在


Tags: and代码inforifnotrangeprime
1条回答
网友
1楼 · 发布于 2024-04-18 23:34:43

假设sieveSieve of Eratosthenes,或者similar,那么您可以使用itertools模块中的^{}配方来获得带有生成器表达式的孪生素数

from itertools import tee #, izip # <  for python 2

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b) #izip(a, b) # <  for python 2

def twin_primes(n):
    return ( (p1,p2) for p1,p2 in pairwise(sieve(n)) if p1+2 == p2 )
    # or use list comprehension, but I prefer generator as they use 
    # less memory and can be infinite, as sieve can be made to be 
    # infinite as well

例如

^{2}$

同样地,您可以将它与enumerate一起使用,以获得与素数列表相关的对中第一个素数的索引

>>> primes=list(sieve(100))
>>> primes
[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]   
>>> twins=[ (i,pair) for i,pair in enumerate( pairwise(primes) ) if pair[0]+2 == pair[1] ]
>>> twins
[(1, (3, 5)), (2, (5, 7)), (4, (11, 13)), (6, (17, 19)), (9, (29, 31)), (12, (41, 43)), (16, (59, 61)), (19, (71, 73))]
>>> primes[1]
3
>>> primes[4]
11
>>> primes[9]
29
>>> 

相关问题 更多 >