import os import sys from memoized import memoized import numpy from fractions import Fraction INIT_VAL = 60 CAPS = {} def series_value(*vals): tot_den = 0 for v in vals: tot_den = tot_den + Fraction(1, v) return Fraction(1, tot_den) def par_value(*vals): return sum(vals) all_forms = set() @memoized def add_forms2(f1, f2): forms = set() for one_f in f1: for two_f in f2: forms.add(series_value(one_f, two_f)) forms.add(par_value(one_f, two_f)) forms = forms - all_forms all_forms.update(forms) return forms def add_forms(f1, f2): if len(f1) < len(f2): first = f1 second = f2 else: first = f2 second = f1 return add_forms2(tuple(first), tuple(second)) @memoized def cap_forms(num_caps): if num_caps == 1: all_forms.add(INIT_VAL) return [INIT_VAL] num_set1 = 1 forms = set() while num_set1 < num_caps: num_set2 = num_caps - num_set1 f1 = cap_forms(num_set1) #print num_caps,num_set1,sorted(f1) f2 = cap_forms(num_set2) #print num_caps,num_set2,sorted(f2) forms.update(add_forms(f1, f2)) num_set1 += 1 print "Returning for num_caps %d = %d" % (num_caps,len(forms)) #print sorted(forms) return list(forms) def cap_forms_fast(num_caps): if num_caps > 3: return 3*cap_forms_fast(num_caps-1) - 2*cap_forms_fast(num_caps-2) elif num_caps == 3: return 7 elif num_caps == 2: return 3 else: return 1 def main(): if len(sys.argv) <= 1: print len(cap_forms(10)) else: print len(cap_forms(int(sys.argv[1]))) print len(all_forms) #print sorted(all_forms) #print cap_forms_fast(10) if __name__ == "__main__": sys.exit(main())