[수학] 소수 구하기

2023. 9. 23. 23:31·Computer Science/Algorithms

소수 판별 알고리즘

 

1. 1과 자기 자신을 제외한 나머지 수 중에서 약수가 있는  -> 시간 복잡도 O(n) 

1을 제외한 2부터 n-1까지 탐색하면서 i로 나누어 떨어지는 수가 있는지 확인

static boolean isPrime(int N) {
    if (N < 2) return false;
    for (int i=2; i<=N-1; i++) {
    	if (N/i == 0) return false;
    }
    return true;
}

 

 

2. 제곱근을 이용한 방식 -> 시간 복잡도 : O(루트 n)

만약 N이 12라 할때, 12의 제곱근은 약 3.46이다. 12의 약수는 1, 2, 3, 4, 6, 12 이다.
여기서 1과 12를 제외했을 때 이는 2 * 6, 3 * 4, 4 * 3, 6 * 2의 결과이다.

따라서 N의 제곱근까지 나누어 떨어지는지 여부를 조사하면 더 빠르게 소수판별을 할 수 있다.

static boolean prime(int n) {
        if(n < 2) return false;

        for(int i = 2; i * i <= n; i++) {
            System.out.print(i + " ");
            if(n % i == 0) return false;
        }
        return true;
    }

 

 

3. 에라토스테네스의 체 => 시간 복잡도 : O(n log(logn))

1. 소수가 아닌 1을 지운다.

 

2. 1을 더하여 2(소수)를 남겨두고 2의 배수를 모두 지운다.

 

3. 1을 증가시켜서 3(소수)을 남겨두고(지워지지 않음), 3의 배수를 모두 지운다.

 

4. 1을 증가시켜서 4는 2의 배수로 인해 모두 지워졌으므로 넘어간다. (=소수가 아니다)

 

즉, 2부터 N-1까지 1씩 증가시키면서 선택된 수(=소수)는 남겨두고, 선택된 수의 배수를 모두 지우는 것(=약수가 존재하므로 소수가 아니다)을 반복한다.

 

5. 더 이상 지울 수가 없다면 종료, 남겨진 수들은 모두 소수이다.

 

위키피디아

 

package algorithms.Math.PrimeNumber;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        boolean[] check = new boolean[m+1];
        check[0] = check[1] = true;
        for(int i=2; i*i <= m; i++) {
            if(check[i]) {
                continue;
            }
            for(int j=i+i; j <= m; j+=i) { // 해당하는 수는 소수. 소수의 배수부터 지워준다.
                check[j] = true;
            }
        }
        for(int i = n; i <= m; i++) {
            if(!check[i]) System.out.println(i);
        }
    }
}

 

 

'Computer Science/Algorithms' 카테고리의 다른 글
  • 그래프 표현 방법 간단한 정리
  • Monotonic Stack
  • [수학] - 최소공배수, 최대공약수 구하기
  • [트리] 트리의 리프노드 개수 구하기
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker image
    Bucket
    알고리즘
    docker
    python
    AWS
    구간합
    도커
    인덱스 시그니처
    segment tree
    온라인 쿼리
    삼성기출
    오프라인 쿼리
    TypeScript
    점 업데이트
    티스토리챌린지
    백준
    S3
    누적합
    오블완
    인덱서블 타입
    세그먼트 트리
    컨테이너
    interface
    구간 업데이트
    인터페이스
    PrefixSum
    타입스크립트
    imos법
    파이썬
    CORS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[수학] 소수 구하기
상단으로

티스토리툴바