# 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)

Return the semidirect product of the groups G and H using the homomorphism twist.

INPUT:

• G and H – multiplicative groups

• twist – (default: None) a function defining a homomorphism (see below)

• act_to_right – True or False (default: True)

• prefix0 – (default: None) optional string

• prefix1 – (default: None) optional string

• print_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 of G (resp. H). If print_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
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

construction()

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

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

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)