카테고리 없음

(정수론/파이썬) 쌍둥이 소수 구하기

미친토끼 2021. 8. 28. 07:40
### 쌍둥이 소수를 최대한 구해보기
# '친절한 수론 길라잡이' 11쪽 참고
# 쌍둥이 소수: 소수의 목록엔 인접한 홀수 2개가 모두 소수인 경우가 있다... 
# 쌍둥이 소수는 무수히 많을까? 다시 말해, p + 2도 역시 소수인 소수 p가 무수히 많을까?
# 현재는 이 질문에 대한 답은 아무도 모른다.

# 어떤 수가 소수인지 판단. 그 수를 그 수의 루트까지 나눠봐서 나눠지면 소수, 
# 아니면 소수가 아니다.
# 소수이면 1, 아니면 0을 반환
def isPrime(num):
  root_val = round(num ** 0.5) # 제곱근 값을 구한다
  for i in range(2, root_val+1): # 제곱근값+1 까지만 약수를 조사해도 충분하다
    if num % i == 0:  # 중간에 나눠지면 소수가 아니다
      return False
  return True   # 끝까지 나눠지지 않을 경우, 소수로 판정하고 리턴한다.

i = 5  # 현재 수
prev_prime = 3 # 이전에 등장한 소수
count = 0  # 쌍둥이 소수 등장 횟수 
while True: 
  if isPrime(i): # 현재 수가 소수라면
    if i - prev_prime == 2: # 이전의 소수(홀수)가 인접한 소수(홀수)라면
      count += 1
      print(f"({prev_prime}, {i})    {count}")
    prev_prime = i
  i += 2  # 짝수에 대해서는 굳이 소수 여부 조사를 할 필요가 없음. 홀수에 대해서만 조사함

출력:

 

(3, 5)    1
(5, 7)    2
(11, 13)    3
(17, 19)    4
(29, 31)    5
(41, 43)    6
(59, 61)    7
(71, 73)    8
(101, 103)    9
(107, 109)    10
(137, 139)    11
(149, 151)    12
(179, 181)    13
(191, 193)    14
(197, 199)    15

........
(63718931, 63718933)    295748
(63719099, 63719101)    295749
(63719189, 63719191)    295750
(63719309, 63719311)    295751