Размещения и сочетания: биномиальный коэффициент

Учимся выбирать часть объектов: с учётом порядка (размещения) и без (сочетания).

Сочетание из $n$ по $k$ — это выбор $k$ объектов из $n$ без учёта порядка; их число обозначают $\binom{n}{k}$.

Перестановки упорядочивали все объекты. Но чаще нужно выбрать лишь часть: $k$ из $n$. Тут важно, считаем ли мы порядок. Если да — это размещения, если нет — сочетания. Различие определяет, какую формулу применять, и ошибка здесь — источник большинства неправильных ответов в задачах на вероятность. Простой способ не запутаться — придумать «тест на порядок»: поменяйте местами два выбранных объекта и спросите, изменился ли результат. Пьедестал почёта (золото-серебро-бронза) — порядок важен, перестановка призёров даёт другой расклад, это размещения. Букет из трёх цветов — порядок не важен, роза-тюльпан-ромашка и ромашка-роза-тюльпан это один и тот же букет, это сочетания. PIN-код — размещения, рука в покере — сочетания, состав сборной — сочетания, а распределение ролей в этой сборной — уже размещения. Привыкнув задавать себе этот вопрос, вы перестанете путать две формулы.

Размещения: порядок важен

Размещение — это выбор $k$ объектов из $n$ с учётом порядка. Первое место — $n$ вариантов, второе — $n-1$, и так $k$ шагов:

$$A_n^k=\frac{n!}{(n-k)!}=n(n-1)\cdots(n-k+1).$$

Например, сколько трёхбуквенных «слов» из различных букв можно составить из 5 разных букв? Это $A_5^3=5\cdot 4\cdot 3=60$.

Сочетания: порядок не важен

Если порядок не важен, каждое сочетание мы посчитали $k!$ раз (по числу его внутренних перестановок). Поэтому делим:

$$\binom{n}{k}=\frac{n!}{k!\,(n-k)!}.$$

Это и есть биномиальный коэффициент. Проверим его перебором: itertools.combinations выдаёт все сочетания, а math.comb считает $\binom{n}{k}$ напрямую.

import math, itertools

for n, k in [(5, 2), (6, 3), (10, 4), (12, 5)]:
    items = range(n)
    brute = sum(1 for _ in itertools.combinations(items, k))
    print(f"C({n},{k}): перебор={brute:>4}, формула={math.comb(n, k):>4}")

Вывод:

C(5,2): перебор=  10, формула=  10
C(6,3): перебор=  20, формула=  20
C(10,4): перебор= 210, формула= 210
C(12,5): перебор= 792, формула= 792

Симметрия и треугольник Паскаля

Биномиальные коэффициенты обладают красивой симметрией:

$$\binom{n}{k}=\binom{n}{n-k}.$$

Выбрать $k$ объектов «в команду» — то же самое, что выбрать $n-k$ «не в команду». А соседние коэффициенты связаны правилом Паскаля $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$, которое порождает знаменитый треугольник.

Применение к вероятности

Сочетания нужны, чтобы считать вероятности «выбора кучкой». Какова вероятность вытащить 2 туза из 4, выбрав наугад 2 карты из 4 тузов и 4 королей (8 карт)? Благоприятных исходов $\binom{4}{2}=6$, всех — $\binom{8}{2}=28$, значит $P=6/28\approx 0{,}2143$. Проверим симуляцией.

import random, math
random.seed(3)

deck = ["A", "A", "A", "A", "K", "K", "K", "K"]
n = 500000
two_aces = 0
for _ in range(n):
    hand = random.sample(deck, 2)
    if hand.count("A") == 2:
        two_aces += 1
print("Симуляция:", round(two_aces / n, 4))
print("Теория:   ", round(math.comb(4,2)/math.comb(8,2), 4))

Вывод:

Симуляция: 0.2147
Теория:    0.2143

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

Функция random.sample выбирает $k$ элементов без повторов, причём все $\binom{n}{k}$ подмножеств равновероятны — поэтому доля «удачных» рук стремится к отношению сочетаний. А math.comb вычисляет биномиальный коэффициент эффективно, без построения огромного факториала целиком, сокращая дробь по ходу — иначе для больших $n$ числа не поместились бы в память даже у Python с его длинной арифметикой.

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

Главная путаница — между размещениями и сочетаниями. Спросите себя: «важен ли порядок?» Пароли и пьедесталы — размещения; команды, букеты, руки карт — сочетания. Вторая ошибка — делить на $k!$ дважды или забыть поделить вовсе. Третья — применять эти формулы при выборе с возвратом (когда объект можно взять повторно): там работают другие, степенные формулы.

Итог

  • Размещения учитывают порядок: $A_n^k=\dfrac{n!}{(n-k)!}$.
  • Сочетания порядок игнорируют: $\binom{n}{k}=\dfrac{n!}{k!(n-k)!}$.
  • Симметрия $\binom{n}{k}=\binom{n}{n-k}$ и правило Паскаля упрощают подсчёты.
  • В вероятности сочетания дают число благоприятных исходов при выборе «кучкой».
Проверьте себя
1. Чем сочетания отличаются от размещений?
AСочетания учитывают порядок, размещения нет
BРазмещения учитывают порядок, сочетания нет
CОни всегда равны
DСочетания только для карт
2. Чему равно C(6, 3)?
A18
B20
C120
D720
3. Какому свойству отвечает равенство C(n,k) = C(n, n−k)?
AПравилу умножения
BСимметрии биномиального коэффициента
CЗакону больших чисел
DФормуле Байеса