def change_base_module(self, other_base): """ change base_module to other_base_module (i.e. represent with respect to base_module) """ if self.base == other_base: return self n = self.number_field.degree if isinstance(other_base, list): other_base = matrix.FieldSquareMatrix(n, [vector.Vector(other_base[i]) for i in range(n)]) else: # matrix repr other_base = other_base.copy() tr_base_mat, tr_base_denom = _toIntegerMatrix( other_base.inverse(self.base)) denom = tr_base_denom * self.denominator mat_repr, numer = _toIntegerMatrix( tr_base_mat * self.mat_repr, 2) d = gcd.gcd(denom, numer) if d != 1: denom = ring.exact_division(denom, d) numer = ring.exact_division(numer, d) if numer != 1: mat_repr = numer * mat_repr return self.__class__([mat_repr, denom], self.number_field, other_base)
def __init__(self, pair_mat_repr, number_field, base=None, ishnf=False): """ pair_mat_repr: generators represented with respect to base_module 1: [[deg(number_field))-integral tuple/vector], denominator] 2: [integral matrix whose the number of row is deg(number_field), denominator] 3: rational matrix whose the number of row is deg(number_field) number_field: an instance of NumberField base: a base module represented with respect to Z[theta] 1: [deg(number_field)-rational tuple/vector], which represents basis 2: deg(number_field)-square non-singular rational matrix ishnf: if hnf_repr is already HNF-form, set True """ self.number_field = number_field size = self.number_field.degree if isinstance(base, bool): ishnf = base base = None if base == None: # power basis self.base = matrix.unitMatrix(size, rational.theIntegerRing) self.base.toFieldMatrix() elif isinstance(base, list): # list repr self.base = matrix.FieldSquareMatrix(size, base) else: # matrix repr if base.row != size: raise TypeError("The number of row of base is incorrect.") self.base = base.copy() self.base.toFieldMatrix() if not isinstance(pair_mat_repr, list): #rational matrix repr self.mat_repr, self.denominator = _toIntegerMatrix( pair_mat_repr) else: self.denominator = pair_mat_repr[1] if isinstance(pair_mat_repr[0], list): # list repr column = len(pair_mat_repr[0]) self.mat_repr = Submodule( size, column, pair_mat_repr[0], ishnf) else: # integral matrix repr self.mat_repr = Submodule.fromMatrix( pair_mat_repr[0].copy(), ishnf)