CS/Algorithm

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체(Sieve Of Eratosthenes)

deo2kim 2020. 10. 3. 20:43
λ°˜μ‘ν˜•

πŸ“” μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄(Sieve Of Eratosthenes) λž€

  • λŒ€ν‘œμ μΈ μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜ ( μ†Œμˆ˜: Prime Number )
  • ν•œκΊΌλ²ˆμ— λ§Žμ€ 숫자의 μ†Œμˆ˜λ₯Ό νŒλ³„ν•  λ•Œ μ‚¬μš©
  • 숫자 ν•œκ°œμ˜ μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” κΈ°λ³Έ μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(N)
  • ν•˜μ§€λ§Œ μˆ˜ν•™μ μœΌλ‘œ μ ‘κ·Όν•΄μ„œ μ‹œκ°„λ³΅μž‘λ„λ₯Ό O(N^(1/2)) κΉŒμ§€ 쀄일 수 μžˆλ‹€.
  • μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n log log n)

πŸ“” μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄(Sieve Of Eratosthenes) κ΅¬ν˜„

  • μžμ—°μˆ˜ 50κΉŒμ§€μ˜ 숫자 μ€‘μ—μ„œ μ†Œμˆ˜λ₯Ό κ΅¬ν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž.
  • κΈ°λ³Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  경우 O(N*N^(1/2)) 의 μ‹œκ°„λ³΅μž‘λ„κ°€ 생긴닀.
  • μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν•΄λ³΄μž.
  • λ¨Όμ € 51개의 값이 1(True)인 리슀트λ₯Ό λ§Œλ“ λ‹€.
  • for문으둜 2λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 자기 μžμ‹ μ„ μ œμ™Έν•˜κ³  μžμ‹ μ˜ 배수의 μˆ«μžλ“€μ€ 0(False)둜 λ§Œλ“ λ‹€.
  • 이미 μžμ‹ μ΄ 0 이라면 κ±΄λ„ˆλ›΄λ‹€.
  • λ¦¬μŠ€νŠΈμ—μ„œ 값이 1인 인덱슀λ₯Ό μΆ”μΆœν•˜λ©΄ κ·Έ μˆ«μžλ“€μ΄ μ†Œμˆ˜μ΄λ‹€.
import math
import time


# κΈ°λ³Έ μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜ O(N)
def prime(x):
    for i in range(2, x):
        if x % i == 0:
            return False

    return True


# μ œκ³±κ·ΌκΉŒμ§€ O(N^(1/2))
def prime2(x):
    for i in range(2, int(math.sqrt(x))):
        if x % i == 0:
            return False

    return True


# μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 O(n log log n)
def eratos(x):
    prime_number = [1] * (x + 1)
    for i in range(2, x):
        if prime_number[i] == 0:
            continue

        for j in range(i * 2, x + 1, i):
            prime_number[j] = 0


# 1λΆ€ν„° 10000κΉŒμ§€
n = 10000
print('κΈ°λ³Έ')
start = time.time()
for k in range(2, n + 1):
    prime(k)
end = time.time()
print(f'μ‹œκ°„: {end - start}')

print('제곱근')
start = time.time()
for k in range(2, n + 1):
    prime2(k)
end = time.time()
print(f'μ‹œκ°„: {end - start}')

print('μ—λΌν† μŠ€')
start = time.time()
eratos(n)
end = time.time()
print(f'μ‹œκ°„: {end - start}')

'''
κΈ°λ³Έ
μ‹œκ°„: 0.3489978313446045
제곱근
μ‹œκ°„: 0.012001991271972656
μ—λΌν† μŠ€
μ‹œκ°„: 0.0019986629486083984
'''
λ°˜μ‘ν˜•