[기본수학 2] 골드바흐의 추측

2021. 3. 28. 14:01백준

 

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

 와우.... 왜 골드바흐의 '추측'인가 했더니 아직 증명되지 않은 정수론의 미해결 문제라고 한다.

 

 

골드바흐의 추측 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 골드바흐의 추측(Goldbach's conjecture)은 오래전부터 알려진 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것

ko.wikipedia.org

흥미진진

 

난 비록 문제풀이를 위해 끄적거리는 수준이지만 미해결 문제라는 단어가 주는 설레임과 위대한 수학자들의 업적에 잠시 경외감을 느끼게 된다.

 

2보다 큰 자연수는 두 개의 소수로 이루어졌을 것이라고 '추측' 되는데, 이 때 그 두 소수를 출력하는 문제이다.

 

두 수의 합이 적은 것부터 출력하면 된다고 했으니 2로 나누어서 +1 -1을 하면서 소수인지 검증하면 되겠다.

 

 

import math
from sys import stdin

# 골드바흐의 추측


t = stdin.readline()
t_c = []

for i in range(0, int(t)):
    t_c.append(int(stdin.readline()))

'''
2보다 큰 모든 짝수는 '두' 소수의 합으로 나타낼 수 있다.
두 소수의 차이가 적은 순서대로 구해라.

입력값의 범위 = 4 <= n <= 10,000
 
'''


def prime(num):
    if num == 1:
        return False

    n = int(math.sqrt(num))
    for k in range(2, n + 1):
        if num % k == 0:
            return False

    return True


def getGoldBach(target:int):
    right = math.ceil(target/2)
    left = target - right

    while True:
        if prime(left) and prime(right):
            break
        else:
            right = right + 1
            left = left - 1

    return print(str(left) + " " + str(right))


for c in t_c:
    getGoldBach(c)