Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 두 숫자가 친화수(우호수)인지 확인하는 방법

친화수(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

코드 동작 원리

  1. 같은 수 제외: 두 수가 동일하면 친화수가 될 수 없으므로 False를 반환합니다.
  2. 진약수의 합 계산: 1부터 해당 수의 절반(x//2)까지 반복하면서 나누어 떨어지는 값을 모두 더합니다. 약수는 항상 절반 이하에 존재하므로 효율적으로 탐색할 수 있습니다.
  3. 상호 검증: x의 진약수 합이 y와 같고, y의 진약수 합이 x와 같을 때만 True를 반환합니다.

15와 20은 위 조건을 만족하지 않아 False가 출력되고, 220과 284는 조건을 만족하므로 True가 출력됩니다. 이 방식을 응용하면 특정 범위 내의 모든 친화수 쌍을 찾는 프로그램도 손쉽게 작성할 수 있습니다.