Development/Node

javascript 소수 확인, 제곱근 범위 나누기법으로 가장 효율적으로 소수 판별

Jun Mr 2021. 10. 12. 23:30
728x90
반응형

소수란

수학에서

소수라는 것은

1과 자기 자신 이외의

자연수로는 나눌 수 없는 자연수를 의미합니다.

(자연수는 1부터 시작하는 숫자입니다.)

즉 약수를 2개만 가지는 수입니다.

때문에, 1은 소수가 될 수 없죠.

2, 3, 5, 7, 11

의 숫자들이 그에 해당됩니다.

2 = 1과 2로만 나눠짐

17 = 1과 17로만 나눠짐

소수 체크

javascript를 활용하여

소수를 판별하는

방법을 확인해 봅시다.

1. 가장 빠른 시간 복잡도를 가지는

제곱근 범위 나누기 법을 활용한

소수 체크 판별식

 

const isPrime = (number) => {
  
  if(number < 2) return false; // 자연수가 아닌 경우

  for(let i = 2; i <= Math.floor(Math.sqrt(number)); i++){
    if(number% i === 0){
      return false; 
    }
  }

  return true; 
}

* Math.floor() 함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.

* Math.sqrt() 함수는 숫자의 제곱근을 반환합니다.

한 번, 해석을 해볼까요~?

num % i에서 %는 나머지 값을 구할 수 있는

나머지(%) 연산자입니다.

12를 5로 나누면

몫이 2이고, 나머지가 2이죠.

즉, 12 % 5 = 2가 됩니다.

나머지 연산자를 활용하여,

1과 자기 자신을 제외한

값으로 나누었을 때

나머지가 0인 값이

1개라도 나올 경우,

소수가 아니다

라는 공식을 작성하면 됩니다.

그럼 아래와 같이 표현할 수 있겠네요.

 

 

const isPrime = (number) => {
  
  if(number < 2) return false; // 자연수가 아닌 경우

  for(let i = 2; i < number; i++){ // 1을 제외하고 2부터 시작하여 자기 자신보다 작은 수
    if(number% i === 0){ // 하나라도 나누어 떨어지면 소수가 아님.
      return false; 
    }
  }
  return true; 
}

그런데,

제일 위 공식에서는

i <= Math.floor(Math.sqrt(number));

갑자기 제곱근이 나왔습니다.

제곱근(square root)이란,

제곱하여 그 수가 되는 수를 의미합니다!!

제곱근(sqrt) 범위 나누기법으로,

제곱근을 기준으로

그 곱은 대칭적으로 곱이 일어나므로

제곱근 이하의 작은 값까지만 검사를 하면

나머지는 검사를 할 필요가 없다는 방법을 의미합니다.

20이라는 숫자로 예를 들어보겠습니다.

20으로 나누어떨어지는 약수는

1, 2, 4, 5, 10, 20

입니다.

1과 자기 자신을 제외한

2, 4, 5, 10

을 보면,

2는 10과 대칭

4는 5와 대칭됩니다.

20 / 2 = 10;

20 / 10 = 2;

다시 말해

2, 4만 확인하면

굳이 5, 10을 확인하지 않아도

된다는 의미가 됩니다.

20의 제곱근

4.47213595499958....

의 가장 큰 정수를 구하는

Math.floor 함수를 사용하여

2부터 4까지 만 반복하는

반복문을 작성하면 되겠네요.

for(let i = 2; i <= Math.floor(Math.sqrt(number)); i++)

2부터 19까지 18번의 반복문을 돌릴 필요 없이,

2부터 4까지 3번만 확인하면

소수를 판별할 수 있기 때문에

굉장히 효율적이게 됩니다.

 

const isPrime = (number) => {
  
  if(number < 2) return false; // 자연수가 아닌 경우

  for(let i = 2; i <= Math.floor(Math.sqrt(number)); i++){
    if(number% i === 0){
      return false; 
    }
  }

  return true; 
}
반응형