친화수(Amicable Numbers)란?
친화수는 서로 다른 두 수가 특별한 관계를 이루는 숫자 쌍입니다. 각 수의 진약수(proper divisor)의 합이 상대방의 수와 정확히 일치할 때, 이 두 수를 친화수라고 부릅니다. 여기서 진약수란 그 수 자신을 제외한 양의 약수를 의미합니다. 예를 들어, 6의 진약수는 1, 2, 3입니다.
대표적인 친화수의 예로 220과 284가 있습니다.
- 220의 진약수: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 → 합계 284
- 284의 진약수: 1, 2, 4, 71, 142 → 합계 220
파이썬으로 친화수 판별하기
파이썬에서는 각 수의 진약수의 합을 구한 뒤, 그 합이 서로 상대방의 값과 일치하는지 비교하여 친화수 여부를 확인할 수 있습니다. 아래 코드를 살펴보겠습니다.
def are_amicable(x, y):
if x == y:
return False
# 각 수의 진약수의 합 구하기
sum_x = sum(e for e in range(1, x//2+1) if x % e == 0)
sum_y = sum(e for e in range(1, y//2+1) if y % e == 0)
# 조건을 만족하면 True 반환
return sum_x == y and sum_y == x
print(are_amicable(15, 20))
print(are_amicable(220, 284))
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
False
True
코드 동작 원리
- 같은 수 제외: 두 수가 동일하면 친화수가 될 수 없으므로 False를 반환합니다.
- 진약수의 합 계산: 1부터 해당 수의 절반(x//2)까지 반복하면서 나누어 떨어지는 값을 모두 더합니다. 약수는 항상 절반 이하에 존재하므로 효율적으로 탐색할 수 있습니다.
- 상호 검증: x의 진약수 합이 y와 같고, y의 진약수 합이 x와 같을 때만 True를 반환합니다.
15와 20은 위 조건을 만족하지 않아 False가 출력되고, 220과 284는 조건을 만족하므로 True가 출력됩니다. 이 방식을 응용하면 특정 범위 내의 모든 친화수 쌍을 찾는 프로그램도 손쉽게 작성할 수 있습니다.