def direct_sum_decompose(U_basis, V_basis, w): ''' Input: - U_basis: a list of Vecs forming a basis for a vector space U - V_basis: a list of Vecs forming a basis for a vector space V - w: a Vec in the direct sum of U and V Output: - a pair (u, v) such that u + v = w, u is in U, v is in V Example: >>> D = {0,1,2,3,4,5} >>> U_basis = [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, w) >>> (u + v - w).is_almost_zero() True >>> U_matrix = coldict2mat(U_basis) >>> V_matrix = coldict2mat(V_basis) >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> ww = Vec(D,{0: 2, 1: 5, 2: 51, 4: 1, 5: 7}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, ww) >>> (u + v - ww).is_almost_zero() True >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> U_basis == [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] True >>> V_basis == [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] True >>> w == Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) True ''' u = rep2vec(vec2rep(U_basis, w), U_basis) v = rep2vec(vec2rep(V_basis, w), V_basis) return (u,v)
def direct_sum_decompose(U_basis, V_basis, w): ''' Input: - U_basis: a list of Vecs forming a basis for a vector space U - V_basis: a list of Vecs forming a basis for a vector space V - w: a Vec in the direct sum of U and V Output: - a pair (u, v) such that u + v = w, u is in U, v is in V Example: >>> D = {0,1,2,3,4,5} >>> U_basis = [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, w) >>> (u + v - w).is_almost_zero() True >>> U_matrix = coldict2mat(U_basis) >>> V_matrix = coldict2mat(V_basis) >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> ww = Vec(D,{0: 2, 1: 5, 2: 51, 4: 1, 5: 7}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, ww) >>> (u + v - ww).is_almost_zero() True >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> U_basis == [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] True >>> V_basis == [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] True >>> w == Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) True ''' u = rep2vec(vec2rep(U_basis, w), U_basis) v = rep2vec(vec2rep(V_basis, w), V_basis) return (u, v)
def direct_sum_decompose(U_basis, V_basis, w): ''' Input: - U_basis: a list of Vecs forming a basis for a vector space U - V_basis: a list of Vecs forming a basis for a vector space V - w: a Vec in the direct sum of U and V Output: - a pair (u, v) such that u + v = w, u is in U, v is in V Example: >>> D = {0,1,2,3,4,5} >>> U_basis = [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, w) >>> (u + v - w).is_almost_zero() True >>> U_matrix = coldict2mat(U_basis) >>> V_matrix = coldict2mat(V_basis) >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> ww = Vec(D,{0: 2, 1: 5, 2: 51, 4: 1, 5: 7}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, ww) >>> (u + v - ww).is_almost_zero() True >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> U_basis == [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] True >>> V_basis == [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] True >>> w == Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) True ''' U_V_basis = list(U_basis) U_V_basis.extend(V_basis) w_coordinates = vec2rep(U_V_basis, w) w_u_coord = list() w_v_coord = list() for n in range(len(U_V_basis)): if n < len(U_basis): w_u_coord.append(w_coordinates[n]) else: w_v_coord.append(w_coordinates[n]) u = rep2vec(list2vec(w_u_coord), U_basis) v = rep2vec(list2vec(w_v_coord), V_basis) return (u, v)
def morph(S, B): """ Input: - S: a list of distinct Vecs - B: a list of linearly independent Vecs all in Span S Output: a list of pairs of vectors to inject and eject (see problem description) Example: >>> # This is how our morph works. Yours may yield different results. >>> # Note: Make a copy of S to modify instead of modifying S itself. >>> from vecutil import list2vec >>> from vec import Vec >>> S = [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]] >>> B = [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]] >>> D = {0, 1, 2} >>> morph(S, B) == [(Vec(D,{0: 1, 1: 1, 2: 0}), Vec(D,{0: 1, 1: 0, 2: 0})), (Vec(D,{0: 0, 1: 1, 2: 1}), Vec(D,{0: 0, 1: 1, 2: 0})), (Vec(D,{0: 1, 1: 0, 2: 1}), Vec(D,{0: 0, 1: 0, 2: 1}))] True >>> S == [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]] True >>> B == [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]] True >>> from GF2 import one >>> D = {0, 1, 2, 3, 4, 5, 6, 7} >>> S = [Vec(D,{1: one, 2: one, 3: one, 4: one}), Vec(D,{1: one, 3: one}), Vec(D,{0: one, 1: one, 3: one, 5: one, 6: one}), Vec(D,{3: one, 4: one}), Vec(D,{3: one, 5: one, 6: one})] >>> B = [Vec(D,{2: one, 4: one}), Vec(D,{0: one, 1: one, 2: one, 3: one, 4: one, 5: one, 6: one}), Vec(D,{0: one, 1: one, 2: one, 5: one, 6: one})] >>> sol = morph(S, B) >>> sol == [(B[0],S[0]), (B[1],S[2]), (B[2],S[3])] or sol == [(B[0],S[1]), (B[1],S[2]), (B[2],S[3])] True >>> # Should work the same regardless of order of S >>> from random import random >>> sol = morph(sorted(S, key=lambda x:random()), B) >>> sol == [(B[0],S[0]), (B[1],S[2]), (B[2],S[3])] or sol == [(B[0],S[1]), (B[1],S[2]), (B[2],S[3])] True """ tmp_S = S[:] tmp_B = B[:] A = [] res = [] for i in range(len(tmp_B)): z = tmp_B[i] idxes = vec2rep(tmp_S, z) idxes = [idxes[k] for k in idxes.D] for i in range(len(idxes)): if idxes[i] != 0 and tmp_S[i] not in A: w = tmp_S[i] break tmp_S.remove(w) tmp_S.append(z) A.append(z) res.append((z, w)) return res
def morph(S, B): ''' Input: - S: a list of distinct Vecs - B: a list of linearly independent Vecs all in Span S Output: a list of pairs of vectors to inject and eject (see problem description) Example: >>> # This is how our morph works. Yours may yield different results. >>> # Note: Make a copy of S to modify instead of modifying S itself. >>> from vecutil import list2vec >>> from vec import Vec >>> S = [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]] >>> B = [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]] >>> D = {0, 1, 2} >>> morph(S, B) == [(Vec(D,{0: 1, 1: 1, 2: 0}), Vec(D,{0: 1, 1: 0, 2: 0})), (Vec(D,{0: 0, 1: 1, 2: 1}), Vec(D,{0: 0, 1: 1, 2: 0})), (Vec(D,{0: 1, 1: 0, 2: 1}), Vec(D,{0: 0, 1: 0, 2: 1}))] True >>> S == [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]] True >>> B == [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]] True >>> from GF2 import one >>> D = {0, 1, 2, 3, 4, 5, 6, 7} >>> S = [Vec(D,{1: one, 2: one, 3: one, 4: one}), Vec(D,{1: one, 3: one}), Vec(D,{0: one, 1: one, 3: one, 5: one, 6: one}), Vec(D,{3: one, 4: one}), Vec(D,{3: one, 5: one, 6: one})] >>> B = [Vec(D,{2: one, 4: one}), Vec(D,{0: one, 1: one, 2: one, 3: one, 4: one, 5: one, 6: one}), Vec(D,{0: one, 1: one, 2: one, 5: one, 6: one})] >>> sol = morph(S, B) >>> sol == [(B[0],S[0]), (B[1],S[2]), (B[2],S[3])] or sol == [(B[0],S[1]), (B[1],S[2]), (B[2],S[3])] True >>> # Should work the same regardless of order of S >>> from random import random >>> sol = morph(sorted(S, key=lambda x:random()), B) >>> sol == [(B[0],S[0]), (B[1],S[2]), (B[2],S[3])] or sol == [(B[0],S[1]), (B[1],S[2]), (B[2],S[3])] True ''' tmp_S = S[:] tmp_B = B[:] A = [] res = [] for i in range(len(tmp_B)): z = tmp_B[i] idxes = vec2rep(tmp_S, z) idxes = [idxes[k] for k in idxes.D] for i in range(len(idxes)): if idxes[i] != 0 and tmp_S[i] not in A: w = tmp_S[i] break tmp_S.remove(w) tmp_S.append(z) A.append(z) res.append((z, w)) return res
def direct_sum_decompose(U_basis, V_basis, w): ''' Input: - U_basis: a list of Vecs forming a basis for a vector space U - V_basis: a list of Vecs forming a basis for a vector space V - w: a Vec in the direct sum of U and V Output: - a pair (u, v) such that u + v = w, u is in U, v is in V Example: >>> D = {0,1,2,3,4,5} >>> U_basis = [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, w) >>> (u + v - w).is_almost_zero() True >>> U_matrix = coldict2mat(U_basis) >>> V_matrix = coldict2mat(V_basis) >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> ww = Vec(D,{0: 2, 1: 5, 2: 51, 4: 1, 5: 7}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, ww) >>> (u + v - ww).is_almost_zero() True >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> U_basis == [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] True >>> V_basis == [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] True >>> w == Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) True ''' direct_sum_basis = U_basis + V_basis x = vec2rep(direct_sum_basis, w) # len(x) = len(direct_sum_basis) u = Vec(U_basis[0].D, {}) v = Vec(V_basis[0].D, {}) for i in range(len(U_basis)): u = u + x[i] * U_basis[i] for j in range(len(V_basis)): v = v + x[len(U_basis) + j] * V_basis[j] return (u, v)
def direct_sum_decompose(U_basis, V_basis, w): ''' Input: - U_basis: a list of Vecs forming a basis for a vector space U - V_basis: a list of Vecs forming a basis for a vector space V - w: a Vec in the direct sum of U and V Output: - a pair (u, v) such that u + v = w, u is in U, v is in V Example: >>> D = {0,1,2,3,4,5} >>> U_basis = [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, w) >>> (u + v - w).is_almost_zero() True >>> U_matrix = coldict2mat(U_basis) >>> V_matrix = coldict2mat(V_basis) >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> ww = Vec(D,{0: 2, 1: 5, 2: 51, 4: 1, 5: 7}) >>> (u, v) = direct_sum_decompose(U_basis, V_basis, ww) >>> (u + v - ww).is_almost_zero() True >>> (u - U_matrix*solve(U_matrix, u)).is_almost_zero() True >>> (v - V_matrix*solve(V_matrix, v)).is_almost_zero() True >>> U_basis == [Vec(D,{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec(D,{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec(D,{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] True >>> V_basis == [Vec(D,{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec(D,{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] True >>> w == Vec(D,{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) True ''' direct_sum_basis = U_basis+V_basis x = vec2rep(direct_sum_basis, w) # len(x) = len(direct_sum_basis) u = Vec(U_basis[0].D, {}); v = Vec(V_basis[0].D, {}) for i in range(len(U_basis)): u = u+x[i]*U_basis[i] for j in range(len(V_basis)): v = v+x[len(U_basis)+j]*V_basis[j] return (u, v)
def exchange(S, A, z): u = vec2rep(S, z) for i, v in enumerate(S): coef = u[i] if v not in A and coef != 0: return v