С помощью чего можно легко найти биномиальные коэффициенты

от admin

Биномиальные коэффициенты

Биномиальные коэффициенты — коэффициенты в разложении (1 + x) n по степеням x (т. н. бином Ньютона):

+ x + x^2 + \cdots = \sum_k x^k.» width=»» height=»» />

Иначе говоря, (1 + x) n является производящей функцией для биномиальных коэффициентов.

Значение биномиального коэффициента <n\choose k>» width=»» height=»» /> определено для всех целых чисел <i>n</i> и <i>k</i> . Явные формулы для вычисления биномиальных коэффициентов:</p>
<p> <img decoding=; <n\choose k>= 0″ width=»» height=»» /> для <i>k</i> < 0 или <img decoding=; <n\choose k>= (-1)^k <-n+k-1\choose k>» width=»» height=»» /> для <img decoding=,

где n! и k! — факториалы чисел n и k .

Биномиальный коэффициент <n\choose k>» width=»» height=»» /> является обобщением числа сочетаний <img decoding=, которое определено только для неотрицательных целых чисел n , k .

Биномиальные коэффициенты часто возникают в комбинаторных задачах и теории вероятностей.

Обобщением биномиальных коэффициентов являются мультиномиальные коэффициенты.

Содержание

Треугольник Паскаля

<n\choose k>= <n-1\choose k-1>+ <n-1\choose k>» width=»» height=»» /></p>
<p>позволяет расположить биномиальные коэффициенты для неотрицательных <i>n</i> , <i>k</i> в виде треугольника Паскаля, в котором каждое число равно сумме двух вышестоящих:</p>
<p> <img decoding=в двоичной записи числа k единицы не стоят в тех разрядах, где в числе n стоят нули,

  • <n\choose k>» width=»» height=»» /> некратен простому <i>p</i><img decoding=в p -ичной записи числа k все разряды не превосходят соотв. разрядов числа n ,
  • В ряду биномиальных коэффициентов <n\choose 0>, \ldots, <n\choose k>, \ldots, <n\choose n>» width=»» height=»» />:
<ul>
<li>все числа не кратны заданному простому <i>p</i><img decoding=n = mpk − 1 , где натуральное m < p ,
  • все числа, кроме первого и последнего, кратны заданному простому p\iffn = pk , где натуральное m < p ,
  • количество нечётных чисел равно степени двойки,
  • не может быть поровну чётных и нечётных чисел,
  • количество не кратных простому p чисел равно (a_1+1)\ldots(a_m+1), где числа a_1,\ldots,a_m— разряды p -ичной записи числа n ; а число m = [logpn] + 1
  • Тождества

    • <n\choose k>= <n-1\choose k-1>+ <n-1\choose k>» width=»» height=»» /></li>
<li><img decoding=в виде замкнутой суммы из s слагаемых:

    Асимптотика и оценки

    • <2n\choose n>\sim \frac<2^<2n>><\sqrt<\pi n>>» width=»» height=»» /></li>
<li><img decoding=. Этот алгоритм особенно эффективен, если нужно получить все значения <n\choose k>» width=»» height=»» /> при фиксированном <i>n</i> . Алгоритм требует <i>O</i>(<i>n</i>) памяти ( <i>O</i>(<i>n</i> 2 ) при вычислении всей таблицы биномиальных коэффициентов) и <i>O</i>(<i>n</i> 2 ) времени (в предположении, что каждое число занимает единицу памяти и операции с числами выполняются за единицу времени).</p>
<p>Второй способ основан на тождестве <img decoding=также использует биномиальные коэффициенты. Для их расчета можно использовать формулу, выражающую биномиальный коэффициент через факториалы: imageили использовать рекуррентную формулу: imageИз бинома Ньютона и рекуррентной формулы ясно, что биномиальные коэффициенты — целые числа. На данном примере хотелось показать, что даже при решении несложной задачи можно наступить на грабли.
      Прежде чем перейти к написанию процедур расчета, рассмотрим так называемый треугольник Паскаля.

      или он же, но немного в другом виде. В левой колонке строки значение n, дальше в строке значения imageдля k=0..n

      В полном соответствии с рекуррентной формулой значения imageравны 1 и любое число равно сумме числа, стоящего над ним и числа «над ним+шаг влево». Например, в 7й строке число 21, а в 6й строке числа 15 и 6: 21=15+6. Видно также, что значения в строке симметричны относительно середины строки, т.е. image. Это свойство симметричности бинома Ньютона относительно a и b и оно видно в факториальной формуле.
      Ниже для биномиальных коэффициентов imageя буду также использовать представление 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.
      Как оптимизировать расчет image? Очень просто: раскроем 13! и сократим числитель и знаменатель на 7! В результате получится image. Запрограммируем расчет по этой формуле

      Явно лучше, ошибка возникла при расчете 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 считается справедливым. Докажем его существование.

      Для этого необходимо применить метод математической индукции.

      Для доказательства необходимо выполнить несколько пунктов:

      1. Проверка справедливости разложения при 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
      2. Если неравенство верно при 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
      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 .

      С помощью чего можно легко найти биномиальные коэффициенты

      При решении задач комбинаторики часто возникает необходимость в расчете биномиальных коэффициентов. Бином Ньютона, т.е. разложение imageтакже использует биномиальные коэффициенты. Для их расчета можно использовать формулу, выражающую биномиальный коэффициент через факториалы: imageили использовать рекуррентную формулу: imageИз бинома Ньютона и рекуррентной формулы ясно, что биномиальные коэффициенты — целые числа.

      Преобразование Фурье

      image

      image

      image

      • 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 ;
      • при четном расположении биноминальных коэффициентов их сумма равняется сумме биномиальных коэффициентов, расположенных в нечетных местах.
      1. Проверка справедливости разложения при 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
      2. Если неравенство верно при 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
      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

      Читать:
      Почему кисть в фотошопе рисует прозрачным

    Похожие статьи