Научная статья на тему 'Алгоритмы генерации и нумерации композиций и разбиений натурального числа ПН'

Алгоритмы генерации и нумерации композиций и разбиений натурального числа ПН Текст научной статьи по специальности «Математика»

CC BY
1180
126
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по математике, автор научной работы — Кручинин Владимир Викторович

Рассматриваются вопросы генерации и нумерации композиций и разбиений натурального числа n. Записаны выражения функций подсчета числа композиций c<sub>m</sub>(n) = c<sub>m</sub>(n-1) + c<sub>m</sub>(n-m) и разбиений p<sub>m</sub>(n) = p<sub>m</sub>(n-m) + p<sub>m+1</sub>(n). Разработаны оригинальные алгоритмы генерации и нумерации для композиций и разбиений.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Алгоритмы генерации и нумерации композиций и разбиений натурального числа ПН»

УДК 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)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

Эл. почта: [email protected]

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.

i Надоели баннеры? Вы всегда можете отключить рекламу.