代码之家  ›  专栏  ›  技术社区  ›  Frenchi33

双素数对公式

  •  0
  • Frenchi33  · 技术社区  · 7 年前

    我试图计算素数列表中的所有双素数对,但无法计算出公式,正如你在 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 回复  |  直到 7 年前
        1
  •  1
  •   tobias_k    7 年前

    当然,第一个错误是 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