我正在尝试计算素数列表中的所有双素数对,并且无法找出公式,正如您在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
答案 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