Search code examples
maple

function which return s-tuples with non-negative integers and a given sum $n$


I am trying to write a function which return s-tuples with non-negative integers and a given sum $n$ (the sum of each tuple is $n$). In the program, I need to use s nested loops:

 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;

How could I use only a few loops instead of s loops? Thank you very much.


Solution

  • I suggest the combinat:-composition() command. On its own, the command won't include zero terms, but you can instead partition n+s and remove 1 from each term at the end:

    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] ]