우리는 코딩할 때 Math.sqrt(5) 한 줄이면 제곱근을 구할 수 있는 세상에 살고 있습니다.
하지만 컴퓨터가 없던 4,000년 전 고대 바빌로니아 사람들은 도대체 어떻게 제곱근을 계산했을까요?
단순히 라이브러리를 가져다 쓰는 것을 넘어, 그 내부에서 어떤 수학적 원리가 작동하는지
'바빌로니아 알고리즘'을 통해 파헤쳐 보고, 이를 자바 재귀 함수로 직접 구현해 보겠습니다.

계산기 없이 √5를 구해봐
갑자기 누군가 당신에게 √5가 몇인지 묻는다면 어떻게 대답할까요?
"2보다는 크고 3보다는 작으니까... 2.2 정도 되려나?"
대충 짐작은 할 수 있지만, 정확한 값을 찾기는 어렵습니다. 컴퓨터 내부에서도 이와 비슷한 고민을 합니다.
정확한 값을 한 번에 '뿅' 하고 내놓는 공식은 없습니다.
대신 '점점 더 정답에 가까워지는(수렴하는)' 방식을 사용합니다.
평균의 마법
바빌로니아 알고리즘의 핵심은 '추측'과 '보정'의 반복입니다. 논리는 아주 심플합니다.
- 어떤 수
S의 제곱근을 구하고 싶습니다. 일단 아무 숫자나 추측값(x)으로 던집니다. - 만약
x가 진짜 제곱근보다 작다면,S / x는 진짜 제곱근보다 클 것입니다. (반대도 마찬가지) - 그렇다면 진짜 정답은
x와S / x의 정중앙(평균)에 있지 않을까요?
💡 바빌로니아 점화식
xnew = ( xold + S / xold ) / 2
이 공식을 계속 반복하면, 오차 범위가 기하급수적으로 줄어들며 실제 제곱근 값에 도달하게 됩니다.
자바 코드로 구현하기 (재귀 함수)
이 반복되는 과정을 for문이나 while문으로 짤 수도 있지만, 재귀(Recursion)를 사용하면 수식 그대로를 코드로 옮긴 듯한 직관적인 구현이 가능합니다.
public class BabylonianSqrt {
// 외부 변수(static)를 없애고, 함수가 직접 값을 반환하도록 변경
public static double getSqrt(double value, double guess) {
// 1. 점화식 계산
double nextGuess = (guess + (value / guess)) / 2;
// 2. 종료 조건: 값이 더 이상 변하지 않으면 그 값을 던져줌!
if (guess == nextGuess) {
return nextGuess;
}
// 3. 재귀 호출: 계산된 값을 가지고 다시 자신을 호출
return getSqrt(value, nextGuess);
}
public static void main(String[] args) {
double target = 5.0;
// 함수가 던져준 값을 받아서 출력
double result = getSqrt(target, 1.0);
System.out.println("바빌로니아 알고리즘 결과: " + result);
System.out.println("Java Math.sqrt 결과: " + Math.sqrt(target));
}
}
왜 무한 루프에 빠지지 않을까?
위 코드에서 가장 흥미로운 부분은 종료 조건입니다.
if (squareRoot == nextGuess) return;
일반적인 수학 세계에서는 완벽한 무리수 값을 찾을 때까지 무한히 반복해야 합니다.
하지만 컴퓨터의 double 자료형은 유효숫자(정밀도)의 한계가 있습니다.
근사값이 점점 정답에 가까워지다가, double이 표현할 수 있는 비트 단위까지 같아지는 순간이 옵니다. 이때 squareRoot와 nextGuess가 완벽히 일치하게 되어 재귀가 종료됩니다. 즉, 자료형의 한계를 역이용해 깔끔한 종료 조건을 만든 셈이죠.
결론
바빌로니아 알고리즘은 "틀린 답을 수정해서 덜 틀린 답으로, 그것을 다시 수정해서 맞는 답으로" 나아가는 과정입니다.
- 초기값을 던진다.
- 오차를 보정한다.
- 이것을 반복한다.
우리가 편하게 쓰는 Math.sqrt() 뒤에는, 수천 년 전 고대 수학자들의 지혜와 이를 최적화하려는 컴퓨터 과학의 원리가 숨어 있었습니다.
바빌로니아 알고리즘 핵심 요약
이 알고리즘의 원리는 "직사각형을 정사각형으로 만들기"라고 생각하면 이해가 쉽습니다.
- 1. 목표
숫자S의 제곱근(√S)을 구하고 싶습니다. (예:S = 5) - 2. 추측 (Guess)
일단 아무 숫자나 찍습니다. 이를x라고 합시다. (예:x = 2) - 3. 확인
만약x가 진짜 제곱근이라면,x × x = S여야 합니다.
즉,x = S / x여야 합니다.
우리는x = 2라고 했고,S / x는5 / 2 = 2.5입니다.2 ≠ 2.5이므로 틀렸습니다.
(직사각형의 가로가 2, 세로가 2.5인 상태) - 4. 보정 (Average)
진짜 제곱근은x와S / x의 중간 어디쯤에 있을 것입니다.
그래서 두 수의 평균을 구합니다.new = (2 + 2.5) / 2 = 2.25 - 5. 반복
이제2.25를 새로운 추측값(x)으로 삼고 이 과정을 반복합니다.
놀랍게도 몇 번만 반복하면 정확한 값에 빠르게 수렴합니다.
