Given a sum, break it into n random numbers. (sum, n) => [x1, x2, ... xn] // so that: // x1 + x2 + ... + xn = sum // x1 > x2 > ... > xn > 0
Так, что слагаемые одно больше другого (без равных).
Для вопроса на QnA Habr com
x = k0
y = x + k1 = k0 + k1
z = y + k2 = k0 + k1 + k2
m = z + k3 = k0 + k1 + k2 + k3
-----------------------------
x+y+z+m = 4k0 + 3k1 + 2k2 + k3 = SUM
ki это натуральные числа от 1
Найдём k0 Т.к. на k1..k3 уходит минимум 6, когда все по 1, для k0 остаётся диапазон от 1 до (SUM - 6) / 4
Выбрав случайный k0 в этом диапазоне, получаем новую целевую сумму SUM1, которую нужно заполнить 3k1 + 2k2 + k3 = SUM1
Рекурсия. Но на последнем шаге k3 это весь остаток.