Emmanuel ROYER on Thu, 01 Aug 2024 16:49:19 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Enumeration of partitions


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)

For the moment, I'm using the following scripts, which don't seem very otpimal (the second is even longer than the first...)

Partitions(n)={
  my(P=partitions(n),Part=List(),L=List());
  for(i=1,#P,
    p=P[i];
    L=List();
    for(j=1,n,my(S=0);
              for(k=j,#p,if(p[k]==j,S+=1));
              listput(L,S)
    );
    listput(Part,Vecsmall(L));
  );
  Vec(Part)
};
\\.......
Partitions3(n)={
  my(P=partitions(n),Part=List(),L=List());
  for(i=1,#P,
    p=P[i];
    L=List();
    for(j=1,n,my(S=0);
              for(k=j,#p,if(p[k]==j,S+=1,if(p[k]>j,break(1))));
              listput(L,S)
    );
    listput(Part,Vecsmall(L));
  );
  Vec(Part)
};

? Partitions(57);
cpu time = 30,995 ms, real time = 30,995 ms.
? Partitions3(57);
cpu time = 38,106 ms, real time = 38,106 ms.

Best regards,
Emmanuel