바크샬리 근사법(Bakhshali approximation)은 완전제곱수가 아닌 숫자의 제곱근을 계산하는 방법입니다. 개념을 쉽게 이해하기 위해 먼저 관련 용어부터 간단히 살펴보겠습니다.
기본 개념 정리
제곱근(Square Root)이란?
숫자 x의 제곱근은 다음 조건을 만족하는 수 y를 말합니다.
y² = x
완전제곱수(Perfect Square)란?
완전제곱수는 제곱근이 정확히 정수로 떨어지는 수입니다. 예를 들어 16은 제곱근이 4 × 4 = 16이므로 완전제곱수에 해당합니다.
수학적으로 제곱근을 구하는 방법은 여러 가지가 정의되어 있습니다. 이 글에서는 그중에서도 바크샬리 근사법을 사용해 제곱근을 구하는 방법을 알아보겠습니다.
바크샬리 근사법은 특정 수의 제곱근 근삿값을 구하는 기법으로, 고대의 바빌로니아 법(Babylonian method)의 처음 두 단계와 동일한 결과를 산출합니다.
바크샬리 근사법의 작동 원리
숫자 s의 제곱근을 구한다고 가정해 보겠습니다. 근삿값을 계산하기 위해 필요한 단계는 다음과 같습니다.
- 가장 가까운 완전제곱수 찾기: s 이하에서 가장 가까운 완전제곱수 n²을 구합니다.
- 차이 계산: 주어진 수와 완전제곱수의 차이를 구합니다. 즉, d = s − n²
- P 값 계산: P = d / (2n)
- A 값 계산: A = n + P
- 최종 근삿값: s의 제곱근 근삿값은 (A − P² / 2A)가 됩니다.
예제 코드
#include <iostream>
using namespace std;
int main(){
float s = 12.3412;
int perfectSqaure = 0;
int n = 0;
for (int i = static_cast<int>(s); i > 0; i--) {
for (int j = 1; j<i; j++){
if (j*j == i){
perfectSqaure = i;
n = j;
break;
}
}
if (perfectSqaure > 0)
break;
}
float d = s - perfectSqaure;
float P = d/(2.0*n);
float A = n+P;
float rootOfs = A-((P*P)/(2.0*A));
cout<<"The square root of "<<s<<" = "<<rootOfs;
return 0;
}
실행 결과
The square root of 12.3412 = 3.51327
위 코드의 실행 결과인 3.51327은 실제 제곱근 값인 3.51300441과 매우 근접합니다. 이처럼 바크샬리 근사법은 주어진 수의 제곱근 근삿값을 구하는 데 상당히 정확한 방법이며, 몇 자릿수까지 올바른 값을 보장하므로 부동소수점 값의 제곱근을 계산할 때 유용하게 활용할 수 있습니다.