문제 : Math.sqrt 없이 제곱근 구하기
루트4 = 2 처럼 한번에 구할 수 있는 수도 있지만
루트2 = 1.414213... 이 무리수인 것 처럼 근사값을 구하는 방식도 존재합니다.
그래서 이러한 경우를 위해 바빌로니아 법을 사용합니다.
우선 바빌로니아 법이 뭔지를 알아봅시다.
* 바빌로니아 법
임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법입니다.
아래의 과정에 따라 양의 실수 a에 대하여 다음 과정을 따라 제곱근a의 근삿값을 구할 수 있습니다.
- 포인트는 다음과 같습니다.
1) x는 임의의 양의 실수
2) x는 항상 루트a보다 크므로 하한이 있는데 계속 감소하여 수렴
3) n이 높아질수록 정밀도가 올라감
위의 수식을 코드로 작성하기전에 적어보면
X2 = Xn+1 , X1 = Xn 으로 가정하고,
X2 = 1/2 * (X1 + a/X1) = X1 * X1 + a / 2 * X1
그러면 위의 수식을 이용해 자바코드로 알고리즘을 풀어보도록 하겠습니다.
public class Babylonian {
private double x,m;
private double result;
private int count;
private double guess;
// 근사값 구하기
public double computeRoot(double a) {
x = a;
m = 0;
while (m <= x) {
// 제곱했을 때 딱 떨어진다면 바로 리턴
// 제곱했을 때 수가 더 커진다면 제곱한 수의 -1을 리턴
result = Math.floor((m+x) / 2);
if (result * result > x) {
x = result - 1;
}
else {
m = x + 1;
}
}
return x;
}
// 바빌로니아 공식
public double BL(double num) {
guess = computeRoot(num);
if((num * num) == x) return num;
while (guess * guess < num ) {
guess += 0.01;
}
return guess;
}
public static void main(String[] args) {
int num = 6;
double b = BL(num);
String res = String.format("%.2f",b);
System.out.println(res);
}
}
'알고리즘' 카테고리의 다른 글
문자열에서 숫자 추출 알고리즘 (0) | 2022.08.01 |
---|---|
동전 교환 알고리즘 (0) | 2022.07.30 |
Binary Search Algorithm (0) | 2022.07.28 |
Brute Force Algorithm과 시뮬레이션 (0) | 2022.07.28 |
Greedy Algorithm (0) | 2022.07.28 |