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