Дружественные числа

Два числа, каждое из которых «строит» другое из своих делителей, — математический символ дружбы.

Дружественные числа — пара чисел, в которой сумма собственных делителей каждого равна другому числу.

Если совершенное число дружит само с собой, то дружественная пара — это два разных числа, связанных тем же правилом. Самая знаменитая пара — 220 и 284 — была известна ещё пифагорейцам и считалась символом дружбы и любви; в Средние века её даже гравировали на талисманах.

Пара 220 и 284

Обозначим через $s(n)$ сумму собственных делителей $n$. Пара $(a, b)$ дружественна, если

$$s(a) = b \quad \text{и} \quad s(b) = a.$$

Проверим на классике. Делители 220: $1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110$ — их сумма равна 284. Делители 284: $1, 2, 4, 71, 142$ — их сумма равна 220. Числа «ссылаются» друг на друга. Заметьте: совершенное число — частный случай, когда $a = b$.

Ищем дружественные пары

def divisor_sum(n):
    total = 1
    d = 2
    while d * d <= n:
        if n % d == 0:
            total += d
            if d != n // d:
                total += n // d
        d += 1
    return total

pairs = []
for a in range(2, 1500):
    b = divisor_sum(a)
    if b > a and divisor_sum(b) == a:
        pairs.append((a, b))
print("Дружественные пары до 1500:", pairs)

# Подробно про 220 и 284
print("s(220) =", divisor_sum(220))
print("s(284) =", divisor_sum(284))

Вывод:

Дружественные пары до 1500: [(220, 284), (1184, 1210)]
s(220) = 284
s(284) = 220

Как работает под капотом

В цикле мы для каждого $a$ считаем $b = s(a)$ и проверяем, вернёт ли $s(b)$ обратно $a$. Условие $b \gt a$ нужно, чтобы каждую пару не печатать дважды и заодно отсечь совершенные числа (там $b = a$). Пара $(1184, 1210)$ была найдена лишь в 1866 году шестнадцатилетним итальянцем Никколо Паганини (тёзкой скрипача) — её «проглядели» великие математики, потому что искали среди больших чисел. Существуют и более длинные циклы: «общительные» числа, где $s$ возвращает к началу через несколько шагов.

Частые ошибки

Не считайте пару $(n, n)$ дружественной — это уже совершенное число, для дружественных нужны различные числа. Не забывайте проверять обратное условие $s(b) = a$: одного равенства $s(a) = b$ мало. И не путайте: $s(n)$ — сумма собственных делителей, само $n$ не входит.

Итог

  • Дружественная пара: $s(a) = b$ и $s(b) = a$ при $a \neq b$.
  • Классическая пара — 220 и 284.
  • Совершенное число — вырожденный случай $a = b$.
  • Бывают и длинные «общительные» циклы.
Проверьте себя
1. Какая пара чисел является дружественной?
A$(6, 28)$
B$(220, 284)$
C$(100, 200)$
D$(12, 24)$
2. Чем дружественные числа отличаются от совершенных?
AНичем
BУ совершенного $s(n)=n$, а у дружественной пары $s(a)=b$, $s(b)=a$ при $a \neq b$
CДружественные всегда чётные
DСовершенные больше
3. Почему в коде ставят условие $b \gt a$?
AЧтобы ускорить перебор вдвое
BЧтобы не печатать каждую пару дважды и отсечь совершенные числа
CИначе код выдаст ошибку
DЧтобы найти только большие числа