УДК 519.16
В.В. Кручинин
Алгоритмы генерации и нумерации композиций и разбиений натурального числа л
Рассматриваются вопросы генерации и нумерации композиций и разбиений натурального числа п. Записаны выражения функций подсчета числа композиций = cm(" - !) + -т.) и разбиений рт(п) = рт(п - т) + ря+1(я). Разработаны оригинальные алгоритмы генерации и нумерации для композиций и разбиений.
Введение
Разбиения и композиции являются достаточно хорошо изученными комбинаторными объектами (1]. Имеется некоторое множество алгоритмов последовательной генерации композиций м разбиений [2,3]. В данной работе предложены оригинальные алгоритмы нумерации и генерации для композиций и разбиений натурального числа п. Дадим ряд определений.
Определение 1. Разбиением натурального числа п называется конечная неубывающая последовательность натуральных чисел д1( ..., пк, таких, что
tn(=n. (1)
4 ¡=1
Функция разбиений р(п) определяет число всех разбиений числа п. Например, р<4) = 5 : { 1+1+1+1, 1+1+2, 1+3, 2+2, 4 } .
Определение 2. Композицией натурального числа п называется разбиение, в котором учитывается порядок слагаемых.
Например, с(4) = 8: {1 + 1+1+1, 1+1+2, 1+2+1, 2+1+1, 1+3, 2+2, 3+1, 4 }.
Алгоритмы генерации и нумерации композиций
В работе Д. Кнута [4] показано, что для подсчета числа п-узловых упорядоченных деревьев, в которых каждый лист находится на одном и том же расстоянии d от корня, можно воспользоваться формулой обобщенных чисел Фибоначчи. Рассмотрим класс деревьев для d - 2 (таблица).
Число деревьев Деревья (d = 2) Число узлов íi (3, 4, 5, 6, 7) Композиции числа (п - 1) Числа Фибоначчи F
МЗ) 1 {2} F( 1)=1
М4) 1 {3> F( 2) - 1
М5) JLñ {4, 2+2} F{ 3) = 2
Мб) <Àoûà<ù {5, 2+3, 3+2} F( 4) = 3
М7> {6, 2+4, 2+2, 3+3, 2+2+2} F<5) = 5
Из таблицы видно, что ta (л) = F(n ~2). Теперь рассмотрим поддеревья корня. Это все деревья высотой 1. Число узлов дерева высотой 2 будет равно сумме узлов поддеревьев высотой 1 плюс 1 и числу композиций числа п - 1, где каждое слагаемое должно быть яе менее 2. Таким образом, число композиций числа п на слагаемые не менее 2 будет равно F(n-1).
Введем обозначение ст(п) — число композиций числа л на слагаемые, каждое из которых не менее, чем т. Тогда для с2(ге) можно записать
О, п< 2; с2(п) = 1, п = 2;
с2(п -1) + с2(п - 2), п > 2.
Рассмотрим рекуррентное выражение для m = 1:
сг (1) = 1 ;
ct(n) = с,(я -1) + Cj(rt -1) для л > 1. (3)
Покажем, что это выражение позволяет строить все композиции числа п.
Множество всех композиций для выражения (3) обозначим С, (л). Его можно построить из множества композиций Сг(п -1). Для этого введем две операции над композициями: первая операция — это получение новой композиции путем прибавления единицы в первое слагаемое композиции — inc; вторая — получение новой композиции добавлением нового слагаемого слева от данной композиции, равного единице, —■ pos.
Например, для композиции пп = nt + + - + пк :
1) тс(ял) =«{+/12 + ... + пк , где п[ = пг +1 ;
2) poè( пп) = 1 + % + п2 +... + пк,
Очевидно, что операции inc(nn) я роэ(я„) :
1 ) переводят композиции множества (л -1) в композиции множества С\ (л), поскольку к числу п - 1 добавляется единица;
2) множества {mctC^n -1)]} n {роз[С[(и -1)]} = 0, поскольку все первые слагаемые множества {inc[Cj(ra - 1)]} будут больше 1, а все первые слагаемые композиций множества {роэ[С,(л - 1)]} будут равны 1.
Рассмотрим получение множества композиций.
По определению множество С|{1) = {1}, тогда:
1) {inc[Cj(l)]} = {2} , увеличиваем первое слагаемое;
2) {pos[Cj(l)]} = {1 + 1}, добавляем новое слагаемое, равное 1.
Таким образом, Cj(2) = {inc[C,(l)]} u{pos[C1(l)]}={2, 1+1},
Чтобы получить (^(3), необходимо получить множества {inc[Cj(2)]}, (pos[C1(2)]}:
{lnc[C,(2)]} = {3, 2 + 1}.
{pos[Cj (2)]} = {1 + 2, 1 + 1 + 1).
Тогда С,(3) = {3, 2+2, 1+2, 1+1+1}. ^ ^
Применяя индукцию, получим
Cjire) = {mctC^n-lWuiposiC^n-l)]}.
Таким образом, для числа композиций натурального числа л можно записать следующую рекурсивную функцию:
^(л) = сг(л -1) + Cj(n -1), ^(1) = 1.
Покажем, что для выражения (2) также годится данный подход. Для этого введем расширение операции роз — добавление нового слагаемого слева в композиции тс„ = Л| + п^ +... + пк :
posm(jt„) = m + n, + п2 + ... + nk .
Пусть имеются два множества композиций С2(л -1) и С2(п - 2) , тогда:
1) множество {inc[C2(n -1)]} с С2(га) ;
2) множество {pos2[C2(n - 2)]} с С2(л) ;
3) {inc[C2(/î -1)]} r> {pos2[C2(ra - 2)]} = 0.
Покажем, что С2(га) = {inc[C'2(n -1)]} u{pos2[C2(n - 2)]}.
При п=1ип = 2по определению имеем С2(1) = 0, С2(2) = {2}. Для п = 3 имеем <тс[С2(2)]} = {3}, {роз[С2(1Ш = 0 • Получим С2(3) = {3}.
Для л=4 имеем {тс[С2(3)]} = {4}, {роБ2[С2(2)]} = {2 + 2}.
Получим С2(4) = {4, 2 + 2). Аналогично получим С2(5) = {5, 3 + 2, 2 + 3}. Применяя индукцию, получим
С2(п) - {тс[С2(п - 1)]} и {роз2[С2(я - 2)]}. Отсюда получим выражение (2). Таким образом, рассматривая операции тс и роэ^ :
{тс[Ст(и - 1)]> п{розт[Сот(я - т)]} = 0 ;
Ст(п) = {тс[Ст(п - Щ и{розт[Ст(п - т)]}. Тогда можно записать обобщенное рекуррентное выражение для числа композиций числа
л на слагаемые не менее т:
=
0, п < т;
1, п = т; ст(п-1) + ст(п-т).
(4)
Теперь разработаем алгоритмы генерации и нумерации композиций, основываясь на выражении (4). Для этого применим следующий метод построения алгоритмов генерации [5]:
1) строим рекурсивную композицию деревьев И/ИЛИ (рис. 1);
2) получаем алгоритм генерации композиции по номеру;
3) строим алгоритм нумерации композиции.
Схема рекурсивной композиции строится из выражения (4)
(см. рис 1). Все узлы дерева И/ИЛИ будут ИЛИ-узлами. Соответственно вариант будет представлять собой путь от корня к листу дерева, причем если нагрузить левую ветвь операцией тс, а правую — pos2, то обход варианта снизу вверх будет давать конкретную композицию (рис. 2).
+1/ \т ст(п~ 1) сп(п-т)
А Д
Рис. 1. Схема рекурсивной композиции построения дерева И/ИЛИ для ст(п)
с2(6)
с2<5) с2<4)
у -у V
с2(4) е2(3) С2(3) с2(2)
+1/ V I I I
с2(3) с2(2) 3 3 2
I I
3 2
Рис. 2. Дерево И/ИЛИ для с2(6)
Запишем алгоритм генерации композиции натурального числа п на части не менее т, приняв обозначения:
пит — номер композиции; п — натуральное число; т — основание композиции; у — массив, хранящий композицию числа п.
algorithm Unrank(num, m, п) begin if n<m then return;
if n-nt then v[l]:=m
else
begin
if(num< Cm(n — т.)) { переход no правой ветви дерева, операция poam(o)} begin
Unr&nk{num,m,n~m);
pos„ (i>);
end
else
begin { переход no левой ветви дерева, операция inc{f) } пит:=пит- ст(п -т); Unrank(nuffi,ffi,n~l); inc(y); end end end
Алгоритм нумерации композиции Rank; algorithm Rank(u,nt,n) begin
if m=rc then return 0; { достигли листа } j
if i>{l]=m then { { движение no правой ветви}
i>.erase(v.begin()) (удаляем первое слагаемое }
retunTRank(i\m,n-m)
else
begin { движение по левой ветви} i>[0]:= и[0]-1
return Rank(v,m,n-1)+ cm{n - m) end end
Алгоритмы генерации и нумерации разбиений
Для построения алгоритмов генерации и нумерации разбиений необходимо иметь рекурсивную функцию алгебры {N>+,x,R,S} [5], Построим рекурсивную функцию рт(п) разбиений натурального числа п, части не меньше т. Для этого рассмотрим операции inc(p) и posm(p), где р — некоторое разбиение. Операция pos^íp) переводит множество разбиений Р(п) в подмножество разбиений Р(л+т), поскольку слева добавляется новое слагаемое т., при этом условие неубывания не нарушается.
Операция inc( р) переводит только часть разбиений множества Р(л) в элементы множества Р(л+1), поскольку для некоторых разбиений {inc[P(n)]) условие неубывания нарушается. Например, inc{2+2+3} = {3+2+3}. По аналогии с выражением (4) для разбиений можно записать:
0, п < т;
рт(п) = • 1, п = т; (5)
<(«-l) + pm(n-m),
где а™(п-1) —число разбиений множества Рт(л), получаемых из Pm(n - 1) операцией inc. Это множество обозначим как (я). Для получения выражения а" («) необходимо подсчитать все разбиения Рт(п-1), для которых первое слагаемое меньше второго (п{ <«2). Для этого необходимо найти А™(п- 1) — множество разбиений числа га-1, для которого < п2 + 1, и Pm+l(n. - т -1) — множество разбиений числа (га - т - 1) по основанию m +1.
Тогда
А{» = {inc[A^(n - 1)]} u<posm[PmH(/i - m -1]}; «i» -1) = a?(» - 2) + p^in - m -1). Чтобы найти а£Чя), необходимо найти все разбиения
а2(п - 2) = - 3) + рт+2(л - ш - 2). Можно обобщить на случай fe-шага, чтобы найти множество А™(п - т - к) . Необходимо найти множества А™+1 {п - т - h -1) и Pm+A+1(n - т - k -1). Тогда
<(»-*) = a?(n-ft-l) + peitik(n-m-ft).
Рекурсия будет завершена, если m + k = n- m- k, отсюда к = — - т .
2
Покажем, что для четных и нечетных чисел п а к) и pm+k(n -т- к) равны единице. При п = 21 получим 0™(п - т - k) = aj"_m(0 = 1, поскольку во множестве P( m(í) имеется только одно разбиение, которое дает разницу (í - т), — это разбиение (0- По определению
М 0 = 1.
В случае п - 21 + 1 имеем а;"1т(7 + 1) и P((l + 1) , очевидно и для них
аГ_жа + 1) = 1 и РД/ + 1) = 1. Отсюда можно записать (рис. 3)
рт(п)= рт(п-т)+ рт+1(п-т~1) + ... + рп/г(п/2) + 1. (6)
Или
=
0, rt < m;
1, п = m; (7)
п/2
1+ £ Pm+ktn-k)-
к-m
А» \
«if«"1) РЛп-т)
У"'2} Рт+i(n-m-l)
1 I
Рис. 3. Процесс нахождения рт(п)
Тогда число всех разбиений выразится формулой
Pi(n) = рг(п - I) + р2{п - 2) + ... ->■ рп /2(п / 2) + 1. (8)
Проверим тождество
Pi(") = Pj(n -1)+ р2(") • Для этого воспользуемся выражением (7) для m - 2, получим
Р2(") = Рг(» - 2) + Р3(п - 3) + ... + рп/г(п/ 2) +1. (9)
\
Рассмотрим теперь выражение (7) для т = 3, получим
= + + +д,/2(!»/2) + 1 . (10)
Подставляя (10) в выражение (9), получим
Р2(") = Рг(п ~ 2> + Рз(") • Таким образом получим выражение в общем виде:
Рт(") = " W) + Рт + 1<") • (П)
Схема рекурсивной композиции строится на основе тождества (11) (рис. 4). Все узлы дерева И/ИЛИ будут ИЛИ-узлами. Соответственно вариант будет представлять собой путь от корня к листу дерева, причем если нагрузить левую ветвь операцией posm, а правую не нагружать никакой операцией, то обход варианта снизу вверх будет давать конкретное разбиение (рис. 5).
Рй<7)
У \
Р э<5) Рз<"П
«/ \ у \
р2(3) р3(5) р8(4) р,т
I I I I
3 5 4 7
Рис. 5. Дерево И/ИЛИ дляр2(7)
Все пути в дереве р2(7) будут следующие: 2+2+3; 2+5; 3+4; 7.
Для записи алгоритмов генерации нумерации введем обозначения: пит — номер разбиения начиная с нуля; т. — параметр разбиении; п — число, для которого строится разбиение; и — массив, содержащий члены разбиения; u.insert(A-) — операция вставки числа к в массив на первое место; u.erase() — операция удаления числа в начале массива v.
Тогда в соответствии с методом, описанным в [5], получим следующие алгоритмы генерации и нумерации разбиений:
algorithm Unrank(nu/n, гп, л) begin
if п-т<т then begin vfl]:=n return end { добрались до листа дерева)
if пит< рт{п - т.) then
begin [спуск по левой ветви дерева }
Unrank(nunt, m,n-fn);
v.insert(m) {вставка ml
end
else
begin {спуск no правой ветви дерева } nttm-рт(п - т)
Unrank(/iu/n,m+l,/í); end end
algorithm Rank(v, m, n) begin
if n-m<m then return 0 (добрались до листа] if 1 }=/n then { если равно. спуск влево по дереву } begin
u.eraseO: ( идаление первого элемента вектора 1
Рис. 4. Схема рекурсивной композиции построения дерева И/ИЛИ для разбиений
return Rank(i>,/n,rt-ffi); end
else { спуск no правой ветви дерева) begin
return Rank(i>,/n+l,rt)+ Pm{n - m) end end
Выводы
1. Получено выражение рекурсивной функции для числа композиций натурального числа п:
=
0, п < т;
1, п - т;
где все члены композиции не меньше т.
2. Получено выражение рекурсивной функции для числа разбиений натурального числа п:
рт(п) = 1+ £ JWi^-ft).
\
где все члены разбиения не меньше т.
3. Получено тождество для числа разбиений
AB<«) = Pb.<"-m)+A. + t<n>'
4. На основе выражений для ст(п) и рт(п) построены алгоритмы генерации и нумерации композиций и разбиений натурального числа п.
Литература
1. Эндрюс Г. Теория разбиений / Г. Эндрюс. - М. : Наука, 1982. - 256 с.
2. Knuth D. Generating All Combinations and Partitions / D. Knuth. - Addison-Wesley, 2005. - 150 p.
3. Kreher D.L. Combinatorial algorithms: Generation, Enumeration and Search / D.L. Kreher, D.S. Stinson. - CRC Press, 1998. - 329 p.
4. Кнут Д. Искусство программирования. Т. 3. Сортировка и поиск / Д. Кнут - М. : Вильяме, 2007. - 832 с.
5. Кручинин В.В. Методы построения алгоритмов генерации и нумерации комбинаторных объектов на основе деревьев И/ИЛИ / В.В. Кручинин. - Томск : В-Спектр, 2007. - 200 с.
Кручинин Владимир Викторович
Канд. техн. наук, зав. лаб. инструментальных систем моделирования и обучения ТУСУРа
Тел.: 45 10 00
Эл. почта: kru@tcde.ru
V.V. Kruchinin
Algorithms of ranking and unranking of compositions and partitions of natural number n
Questions of generation and ranking of compositions and partitions of natural number n are considered. Expressions of functions of calculation of number of compositions cm(n) = cm(n - 1) + cm(n - m) and partitions pm(n) = pm(n - m) + pm+1(n) are written down. Original algorithms of generation and ranking are developed for compositions and partitions.