def normalize_square_matrices(matrices): """ Find a common space for all matrices. OUTPUT: A list of matrices, all elements of the same matrix space. EXAMPLES:: sage: from sage.groups.matrix_gps.finitely_generated import normalize_square_matrices sage: m1 = [[1,2],[3,4]] sage: m2 = [2, 3, 4, 5] sage: m3 = matrix(QQ, [[1/2,1/3],[1/4,1/5]]) sage: m4 = MatrixGroup(m3).gen(0) sage: normalize_square_matrices([m1, m2, m3, m4]) [ [1 2] [2 3] [1/2 1/3] [1/2 1/3] [3 4], [4 5], [1/4 1/5], [1/4 1/5] ] """ deg = [] gens = [] for m in matrices: if is_MatrixGroupElement(m): deg.append(m.parent().degree()) gens.append(m.matrix()) continue if is_Matrix(m): if not m.is_square(): raise TypeError('matrix must be square') deg.append(m.ncols()) gens.append(m) continue try: m = list(m) except TypeError: gens.append(m) continue if isinstance(m[0], (list, tuple)): m = [list(_) for _ in m] degree = ZZ(len(m)) else: degree, rem = ZZ(len(m)).sqrtrem() if rem != 0: raise ValueError( 'list of plain numbers must have square integer length') deg.append(degree) gens.append(matrix(degree, degree, m)) deg = set(deg) if len(set(deg)) != 1: raise ValueError('not all matrices have the same size') gens = Sequence(gens, immutable=True) MS = gens.universe() if not is_MatrixSpace(MS): raise TypeError('all generators must be matrices') if MS.nrows() != MS.ncols(): raise ValueError('matrices must be square') return gens
def normalize_square_matrices(matrices): """ Find a common space for all matrices. OUTPUT: A list of matrices, all elements of the same matrix space. EXAMPLES:: sage: from sage.groups.matrix_gps.finitely_generated import normalize_square_matrices sage: m1 = [[1,2],[3,4]] sage: m2 = [2, 3, 4, 5] sage: m3 = matrix(QQ, [[1/2,1/3],[1/4,1/5]]) sage: m4 = MatrixGroup(m3).gen(0) sage: normalize_square_matrices([m1, m2, m3, m4]) [ [1 2] [2 3] [1/2 1/3] [1/2 1/3] [3 4], [4 5], [1/4 1/5], [1/4 1/5] ] """ deg = [] gens = [] for m in matrices: if is_MatrixGroupElement(m): deg.append(m.parent().degree()) gens.append(m.matrix()) continue if is_Matrix(m): if not m.is_square(): raise TypeError('matrix must be square') deg.append(m.ncols()) gens.append(m) continue try: m = list(m) except TypeError: gens.append(m) continue if isinstance(m[0], (list, tuple)): m = [list(_) for _ in m] degree = ZZ(len(m)) else: degree, rem = ZZ(len(m)).sqrtrem() if rem!=0: raise ValueError('list of plain numbers must have square integer length') deg.append(degree) gens.append(matrix(degree, degree, m)) deg = set(deg) if len(set(deg)) != 1: raise ValueError('not all matrices have the same size') gens = Sequence(gens, immutable=True) MS = gens.universe() if not is_MatrixSpace(MS): raise TypeError('all generators must be matrices') if MS.nrows() != MS.ncols(): raise ValueError('matrices must be square') return gens
def is_matrix_space(self): """ Return whether the free module is a matrix space. OUTPUT: Boolean. Whether the :meth:`free_module` factor in the tensor product is a matrix space. EXAMPLES:: sage: mip = MixedIntegerLinearProgram() sage: LF = mip.linear_functions_parent() sage: LF.tensor(RDF^2).is_matrix_space() False sage: LF.tensor(RDF^(2,2)).is_matrix_space() True """ from sage.matrix.matrix_space import is_MatrixSpace return is_MatrixSpace(self.free_module())