функция, которая возвращает s-кортежи с неотрицательными целыми числами и заданной суммой $n$

Я пытаюсь написать функцию, которая возвращает s-кортежи с неотрицательными целыми числами и заданной суммой $n$ (сумма каждого кортежа равна $n$). В программе мне нужно использовать вложенные циклы:

 for i1 from 0 to n do

 for i2 from 1 to n do

 ...

 for is from 1 to n do

 end for;
 end for;
 end for;

Как я мог использовать только несколько циклов вместо циклов s? Большое спасибо.


person math 123    schedule 26.02.2018    source источник
comment
Что вы имеете в виду под данной суммой? А что такое n в вашем коде?   -  person ViG    schedule 28.02.2018
comment
@ViG, спасибо за ваши комментарии. Я отредактировал сообщение.   -  person math 123    schedule 28.02.2018


Ответы (1)


Я предлагаю команду combinat:-composition(). Сама по себе команда не будет включать нулевые термины, но вместо этого вы можете разделить n+s и удалить 1 из каждого термина в конце:

restart;

partitions := proc( n :: posint, s :: posint, { allowzero :: truefalse := false } )

  local P, u:

  if allowzero = false then

    P := convert( combinat:-composition( n, s ), 'list' ):
    return select( u -> numelems(u) = s, P ):

  else

    P := procname( n + s, s, ':-allowzero'=false ):
    return map( u -> u -~ 1, P ):

  end if:

end proc:

partitions( 5, 2, ':-allowzero'=false ); # [ [1,4], [2,3], [3,2], [4,1] ]
partitions( 5, 2, ':-allowzero'=true ); # [ [0,5], [1,4], [2,3], [3,2], [4,1], [5,0] ]
person maplemathmatt    schedule 22.03.2018