Изменения
→Специализация алгоритма для генерации следующего разбиения на слагаемые
== Специализация алгоритма для генерации следующего [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B_.D0.BA.D0.BE.D0.BC.D0.B1.D0.B8.D0.BD.D0.B0.D1.82.D0.BE.D1.80.D0.BD.D1.8B.D1.85_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.BE.D0.B2 разбиения на слагаемые] ==
Рассматриваемый алгоритм находит следующее разбиение на слагаемые в упорядоченном множестве разбиений числа, при этом разбиение упорядоченно лексикографически.
* Увеличим предпоследнее число на 1, уменьшим последнее на 1.
** Если предпоследний элемент стал больше последнего, то увеличиваем предпоследний элемент на величину последнего.** Если предпоследний элемент меньше последнего, то проверяем, можем ли мы разбить последний элемент на сумму двух предпоследних. Если да – разбиваем, пока предпоследний*2 < = последнего.
<code>
// b – список, содержащий разбиение данного числа, length – его размер.
'''function''' nextPartition(var b:list<int>): list<int>;
'''var''' i : '''integer;'''
'''begin'''
b.set([b.size,] := b.get([b.size) ] - 1); b.set([b.size-1,] := b.get([b.size-1) ] + 1); '''if''' b.get([b.size-1) ] > b.get([b.size) ] '''then'''
'''begin'''
b.set([b.size-1,] := b.get([b.size-1) ] + b.get([b.size))]; b.sizepop(b.size-1);
'''end'''
'''else'''
'''begin'''
'''while''' b.get([b.size-1) ] * 2 <= b.get([b.size) ] '''do'''
'''begin'''
b.add(b.get([b.size)] -b.get([b.size-1)]); b.set([b.size-1,] := b.get([b.size-1))2];
'''end;'''
'''end;'''
'''return(''' b);
'''end;'''
</code>