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.