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)¶ Bases:
sage.sets.cartesian_product.CartesianProduct
Return the semidirect product of the groups
G
andH
using the homomorphismtwist
.INPUT:
G
andH
– multiplicative groupstwist
– (default: None) a function defining a homomorphism (see below)act_to_right
– True or False (default: True)prefix0
– (default: None) optional stringprefix1
– (default: None) optional stringprint_tuple
– True or False (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_right
is 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_right
is 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
twist
is 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 None then it is used as a wrapper for printing elements ofG
(resp.H
). Ifprint_tuple
is True then 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: 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)
Todo
 Functorial constructor for semidirect products for various categories
 Twofold Direct product as a special case of semidirect product

Element
¶ alias of
GroupSemidirectProductElement

act_to_right
()¶ True if the left factor acts on the right factor and False if 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

group_generators
()¶ 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))

one
()¶ 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)

opposite_semidirect_product
()¶ 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, twist = lambda g,v: EL(g*v.value), 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: 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

product
(x, y)¶ 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)]

class
sage.groups.group_semidirect_product.
GroupSemidirectProductElement
¶ Bases:
sage.sets.cartesian_product.CartesianProduct.Element
Element class for
GroupSemidirectProduct
.
inverse
()¶ The inverse of
self
.EXAMPLES:
sage: L = RootSystem(['A',2]).root_lattice() sage: from sage.groups.group_exp import GroupExp sage: EL = GroupExp()(L) sage: W = L.weyl_group(prefix="s") sage: def twist(w,v): ....: return EL(w.action(v.value)) sage: G = GroupSemidirectProduct(W, EL, twist, prefix1='t') sage: g = G.an_element(); g s1*s2 * t[2*alpha[1] + 2*alpha[2]] sage: g.inverse() s2*s1 * t[2*alpha[1]]

to_opposite
()¶ Send an element to its image in the opposite semidirect product.
EXAMPLES:
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)
