| Denis Simon on Thu, 01 Aug 2024 17:16:08 +0200 | 
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Enumeration of partitions | 
If you want the output to contain lots of 0, you can try the following function.
However, it does not return exactly the same as your functions, so I am possibly mistaking somewhere...
Denis SIMON.
Partitions4(n)=
{
  my(P=partitions(n));
  my(Part = vector(#P,i,Vecsmall(0,n)));
  for( i = 1, #P,
    p = P[i];
    for( j = 1, #p,
      k = p[j];
      Part[i][k]++
    )
  );
  return(Part);
}
----- Mail original -----
> De: "Bill Allombert" <Bill.Allombert@math.u-bordeaux.fr>
> À: "pari-users" <pari-users@pari.math.u-bordeaux.fr>
> Envoyé: Jeudi 1 Août 2024 17:06:30
> Objet: Re: Enumeration of partitions
> On Thu, Aug 01, 2024 at 04:49:03PM +0200, Emmanuel ROYER wrote:
>> Dear Pari users!
>> 
>> There are two ways of representing a partition of an integer n, either as
>> (a_1,...,a_q) where n=a_1+...+a_q
>> or in the form
>> (1^{b_1},...,n^{b_n}) with n=b_1+2b_2+...+nb_n.
>> 
>> Unless I'm mistaken, partitions(n) returns the partitions in the first form.
>> How can we translate the result into the second form as efficiently as
>> possible? (Related to: how to count multiplicities in an ordered vector)
> 
> You can use matreduce!
> 
> ? matreduce([1,1,1,1,3]))
> %18 = [1,4;3,1]
> 
>> ? Partitions(57);
>> cpu time = 30,995 ms, real time = 30,995 ms.
>> ? Partitions3(57);
>> cpu time = 38,106 ms, real time = 38,106 ms.
> 
> [matreduce(Vec(x)) | x <- partitions(57)];
>  ***   last result computed in 495 ms.
> 
> Cheers,
> Bill.