2017-09-22 3 views
0

get_pairs(n) 함수에서 볼 수있는 것처럼 소수의 소수점 쌍에있는 모든 쌍성 소수 쌍을 계산하려고하는데 수식을 알아낼 수 없습니다. I 개 (A, B), 그러나 다만 그들을 인쇄 할 쌍으로 그들을 표시하려고 아니에요트윈 프라임 쌍 수식

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 

:이 출력

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)))) 

: 여기

내 시도이다 주문. 계산 공식에 대한 도움을 주시면 감사하겠습니다.


UPDATE :

이 실제 출력 :

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

2와 3을 제외한 모든 소수는 6n ± 1 형식입니다. 그래서 일단 과거를 지나면 (3, 5) 모든 프라임 쌍은 (6n-1, 6n + 1) 형태입니다. 먼저 6n-1 형식의 소수를 찾음으로써 시간을 절약 할 수 있습니다.이 소수는 소수 쌍의 하위 구성원 일 수 있습니다. 6n-1이 프라임 인 경우에만 6n + 1을 확인해야합니다. – rossum

+0

'sum (b, a == 2 인 경우, a, b의 Z 값 (소수, 소수 [1 :])의 경우) – f5r5e5d

+0

'n'아래에 소수를 생성하는 방법은 매우 비효율적입니다. 에라 토 스테 네스 체 (또는 더 정교한 방법)를 읽으십시오. –

답변

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