Euclidean algorithm(유클리드 호제법)
EX) 48과 18의 최대공약수를 구하는 과정
유클리드 호제법은 그 효율성 때문에 컴퓨터 알고리즘, 특히 암호학 분야에서 널리 사용된다. 이 알고리즘은 두 수의 크기에 상관없이 매우 빠르게 최대공약수를 찾을 수 있다.
두 수가 있을 때 두 수의 곱을 그들의 최대공약수(Greatest Common Divisor, GCD)로 나눈 값은 그 두 수의 최소공배수(Least Common Multiple, LCM)가 된다.
최대공약수(Greatest Common Divisor, GCD), 최소공배수(Least Common Multiple, LCM), 두 수 a, b는 다음과 같은 관계를 가진다.
이 수학적 성질은 두 수의 곱이 그들의 최대공약수와 최소공배수를 포함하는 공통 배수라는 점에 기반한다. 최대공약수는 두 수가 공유하는 가장 큰 약수를 의미하며, 최소공배수는 두 수가 공유하는 가장 작은 배수를 의미한다. 따라서, 두 수의 곱은 최대공약수의 배수이자 최소공배수의 배수이므로, 이 두 수의 곱을 최대공약수로 나누면 최소공배수를 얻을 수 있다.
이 관계는 두 수 또는 그 이상의 수에 대한 최소공배수를 구할 때 유용하게 사용된다. 예를 들어, 두 수의 최대공약수를 유클리드 호제법으로 빠르게 계산한 후, 이를 이용해 최소공배수를 구할 수 있다. 이 방법은 특히 컴퓨터 프로그래밍에서 두 수의 최소공배수를 효율적으로 계산할 때 자주 사용된다.
a, b = origin_a , origin_b
while b != 0:
a, b = b, a % b
gcd = a # a가 최종적으로 gcd가 된다.
lcm = origin_a * origin_b // gcd # 최소 공배수는 최대 공약수 // 두 수의 곱
소수(Prime Number)
def is_prime(n):
"""정석적인 소수 판별"""
if n <= 1:
return False
for i in range(2, n): # 2부터 n-1까지 모든 수로 나누어보기
if n % i == 0: # 나누어 떨어지면 소수가 아님
return False
return True # 나누어 떨어지지 않으면 소수
def is_prime(n):
"""효율적인 소수 판별"""
if n <= 1:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
에라토스테네스의 체(Sieve of Eratosthenes)
def sieve_of_eratosthenes(limit):
prime = [True for _ in range(limit + 1)]
p = 2
while (p * p <= limit):
if (prime[p] == True):
for i in range(p * p, limit + 1, p):
prime[i] = False
p += 1
primes = []
for p in range(2, limit + 1):
if prime[p]:
primes.append(p)
return primes
def sieve_of_eratosthenes_with_set(limit):
# 2부터 limit까지 모든 숫자를 포함하는 집합 생성
numbers = set(range(2, limit + 1))
p = 2
while p * p <= limit:
# 현재 수 p의 배수들을 집합에서 제거
if p in numbers:
numbers -= set(range(p*2, limit + 1, p))
p += 1
return sorted(numbers) # 소수 집합을 정렬하여 반환
# 예시: 30까지의 소수를 찾기
print(sieve_of_eratosthenes_with_set(30))
git branch -M main 입력하면 된다.git config --global init.defaultBranch main