Python으로 루트 2 계산해보기

문사이봇·2022년 10월 11일

점심 먹고 조용히 있는데, 갑자기 루트 2와 이를 구할 수 있는 방법이 생각났다.

1<2<4\sqrt{1} < \sqrt{2} < \sqrt{4}
44<84<94\sqrt{4 \over 4} < \sqrt{8 \over 4} < \sqrt{9 \over 4}
169<189<259\sqrt{16 \over 9} < \sqrt{18 \over 9} < \sqrt{25 \over 9}
2516<3216<3616\sqrt{25 \over 16} < \sqrt{32 \over 16} < \sqrt{36 \over 16}
......

처럼 제곱수를 활용하여 2\sqrt{2}의 범위를 줄여나가는 방식이다.
손으로 좀 해봤는데, 엄청나게 오래 해야할 것 같아서 컴퓨터의 도움을 받아야겠다는 생각을 했다. 그래서 Python을 활용하여 간단하게 만들어 보았다.

우선 n과 가장 가까운 제곱수를 출력하는 함수 getLowerSquareNumgetUpperSquareNum을 만들어 보았다. (참고로 제곱수는 영어로 square number이라고 하더라)

def getLowerSquareNum(n):
    answer = 1
    while answer ** 2 <= n:
        answer += 1
        
    return (answer - 1)**2
def getUpperSquareNum(n):
    answer = 1
    while answer ** 2 <= n:
        answer += 1
        
    return answer**2 # -1을 하지 않으면 upperSquareNum이 출력됩니다.

getLowerSquareNum은 n보다 '작은' 수 중에서 가장 가까운 제곱수를 출력하고, getUpperSquareNum은 n보다 '큰' 수 중에서 가장 가까운 제곱수를 출력한다.

수식으로 돌아가서, 아까 우리가 썼던 식을 일반화해보자.

getLowerSquareNum(루트2분자)분모<루트2분자분모<getUpperSquareNum(루트2분자)분모\sqrt{getLowerSquareNum(루트2분자) \over 분모} < \sqrt{루트2분자 \over 분모} < \sqrt{getUpperSquareNum(루트2분자) \over 분모}
이거를 그대로 프로그램으로 짠다.

import math
범위 = []

for i in range(1, 100):
    분모 = i**2
    루트2분자 = 분모 * 2
    
    범위.append([
        math.sqrt(getLowerSquareNum(루트2분자) / 분모),
        math.sqrt(getUpperSquareNum(루트2분자) / 분모)
    ])

범위를 그래프로 출력해보자.

import matplotlib.pyplot as plt

plt.plot(범위)
plt.show()


오케이! 그래프를 보니 한눈에 루트 2로 수렴하고 있는걸 알 수 있다. 그래프로는 '정확한' 값을 알 수 없으니, 확인해보자!

nearestLower = 0
nearestUpper = 100 #넉넉하게 100으로

for i in 범위:
    if i[0] > nearestLower:
        nearestLower = i[0]
    if i[1] < nearestUpper:
        nearestUpper = i[1]
        
print(f"{nearestLower} < sqrt 2 < {nearestUpper}")

그래프를 보면 매끄러운 곡선 형태로 수렴하는게 아니라, 올라갔다 내려갔다 하면서 수렴하고 있어서 nearestLower, nearestUpper라는 변수를 따로 만들어서, 가장 가까운 값이 발견되었을 때 변수에 값을 저장하는 방식을 사용했다. 결과는??

1.4141414141414141 < sqrt 2 < 1.4142857142857144

아주 좋다! 이러한 결과를 단 100번의 반복만으로 얻어냈다. 1000번 10000번 반복하면 얼마나 가까워질지 너무나 궁금해진다.

profile
열심히 연습해서 프로그래머를 꿈꾸는 학생

0개의 댓글