제곱근을 구할때 흔히 _sqrt_와 같은 함수를 사용하여 그 결과를 얻고는 한다. 그러면 과연 sqrt를 사용하지 않고는 이를 어떻게 얻을 수 있을 것인가?

제곱과 제곱근

제곱이란 무엇인가? 간단히 말하면 특정 수를 한번 더 곱한 것을 말한다. 특정 수를 x라 했을 때, x의 제곱은 x * x, 즉 x^2 가 된다. 제곱근은 어떤 수 x^2가 있을 때, 이 x를 말하는 것이다.

그래서 2의 제곱은 4이며 4의 제곱근은 2이다. 즉 제곱의 역원이 제곱근이 된다.

>>> from math import sqrt
>>> from math import pow
>>> pow(2, 2)
4.0
>>> sqrt(pow(2, 2))
2.0

보통 우리는 피타고라스 정의를 통해 이 제곱과 제곱근에 대해서 친숙하게 알고 있으므로, 다음과 같은 그림을 많이 봐 왔다.

제곱이라는 것은 특정한 수를 다시 곱한 것이므로, 제곱은 정사각형의 넓이를 뜻한다. 따라서 삼각형 각 변으로 이루는 각각의 정사각형의 넓이를 통해 구하려는 변의 정사각형의 넓이를 구할 수 있고, 넓이를 구한다면 제곱근을 통해 다시 한 변의 길이를 알 수 있게 된다.

제곱근 구하기

직관적인 방법

_sqrt_를 사용하지 않고 제곱근을 구하는 방법을 생각해 보자. 제곱이라는 것이 결국 두 번 곱한 결과이므로, 어떤 수를 두 번 곱했을 때 제곱이 나온다면 이 어떤 수가 바로 제곱근이 될 것이다.

직관적으로 떠오르는 방식은 x의 제곱근을 구하기 위해서, x보다 작은 수 z를 두 번 곱해보는 것이 좋아보인다. 문제는 z가 가질 수 있는 범위를 어떻게 정할 것인가 하는 것이다.

예를 들어 4의 제곱근을 구하기 위해서라면 2를 두 번 곱하면 되므로 z는 4/2, 2가 되겠지만 7일 경우 3.5를 사용하면 그 결과가 12.25가 되어버린다. 따라서 7의 경우 x/2보다 작은 수를 써야 한다는건데, x/3의 경우 2.3333…이고 이의 제곱은 5.444…이므로 x/2와 x/3 사이의 어떤 값을 찾아야 하는 것이 결국 제곱근을 고하는 길이 되겠다.

z의 값은 그러면 다음과 같이 계산하는 것으로 해보자. z = x/t일 때, 그 결과가 더 크다면 t를 증가시키고 더 작다면 t를 감소시키면 된다.

  1. x = 7, t = 2, z = 3.5, z^2 = 12.25
  2. x = 7, t = 3, z = 2.3333, z^2 = 5.4444
  3. x = 7, t = 2.5, z = 2.8, z^2 = 7.8399
  4. x = 7, t = 2.75, z = 2.5454, z^2 = 6.47
  5. x = 7, t = 2.625, z = 2.6666, z^2 = 7.1107

값이 점점 7에 근접해진다. 실제로 7으 제곱근은 2.64575…이므로, 이 과정을 반복하다 보면 결국 원하는 값을 찾을 수 있을 것이다. 정확히는 시도 횟수가 늘어날수록 점점 더 근사한 값을 얻게 되겠지만.

이 식은 만약 코드로 작성한다면 두 개의 분기가 있을 것이다. t의 값은 z^2에 따라 달라진다. z^2가 x보다 더 크다면 t는 1/2만큼 작아지고, 작다면 1/2만큼 커진다.

바빌로니아 법(The Babylonian Method)

정확히 이 식을 사용하여 값을 찾는다.

Babylonian Method

a는 이제 우리가 구하려는 제곱을 말한다.

결국은 직관적 방식이 조금 더 가다듬어진 형태이며, 다른 점이 있다면 값을 판별하여 증감 여부를 판별할 필요가 없다는 것이다.

이 식을 통해 7의 제곱근을 구해 보자. x0는 3.5로 시작하기로 했다. 그리고 a는 7이 된다.

  1. x0: 3.5
  2. x1: (3.5)^2 + 7 / 2 * (3.5) = 2.75
  3. x2: (2.75)^2 + 7 / 2 * (2.75) = 2.6477
  4. x3: 2.6477^2 + 7 / 2 * (2.75) = 2.6457

간단히 파이썬 코드로 나타내면 다음과 같다.

>>> def bb(a, xn):
...     return (pow(xn, 2) + a) / (xn * 2)
...
>>> bb(7, 3.5)
2.75
>>> bb(7, 2.75)
2.647727272727273
>>> bb(7, 2.647727)
2.645752048177361
>>> bb(7, 2.647727272727273)
2.6457520483808037
>>> bb(7, 2.6457520483808037)
2.6457513110646933
>>> bb(7, 2.6457513110646933)
2.6457513110645907
>>> bb(7, 2.6457513110645907)
2.6457513110645903

위키피디아에서 7의 제곱근을 찾아보면

√ 7 ≈ 2.6457513110 6459059050 1615753639 2604257102 5918308245 0180368334 4592010688 23230

지금 마지막에 구한 수와는 0.0000000000000002의 차이가 나타났다. 상당히 간단한 방법으로 굉장한 근사치를 가지는 제곱근을 얻은 것이다.