def __init__(self, homset, imgsH, check=True): """ Group morphism specified by images of generators. Some Python code for wrapping GAP's GroupHomomorphismByImages function but only for matrix groups. Can be expensive if G is large. EXAMPLES:: sage: F = GF(5); MS = MatrixSpace(F,2,2) sage: G = MatrixGroup([MS([1,1,0,1])]) sage: H = MatrixGroup([MS([1,0,1,1])]) sage: phi = G.hom(H.gens()) sage: phi Homomorphism : Matrix group over Finite Field of size 5 with 1 generators ( [1 1] [0 1] ) --> Matrix group over Finite Field of size 5 with 1 generators ( [1 0] [1 1] ) sage: phi(MS([1,1,0,1])) [1 0] [1 1] sage: F = GF(7); MS = MatrixSpace(F,2,2) sage: F.multiplicative_generator() 3 sage: G = MatrixGroup([MS([3,0,0,1])]) sage: a = G.gens()[0]^2 sage: phi = G.hom([a]) TESTS: Check that :trac:`19406` is fixed:: sage: G = GL(2, GF(3)) sage: H = GL(3, GF(2)) sage: mat1 = H([[-1,0,0],[0,0,-1],[0,-1,0]]) sage: mat2 = H([[1,1,1],[0,0,-1],[-1,0,0]]) sage: phi = G.hom([mat1, mat2]) Traceback (most recent call last): ... TypeError: images do not define a group homomorphism """ MatrixGroupMorphism.__init__(self, homset) # sets the parent from sage.libs.gap.libgap import libgap G = homset.domain() H = homset.codomain() gens = [x.gap() for x in G.gens()] imgs = [to_libgap(x) for x in imgsH] self._phi = phi = libgap.GroupHomomorphismByImages( G.gap(), H.gap(), gens, imgs) if not phi.IsGroupHomomorphism(): raise ValueError('the map {}-->{} is not a homomorphism'.format( G.gens(), imgsH))
def _element_constructor_(self, x, check=True, **options): r""" Handle conversions and coercions. EXAMPLES:: sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap sage: A = AbelianGroupGap([2,4]) sage: H = A.Hom(A) sage: H([g^2 for g in A.gens()]) Group endomorphism of Abelian group with gap, generator orders (2, 4) sage: H(2) Traceback (most recent call last): ... TypeError: unable to convert 2 to an element of ... A group homomorphism between a finitely presented group and a subgroup of a permutation group:: sage: PG = PGU(6,2) sage: g, h = PG.gens() sage: p1 = h^-3*(h^-1*g^-1)^2*h*g*h^2*g^-1*h^2*g*h^-5*g^-1 sage: p2 = g*(g*h)^2*g*h^-4*(g*h)^2*(h^2*g*h^-2*g)^2*h^-2*g*h^-2*g^-1*h^-1*g*h*g*h^-1*g sage: p3 = h^-3*g^-1*h*g*h^4*g^-1*h^-1*g*h*(h^2*g^-1)^2*h^-4*g*h^2*g^-1*h^-7*g^-2*h^-2*g*h^-2*g^-1*h^-1*(g*h)^2*h^3 sage: p4 = h*(h^3*g)^2*h*g*h^-1*g*h^2*g^-1*h^-2*g*h^4*g^-1*h^3*g*h^-2*g*h^-1*g^-1*h^2*g*h*g^-1*h^-2*g*h*g^-1*h^2*g*h^2*g^-1 sage: p5 = h^2*g*h^2*g^-1*h*g*h^-1*g*h*g^-1*h^2*g*h^-2*g*h^2*g*h^-2*(h^-1*g)^2*h^4*(g*h^-1)^2*g^-1 sage: UPG = PG.subgroup([p1, p2, p3, p4, p5], canonicalize=False) sage: B6 = BraidGroup(6) sage: reprB6 = B6.hom(UPG.gens()) sage: b1, b2, b3, b4, b5 = B6.gens() sage: reprB6(b1*b2*b3*b4*b5) == p1*p2*p3*p4*p5 True TESTS: The following input does not define a valid group homomorphism:: sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap sage: A = AbelianGroupGap([2]) sage: G = MatrixGroup([Matrix(ZZ, 2, [0,1,-1,0])]) sage: A.hom([G.gen(0)]) Traceback (most recent call last): ... ValueError: images do not define a group homomorphism """ if isinstance(x, (tuple, list)): # there should be a better way from sage.libs.gap.libgap import libgap dom = self.domain() codom = self.codomain() gens = dom.gap().GeneratorsOfGroup() imgs = [codom(g).gap() for g in x] if check: if not len(gens) == len(imgs): raise ValueError("provide an image for each generator") phi = libgap.GroupHomomorphismByImages(dom.gap(), codom.gap(), gens, imgs) # if it is not a group homomorphism, then # self._phi is the gap boolean fail if phi.is_bool(): # check we did not fail raise ValueError("images do not define a group homomorphism") else: ByImagesNC = libgap.function_factory("GroupHomomorphismByImagesNC") phi = ByImagesNC(dom.gap(), codom.gap(), gens, imgs) return self.element_class(self, phi, check=check, **options) if isinstance(x, GapElement): try: return self.element_class(self, x, check=True, **options) except ValueError: pass return super(GroupHomset_libgap, self)._element_constructor_(x, check=check, **options)