Биномиальные коэффициенты
Биномиальные коэффициенты — коэффициенты в разложении (1 + x) n по степеням x (т. н. бином Ньютона):
+
Иначе говоря, (1 + x) n является производящей функцией для биномиальных коэффициентов.
Значение биномиального коэффициента
;
;
,
где n! и k! — факториалы чисел n и k .
Биномиальный коэффициент
, которое определено только для неотрицательных целых чисел n , k .
Биномиальные коэффициенты часто возникают в комбинаторных задачах и теории вероятностей.
Обобщением биномиальных коэффициентов являются мультиномиальные коэффициенты.
Содержание
Треугольник Паскаля

в двоичной записи числа k единицы не стоят в тех разрядах, где в числе n стоят нули,
в p -ичной записи числа k все разряды не превосходят соотв. разрядов числа n ,
n = mpk − 1 , где натуральное m < p ,
n = pk , где натуральное m < p ,
, где числа
— разряды p -ичной записи числа n ; а число m = [logpn] + 1Тождества
в виде замкнутой суммы из s слагаемых:
Асимптотика и оценки
. Этот алгоритм особенно эффективен, если нужно получить все значения
также использует биномиальные коэффициенты. Для их расчета можно использовать формулу, выражающую биномиальный коэффициент через факториалы:
или использовать рекуррентную формулу:
Из бинома Ньютона и рекуррентной формулы ясно, что биномиальные коэффициенты — целые числа. На данном примере хотелось показать, что даже при решении несложной задачи можно наступить на грабли.
Прежде чем перейти к написанию процедур расчета, рассмотрим так называемый треугольник Паскаля.или он же, но немного в другом виде. В левой колонке строки значение n, дальше в строке значения
для k=0..nВ полном соответствии с рекуррентной формулой значения
равны 1 и любое число равно сумме числа, стоящего над ним и числа «над ним+шаг влево». Например, в 7й строке число 21, а в 6й строке числа 15 и 6: 21=15+6. Видно также, что значения в строке симметричны относительно середины строки, т.е.
. Это свойство симметричности бинома Ньютона относительно a и b и оно видно в факториальной формуле.
Ниже для биномиальных коэффициентов
я буду также использовать представление C(n,k) (его проще набирать, да и формулу-картинку не везде можно вставить.Расчет биномиальных коэффициентов через факториальную формулу
поскольку биномиальные коэффициенты неотрицательные, будем использовать в расчетах беззнаковый тип.
Вызовем функцию bci(10,4) — она вернет 210 и это правильное значение коэффициента C(10,4). Значит, задача расчета решена? Да, решена. Но не совсем. Мы не ответили на вопрос: при каких максимальных значениях n,k функция bci будет работать правильно? Прежде чем начать искать ответ, условимся, что используемый нами тип unsigned int 4-х байтный и максимальное значение равно 2 32 -1=4’294’967’295. При каких n,k C(n,k) превысит его? Обратимся к треугольнику Паскаля. Видно, что максимальные значения достигаются в середине строки, т.е. при k=n/2. Если n четно, то имеется одно максимальное значение, а если n нечетно, то их два. Точное значение C(34,17) равно 2333606220, а точное значение C(35,17) равно 4537567650, т.е. уже больше максимального unsigned int.
Напишем тестовую процедуруЗначение в очередной строке должно быть примерно в 2 раза больше, чем в предыдущей. Поэтому последний правильно вычисленный коэффициент (см треугольник выше) — это C(12,6) Хотя unsigned int вмещает 4млрд, правильно вычисляются значения меньше 1000. Вот те раз, почему так? Все дело в нашей процедуре bci, точнее в строке, которая сначала вычисляет большое число в числителе, а потом делит его на большое число в знаменателе. Для вычисления C(13,6) сначала вычисляется 13!, а это число > 6млрд и оно не влезает в unsigned int.
Как оптимизировать расчет
? Очень просто: раскроем 13! и сократим числитель и знаменатель на 7! В результате получится
. Запрограммируем расчет по этой формулеЯвно лучше, ошибка возникла при расчете C(31,15). Причина понятна — все то же переполнение. Сначала умножаем на 31 (оп-па — переполнение, потом делим на 15). А что, если использовать рекурсивную формулу? Там только сложение, переполнения быть не должно.
Что ж, пробуем:Все, что влезло в unsigned int, посчиталось правильно. Вот только строчка с n=34 считалась около минуты. При расчете C(n,n/2) делается два рекурсивных вызова, поэтому время расчета экспоненциально зависит от n. Что же делать — получается либо неточно, либо медленно. Выход — в использовании 64 битных переменных.
Замечание по результатам обсуждений: в конце статьи добавлен раздел, где приведен простой и быстрый вариант «bcr с запоминанием» одного из участников обсуждения.
Использование 64 битных типов для расчета C(n,k)
2.8*10 19 уже не влезает в unsigned long long
Дальнейшее повышение точности и расчет при n>67
Ошибка возникла при n=63, а при n=68 результат уже не влезает в unsigned64. Поэтому можно сказать «до n<=62 функция bcl считает правильно, дальнейшее увеличение точности требует либо int128 либо длинной арифметики». А если очень высокая точность не нужна, но хочется считать биномиальные коэффициенты при n=100. 1000? Снова берем процедуру bci и меняем в ней типы unsigned int на double:
Для экстремалов и «олимпийцев»
В принципе, для практических задач точности функции bcd достаточно, но в олимпиадных задачах часто даются тесты «на грани». Т.е. теоретически может встретится задача, где точности double недостаточно и C(n,k) влезает в unsigned long long еле-еле. Как избежать переполнения для таких крайних случаев? Можно использовать рекурсивный алгоритм. Но если он для n=34 считал минуту, то для n=67 будет считать лет 100. Можно запоминать рассчтанные значения (см Дополнение после публиукации).Также можно использовать рекурсию не для всех n и k, а только для «достаточно больших». Вот процедура расчета, которая считает правильно для n<=67. Иногда и для n>67 при малых k (к примеру, считает C(82,21)=1.83*10 19 ).
В какой-то из олимпиадных задач мне потребовалось вычислять много C(n,k) для n >70, т.е. они заведомо не влезали в unsigned long long. Естественно, пришлось использовать «длинную арифметику» (свою). Для этой задачи я написал «рекурсию с памятью»: вычисленные коэффициенты запоминались в массиве и экспоненциального роста времени расчета не было.
Дополнение после публикации
При обсуждении часто упоминаются варианты с запоминанием рассчитанных значений. У меня есть код с динамическим выделением памяти, но я его не привел. На даный момент вот самый простой и эффективный из комментария chersanya: http://habrahabr.ru/post/274689/#comment_8730359http://habrahabr.ru/post/274689/#comment_8730359
Если в программе надо использовать [почти] все коэффициенты треугольника Паскаля (до какого-то уровня), то приведенный рекурсивный алгоритм с запоминанием — самый быстрый способ. Аналогичный код годится и для unsigned long long и даже для длинной арифметики (хотя там, наверное, лучше динамически вычислять и выделять требуемый объем памяти). Конкретные значения N_MAX могут быть такими:
35 — посчитает все коэффициенты C(n,k), n< 35 для unsigned int (32 бита)
68 — посчитает все коэффициенты C(n,k), n< 68 для unsigned long long (64 бита)
200 — посчитает коэффициенты C(n,k), n< 200 и некоторых k для unsigned long long (64 бита). Например, для С(82,21)=1.83*10 19
K_MAX — это может быть N_MAX/2+1, но не больше 35, поскольку C(68,34) за границей unsigned long long.
Для простоты можно всегда брать K_MAX=35 и не думать «войдет — не войдет» (до тех пор, пока не перейдем к числами с разрядностью >64 бита).Расчет биномиальных коэффициентов на Python
Это дополнение появилось спустя примерно погода после публикации статьи. Автор начал осваивать Python и для тренироки я решаю олимпиадные задачи, сделанные ранее на C++. Для задач связанных в точными/длинными вычислениями приходится либо всячески исхитряться (как при расчетах биномиальных коэфиициентов), дабы избежать раннего переполнения, либо смиряться с потерей точности (перейдя к типу double) либо писать(или искать) длинную арифметику. В Python длинная арифметика уже есть, поэтому тут для вычисления биномиальных коэффициентов достаточно реализовать запоминание. Запоминать их будем в списке (передается в функцию как папаметр).
Вот вывод (без таблички)
270288240945436569515614693625975275496152008446548287007392875106625428705522193898612483924502370165362606085021546104802209750050679917549894219699518475423665484263751733356162464079737887344364574161119497604571044985756287880514600994219426752366915856603136862602484428109296905863799821216320
0.4200884663301988
Меньше полсекуды для такого коэффициента
C(68,34) (напомню — он не влезает в long long) считается за 0.017 сек и равен 28453041475240576740Бином Ньютона
С натуральным n формула Бинома Ньютона принимает вид a + b n = C n 0 · a n + C n 1 · a n — 1 · b + C n 2 · a n — 2 · b 2 + . . . + C n n — 1 · a · b n — 1 + C n n · b n , где имеем, что C n k = ( n ) ! ( k ) ! · ( n — k ) ! = n ( n — 1 ) · ( n — 2 ) · . . . · ( n — ( k — 1 ) ) ( k ) ! — биномиальные коэффициенты, где есть n по k , k = 0 , 1 , 2 , … , n , а » ! » является знаком факториала.
В формуле сокращенного умножения a + b 2 = C 2 0 · a 2 + C 2 1 · a 1 · b + C 2 2 · b 2 = a 2 + 2 a b + b 2
просматривается формула бинома Ньютона, так как при n = 2 является его частным случаем.Первая часть бинома называют разложением ( a + b ) n , а С n k · a n — k · b k — ( k + 1 ) -ым членом разложения, где k = 0 , 1 , 2 , … , n .
Коэффициенты бинома Ньютона, свойства биномиальных коэффициентов, треугольник Паскаля
Представление биномиальных коэффициентов для различных n осуществляется при помощи таблицы, которая имеет название арифметического треугольника Паскаля. Общий вид таблицы:
Показатель степени Биноминальные коэффициенты 0 C 0 0 1 C 1 0 C 1 1 2 C 2 0 C 2 1 C 2 2 3 C 3 0 C 3 1 C 3 2 C 3 3 ⋮ … … … … … … … … … n C n 0 C n 1 … … … … … C n n — 1 C n n При натуральных n такой треугольник Паскаля состоит из значений коэффициентов бинома:
Показатель степени Биноминальные коэффициенты 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 ⋮ … … … … … … … … … … … … … n C n 0 C n 1 … … … … … … … … … C n n — 1 C n n Боковые стороны треугольника имеют значение единиц. Внутри располагаются числа, которые получаются при сложении двух чисел соседних сторон. Значения, которые выделены красным, получают как сумму четверки, а синим – шестерки. Правило применимо для всех внутренних чисел, которые входят в состав треугольника. Свойства коэффициентов объясняются при помощи бинома Ньютона.
Доказательство формулы бинома Ньютона
Имеются равенства, которые справедливы для коэффициентов бинома Ньютона:
- коэффициента располагаются равноудалено от начала и конца, причем равны, что видно по формуле C n p = C n n — p , где р = 0 , 1 , 2 , … , n ;
- C n p = C n p + 1 = C n + 1 p + 1 ;
- биномиальные коэффициенты в сумме дают 2 в степени показателя степени бинома, то есть C n 0 + C n 1 + C n 2 + . . . + C n n = 2 n ;
- при четном расположении биноминальных коэффициентов их сумма равняется сумме биномиальных коэффициентов, расположенных в нечетных местах.
Равенство вида a + b n = C n 0 · a n + C n 1 · a n — 1 · b + C n 2 · a n — 2 · b 2 + . . . + C n n — 1 · a · b n — 1 + C n n · b n считается справедливым. Докажем его существование.
Для этого необходимо применить метод математической индукции.
Для доказательства необходимо выполнить несколько пунктов:
- Проверка справедливости разложения при n = 3 . Имеем, что
a + b 3 = a + b a + b a + b = a 2 + a b + b a + b 2 a + b = = a 2 + 2 a b + b 2 a + b = a 3 + 2 a 2 b + a b 2 + a 2 b + 2 a b + b 3 = = a 3 + 3 a 2 b + 3 a b 2 + b 3 = C 3 0 a 3 + C 3 1 a 2 b + C 3 2 a b 2 + C 3 3 b 3 - Если неравенство верно при n — 1 , тогда выражение вида a + b n — 1 = C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1
- Доказательство равенства a + b n — 1 = C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1 , основываясь на 2 пункте.
a + b n = a + b a + b n — 1 = = ( a + b ) C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1
Необходимо раскрыть скобки, тогда получим a + b n = C n — 1 0 · a n + C n — 1 1 · a n — 1 · b + C n — 1 2 · a n — 2 · b 2 + . . . + C n — 1 n — 2 · a 2 · b n — 2 + + C n — 1 n — 1 · a · b n — 1 + C n — 1 0 · a n — 1 · b + C n — 1 1 · a n — 2 · b 2 + C n — 1 2 · a n — 3 · b 3 + . . . + C n — 1 n — 2 · a · b n — 1 + C n — 1 n — 1 · b n
Производим группировку слагаемых
a + b n = = C n — 1 0 · a n + C n — 1 1 + C n — 1 0 · a n — 1 · b + C n — 1 2 + C n — 1 1 · a n — 2 · b 2 + . . . + + C n — 1 n — 1 + C n — 1 n — 2 · a · b n — 1 + C n — 1 n — 1 · b n
Имеем, что C n — 1 0 = 1 и C n 0 = 1 , тогда C n — 1 0 = C n 0 . Если C n — 1 n — 1 = 1 и C n n = 1 , тогда C n — 1 n — 1 = C n n . При применении свойства сочетаний C n p + C n p + 1 = C n + 1 p + 1 , получаем выражение вида
C n — 1 1 + C n — 1 0 = C n 1 C n — 1 2 + C n — 1 1 = C n 2 ⋮ C n — 1 n — 1 + C n — 1 n — 2 = C n n — 1
Произведем подстановку в полученное равенство. Получим, что
a + b n = = C n — 1 0 · a n + C n — 1 1 + C n — 1 0 · a n — 1 · b + C n — 1 2 + C n — 1 1 · a n — 2 · b 2 + . . . + + C n — 1 n — 1 + C n — 1 n — 2 · a · b n — 1 = C n — 1 n — 1 · b n
После чего можно переходить к биному Ньютона, тогда a + b n = C n 0 · a n + C n 1 · a n — 1 · b + C n 2 · a n — 2 · b 2 + . . . + C n n — 1 · a · b n — 1 + C n n · b n .
Формула бинома доказана.
Бином Ньютона — применение при решении примеров и задач
Для полного понятия использования формулы рассмотрим примеры.
Разложить выражение ( a + b ) 5 , используя формулу бинома Ньютона.
Решение
По треугольнику Паскаля с пятой степенью видно, что биноминальные коэффициенты – это 1 , 5 , 10 , 10 , 5 , 1 . То есть, получаем, что a + b 5 = a 5 + 5 a 4 b + 10 a 3 b 2 + 10 a 2 b 3 + 5 a b 4 + b 5 является искомым разложением.
Ответ: a + b 5 = a 5 + 5 a 4 b + 10 a 3 b 2 + 10 a 2 b 3 + 5 a b 4 + b 5
Найти коэффициенты бинома Ньютона для шестого члена разложения выражения вида a + b 10 .
Решение
По условию имеем, что n = 10 , k = 6 — 1 = 5 . Тогда можно перейти к вычислению биномиального коэффициента:
C n k = C 10 5 = ( 10 ) ! ( 5 ) ! · 10 — 5 ! = ( 10 ) ! ( 5 ) ! · ( 5 ) ! = = 10 · 9 · 8 · 7 · 6 ( 5 ) ! = 10 · 9 · 8 · 7 · 6 1 · 2 · 3 · 4 · 5 = 252
Ответ: C n k = C 10 5 = 252
Ниже приведен пример, где используется бином для доказательства делимости выражения с заданным числом.
Доказать, что значение выражения 5 n + 28 · n — 1 , при n , являющимся натуральным числом, делится на 16 без остатка.
Решение
Необходимо представить выражение в виде 5 n = 4 + 1 n и воспользоваться биномом Ньютона. Тогда получим, что
5 n + 28 · n — 1 = 4 + 1 n + 28 · n — 1 = = C n 0 · 4 n + C n 1 · 4 n — 1 · 1 + . . . + C n n — 2 · 4 2 · 1 n — 2 + C n n — 1 · 4 · 1 n — 1 + C n n · 1 n + 28 · n — 1 = = 4 n + C n 1 · 4 n — 1 + . . . + C n n — 2 · 4 2 + n · 4 + 1 + 28 · n — 1 = = 4 n + C n 1 · 4 n — 1 + . . . + C n n — 2 · 4 2 + 32 · n = = 16 · ( 4 n — 2 + C n 1 · 4 n — 3 + . . . + C n n — 2 + 2 · n )
Ответ: Исходя из полученного выражения, видно, что исходное выражение делится на 16 .
С помощью чего можно легко найти биномиальные коэффициенты
При решении задач комбинаторики часто возникает необходимость в расчете биномиальных коэффициентов. Бином Ньютона, т.е. разложение
также использует биномиальные коэффициенты. Для их расчета можно использовать формулу, выражающую биномиальный коэффициент через факториалы:
или использовать рекуррентную формулу:
Из бинома Ньютона и рекуррентной формулы ясно, что биномиальные коэффициенты — целые числа.



- FFT – операция прямого преобразования Фурье
- BFT – операция обратного преобразования Фурье
\[\sum\limits_ ^=2\cdot 3+2\cdot 4+2\cdot 5\]
\[n!=1\cdot 2\cdot 3\cdot . \cdot n\]
\[n!=1\cdot 2\cdot 3\cdot . \cdot n,\quad n\in \mathbb \]
\[\begin 1 \\ 1\quad 1 \\ 1\quad 2\quad 1 \\ 1\quad 3\quad 3\quad 1 \\ 1\quad 4\quad 6\quad 4\quad 1 \\ \end \]
Показатель степени Биноминальные коэффициенты 0 C 0 0 1 C 1 0 C 1 1 2 C 2 0 C 2 1 C 2 2 3 C 3 0 C 3 1 C 3 2 C 3 3 ⋮ … … … … … … … … … n C n 0 C n 1 … … … … … C n n — 1 C n n Показатель степени Биноминальные коэффициенты 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 ⋮ … … … … … … … … … … … … … n C n 0 C n 1 … … … … … … … … … C n n — 1 C n n - коэффициента располагаются равноудалено от начала и конца, причем равны, что видно по формуле C n p = C n n — p , где р = 0 , 1 , 2 , … , n ;
- C n p = C n p + 1 = C n + 1 p + 1 ;
- биномиальные коэффициенты в сумме дают 2 в степени показателя степени бинома, то есть C n 0 + C n 1 + C n 2 + . . . + C n n = 2 n ;
- при четном расположении биноминальных коэффициентов их сумма равняется сумме биномиальных коэффициентов, расположенных в нечетных местах.
- Проверка справедливости разложения при n = 3 . Имеем, что
a + b 3 = a + b a + b a + b = a 2 + a b + b a + b 2 a + b = = a 2 + 2 a b + b 2 a + b = a 3 + 2 a 2 b + a b 2 + a 2 b + 2 a b + b 3 = = a 3 + 3 a 2 b + 3 a b 2 + b 3 = C 3 0 a 3 + C 3 1 a 2 b + C 3 2 a b 2 + C 3 3 b 3 - Если неравенство верно при n — 1 , тогда выражение вида a + b n — 1 = C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1
- Доказательство равенства a + b n — 1 = C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1 , основываясь на 2 пункте.
a + b n = a + b a + b n — 1 = = ( a + b ) C n — 1 0 · a n — 1 · C n — 1 1 · a n — 2 · b · C n — 1 2 · a n — 3 · b 2 + . . . + C n — 1 n — 2 · a · b n — 2 + C n — 1 n — 1 · b n — 1
a + b n = = C n — 1 0 · a n + C n — 1 1 + C n — 1 0 · a n — 1 · b + C n — 1 2 + C n — 1 1 · a n — 2 · b 2 + . . . + + C n — 1 n — 1 + C n — 1 n — 2 · a · b n — 1 + C n — 1 n — 1 · b n
C n — 1 1 + C n — 1 0 = C n 1 C n — 1 2 + C n — 1 1 = C n 2 ⋮ C n — 1 n — 1 + C n — 1 n — 2 = C n n — 1
a + b n = = C n — 1 0 · a n + C n — 1 1 + C n — 1 0 · a n — 1 · b + C n — 1 2 + C n — 1 1 · a n — 2 · b 2 + . . . + + C n — 1 n — 1 + C n — 1 n — 2 · a · b n — 1 = C n — 1 n — 1 · b n