#!/usr/bin/python2 def expand(l): return expand_help(l, [], 1) def expand_help(l, r, s): """ Basically what we want to do is walk through a list like l = [(0, 2), (0, 1), (1, 2)] and turn it into something like r = [(-1, [(0, 2)]), (-1, [(0, 1), (1, 2)])], so there are a few different cases. if l[0] is a list then we should expand that, if not then it must be (1, [(0, 2)]) by definition of phi_b_ext. if l[1] is a list, expand that, then if l[2] is a list as well expand it and foil, otherwise multiply each element of l[1] by l[2], similarly, if l[2] is a list, multiply each element of l[2] by l[1], otherwise just multiply l[1] and l[2] """ if type(l[0]) == list: r.extend(expand_help(l[0], [], -1*s)) else: r.append((-1*s, [l[0]])) t = [] if type(l[1]) == list: a = expand_help(l[1], [], -1*s) if type(l[2]) == list: b = expand_help(l[2], [], s) for i in a: s_a, els_a = i for j in b: n_a = list(els_a) s_b, els_b = j n_a.extend(els_b) t.append((s_a*s_b, n_a)) else: for i in a: x, y = i y.append(l[2]) t.append((x, y)) else: if type(l[2]) == list: a = expand_help(l[2], [], s) for i in a: x, y = i if type(y) == list: new_l1 = [l[1]] new_l1.extend(y) t.append((-1*s*x, new_l1)) else: t.append((-1*s*x, [l[1], y])) else: t.append((-1*s, [l[1]])) t[-1][1].append(l[2]) r.extend(t) return r def test_expand(): a = [(0, 2), (0, 1), (1, 2)] r = [(-1, [(0, 2)]), (-1, [(0, 1), (1, 2)])] t = expand(a) print "test 1:" print "-as2 - as1a12" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print a = [[(0, 2), (0, 1), (1, 2)], (2, 1), (1, 0)] r = [(1, [(0, 2)]), (1, [(0, 1), (1, 2)]), (-1, [(2, 1), (1, 0)])] t = expand(a) print "test 2:" print "-(-as2 - as1*a12) - a21*a1s" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print a = [(1, 0), (2, 1), [(0, 1), (1, 2), (2, 0)]] r = [(-1, [(1, 0)]), (1, [(2, 1), (0, 1)]), (1, [(2, 1), (1, 2), (2, 0)])] t = expand(a) print "test 3:" print "-a1s - a21*(-as1 - a12*a2s)" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print [57/418] a = [[(2, 0), (2, 1), (1, 0)], (2, 1), [(1, 0), (1, 2), [(2, 0), (2, 1), (1, 0)]]] r = [(1, [(2, 0)]), (1, [(2, 1), (1, 0)]), (1, [(2, 1), (1, 0)]), (-1, [(2, 1), (1 , 2), (2, 0)]), (-1, [(2, 1), (1, 2), (2, 1), (1, 0)])] t = expand(a) print "test 4:" print "-(-a2s - a21*a1s) - a21*(-a1s - a12*(-a2s - a21*a1s))" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print a = [(0, 1), [(0, 2), (0, 1), (1, 2)], (2, 1)] r = [(-1, [(0, 1)]), (1, [(0, 2), (2, 1)]), (1, [(0, 1), (1, 2), (2, 1)])] t = expand(a) print "test 5:" print "-as1 - (-as2 - as1*a12)*a21" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print a = [(1, 0), [(1, 2), (2, 0), (1, 0)], [(2, 1), (1, 0), (2, 0)]] r = [(-1, [(1, 0)]), (-1, [(1, 2), (2, 1)]), (-1, [(1, 2), (1, 0), (2, 0)]), (-1, [(2, 0), (1, 0), (2, 1)]), (-1, [(2, 0), (1, 0), (1, 0), (2, 0)])] t = expand(a) print "test 6:" print "-as1 - (-a12 + a2s*a1s)(-a21 - a1s*a2s)" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print a = [(1, 0), [(1, 2), [(0, 2), (0, 1), (1, 2)], (1, 0)], [(2, 1), (1, 0), (2, 0)]] r = [(-1, [(1, 0)]), (-1, [(1, 2), (2, 1)]), (-1, [(1, 2), (1, 0), (2, 0)]), (1, [(0, 2), (1, 0), (2, 1)]), (1, [(0, 2), (1, 0), (1, 0), (2, 0)]), (1, [(0, 1), (1, 2), (1, 0), (2, 1)]), (1, [(0, 1), (1, 2), (1, 0), (1, 0), (2, 0)])] t = expand(a) print "test 7:" print "-a1s - (-a12 - (-as2 - as1*a12)*a1s)*(-a12 - a1s*a2s)" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print print "test 9:" a = [(1, 0), [(1, 2), (2, 0), (1, 0)], [(2, 1), [(0, 2), (0, 1), (1, 2)], (2, 0)]] r = [(-1, [(1, 0)]), (-1, [(1, 2), (2, 1)]), (1, [(1, 2), (0, 2), (2, 0)]), (1, [(1, 2), (0, 1), (1, 2), (2, 0)]), (-1, [(2, 0), (1, 0), (2, 1)]), (1, [(2, 0), (1, 0), (0, 2), (2, 0)]), (1, [(2, 0), (1, 0), (0, 1), (1, 2), (2, 0)])] t = expand(a) print "-a1s - (-a12 - a2s*a1s)(-a21 - (-as2 - as1*a12)*a2s)" print "a = " + str(a) print "r = " + str(r) print "t = " + str(t) try: assert t == r print "PASS" except AssertionError: print "FAILED" exit() print test_expand() a = [[[[(3, 0), (3, 1), (1, 0)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [(2, 0), (2, 1), (1, 0)]], [[(3, 1), [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], (2, 1)], [[[[(3, 4), (3, 1), (1, 4)], (3, 1), (1, 4)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [(4, 1), [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], (2, 1)]], [[(1, 0), [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 0), (4, 1), (1, 0)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [(2, 0), (2, 1), (1, 0)]]], [[(1, 3), (1, 2), [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[[[(4, 3), (4, 1), (1, 3)], (4, 1), (1, 3)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]]], [[(3, 0), (3, 1), (1, 0)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [(2, 0), (2, 1), (1, 0)]]]], [[[[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[[[(3, 4), (3, 1), (1, 4)], (3, 1), (1, 4)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)]], [[(3, 1), [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], (2, 1)], [[[[(3, 4), (3, 1), (1, 4)], (3, 1), (1, 4)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [(4, 1), [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], (2, 1)]], [[[[(1, 2), [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)]], [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)]], [[(1, 3), (1, 2), [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[[[(4, 3), (4, 1), (1, 3)], (4, 1), (1, 3)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]]], [[[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[[[(3, 4), (3, 1), (1, 4)], (3, 1), (1, 4)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)]]], [[(1, 3), (1, 2), [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [(1, 4), (1, 2), [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[[[(4, 3), (4, 1), (1, 3)], (4, 1), (1, 3)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]]], [[[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[[[(3, 4), (3, 1), (1, 4)], (3, 1), (1, 4)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)]]]], [[[(2, 0), (2, 1), (1, 0)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)], [[(4, 0), (4, 1), (1, 0)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [(2, 0), (2, 1), (1, 0)]]], [[[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)], [[(2, 4), (2, 1), (1, 4)], (2, 1), (1, 4)], [[[[(4, 3), (4, 1), (1, 3)], (4, 1), (1, 3)], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]], [[(4, 2), (4, 1), (1, 2)], (4, 1), (1, 2)], [[(2, 3), (2, 1), (1, 3)], (2, 1), (1, 3)]]], [[(3, 0), (3, 1), (1, 0)], [[(3, 2), (3, 1), (1, 2)], (3, 1), (1, 2)], [(2, 0), (2, 1), (1, 0)]]]] print "calling expand on a" print expand(a)