a(n) = customparts(unitary_divisors(n), n) \\ this one comes from Antti Karttunen. unitary_divisors(n) = select(d -> (1==gcd(d, n/d)), divisors(n)); customparts(vparts, n) = { maxSum = n; count = 1; vpartsCopy = vparts; vInv = Map(); for(i = 1, #vparts, mapput(vInv, vparts[i], i); ); for(i = 0, n \ vparts[1] - 1, custompartsIterate(i) ); count } custompartsIterate(n) = { my(v = vector(n, i, 1), s = sum(i = 1, n, vpartsCopy[v[i]])); while(v != 0, j = 0; s = sum(i=1,#v,vpartsCopy[v[i]]); if(s < maxSum, mapisdefined(vInv, maxSum - s, &j); if(j >= v[#v], count++ ); v = nxtVl(v, #vpartsCopy); , v = nxtVs(v) ) ) } nxtVl(v, {u = oo}) = { if(v[#v] + 1 <= u, v[#v]++; v , nxtVs(v) ) } nxtVs(v) = { forstep(j = #v - 1, 1, -1, if(v[j] + 1 < v[#v], v[j]++; for(k = j + 1, #v, v[k] = v[j] ); return(v) ) ) ; return([0]) }