Зарегистрируйтесь, чтобы продолжить обучение

Производящая функция Комбинаторика

08

Представьте, что ребенок держит в руках несколько красных и желтых кубиков. Он выставляет их в ряд, потом перемешивает и выставляет в новый ряд. Таких комбинаций может быть много — число будет зависеть от количества кубиков каждого цвета.

Мы можем узнать, сколькими способами можно расположить в ряд кубики красного и желтого цветов — для этого используется метод производящих функций. В этом уроке разберем, что такое производящая функция, рассмотрим ее обычный вид и научимся ее использовать.

Что такое производящая функция

Производящая функция — это многочлен, коэффициенты которого соответствуют членам последовательности чисел a_n. Эту функцию используют, чтобы решать реккурентные соотношения, потому что она умеет кодировать информацию о целочисленной последовательности.

Например, простая последовательность — это постоянная последовательность 1, 1, 1, . . ..

Производящая функция для нее:

G(s) = 1 + s + s^2 + s^3 + . . .

Когда функция используется без уточнения, ее называют обычной производящей функцией. Разберем подробнее, как она выглядит.

Как выглядит производящая функция

Обычная производящая функция — это функция вида f(x) = n=0suminftyanxn. Разберем на примере, как ее использовать.

Представим, что нам нужно найти, сколькими способами можно составить сумму 10. При этом можно использовать по одному элементу из каждого из следующих двух наборов: {2,3,6,7} и {3,4,5,8}.

Рассмотрим два многочлена:

  • x^2 + x^3 + x^6 + x^7
  • x^3 + x^4 + x^5 + x^8

x^n — это количество способов составить сумму n с помощью одного элемента из каждого набора.

Например, коэффициент x^4 во втором многочлене равен 1. Значит, существует один способ составить сумму из четырех, используя только один элемент из набора.

Теперь рассмотрим произведение многочленов:

(x^2 +x ^ 3 +x ^ 6 +x ^ 7 )(x ^ 3 +x ^ 4 +x ^ 5 +x ^ 8 )

В полиномиальном произведении x^n — количество способов составить сумму из n, когда берется по одному числу из каждого набора.

Разложим произведение:

(x^2 + x^3 + x^6 + x^7)(x^3 + x^4 + x^5 + x^8) = x^5 + 2x^6 + 2x^7 + x^8 + x^9 + 3x^10 + 3x^11 + x^12 + x^14 + x^15

Коэффициент x^n равен нулю при n > 15, так как мы не можем получить сумму больше 15. Если взять самые большие числа из каждого набора, то получится число 15 - 7 + 8.

То же самое относится и к (n > 5). Берем самые маленькие числа из наборов и получаем (5 - 2 + 3).

Когда n = 10, коэффициент равен трем. Это означает, что есть три способа получить число 10. Если c помощью формулы дистрибутивности мы развернем произведение полностью, то увидим, что три члена x^{10} получаются из произведений:

  • x^2 * x^8
  • x^6 * x^4
  • x^7 * x^3

Производящая функция придает смысл коэффициенту x^n, но не придает смысла x. Она кодирует числа объектов с помощью формальных степенных рядов — многочленов с бесконечно большим количеством членов.

В разобранном примере можно было просто подсчитать количество способов получения числа 10 путем проверки. Но производящие функции полезны, когда многочлены выражены в более компактной форме — например, с помощью суммы геометрического ряда.

Выводы

В этом уроке мы изучили метод производящих функций, рассмотрели ее обычный вид и научились ее использовать. Теперь в вашем арсенале есть еще один инструмент для решения задач в комбинаторике.


Самостоятельная работа

Задача №1

У Васи есть четыре вида лука в разном количестве:

  • Пурпурный — количество может быть любым неотрицательным целым числом
  • Зеленый — количество кратно 2
  • Красный — количество кратно 3
  • Синий — количество кратно 4

Если у Васи 23 луковицы, сколько различных распределений цветов может быть?

Нажмите, чтобы увидеть ответ

Мы хотим найти количество неотрицательных целочисленных решений задачи. Сначала обозначим цвета буквами:

  • Пурпурный — a
  • Зеленый — b
  • Красный — c
  • Синий — d

Далее обозначим общее количестов луковиц через формулу:

a + b + c + d = 23

Таким образом, мы можем обозначить формулами луковицы всех цветов:

  • a=k, где 0≤k≤23
  • b=2k, где 0≤k≤11
  • c=3k, где 0≤k≤7
  • d=5k, где 0≤k≤4
  • (\sum_{k=0}^{23} x^k )(\sum_{k=0}^{11} x^{2k} )(\sum_{k=0}^7 x^{3k})(\sum_{k=0}^4 x^{5k})

По формулам выше мы видим, что коэффициент x^{23} в разложении равен 127.

Другой способ заключается в решении задачи по d, через синий цвет.

Случай 1: d=20:

Мы видим, что (0, 0, 3, 20) подхоит: 0+0+3+20=23.

(1, 2, 0, 20) и (3, 0, 0, 20) также подхоят.

Получаем 3 вартанта.

Случай 2: d=15

(0, 2, 6) и (2, 0, 6): 2 варианта в этом подслучае, при c=6.

(1, 4, 3), (3, 2, 3), (5, 0, 3): 3 в этом подслучае.

(0, 8, 0) ... (8, 0, 0): 5 в этом подслучае.

Итого в этом случае 10 вариантов.

Случай 3: d=10

c=12: 1 здесь

c=9: 3 здесь

c=6: 4 здесь

c=3: 6 здесь

c=0: 7 здесь

На этом этапе вы должны увидеть закономерность: мы можем доказать это, взяв два случая: один, где c нечетное, и другой, где c четное.

Всего здесь 21 случай.

Случай 4: d=5

c=18: 1 здесь

c=15: 2 здесь

Отсюда мы можем получить, что сумма для этого случая равна 1+2+4+5+7+8+10=37, по аналогии со случаем 3.

Случай 5: d=0

c=21: 2 здесь

c=18: 3 здесь

2+3+5+6+8+9+11+12=56 в этом случае.

Суммируя все это, получаем 3+10+21+37+56=127

Задача №2

Найдите количество неотрицательных целочисленных решений задачи 3x+y+z=24.

Нажмите, чтобы увидеть ответ

В условии есть такие данные:

  • 3x+y+z=24
  • x≥0
  • y≥0
  • z≥0

Пусть:

  • x=k
  • thereforey+z=24-3k...(i)
  • 24≥24-3k≥0(becausex≥0)

Следовательно:

  • 0≤k≤8

Далее вычисляем i — общее число интегральных решений:

(24-3k+2-1)_C_(2-1)=(25-3k)_C_1=25-3k

Отсюда следует, что общее количество решений исходного уравнения равно 117:

((k=0)sum(8))(25-3k)=25((k=0)sum(8))(1)-3((k=0)sum(8))(k)\ =25.9-3*(8.9/2)=225-108=117

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff