#!/usr/bin/env python3 from functools import lru_cache from math import isqrt @lru_cache(None) def search(B): S={a+b for a in B for b in B} if 113 in S:return False D=S-{a*b for a in B for b in B} if not D:return True def factors(s): return [(u,s//u) for u in range(1,isqrt(s)+1) if s%u==0 and s//u<113] s=min(D,key=lambda s:len(factors(s))) return any(search(tuple(sorted(set(B)|{u,v}))) for u,v in factors(s)) print(search((1,2,3,5,7)),search.cache_info())