Нахождение количества разбиений числа на слагаемые
Задача: Дано число n, найти количество его различных разбиений на слагаемые так что .
Алгоритм за n sqrt(n)
Рассмотрим самый быстрый алгоритм их нахождения - за
. Если кто хочет добавить другие алгоритмы, добавьте.Итак, обозначим количество таких разбиений за
.Рассмотрим бесконечное произведение
Каждый член произведения получается в результате умножения мономов(одночленов), взятых по одному из каждой скобки. Если в первой скобке взять , во второй — и т.д., то их произведение будет равно Значит, после раскрытия скобок получится сумма мономов вида .Можно увидеть, что
встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить как сумму Каждому такому представлению отвечает разбиение числа на единиц, двоек и т.д. Так получаются все разбиения, так как каждое из них, конечно, состоит из нескольких единиц, нескольких двоек и т.д. Поэтому коэффициент при равен числу разбиений .Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. По формуле ее суммирования:
- ,
и т.д. Теперь наш результат можно записать так:
- (1)
Рассмотрим произведение
, т.е. знаменатель правой части формулы (1). Раскрывая в нём скобки, получим такой результат:Показатели в правой части — пятиугольные числа(при чем тут пятиугольники? o_O ), т.е. числа вида
, а знаки при соответствующих мономах равны . Исходя из этого наблюдения, Эйлер предположил, что должна быть верна:Теорема (Пентагональная теорема Эйлера): |
Доказательство: |
Пентагональная теорема оказалась «крепким орешком» — Эйлер сумел доказать её лишь 14 лет спустя. TODO: скурить доказательство |
Умножим обе части равенства (1) на
и воспользуемся пентагональной теоремой:- (2)
Начнем раскрывать скобки, для наглядности мономы с одинаковыми степенями x пишем друг под другом:
// тут ужасное быдлоформатирование, не знаю как нормально расположить друг под другом
Так как p(0) = 1, то оно сокращается с единицей справа. Так что чтобы выражение (2) было удовлетворено при любом x, все коэффициенты должны быть равны 0(вроде так). Поэтому:
и т.д.
Получаем формулу Эйлера, позволяющую последовательно находить числа
:- .
Ну и объяснение асимптотики
- так как , получаем порядка , а так как находим n-е число, то получаем .