Ruud H.G. van Tol on Fri, 12 Dec 2025 15:35:15 +0100


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

Re: set partitions, or mutually disjoint subsets



On 2025-12-11 00:53, Ruud H.G. van Tol wrote:
> On 2025-12-09 14:18, Ruud H.G. van Tol wrote:
>> Mainly for fun, and to learn more about pari,
>> I'm looking for an efficient way to transform a number N (width)
>> into a set of K (binary) vectors (each of length K and at least one 1).
>
> One way to do it:

That wasn't good.


A little better:

{ vec_xor(v)= my(t=0);[t=bitxor(t,e)|e<-v];t; }

{ my( n=10, k=3, s=2^n-1, r=[], t, g=primes(n)~, h=vecsum(g) );
  setsearch( divisors(h), k) || return;
  h/= k;

  forpart(p=s
  , (s == vec_xor(p)) || next;
    t= vecsort([Vecrev(digits(e,2),n)|e<-p]);
    foreach(t,f, (h == f*g) || next(2));
    print([(matdiagonal(f)*g)~|f<-t]);
    r= concat(r,[t])
  ,
  , [k,k]
  );
}

[[0, 0, 0, 0, 11, 13, 0, 19, 0, 0], [0, 3, 0, 0, 0, 0, 17, 0, 23, 0], [2, 0, 5, 7, 0, 0, 0, 0, 0, 29]] [[0, 0, 0, 7, 0, 13, 0, 0, 23, 0], [0, 3, 0, 0, 11, 0, 0, 0, 0, 29], [2, 0, 5, 0, 0, 0, 17, 19, 0, 0]] [[0, 0, 0, 7, 0, 0, 17, 19, 0, 0], [0, 3, 0, 0, 11, 0, 0, 0, 0, 29], [2, 0, 5, 0, 0, 13, 0, 0, 23, 0]]


But this does many skips in for-loops, something I like to get rid of.

Am now looking into bin-packing examples, see also https://oeis.org/A331541.

-- Ruud