Нахождение количества разбиений числа на слагаемые — различия между версиями
м (поправил индекс суммирования) |
|||
| Строка 1: | Строка 1: | ||
| − | Задача: | + | '''Задача:''' По заданному числу <tex>n</tex> найти [http://oeis.org/A000041 количество его различных разбиений на слагаемые] <tex> m_0 + m_1 + m_2 \dots + m_k = n </tex> так что <tex> \forall i: m_i \le m_{i+1} </tex>. |
__TOC__ | __TOC__ | ||
== Алгоритм за n sqrt(n) == | == Алгоритм за n sqrt(n) == | ||
| − | Рассмотрим самый быстрый алгоритм | + | Существует несколько алгоритмов решения данной задачи. Рассмотрим самый быстрый алгоритм нахождения количества разбиений числа <tex>n</tex> на слагаемые, который работает за <tex> O(n \sqrt{n}) </tex>. |
Итак, обозначим количество таких разбиений за <tex> p(n) </tex>. | Итак, обозначим количество таких разбиений за <tex> p(n) </tex>. | ||
| − | Рассмотрим бесконечное произведение | + | Рассмотрим следующее бесконечное произведение |
<tex> (1 + x + x^2 + \dots)(1 + x^2 + x^4 + \dots) \dots (1 + x^k + x^{2k} + \dots) \dots </tex> | <tex> (1 + x + x^2 + \dots)(1 + x^2 + x^4 + \dots) \dots (1 + x^k + x^{2k} + \dots) \dots </tex> | ||
| − | + | После раскрытия скобок каждый член произведения получается в результате умножения мономов (одночленов), взятых по одному из каждой скобки. Если в первой скобке взять <tex dpi = "145">x^{m_1}</tex>, во второй — <tex dpi = "145">x^{2m_2}</tex> и т.д., то их произведение будет равно <tex dpi = "145">x^{m_1 + 2m_2 + 3m_3 + \dots}.</tex> Значит, после раскрытия скобок получится сумма мономов вида <tex dpi = "145">x^{m_1 + 2m_2 + 3m_3 + \dots}</tex>. | |
| − | Можно увидеть, что <tex> x^n </tex> встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить < | + | Можно увидеть, что <tex> x^n </tex> встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить <tex>n</tex> как сумму <tex>m_1 + 2m_2 + 3m_3 + ...</tex> Каждому такому представлению отвечает разбиение числа <tex>n</tex> на <tex>m_1</tex> единиц, <tex>m_2</tex> двоек и т.д. Таким образом очевидно получаются все разбиения, так как из первой скобки мы можем взять любое <tex>x^{m_i}</tex>, где <tex>m_i \in \{0 \dots \infty \},</tex> то есть произвольное количество единиц в нашем разбиении. Аналогично, мы можем взять произвольное количество двоек и т.д. Но при раскрытии скобок мы находим произведения всех возможных комбинации множителей из разных скобок. Поэтому коэффициент при <tex>x^n</tex> равен числу разбиений <tex>p(n)</tex>. |
Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. По формуле ее суммирования: | Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. По формуле ее суммирования: | ||
| − | : <tex>1 + x + x^2 + x^3 + ... = \frac{1}{1 - x}</tex>, | + | : <tex dpi = "145">1 + x + x^2 + x^3 + ... = \frac{1}{1 - x}</tex>, |
| − | : <tex>1 + x^2 + x^4 + x^6 + ... = \frac{1}{1-x^2}</tex> | + | : <tex dpi = "145">1 + x^2 + x^4 + x^6 + ... = \frac{1}{1-x^2}</tex> |
и т.д. Теперь наш результат можно записать так: | и т.д. Теперь наш результат можно записать так: | ||
| − | : <tex>p(0) + p(1) x + p(2) x^2 + p(3) x^3 + \dots = \frac{1}{(1-x)(1-x^2)(1-x^3)\dots}</tex>(1) | + | : <tex dpi = "145">p(0) + p(1) x + p(2) x^2 + p(3) x^3 + \dots = \frac{1}{(1-x)(1-x^2)(1-x^3)\dots}</tex> <tex>(1)</tex> |
| − | Рассмотрим произведение <tex>(1-x)(1-x^2)(1-x^3)...</tex>, т.е. знаменатель правой части формулы (1). Раскрывая в нём скобки, получим | + | Рассмотрим произведение <tex>(1-x)(1-x^2)(1-x^3)...</tex>, т.е. знаменатель правой части формулы <tex>(1)</tex>. Раскрывая в нём скобки, получим следующий результат: |
: <tex>(1 - x)(1 - x^2)(1 - x^3) ... = 1 - x - x^2 + x^5 + x^7 - x^{12} - x^{15} + x^{22} + x^{26} - x^{35} - x^{40} + ...</tex> | : <tex>(1 - x)(1 - x^2)(1 - x^3) ... = 1 - x - x^2 + x^5 + x^7 - x^{12} - x^{15} + x^{22} + x^{26} - x^{35} - x^{40} + ...</tex> | ||
| − | Показатели в правой части — пятиугольные числа | + | Показатели степеней в правой части — [http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B3%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0#.D0.9F.D1.8F.D1.82.D0.B8.D1.83.D0.B3.D0.BE.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.87.D0.B8.D1.81.D0.BB.D0.B0 пятиугольные числа], т.е. числа вида <tex>(3q^2 \pm q)/2</tex>, а знаки при соответствующих мономах равны <tex>(-1)^q</tex>. Исходя из этого наблюдения, Эйлер предположил, что должна быть верна следующая теорема, впоследствии названная его именем. |
{{Теорема | {{Теорема | ||
Версия 10:15, 14 ноября 2011
Задача: По заданному числу найти количество его различных разбиений на слагаемые так что .
Содержание
Алгоритм за n sqrt(n)
Существует несколько алгоритмов решения данной задачи. Рассмотрим самый быстрый алгоритм нахождения количества разбиений числа на слагаемые, который работает за .
Итак, обозначим количество таких разбиений за .
Рассмотрим следующее бесконечное произведение После раскрытия скобок каждый член произведения получается в результате умножения мономов (одночленов), взятых по одному из каждой скобки. Если в первой скобке взять , во второй — и т.д., то их произведение будет равно Значит, после раскрытия скобок получится сумма мономов вида .
Можно увидеть, что встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить как сумму Каждому такому представлению отвечает разбиение числа на единиц, двоек и т.д. Таким образом очевидно получаются все разбиения, так как из первой скобки мы можем взять любое , где то есть произвольное количество единиц в нашем разбиении. Аналогично, мы можем взять произвольное количество двоек и т.д. Но при раскрытии скобок мы находим произведения всех возможных комбинации множителей из разных скобок. Поэтому коэффициент при равен числу разбиений .
Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. По формуле ее суммирования:
- ,
и т.д. Теперь наш результат можно записать так:
Рассмотрим произведение , т.е. знаменатель правой части формулы . Раскрывая в нём скобки, получим следующий результат:
Показатели степеней в правой части — пятиугольные числа, т.е. числа вида , а знаки при соответствующих мономах равны . Исходя из этого наблюдения, Эйлер предположил, что должна быть верна следующая теорема, впоследствии названная его именем.
| Теорема (Пентагональная теорема Эйлера): |
| Доказательство: |
|
Пентагональная теорема оказалась «крепким орешком» — Эйлер сумел доказать её лишь 14 лет спустя. TODO: скурить доказательство |
Умножим обе части равенства (1) на и воспользуемся пентагональной теоремой:
- (2)
Начнем раскрывать скобки, для наглядности мономы с одинаковыми степенями x пишем друг под другом:
// тут ужасное быдлоформатирование, не знаю как нормально расположить друг под другом
Так как p(0) = 1, то оно сокращается с единицей справа. Так что чтобы выражение (2) было удовлетворено при любом x, все коэффициенты должны быть равны 0(вроде так). Поэтому:
и т.д.
Получаем формулу Эйлера, позволяющую последовательно находить числа :
- .
Ну и объяснение асимптотики - так как , получаем порядка , а так как находим n-е число, то получаем .