CS/Algorithm
[알고리즘] 소수 판별 알고리즘(파이썬)
연수구 주정뱅이
2021. 8. 16. 18:09
소수 판별 알고리즘에 대해서 정리할 필요성을 느껴 정리해본다.
소수(Prime Number)란 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로는 나누어떨어지지 않는 자연수이다.
가장 기본적인 소수 판별 함수
# 1. 가장 기본적인 소수 판별 함수
def is_prime_number(x):
# 2부터 (x - 1)까지의 모든 수를 확인하며
for i in range(2, x):
# x가 해당 수로 나누어떨어진다면 소수가 아니다.
if x % i == 0:
return False
# 나누어지지 않고 반복문이 끝나면 소수이다.
return True
print(is_prime_number(4)) # 4는 소수가 아님
print(is_prime_number(7)) # 7은 소수임
2부터 x -1 사이에서 x의 약수가 존재하는지 파악한다.
약수가 존재할 경우 False를 return한다. -> 소수가 아님.
약수가 존재하지 않을 경우 반복문이 끝난다. -> 소수임.
x 까지 모든 수를 파악하므로 시간 복잡도는 O(x)이다.
약수의 성질
16의 모든 약수를 파악하면, 4를 기준으로 약수는 대칭을 이룬다.
4는 16의 제곱근이므로, 판별할 수의 제곱근까지 비교하고 그때까지 소수가 아닐 경우 해당하는 수는 소수인 것을 알 수 있다.
개선된 소수 판별 함수
# 2. 개선된 소수 판별 함수
import math
def is_prime_number(x):
# 2부터 x의 제곱근까지의 모든 수를 확인하며
for i in range(2, int(math.sqrt(x)) + 1):
# x가 해당 수로 나누어떨어진다면 소수가 아니다.
if x % i == 0:
return False
# 나누어지지 않고 반복문이 끝나면 소수이다.
return True
print(is_prime_number(4)) # 4는 소수가 아님
print(is_prime_number(7)) # 7은 소수임
2부터 x의 제곱근까지 반복하므로 시간복잡도는 O(√x)이다.
Reference: 소수 판별 알고리즘