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
G
andH
using the homomorphismtwist
.INPUT:
G
andH
– multiplicative groupstwist
– (default:None
) a function defining a homomorphism (see below)act_to_right
–True
orFalse
(default:True
)prefix0
– (default:None
) optional stringprefix1
– (default:None
) optional stringprint_tuple
–True
orFalse
(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
isTrue
, 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
isFalse
, 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 notNone
then it is used as a wrapper for printing elements ofG
(resp.H
). Ifprint_tuple
isTrue
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: # 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
True
if the left factor acts on the right factor andFalse
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
>>> 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)