返回带有非负整数和给定总和$ n $的s-tuples的函数

时间:2018-02-26 13:32:55

标签: maple

我正在尝试编写一个函数,它返回带有非负整数和给定总和$ n $的s元组(每个元组的总和是$ n $)。在程序中,我需要使用s嵌套循环:

 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循环?非常感谢你。

1 个答案:

答案 0 :(得分:2)

我建议使用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] ]