def generate_secrets(a0, b0): # select 3 pairs from 5, they are all independent # select 4 pairs from 5, they are all not independent, this is certainly n = len(a0.D) choose_3_from_5 = list(itertools.combinations(range(5), 3)) count = 0 while True: print(count) count += 1 res = [] a1, b1 = generate_vec(n), generate_vec(n) a2, b2 = generate_vec(n), generate_vec(n) a3, b3 = generate_vec(n), generate_vec(n) a4, b4 = generate_vec(n), generate_vec(n) res.append([a0, a1, a2, a3, a4]) res.append([b0, b1, b2, b3, b4]) fail_flag = False for choose in choose_3_from_5: chosen_vecs = set() for i in range(len(choose)): chosen_vecs.add(res[0][choose[i]]) chosen_vecs.add(res[1][choose[i]]) if len(chosen_vecs) != 6: print("p1"); fail_flag = True break if not is_independent(chosen_vecs): print("p2") fail_flag = True break if not fail_flag: return res
def generate_secrets(a0, b0): # select 3 pairs from 5, they are all independent # select 4 pairs from 5, they are all not independent, this is certainly n = len(a0.D) choose_3_from_5 = list(itertools.combinations(range(5), 3)) count = 0 while True: print(count) count += 1 res = [] a1, b1 = generate_vec(n), generate_vec(n) a2, b2 = generate_vec(n), generate_vec(n) a3, b3 = generate_vec(n), generate_vec(n) a4, b4 = generate_vec(n), generate_vec(n) res.append([a0, a1, a2, a3, a4]) res.append([b0, b1, b2, b3, b4]) fail_flag = False for choose in choose_3_from_5: chosen_vecs = set() for i in range(len(choose)): chosen_vecs.add(res[0][choose[i]]) chosen_vecs.add(res[1][choose[i]]) if len(chosen_vecs) != 6: print("p1") fail_flag = True break if not is_independent(chosen_vecs): print("p2") fail_flag = True break if not fail_flag: return res
def my_is_independent(L): ''' Input: - L: a list of Vecs Output: - boolean: true if the list is linearly independent Examples: >>> D = {0, 1, 2} >>> L = [Vec(D,{0: 1}), Vec(D,{1: 1}), Vec(D,{2: 1}), Vec(D,{0: 1, 1: 1, 2: 1}), Vec(D,{0: 1, 1: 1}), Vec(D,{1: 1, 2: 1})] >>> my_is_independent(L) False >>> my_is_independent(L[:2]) True >>> my_is_independent(L[:3]) True >>> my_is_independent(L[1:4]) True >>> my_is_independent(L[0:4]) False >>> my_is_independent(L[2:]) False >>> my_is_independent(L[2:5]) False >>> L == [Vec(D,{0: 1}), Vec(D,{1: 1}), Vec(D,{2: 1}), Vec(D,{0: 1, 1: 1, 2: 1}), Vec(D,{0: 1, 1: 1}), Vec(D,{1: 1, 2: 1})] True ''' return is_independent(L)
def superset_basis(C, T): ''' Input: - C: linearly independent set of Vecs - T: set of Vecs such that every Vec in S is in Span(T) Output: Linearly independent set S consisting of all Vecs in C and some in T such that the span of S is the span of T (i.e. S is a basis for the span of T). Example: >>> from vec import Vec >>> from independence import is_independent >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> sb = superset_basis({a0, a3}, {a0, a1, a2}) >>> a0 in sb and a3 in sb True >>> is_independent(sb) True >>> all(x in [a0,a1,a2,a3] for x in sb) True ''' start, tmp = C.copy(), C.copy() for x in T: tmp.add(x) if is_independent(tmp): start.add(x) else: tmp.discard(x) return start
def superset_basis(C, T): ''' Input: - C: linearly independent set of Vecs - T: set of Vecs such that every Vec in C is in Span(T) Output: Linearly independent set S consisting of all Vecs in C and some in T such that the span of S is the span of T (i.e. S is a basis for the span of T). Example: >>> from vec import Vec >>> from independence import is_independent >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> sb = superset_basis({a0, a3}, {a0, a1, a2}) >>> a0 in sb and a3 in sb True >>> is_independent(sb) True >>> all(x in [a0,a1,a2,a3] for x in sb) True ''' S = {x for x in C} for v in T: S.add(v) if is_independent(S) == False: S.remove(v) return S
def superset_basis(C, T): ''' Input: - C: linearly independent set of Vecs - T: set of Vecs such that every Vec in C is in Span(T) Output: Linearly independent set S consisting of all Vecs in C and some in T such that the span of S is the span of T (i.e. S is a basis for the span of T). Example: >>> from vec import Vec >>> from independence import is_independent >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> sb = superset_basis({a0, a3}, {a0, a1, a2}) >>> a0 in sb and a3 in sb True >>> is_independent(sb) True >>> all(x in [a0,a1,a2,a3] for x in sb) True ''' S={x for x in C} for v in T: S.add(v) if is_independent(S)==False: S.remove(v) return S
def subset(T): A = [] for i in T: if i not in A: A.append(i) if not is_independent(A): A.pop() return A
def is_invertible(M): ''' input: A matrix, M outpit: A boolean indicating if M is invertible. >>> M = Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): 0, (1, 2): 1, (3, 2): 0, (0, 0): 1, (3, 3): 4, (3, 0): 0, (3, 1): 0, (1, 1): 2, (2, 1): 0, (0, 2): 1, (2, 0): 0, (1, 3): 0, (2, 3): 1, (2, 2): 3, (1, 0): 0, (0, 3): 0}) >>> is_invertible(M) True >>> M1 = Mat(({0,1,2},{0,1,2}),{(0,0):1,(0,2):2,(1,2):3,(2,2):4}) >>> is_invertible(M1) False ''' return is_independent([v for v in mat2coldict(M).values()]) and (len(M.D[0]) == len(M.D[1]))
def is_invertible(M): ''' input: A matrix, M outpit: A boolean indicating if M is invertible. >>> M = Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): 0, (1, 2): 1, (3, 2): 0, (0, 0): 1, (3, 3): 4, (3, 0): 0, (3, 1): 0, (1, 1): 2, (2, 1): 0, (0, 2): 1, (2, 0): 0, (1, 3): 0, (2, 3): 1, (2, 2): 3, (1, 0): 0, (0, 3): 0}) >>> is_invertible(M) True >>> M1 = Mat(({0,1,2},{0,1,2}),{(0,0):1,(0,2):2,(1,2):3,(2,2):4}) >>> is_invertible(M1) False ''' cols = mat2coldict(M) return is_independent(cols.values())
def subset_basis(T): ''' Input: - T: a set of Vecs Output: - set S containing Vecs from T that is a basis for Span T. Examples: The following tests use the procedure is_independent, provided in module independence >>> from vec import Vec >>> from independence import is_independent >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> sb = subset_basis({a0, a1, a2, a3}) >>> len(sb) 3 >>> all(v in [a0, a1, a2, a3] for v in sb) True >>> is_independent(sb) True >>> b0 = Vec({0,1,2,3},{0:2,1:2,3:4}) >>> b1 = Vec({0,1,2,3},{0:1,1:1}) >>> b2 = Vec({0,1,2,3},{2:3,3:4}) >>> b3 = Vec({0,1,2,3},{3:3}) >>> sb = subset_basis({b0, b1, b2, b3}) >>> len(sb) 3 >>> all(v in [b0, b1, b2, b3] for v in sb) True >>> is_independent(sb) True >>> D = {'a','b','c','d'} >>> c0, c1, c2, c3, c4 = Vec(D,{'d': one, 'c': one}), Vec(D,{'d': one, 'a': one, 'c': one, 'b': one}), Vec(D,{'a': one}), Vec(D,{}), Vec(D,{'d': one, 'a': one, 'b': one}) >>> subset_basis({c0,c1,c2,c3,c4}) == {c0,c1,c2,c4} True ''' res = set() for x in T: res.add(x) if is_independent(res) == False: res.remove(x) return res
def subset_basis(T): ''' Input: - T: a set of Vecs Output: - set S containing Vecs from T that is a basis for Span T. Examples: The following tests use the procedure is_independent, provided in module independence >>> from vec import Vec >>> from independence import is_independent >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> sb = subset_basis({a0, a1, a2, a3}) >>> len(sb) 3 >>> all(v in [a0, a1, a2, a3] for v in sb) True >>> is_independent(sb) True >>> b0 = Vec({0,1,2,3},{0:2,1:2,3:4}) >>> b1 = Vec({0,1,2,3},{0:1,1:1}) >>> b2 = Vec({0,1,2,3},{2:3,3:4}) >>> b3 = Vec({0,1,2,3},{3:3}) >>> sb = subset_basis({b0, b1, b2, b3}) >>> len(sb) 3 >>> all(v in [b0, b1, b2, b3] for v in sb) True >>> is_independent(sb) True >>> D = {'a','b','c','d'} >>> c0, c1, c2, c3, c4 = Vec(D,{'d': one, 'c': one}), Vec(D,{'d': one, 'a': one, 'c': one, 'b': one}), Vec(D,{'a': one}), Vec(D,{}), Vec(D,{'d': one, 'a': one, 'b': one}) >>> subset_basis({c0,c1,c2,c3,c4}) == {c0,c1,c2,c4} True ''' res = set() for x in T: res.add(x) if is_independent(res)==False: res.remove(x) return res