Semidirect product of groups¶
AUTHORS:
- Mark Shimozono (2013) initial version 
- class sage.groups.group_semidirect_product.GroupSemidirectProduct(G, H, twist=None, act_to_right=True, prefix0=None, prefix1=None, print_tuple=False, category=Category of groups)[source]¶
- Bases: - CartesianProduct- Return the semidirect product of the groups - Gand- Husing the homomorphism- twist.- INPUT: - G,- H– multiplicative groups
- twist– (default:- None) a function defining a homomorphism (see below)
- act_to_right– boolean (default:- True)
- prefix0– string (default:- None)
- prefix1– string (default:- None)
- print_tuple– boolean (default:- False)
- category– a category (default:- Groups())
 - A semidirect product of groups \(G\) and \(H\) is a group structure on the Cartesian product \(G \times H\) whose product agrees with that of \(G\) on \(G \times 1_H\) and with that of \(H\) on \(1_G \times H\), such that either \(1_G \times H\) or \(G \times 1_H\) is a normal subgroup. In the former case, the group is denoted \(G \ltimes H\) and in the latter, \(G \rtimes H\). - If - act_to_rightis- True, this indicates the group \(G \ltimes H\) in which \(G\) acts on \(H\) by automorphisms. In this case there is a group homomorphism \(\phi \in \mathrm{Hom}(G, \mathrm{Aut}(H))\) such that\[g h g^{-1} = \phi(g)(h).\]- The homomorphism \(\phi\) is specified by the input - twist, which syntactically is the function \(G\times H\to H\) defined by\[twist(g,h) = \phi(g)(h).\]- The product on \(G \ltimes H\) is defined by \[\begin{split}\begin{aligned} (g_1,h_1)(g_2,h_2) &= g_1 h_1 g_2 h_2 \\ &= g_1 g_2 g_2^{-1} h_1 g_2 h_2 \\ &= (g_1g_2, twist(g_2^{-1}, h_1) h_2) \end{aligned}\end{split}\]- If - act_to_rightis- False, the group \(G \rtimes H\) is specified by a homomorphism \(\psi\in \mathrm{Hom}(H,\mathrm{Aut}(G))\) such that\[h g h^{-1} = \psi(h)(g)\]- Then - twistis the function \(H\times G\to G\) defined by\[twist(h,g) = \psi(h)(g).\]- so that the product in \(G \rtimes H\) is defined by \[\begin{split}\begin{aligned} (g_1,h_1)(g_2,h_2) &= g_1 h_1 g_2 h_2 \\ &= g_1 h_1 g_2 h_1^{-1} h_1 h_2 \\ &= (g_1 twist(h_1,g_2), h_1 h_2) \end{aligned}\end{split}\]- If - prefix0(resp.- prefixl) is not- Nonethen it is used as a wrapper for printing elements of- G(resp.- H). If- print_tupleis- Truethen elements are printed in the style \((g,h)\) and otherwise in the style \(g * h\).- EXAMPLES: - sage: G = GL(2,QQ) sage: V = QQ^2 sage: EV = GroupExp()(V) # make a multiplicative version of V sage: def twist(g, v): ....: return EV(g*v.value) sage: H = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t'); H Semidirect product of General Linear Group of degree 2 over Rational Field acting on Multiplicative form of Vector space of dimension 2 over Rational Field sage: x = H.an_element(); x t[(1, 0)] sage: x^2 t[(2, 0)] sage: # needs sage.rings.number_field sage: cartan_type = CartanType(['A',2]) sage: W = WeylGroup(cartan_type, prefix='s') sage: def twist(w, v): ....: return w*v*(~w) sage: WW = GroupSemidirectProduct(W, W, twist=twist, print_tuple=True) sage: s = Family(cartan_type.index_set(), lambda i: W.simple_reflection(i)) sage: y = WW((s[1],s[2])); y (s1, s2) sage: y^2 (1, s2*s1) sage: y.inverse() (s1, s1*s2*s1) - >>> from sage.all import * >>> G = GL(Integer(2),QQ) >>> V = QQ**Integer(2) >>> EV = GroupExp()(V) # make a multiplicative version of V >>> def twist(g, v): ... return EV(g*v.value) >>> H = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t'); H Semidirect product of General Linear Group of degree 2 over Rational Field acting on Multiplicative form of Vector space of dimension 2 over Rational Field >>> x = H.an_element(); x t[(1, 0)] >>> x**Integer(2) t[(2, 0)] >>> # needs sage.rings.number_field >>> cartan_type = CartanType(['A',Integer(2)]) >>> W = WeylGroup(cartan_type, prefix='s') >>> def twist(w, v): ... return w*v*(~w) >>> WW = GroupSemidirectProduct(W, W, twist=twist, print_tuple=True) >>> s = Family(cartan_type.index_set(), lambda i: W.simple_reflection(i)) >>> y = WW((s[Integer(1)],s[Integer(2)])); y (s1, s2) >>> y**Integer(2) (1, s2*s1) >>> y.inverse() (s1, s1*s2*s1) - Todo - Functorial constructor for semidirect products for various categories 
- Twofold Direct product as a special case of semidirect product 
 - Element[source]¶
- alias of - GroupSemidirectProductElement
 - act_to_right()[source]¶
- Return - Trueif the left factor acts on the right factor and- Falseif the right factor acts on the left factor.- EXAMPLES: - sage: def twist(x, y): ....: return y sage: GroupSemidirectProduct(WeylGroup(['A',2],prefix='s'), ....: WeylGroup(['A',3],prefix='t'), twist).act_to_right() True - >>> from sage.all import * >>> def twist(x, y): ... return y >>> GroupSemidirectProduct(WeylGroup(['A',Integer(2)],prefix='s'), ... WeylGroup(['A',Integer(3)],prefix='t'), twist).act_to_right() True 
 - construction()[source]¶
- Return - None.- This overrides the construction functor inherited from - CartesianProduct.- EXAMPLES: - sage: def twist(x, y): ....: return y sage: H = GroupSemidirectProduct(WeylGroup(['A',2],prefix='s'), ....: WeylGroup(['A',3],prefix='t'), twist) sage: H.construction() - >>> from sage.all import * >>> def twist(x, y): ... return y >>> H = GroupSemidirectProduct(WeylGroup(['A',Integer(2)],prefix='s'), ... WeylGroup(['A',Integer(3)],prefix='t'), twist) >>> H.construction() 
 - group_generators()[source]¶
- Return generators of - self.- EXAMPLES: - sage: twist = lambda x,y: y sage: import __main__ sage: __main__.twist = twist sage: EZ = GroupExp()(ZZ) sage: GroupSemidirectProduct(EZ, EZ, twist, print_tuple=True).group_generators() ((1, 0), (0, 1)) - >>> from sage.all import * >>> twist = lambda x,y: y >>> import __main__ >>> __main__.twist = twist >>> EZ = GroupExp()(ZZ) >>> GroupSemidirectProduct(EZ, EZ, twist, print_tuple=True).group_generators() ((1, 0), (0, 1)) 
 - one()[source]¶
- The identity element of the semidirect product group. - EXAMPLES: - sage: G = GL(2,QQ) sage: V = QQ^2 sage: EV = GroupExp()(V) # make a multiplicative version of V sage: def twist(g, v): ....: return EV(g*v.value) sage: one = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t').one(); one 1 sage: one.cartesian_projection(0) [1 0] [0 1] sage: one.cartesian_projection(1) (0, 0) - >>> from sage.all import * >>> G = GL(Integer(2),QQ) >>> V = QQ**Integer(2) >>> EV = GroupExp()(V) # make a multiplicative version of V >>> def twist(g, v): ... return EV(g*v.value) >>> one = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t').one(); one 1 >>> one.cartesian_projection(Integer(0)) [1 0] [0 1] >>> one.cartesian_projection(Integer(1)) (0, 0) 
 - opposite_semidirect_product()[source]¶
- Create the same semidirect product but with the positions of the groups exchanged. - EXAMPLES: - sage: G = GL(2,QQ) sage: L = QQ^2 sage: EL = GroupExp()(L) sage: H = GroupSemidirectProduct(G, EL, prefix1='t', ....: twist=lambda g,v: EL(g*v.value)); H Semidirect product of General Linear Group of degree 2 over Rational Field acting on Multiplicative form of Vector space of dimension 2 over Rational Field sage: h = H((Matrix([[0,1],[1,0]]), EL.an_element())); h [0 1] [1 0] * t[(1, 0)] sage: Hop = H.opposite_semidirect_product(); Hop Semidirect product of Multiplicative form of Vector space of dimension 2 over Rational Field acted upon by General Linear Group of degree 2 over Rational Field sage: hop = h.to_opposite(); hop t[(0, 1)] * [0 1] [1 0] sage: hop in Hop True - >>> from sage.all import * >>> G = GL(Integer(2),QQ) >>> L = QQ**Integer(2) >>> EL = GroupExp()(L) >>> H = GroupSemidirectProduct(G, EL, prefix1='t', ... twist=lambda g,v: EL(g*v.value)); H Semidirect product of General Linear Group of degree 2 over Rational Field acting on Multiplicative form of Vector space of dimension 2 over Rational Field >>> h = H((Matrix([[Integer(0),Integer(1)],[Integer(1),Integer(0)]]), EL.an_element())); h [0 1] [1 0] * t[(1, 0)] >>> Hop = H.opposite_semidirect_product(); Hop Semidirect product of Multiplicative form of Vector space of dimension 2 over Rational Field acted upon by General Linear Group of degree 2 over Rational Field >>> hop = h.to_opposite(); hop t[(0, 1)] * [0 1] [1 0] >>> hop in Hop True 
 - product(x, y)[source]¶
- The product of elements \(x\) and \(y\) in the semidirect product group. - EXAMPLES: - sage: G = GL(2,QQ) sage: V = QQ^2 sage: EV = GroupExp()(V) # make a multiplicative version of V sage: def twist(g, v): ....: return EV(g*v.value) sage: S = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t') sage: g = G([[2,1],[3,1]]); g [2 1] [3 1] sage: v = EV.an_element(); v (1, 0) sage: x = S((g,v)); x [2 1] [3 1] * t[(1, 0)] sage: x*x # indirect doctest [7 3] [9 4] * t[(0, 3)] - >>> from sage.all import * >>> G = GL(Integer(2),QQ) >>> V = QQ**Integer(2) >>> EV = GroupExp()(V) # make a multiplicative version of V >>> def twist(g, v): ... return EV(g*v.value) >>> S = GroupSemidirectProduct(G, EV, twist=twist, prefix1='t') >>> g = G([[Integer(2),Integer(1)],[Integer(3),Integer(1)]]); g [2 1] [3 1] >>> v = EV.an_element(); v (1, 0) >>> x = S((g,v)); x [2 1] [3 1] * t[(1, 0)] >>> x*x # indirect doctest [7 3] [9 4] * t[(0, 3)] 
 
- class sage.groups.group_semidirect_product.GroupSemidirectProductElement[source]¶
- Bases: - Element- Element class for - GroupSemidirectProduct.- to_opposite()[source]¶
- Send an element to its image in the opposite semidirect product. - EXAMPLES: - sage: # needs sage.rings.number_field sage: L = RootSystem(['A',2]).root_lattice(); L Root lattice of the Root system of type ['A', 2] sage: from sage.groups.group_exp import GroupExp sage: EL = GroupExp()(L) sage: W = L.weyl_group(prefix='s'); W Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice) sage: def twist(w, v): ....: return EL(w.action(v.value)) sage: G = GroupSemidirectProduct(W, EL, twist, prefix1='t'); G Semidirect product of Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice) acting on Multiplicative form of Root lattice of the Root system of type ['A', 2] sage: mu = L.an_element(); mu 2*alpha[1] + 2*alpha[2] sage: w = W.an_element(); w s1*s2 sage: g = G((w,EL(mu))); g s1*s2 * t[2*alpha[1] + 2*alpha[2]] sage: g.to_opposite() t[-2*alpha[1]] * s1*s2 sage: g.to_opposite().parent() Semidirect product of Multiplicative form of Root lattice of the Root system of type ['A', 2] acted upon by Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice) - >>> from sage.all import * >>> # needs sage.rings.number_field >>> L = RootSystem(['A',Integer(2)]).root_lattice(); L Root lattice of the Root system of type ['A', 2] >>> from sage.groups.group_exp import GroupExp >>> EL = GroupExp()(L) >>> W = L.weyl_group(prefix='s'); W Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice) >>> def twist(w, v): ... return EL(w.action(v.value)) >>> G = GroupSemidirectProduct(W, EL, twist, prefix1='t'); G Semidirect product of Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice) acting on Multiplicative form of Root lattice of the Root system of type ['A', 2] >>> mu = L.an_element(); mu 2*alpha[1] + 2*alpha[2] >>> w = W.an_element(); w s1*s2 >>> g = G((w,EL(mu))); g s1*s2 * t[2*alpha[1] + 2*alpha[2]] >>> g.to_opposite() t[-2*alpha[1]] * s1*s2 >>> g.to_opposite().parent() Semidirect product of Multiplicative form of Root lattice of the Root system of type ['A', 2] acted upon by Weyl Group of type ['A', 2] (as a matrix group acting on the root lattice)