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