본문 바로가기
프로그래밍/문제 풀이

[콜라츠 추측] 파이썬 GUI로 콜라츠 추측 알아보기1

by 인성패밀리 2022. 11. 3.
반응형

콜라츠 추측에 대해서 들어보셨나요?

 

콜라츠 추측이란 임의의 양의 정수 n에 대해서 홀수 일 경우 3*n + 1을 하고 짝수일 경우 n / 2를 하는데 이를 임의의 양의 정수에 수행하면 항상 마지막은 4 2 1 순으로 수렴한다는 것이 콜라츠 추측입니다.

 

5에 대해서 이 과정을 수행해보면

 

5 -> 홀수 -> 5 x 3 + 1 -> 16

16 -> 짝수 -> 16 / 2 -> 8

8 -> 짝수 -> 8 / 2 -> 4

4 -> 짝수 -> 4 / 2 -> 2

2 -> 짝수 -> 2 / 2 -> 1

1 -> 홀수 -> 1 x 3 + 1 -> 4

4 -> 짝수 -> 4 / 2 -> 2

2 -> 짝수 -> 2 / 2 -> 1

...

...

 

결과적으로 마지막에는 4 -> 2 -> 1이 계속 반복이 됨을 알 수 있습니다. 즉, 마지막 수는 반드시 1이 됩니다.

 

아직 증명되지 않은 문제이며 곱셈 나눗셈만 알면 쉽게 이해할 수 있는 문제입니다.

 

근데 우리는 프로그래밍적으로 생각을 해야합니다.

 

해당 문제를 프로그래밍 적으로 생각해보면 다음과 같을 수 있습니다.

1. 홀수 일 때 3*n + 1, 짝수일 때 n / 2을 계산해야 한다.

2. 홀수, 짝수를 판별하는 방법?

3. 무엇을 반복해야 1까지 갈까?

4. 그렇다면 반복은 얼마나 해야하나?

 

1. 홀수 일 때 3*n + 1, 짝수일 때 n / 2을 계산해야 한다.

-> 이 문제는 쉽게 해결이 가능합니다. 그냥 그 수에 맞게 계산을 해주면 됩니다.

 

2. 홀수, 짝수를 판별하는 방법?

-> 코딩을 많이 해보신 분들은 이러한 부분은 자면서도 술술 나올테지만 처음 접하거나 생각해본 적이 없는 분들은 어려울 수도 있습니다.

 

우선 판별을 하려면 특징(공통점)을 잡을 수 있어야 합니다.

 

홀수들의 특징, 짝수들의 특징 파악하면 조건을 만들 수 있습니다.

 

홀수는 1, 3, 5, 7, 9, ...

짝수는 2, 4, 6, 8, 10, ...

 

짝수는 모두 2로 나누어 떨어진다는 특징이 있습니다. 2 나누기 2는 1, 4 나누기 2는 2, 6 나누기 2는 3....

그러나 이 부분은 공통점이 보이지 않습니다.

 

보통 나누기를 생각할 때 대부분 몫을 생각하기 쉬워 그럴 수도 있습니다. 나머지를 생각해보겠습니다.

2 나누기 2의 나머지는 0, 4 나누기 2의 나머지는 0, 6 나누기 2의 나머지는 0, .....

 

짝수들의 특징을 눈치 채셨나요?

2로 나눈 나머지가 모두 0과 같습니다. 그렇다면 홀수들을 어떨까요? 홀수는 2로 나눌 때 나머지가 모두 1입니다.

 

여기까지 알아본 내용을 코드로 작성하면 이렇습니다.

n = 5  # 임의의 양의 정수 선택

if n % 2 == 0:  # n을 2로 나눈 나머지가 0과 같다면?
    n = int(n / 2)
else:  # 모든 짝수의 나머지는 홀수 이므로 else를 사용한다.
    n = n * 3 + 1
print(n)

근데 이렇게 하면 딱 한 번밖에 볼 수 없습니다. 그래서 반복을 해야합니다.

 

3. 무엇을 반복해야 1까지 갈까?

-> 당연히 if 문부터 print(n)까지 반복을 해야합니다.

 

4. 그렇다면 반복은 얼마나 해야하나?

-> 마지막에 1이 나올 때까지 반복을 해야합니다. 1이 나오는 순간 4 2 1 4 2 1이 반복이 되기 때문입니다.

 

그렇다면 1이 나올 때까지라는 말은 언제 1이 나올지 모른다는 말과 같으며 특정 조건을 의미하는 말이기도 합니다.

때문에 특정 범위에 따라 반복할 수 있는 for문 보다는 조건에 따라 반복하는 while문이 적절하다고 볼 수 있습니다.

따라서 코드는 다음과 같습니다.

n = 5  # 임의의 양의 정수 선택

while n != 1:
    if n % 2 == 0:  # n을 2로 나눈 나머지가 0과 같다면?
        n = int(n / 2)
    else:  # 모든 짝수의 나머지는 홀수 이므로 else를 사용한다.
        n = n * 3 + 1
    print(n, end=" ")  # 한 줄로 볼 수 있게 해보았습니다.

이 코드를 실행하면 변화를 볼 수 있는데 단순히 숫자로보면 뭔가 밋밋합니다.

그래서 이 것을 그래프로 나타낼 수 있게 해보겠습니다.

 

터틀 모듈을 사용하면 쉽게 보이는데 요즘 tkinter 모듈 사용법을 올리고 있습니다. 때문에 tk모튤을 이용해서 표현을 해보도록 하겠습니다.

 

반응형

댓글