최근 자주 보는 과학채널에서 우연히 보게 된 콜라츠추측이라는 수학계에서 오래된 미증명된 문제에 대해 알게 되었다.
이 수열은 우박수열이라고도 불리우는데 주어진 방법대로 수열을 만들어보면 값이 들쭉날쭉 하면서 마치 우박이 생성되는 과정과 비슷하다 하여 붙여진 이름이라고 한다.
자세한 내용은 아래 나무위키를 참조..ㅎㅎ
https://namu.wiki/w/%EC%BD%9C%EB%9D%BC%EC%B8%A0%20%EC%B6%94%EC%B8%A1
콜라츠 추측 - 나무위키
만약 이 추측이 거짓이라면, 1로 가지 않는 반례가 존재한다는 것을 의미한다. 수학자들은 이런 대표적인 반례에 대해서 자기 자신으로 순환하는 루프가 존재할 것으로 예상한다[9]. 예를들어 문
namu.wiki
내가 궁금했던 것은... 특정 범위의 수들로 수열을 만들어서 시각화를 했을 때 정말 들쭉날쭉하게 그려지는지가 꽤 궁금했다.
일단 시각화에 편리한 것은 c보다는.. python이 편하니 matplotlib를 이용해서 특정범위의 수열을 만든후 그래프로 그려보기로 하였다.
아래는 사용한 코드이다.
import matplotlib.pyplot as plt
font1={'family':'Arial','size':8}
mins=2
maxs=500
sl = list()
for seed in range(mins, maxs):
cseed=seed
while cseed != 1:
sl.append(cseed)
if cseed %2 == 0:
cseed=cseed/2
else:
cseed=cseed*3+1
plt.text(sl.index(max(sl)), max(sl), str(seed)+'('+str(len(sl))+','+str(max(sl))+')', fontdict=font1)
plt.plot(sl, linewidth=1)
sl.clear()
plt.xlabel("Sequence Length")
plt.ylabel("Sequence Max Value")
plt.grid(True)
plt.title("Hailstone Sequence("+str(mins)+'~'+str(maxs)+')')
plt.legend(loc='best')
plt.show()
mins/maxs 에 원하는 범위의 값을 넣어주고(seed값)
그 값들로 while문을 돌면서 1이 될때까지 돌면서 sl 리스트에 구해진 값을 넣고 while loop를 빠져나오면 해당 리스트를 plot에 넣어주는 단순한? 코드이다.
해당수열에서 가장 높은 값에 해당하는 위치에 어느 값으로부터 출발했는지와 1이 되기까지 얼마나 스텝을 지나왔는지 그리고 최대값은 얼마인지를 그래프상에 표시하도록 하였다.
일단 2부터 500까지 구해본 그래프를 보면 아래와 같다.
내가 원했던 그림은 좀더 불규칙적인 그림을 원했는데 딱히 그래보이지는 않아보인다 ㅎㅎ
일단 447로부터 시작한 수열이 신기하게도 97번만에 1로 떨어졌음에도 최대값이 무려 39364까지 나왔다.
저 그래프의 좌측아래를 좀더 확대해보면 아래와 같다.
좀더 확대해보면 아래와 같다.
난 우박수열이라는 것이 전체 수를 놓고 봤을때도 양상이 아주 랜덤하게 불규칙적으로 떨어질 것으로 기대했는데 위의 그래프를 보면 딱히 그래보이지도 않는다 ㅎㅎㅎ
아마 3n+1과 n/2 를 반복하다가 앞서서 그린 그래프와 비슷한 양상으로 반복되는 패턴이 많이 보이는 것으로 보여진다 @@?
좀 더 드라마틱하게? 랜덤한 그래프를 보고 싶다면 아래 코드를 이용하면 된다.
import matplotlib.pyplot as plt
import random
font1={'family':'Arial','size':8}
seed_list=[random.randint(2,999999999999) for value in range(0,500)]
mins=min(seed_list)
maxs=max(seed_list)
sl = list()
for seed in seed_list:
cseed=seed
while cseed != 1:
sl.append(cseed)
if cseed %2 == 0:
cseed=cseed/2
else:
cseed=cseed*3+1
plt.text(sl.index(max(sl)), max(sl), str(seed)+'('+str(len(sl))+','+str(max(sl))+')', fontdict=font1)
plt.plot(sl, linewidth=1)
sl.clear()
plt.xlabel("Sequence Length")
plt.ylabel("Sequence Max Value")
plt.grid(True)
plt.title("Hailstone Sequence("+str(mins)+'~'+str(maxs)+')')
plt.legend(loc='best')
plt.show()
랜덤함수를 이용해서 9천억까지의 범위중 무작위로 500개를 뽑아서 돌려보는 코드이다.
이를 수행해보면 아래와 같은 그래프를(경우에 따라 모두 다르겠다.) 볼 수 있다.
역시 또 확대를 해보면...
콜라츠 추측은 아직도 모든 자연수 n에 대하여 수열의 마지막이 1,2,4를 반복하게 되는지 아직 증명이 안된 문제라고 한다.
최소 2곳 이상의 단체?에서 상금도 걸려있다고 하니 관심있는 분들은 증명에 도전해 보시길 ^^
* 이 수열을 알게 해준 유튜브 영상
https://www.youtube.com/watch?v=5dZKr-Z2FO4
'STUDY' 카테고리의 다른 글
2차 방정식의 근을 구하는 c code에 관하여 (0) | 2022.12.07 |
---|---|
평균속도와 평균 rpm으로 계산한 각종 구동부 회전수는 얼마나 될까? (0) | 2022.11.16 |
UTQG지수와 실제 주행거리는 비슷할까? (4) | 2022.06.13 |
RestAssured Junit test결과중 http request/response 데이터를 Extent Report에 추가하기 (0) | 2022.04.28 |
pypy 로 json decode 수행시 수행시간 변화 (0) | 2022.03.04 |
댓글