점심 먹고 조용히 있는데, 갑자기 루트 2와 이를 구할 수 있는 방법이 생각났다.
처럼 제곱수를 활용하여 의 범위를 줄여나가는 방식이다.
손으로 좀 해봤는데, 엄청나게 오래 해야할 것 같아서 컴퓨터의 도움을 받아야겠다는 생각을 했다. 그래서 Python을 활용하여 간단하게 만들어 보았다.
우선 n과 가장 가까운 제곱수를 출력하는 함수 getLowerSquareNum과 getUpperSquareNum을 만들어 보았다. (참고로 제곱수는 영어로 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보다 '큰' 수 중에서 가장 가까운 제곱수를 출력한다.
수식으로 돌아가서, 아까 우리가 썼던 식을 일반화해보자.
이거를 그대로 프로그램으로 짠다.
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번 반복하면 얼마나 가까워질지 너무나 궁금해진다.