[Algorithm] 에라토스테네스의 체

MINSANG YU·2021년 10월 6일
0

알고리즘

목록 보기
1/1
post-thumbnail

에라토스테네스의 체란?

https://namu.wiki/w/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98%20%EC%B2%B4

에라토스테네스의 체는 소수를 찾아야 하는 상황에 쉽게 사용할 수 있는 알고리즘이다. 2부터 시작해 해당 배수들을 배열에서 모두 제외시키는 원리인데, (ex.2의배수 4,6,8,10... 제외, 3의배수 3,6,9,12,15... 제외.. ) 이 연산이 끝났을 때 배열에는 자연스럽게 소수만 남게 된다. 코드로 나타내면 다음과 같다.

static boolean[] visited = new boolean[MAX];
static int[] prime = new int[MAX];

static void prime_numbers() {
		for(int i=2; i*i<visited.length; i++) {	// 제곱근까지 검사
			if(!visited[i]) {	// 기본값이 false이므로 false라면
				for(int j=i*i; j<visited.length; j+=i) { // 해당숫자의 배수들을 모드 true로 처리
					visited[j] = true;
				}
			}
		}
		
		for(int i=2; i<MAX; i++) {
			if(!visited[i])
				prime[size++] = i;		// 위에서 완성된 visited배열을 활용해 소수를 순차적으로 담는 prime 배열 생성
		}
	} 

왜 제곱근 까지만 검사해도 하는가?

쉽게 이야기하면 자연수의 약수는 대칭을 띄고 있기 때문이다. 예를 들어 64의 약수는 1,2,4,8,16,32,64인데, 가운데 8을 기준으로 양 옆으로 대칭되는 숫자들 끼리 곱하면 64를 만들 수 있다. ( 1 x 64, 2 x 32, 4 x 16 )

여기서 코드와 연관지어 생각 해보면 다음과 같다.

1. 2의 배수를 제거하는 과정에서 2 x 32는 제거가 된다.

2. 2 x 32는 32 x 2로 나타낼 수도 있다.

3. 32의 배수를 제거하는 과정이 있다면 32x2를 제거하는 상황이 발생하는데, 이는 중복된 연산이다.

4. 따라서 원하는 범위의 제곱근까지만 계산하면 불필요한 연산을 줄일 수 있다.

주의사항?

에라토스테네스의 체는 시간복잡도가 O(nlog(logn)) 일반적으로 가장 빠른 소수 판별법이지만,
n의 크기가 매우 크게 주어지는 특정 문제에서는 이중 for문을 활용한 단순한 방식이 유리한 경우가 있다.

profile
쉿! 공부중

0개의 댓글

관련 채용 정보