from itertools import product, zip_longest def split(arr,mults): #traverses the possibility tree if arr == []: #if the list of divisors (arr) is exhausted return int(all(x >= 0 for x in mults)) #return whether an integer is made plus = [p+q for p,q in zip_longest(mults,arr[0],fillvalue = 0)] minus = [p-q for p,q in zip_longest(mults,arr[0],fillvalue = 0)] return split(arr[1:],plus)+split(arr[1:],minus) def facs(arr): #generates prime signatures of divisors, given prime signature powers = [[j for j in range(i+1)] for i in arr] res = list(product(*powers)) res.pop(0) #removes 1 return res def multiparts(n,mx): #returns multiplicative partitions if n == 1: return [[]] res = [] for i in range(2,min(mx,n)+1): if n%i: continue for j in multiparts(n//i,i): res.append([i-1] + j) return res res = [] for n in range(1,21): #for tau ranging from 1 to 20 for num in multiparts(n,n): #iterate over potential prime signatures res.append(split(facs(num),[])) print(sorted((res)))