toprim(n) = my (d=[]); forprime (p=2, oo, if (n==0, return (d), d=concat(n%p,d); n\=p)) classify(n) = if (n==0, 0, vecsum(toprim(n))) { for (w=0, 6, mi = if (w==0, 0, prod(k=1,w-1,prime(k))); \\ smaller number with w digits mx = prod(k=1,w,prime(k))-1; \\ greatest number with w digits if (#toprim(mi)!=w || #toprim(mx)!=w, print ("#oops"); print (mi " " toprim(mi)); print (mx " " toprim(mx)); quit ); vv = [mi..mx]; \\ numbers with w digits cl = apply(classify, vv); \\ corresponding classes cc = Set(cl); \\ all classes mm = vector(#cc, c, []); \\ members by class for (k=1, #vv, c = setsearch(cc, cl[k]); mm[c] = concat(mm[c], vv[k]); ); nb = vector(#cc); \\ # of members seen so far by class for (k=1, #vv, c = setsearch(cc, cl[k]); print (vv[k] " " mm[c][#mm[c]-nb[c]]); nb[c]++; ); ); } quit