Algorithm/Basic

[Python] 에라토스테네스의 체 (Sieve of Eratosthenes)

내영잉 2021. 4. 4. 22:00

1. 정의

- 2부터 시작하여, 소수인 경우 값을 출력하고, 해당 소수의 모든 배수들을 소거해 나가는 방법

 

2. 방법

- 2 -> 소수, N보다 작은 모든 2의 배수 제거

- 3 -> 소수, N보다 작은 모든 3의 배수 제거

- ....

- k -> 소수, N보다 작은 모든 k의 배수 제거

예를들어, 20까지의 소수 구하기를 한다면, 2의 배수부터 20까지의 배수를 지워주는 방식이다.

 

import time

def isPrime(v):
    i = 2

    while i*i < v:
        if v%i == 0:
            return False
        i += 1
    return True

try :
    k = input('Enter k: ')
    start = time.time()

    k = int(k)

    if k >= 2:
        primeList = list(range(k+1))
        primeList[1] = 0 # 1은 소수가 아니므로

        i = 2
        while i * 2 <= k:
            if primeList[i] != 0 and isPrime(i):
                for j in range(i*2, k+1, i):
                     primeList[j] = 0
            i += 1

        for prime in primeList: # 0은 소수가 아닌 숫자 이므로 0보다 크면 출력
            if prime > 0: print(prime, ' ')
    end = time.time() - start
    print('실행 시간: ', end)
except: 
    print('자연수가 아닙니다.')

 


 

4. 결론

- 소수를 구할 땐 에라토스테네스의 체를 이용하자