def __init__(self, parent, x, check=True): """ The Python constructor. See :class:`FinitelyPresentedGroupElement` for details. TESTS:: sage: G = FreeGroup('a, b') sage: H = G / [G([1]), G([2, 2, 2])] sage: H([1, 2, 1, -1]) a*b sage: TestSuite(G).run() sage: TestSuite(H).run() sage: G.<a,b> = FreeGroup() sage: H = G / (G([1]), G([2, 2, 2])) sage: x = H([1, 2, -1, -2]) sage: TestSuite(x).run() sage: TestSuite(G.one()).run() """ if not isinstance(x, GapElement): F = parent.free_group() free_element = F(x) fp_family = parent.one().gap().FamilyObj() x = libgap.ElementOfFpGroup(fp_family, free_element.gap()) ElementLibGAP.__init__(self, parent, x)
def __init__(self, parent, x, check=True): """ The Python constructor. TESTS:: sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap sage: G = AbelianGroupGap([2,3,4,5]) sage: f = G.aut().an_element() sage: TestSuite(f).run() """ if check: if not x in parent.gap(): raise ValueError("%s is not in the group %s" % (x, parent)) ElementLibGAP.__init__(self, parent, x)
def __init__(self, parent, M, check=True, convert=True): r""" Element of a matrix group over a generic ring. The group elements are implemented as Sage matrices. INPUT: - ``M`` -- a matrix. - ``parent`` -- the parent. - ``check`` -- bool (default: ``True``). If true does some type checking. - ``convert`` -- bool (default: ``True``). If true convert ``M`` to the right matrix space. TESTS:: sage: MS = MatrixSpace(GF(3),2,2) sage: G = MatrixGroup(MS([[1,0],[0,1]]), MS([[1,1],[0,1]])) sage: G.gen(0) [1 0] [0 1] sage: g = G.random_element() sage: TestSuite(g).run() """ if isinstance(M, GapElement): ElementLibGAP.__init__(self, parent, M) return if convert: M = parent.matrix_space()(M) from sage.libs.gap.libgap import libgap M_gap = libgap(M) if check: if not is_Matrix(M): raise TypeError("M must be a matrix") if M.parent() is not parent.matrix_space(): raise TypeError("M must be a in the matrix space of the group") parent._check_matrix(M, M_gap) ElementLibGAP.__init__(self, parent, M_gap)
def __init__(self, M, parent, check=True, convert=True): r""" Element of a matrix group over a generic ring. The group elements are implemented as Sage matrices. INPUT: - ``M`` -- a matrix. - ``parent`` -- the parent. - ``check`` -- bool (default: ``True``). If true does some type checking. - ``convert`` -- bool (default: ``True``). If true convert ``M`` to the right matrix space. TESTS:: sage: MS = MatrixSpace(GF(3),2,2) sage: G = MatrixGroup(MS([[1,0],[0,1]]), MS([[1,1],[0,1]])) sage: G.gen(0) [1 0] [0 1] sage: g = G.random_element() sage: TestSuite(g).run() """ if isinstance(M, GapElement): ElementLibGAP.__init__(self, M, parent) return if convert: M = parent.matrix_space()(M) from sage.libs.gap.libgap import libgap M_gap = libgap(M) if check: if not is_Matrix(M): raise TypeError('M must be a matrix') if M.parent() is not parent.matrix_space(): raise TypeError('M must be a in the matrix space of the group') parent._check_matrix(M, M_gap) ElementLibGAP.__init__(self, M_gap, parent)
def __init__(self, parent, x): """ The Python constructor. See :class:`FreeGroupElement` for details. TESTS:: sage: G.<a,b> = FreeGroup() sage: x = G([1, 2, -1, -1]) sage: x # indirect doctest a*b*a^-2 sage: y = G([2, 2, 2, 1, -2, -2, -1]) sage: y # indirect doctest b^3*a*b^-2*a^-1 sage: TestSuite(G).run() sage: TestSuite(x).run() """ if not isinstance(x, GapElement): try: l = x.Tietze() except AttributeError: l = list(x) if len(l) > 0: if min(l) < -parent.ngens() or parent.ngens() < max(l): raise ValueError('generators not in the group') if 0 in l: raise ValueError('zero does not denote a generator') i = 0 while i < len(l) - 1: if l[i] == -l[i + 1]: l.pop(i) l.pop(i) if i > 0: i = i - 1 else: i = i + 1 AbstractWordTietzeWord = libgap.eval('AbstractWordTietzeWord') x = AbstractWordTietzeWord(l, parent._gap_gens()) ElementLibGAP.__init__(self, parent, x)
def __init__(self, x, parent): """ The Python constructor. See :class:`FreeGroupElement` for details. TESTS:: sage: G.<a,b> = FreeGroup() sage: x = G([1, 2, -1, -1]) sage: x # indirect doctest a*b*a^-2 sage: y = G([2, 2, 2, 1, -2, -2, -1]) sage: y # indirect doctest b^3*a*b^-2*a^-1 sage: TestSuite(G).run() sage: TestSuite(x).run() """ if not isinstance(x, GapElement): try: l = x.Tietze() except AttributeError: l = list(x) if len(l)>0: if min(l) < -parent.ngens() or parent.ngens() < max(l): raise ValueError('generators not in the group') if 0 in l: raise ValueError('zero does not denote a generator') i=0 while i<len(l)-1: if l[i]==-l[i+1]: l.pop(i) l.pop(i) if i>0: i=i-1 else: i=i+1 AbstractWordTietzeWord = libgap.eval('AbstractWordTietzeWord') x = AbstractWordTietzeWord(l, parent._gap_gens()) ElementLibGAP.__init__(self, x, parent)
def __init__(self, parent, x, check=True): """ The Python constructor. See :class:`AbelianGroupElement_gap` for details. INPUT: - ``parent`` -- an instance of :class:`AbelianGroup_gap` - ``x`` -- an instance of :class:`sage.libs.gap.element.GapElement` - ``check`` -- boolean (default: ``True``); check if ``x`` is an element of the group TESTS:: sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap sage: G = AbelianGroupGap([3,6]) sage: g = G.an_element() sage: TestSuite(g).run() """ if check and x not in parent.gap(): raise ValueError("%s is not in the group %s" % (x, parent)) ElementLibGAP.__init__(self, parent, x)
def __init__(self, parent, x): """ The Python constructor. See :class:`FreeGroupElement` for details. TESTS:: sage: from train_track import * sage: G.<a,b> = FreeGroup() sage: x = G([1, 2, -1, -1]) sage: x # indirect doctest a*b*a^-2 sage: y = G([2, 2, 2, 1, -2, -2, -1]) sage: y # indirect doctest b^3*a*b^-2*a^-1 sage: G("abAbBAB") a*b*a^-2*b^-1 sage: G(['a','b','A','a','A','B']) a*b*a^-1*b^-1 sage: TestSuite(G).run() sage: TestSuite(x).run() """ if not isinstance(x, GapElement): try: l = x.Tietze() except AttributeError: if isinstance( x, str ): # First check wether x is a string of a generator like 'x0' try: x = [parent._names.index(x) + 1] except ValueError: try: x = [-parent._names.index(x.lower()) - 1] except ValueError: pass l = list(x) for i, a in enumerate(l): if isinstance(a, (int, Integer)): if a < -parent.ngens() or parent.ngens() < a or a == 0: raise ValueError( '%s does not denote a generator of %s' % (a, parent)) elif isinstance(a, str): try: l[i] = parent._names.index(a) + 1 except ValueError: try: l[i] = -parent._names.index(a.lower()) - 1 except ValueError: raise ValueError('%s is not a generator of %s' % (a, parent)) i = 0 while i < len(l) - 1: if l[i] == -l[i + 1]: l.pop(i) l.pop(i) if i > 0: i = i - 1 else: i = i + 1 AbstractWordTietzeWord = libgap.eval('AbstractWordTietzeWord') x = AbstractWordTietzeWord(l, parent._gap_gens()) ElementLibGAP.__init__(self, parent, x)
def __init__(self, parent, x): """ The Python constructor. See :class:`FreeGroupElement` for details. TESTS:: sage: from train_track import * sage: G.<a,b> = FreeGroup() sage: x = G([1, 2, -1, -1]) sage: x # indirect doctest a*b*a^-2 sage: y = G([2, 2, 2, 1, -2, -2, -1]) sage: y # indirect doctest b^3*a*b^-2*a^-1 sage: G("abAbBAB") a*b*a^-2*b^-1 sage: G(['a','b','A','a','A','B']) a*b*a^-1*b^-1 sage: TestSuite(G).run() sage: TestSuite(x).run() """ if not isinstance(x, GapElement): try: l = x.Tietze() except AttributeError: if isinstance(x,str): # First check wether x is a string of a generator like 'x0' try: x = [parent._names.index(x) + 1] except ValueError: try: x = [-parent._names.index(x.lower()) - 1] except ValueError: pass l = list(x) for i,a in enumerate(l): if isinstance(a,(int,Integer)): if a < -parent.ngens() or parent.ngens() < a or a == 0: raise ValueError('%s does not denote a generator of %s'%(a,parent)) elif isinstance(a,str): try: l[i] = parent._names.index(a) + 1 except ValueError: try: l[i] = -parent._names.index(a.lower()) - 1 except ValueError: raise ValueError('%s is not a generator of %s'%(a,parent)) i=0 while i < len(l)-1: if l[i] == -l[i+1]: l.pop(i) l.pop(i) if i>0: i = i-1 else: i = i+1 AbstractWordTietzeWord = libgap.eval('AbstractWordTietzeWord') x = AbstractWordTietzeWord(l, parent._gap_gens()) ElementLibGAP.__init__(self, parent, x)