| Emmanuel ROYER on Thu, 01 Aug 2024 22:39:53 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Enumeration of partitions |
Thank you very much Bill and Denis for your answers!
If a really need the representation with all the zeroes, then I use both of your method
Partitions(n)={
apply( p->
my( v = Vecsmall(0,n));
for( j = 1, matsize(p)[1], v[p[j,1]]=p[j,2]);
v
, [matreduce(Vec(pa)) | pa<-partitions(n)]
);
};
But, the time cost is so great that I had a second thought on the way I use the representations to use Bill representations of the partitions.
I forgot matreduce had already appear a few time ago, this is a great command even though I cannot remember its name!
Emmanuel Royer
Professeur à l'Université Clermont Auvergne
https://royer.perso.math.cnrs.fr
----
Institut CNRS-Pauli
IRL2842
CNRS & Wolfgang Pauli Institut
----- Mail original -----
De: "Denis Simon" <denis.simon@unicaen.fr>
À: "pari-users" <pari-users@pari.math.u-bordeaux.fr>
Envoyé: Jeudi 1 Août 2024 17:46:55
Objet: Re: Enumeration of partitions
Here is an improvement of my previous script, based on apply(), which can easily be replaced by parapply().
But still not competitive with Bill's solution...
Partitions6(n)=
{
apply( p->
my( v = Vecsmall(0,n));
for( j = 1, #p, v[p[j]]++);
v
, partitions(n)
);
}
Denis SIMON.
----- Mail original -----
> De: "Denis Simon" <denis.simon@unicaen.fr>
> À: "pari-users" <pari-users@pari.math.u-bordeaux.fr>
> Envoyé: Jeudi 1 Août 2024 17:16:00
> Objet: 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.