双素数对的公式

时间:2017-09-22 07:25:05

标签: python formula primes

我正在尝试计算素数列表中的所有双素数对,并且无法找出公式,正如您在get_pairs(n)函数中看到的那样。

这是我的尝试:

import math

def get_primes(n):
    """ Adds the calculated primes numbers in the range to a list. """
    prime_list = [2]

    for number in range(3, n, 2):
        if all(number % i != 0 for i in range(2, int(math.sqrt(number)) + 1)):
            prime_list.append(number)

    return prime_list

def get_pairs(n):
    """ Adds the calculated primes pairs in the range to a list. """
    pair_list = []

    prime_list = get_primes(n)

    for i in range(len(prime_list) - 1): # to avoid an index error
        if prime_list[i + 1] - prime_list[i] == 2:
            pair_list.append(prime_list[i])

    return pair_list

def make_prime_table(n):
    """ Displays the prime numbers through a table of rows and columns. """
    primes = get_primes(n)

    rows = 56
    columns = 10

    for row in range(rows):
        for col in range(columns):
            try:
                print(primes[row + 56 * col], "\t", end = "")
            except IndexError:
                print("\t", end = "")
        print()

def make_pair_table(n):
    """ Displays the prime pairs through a table of rows and columns. """
    primes = get_primes(n)

    rows = 20
    columns = 10

    for row in range(rows):
        for col in range(columns):
            try:
                print(primes[row + 20 * col], "\t", end = "")
            except IndexError:
                print("\t", end = "")
        print()

""" Main Program """
# function call
make_prime_table(4027)
# statistics
print("\nThe number of primes in the given range is: " + str(len(get_primes(4027))))
print()

# function call
make_pair_table(4027)
# statistics
print("\nThe number of twin pairs in the given range is: " + str(len(get_pairs(4027))))

这是输出:

2       73      179     283     419     547     661     811     947     1087    
3       79      181     293     421     557     673     821     953     1091    
5       83      191     307     431     563     677     823     967     1093    
7       89      193     311     433     569     683     827     971     1097    
11      97      197     313     439     571     691     829     977     1103    
13      101     199     317     443     577     701     839     983     1109    
17      103     211     331     449     587     709     853     991     1117    
19      107     223     337     457     593     719     857     997     1123    
23      109     227     347     461     599     727     859     1009    1129    
29      113     229     349     463     601     733     863     1013    1151    
31      127     233     353     467     607     739     877     1019    1153    
37      131     239     359     479     613     743     881     1021    1163    
41      137     241     367     487     617     751     883     1031    1171    
43      139     251     373     491     619     757     887     1033    1181    
47      149     257     379     499     631     761     907     1039    1187    
53      151     263     383     503     641     769     911     1049    1193    
59      157     269     389     509     643     773     919     1051    1201    
61      163     271     397     521     647     787     929     1061    1213    
67      167     277     401     523     653     797     937     1063    1217    
71      173     281     409     541     659     809     941     1069    1223

我不是试图将它们显示为对(a,b),而只是想按顺序打印它们。任何有关计算公式的帮助都表示赞赏。

更新:

这是实际输出:

3       227     809     1319    1997    2687    3389                            
5       239     821     1427    2027    2711    3461                            
11      269     827     1451    2081    2729    3467                            
17      281     857     1481    2087    2789    3527                            
29      311     881     1487    2111    2801    3539                            
41      347     1019    1607    2129    2969    3557                            
59      419     1031    1619    2141    2999    3581                            
71      431     1049    1667    2237    3119    3671                            
101     461     1061    1697    2267    3167    3767                            
107     521     1091    1721    2309    3251    3821                            
137     569     1151    1787    2339    3257    3851                            
149     599     1229    1871    2381    3299    3917                            
179     617     1277    1877    2549    3329    3929                            
191     641     1289    1931    2591    3359    4001                            
197     659     1301    1949    2657    3371    4019

1 个答案:

答案 0 :(得分:1)

第一个错误,当然是,在make_pair_table函数中,您不会调用get_pairs而是调用get_primes,但似乎您已经解决了这个问题。

另一个错误是,无论何时遇到素数对,您只需将对中的第一个数字添加到对列表中。例如,对于素数3, 5, 7, 11,你比较3和5,然后加3,然后你比较5和7并添加5,但是你比较7和11并且不加7,即使它在一个素对。解决这个问题的一种方法是为每对添加两个素数,但是你必须检查第一个数字是否已经是最后一对的一部分。

for i in range(len(prime_list) - 1):
    if prime_list[i + 1] - prime_list[i] == 2:
        if pair_list == [] or pair_list[-1] != prime_list[i]:
            pair_list.append(prime_list[i])
        pair_list.append(prime_list[i + 1])

或者,您可以从set创建prime_list(以便更快地查找),然后使用简单的列表推导来使用属于素数对的所有素数:

prime_list = get_primes(n)
prime_set = set(prime_list)
pair_list = [p for p in prime_list if p + 2 in prime_set or p - 2 in prime_set]

最后,在您的make_X_table函数中,您应该将行数确定为rows = len(primes) // columns + 1