Semidirect product of groups - Groups

Skip to content
Back to top
View this page
Edit this page

# 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: `CartesianProduct`

  Return the semidirect product of the groups `G` and `H` using 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_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

      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)

  Python

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

    alias of `GroupSemidirectProductElement`

  act_to_right()

    Return `True` if the left factor acts on the right factor and `False` if the right factor acts on the left factor.

    EXAMPLES:

    Sage

        sage: def twist(x, y):
        ....:     return y
        sage: GroupSemidirectProduct(WeylGroup(['A',2],prefix='s'),
        ....:                        WeylGroup(['A',3],prefix='t'), twist).act_to_right()
        True

    Python

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

    Return `None`.

    This overrides the construction functor inherited from `CartesianProduct`.

    EXAMPLES:

    Sage

        sage: def twist(x, y):
        ....:     return y
        sage: H = GroupSemidirectProduct(WeylGroup(['A',2],prefix='s'),
        ....:                            WeylGroup(['A',3],prefix='t'), twist)
        sage: H.construction()

    Python

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

    Return generators of `self`.

    EXAMPLES:

    Sage

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

    Python

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

    The identity element of the semidirect product group.

    EXAMPLES:

    Sage

        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)

    Python

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

    Create the same semidirect product but with the positions of the groups exchanged.

    EXAMPLES:

    Sage

        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

    Python

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

    The product of elements \(x\) and \(y\) in the semidirect product group.

    EXAMPLES:

    Sage

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

    Python

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

  Bases: `Element`

  Element class for `GroupSemidirectProduct`.

  to_opposite()

    Send an element to its image in the opposite semidirect product.

    EXAMPLES:

    Sage

        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)

    Python

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