#! /usr/bin/python tax_brackets = [ 6000, 0.17, 25000, 0.30, 75000, 0.42, 150000, 0.47 ] medicare_levy = [ 0, 0.015, 50000, 0.025 ] print "hi" def calc_from_brackets(amount,brackets): value = 0 last_ratio = 0 brackets = brackets[:] while len(brackets): threshold = brackets.pop(0) ratio = brackets.pop(0) delta = ratio-last_ratio t = amount-threshold if t<=0: return value value += delta*t last_ratio = ratio return value def calc_from_intervals(amount,intervals): final_ratio = 0 intervals = intervals[:] while(len(intervals)): threshold = intervals.pop(0) ratio = intervals.pop(0) if amount >= threshold: final_ratio = ratio return amount * final_ratio def income_tax(x): return calc_from_brackets(x,tax_brackets) def medicare(x): return calc_from_intervals(x,medicare_levy) def taxedincome(income): return income-income_tax(income)-medicare(income) def untaxed(taxed): brackets = tax_brackets[:] intervals = medicare_levy[:] (x,y,tax,medicare) = (0.0,0.0,0.0,0.0) while True: max = None if len(brackets): max = brackets[0] if(intervals): if(max != None): max = min(max,intervals[0]) else: max = intervals[0] taxable = (taxed-y)/(1.0-tax-medicare)+x # print "### %8.1f %8.1f %5.3f %5.3f %8.1f" % (x,y,tax,medicare,taxable) if max == None or taxable <= max: return taxable if len(intervals) and (not len(brackets) or intervals[0] < brackets[0]): x2 = intervals.pop(0) new_tax = intervals.pop(0) y += (x2-x) * (1-tax-medicare) - (new_tax-medicare)*x2 x = x2 medicare = new_tax else: x2 = brackets.pop(0) new_tax = brackets.pop(0) y += (x2-x) * (1-tax-medicare) x = x2 tax = new_tax for income in range(0,200000,2000): taxed = taxedincome(income) income2 = untaxed(taxed) ok = "." if (income2 != income): ok = "X" print "%6d %6d %6d %s" % (income,taxed,income2,ok)