Automorphisms of abelian groups - Groups

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

# Automorphisms of abelian groups

This implements groups of automorphisms of abelian groups.

EXAMPLES:

Sage

    sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
    sage: G = AbelianGroupGap([2,6])
    sage: autG = G.aut()

Python

    >>> from sage.all import *
    >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
    >>> G = AbelianGroupGap([Integer(2),Integer(6)])
    >>> autG = G.aut()

Automorphisms act on the elements of the domain:

Sage

    sage: g = G.an_element()
    sage: f = autG.an_element()
    sage: f
    Pcgs([ f1, f2, f3 ]) -> [ f1, f1*f2*f3^2, f3^2 ]
    sage: (g, f(g))
    (f1*f2, f2*f3^2)

[Python]

    >>> from sage.all import *
    >>> g = G.an_element()
    >>> f = autG.an_element()
    >>> f
    Pcgs([ f1, f2, f3 ]) -> [ f1, f1*f2*f3^2, f3^2 ]
    >>> (g, f(g))
    (f1*f2, f2*f3^2)

Or anything coercible into its domain:

Sage

    sage: A = AbelianGroup([2,6])
    sage: a = A.an_element()
    sage: (a, f(a))
    (f0*f1, f2*f3^2)
    sage: A = AdditiveAbelianGroup([2,6])
    sage: a = A.an_element()
    sage: (a, f(a))
    ((1, 0), f1)
    sage: f((1,1))
    f2*f3^2

Python

    >>> from sage.all import *
    >>> A = AbelianGroup([Integer(2),Integer(6)])
    >>> a = A.an_element()
    >>> (a, f(a))
    (f0*f1, f2*f3^2)
    >>> A = AdditiveAbelianGroup([Integer(2),Integer(6)])
    >>> a = A.an_element()
    >>> (a, f(a))
    ((1, 0), f1)
    >>> f((Integer(1),Integer(1)))
    f2*f3^2

We can compute conjugacy classes:

Sage

    sage: autG.conjugacy_classes_representatives()
    (1,
     Pcgs([ f1, f2, f3 ]) -> [ f2*f3, f1*f2, f3 ],
     Pcgs([ f1, f2, f3 ]) -> [ f1*f2*f3, f2*f3^2, f3^2 ],
     [ f3^2, f1*f2*f3, f1 ] -> [ f3^2, f1, f1*f2*f3 ],
     Pcgs([ f1, f2, f3 ]) -> [ f2*f3, f1*f2*f3^2, f3^2 ],
     [ f1*f2*f3, f1, f3^2 ] -> [ f1*f2*f3, f1, f3 ])

[Python]

    >>> from sage.all import *
    >>> autG.conjugacy_classes_representatives()
    (1,
     Pcgs([ f1, f2, f3 ]) -> [ f2*f3, f1*f2, f3 ],
     Pcgs([ f1, f2, f3 ]) -> [ f1*f2*f3, f2*f3^2, f3^2 ],
     [ f3^2, f1*f2*f3, f1 ] -> [ f3^2, f1, f1*f2*f3 ],
     Pcgs([ f1, f2, f3 ]) -> [ f2*f3, f1*f2*f3^2, f3^2 ],
     [ f1*f2*f3, f1, f3^2 ] -> [ f1*f2*f3, f1, f3 ])

the group order:

Sage

    sage: autG.order()
    12

Python

    >>> from sage.all import *
    >>> autG.order()
    12

or create subgroups and do the same for them:

Sage

    sage: S = autG.subgroup(autG.gens()[:1])
    sage: S
    Subgroup of automorphisms of Abelian group with gap, generator orders (2, 6)
    generated by 1 automorphisms

[Python]

    >>> from sage.all import *
    >>> S = autG.subgroup(autG.gens()[:Integer(1)])
    >>> S
    Subgroup of automorphisms of Abelian group with gap, generator orders (2, 6)
    generated by 1 automorphisms

Only automorphism groups of finite abelian groups are supported:

Sage

    sage: G = AbelianGroupGap([0,2])        # optional - gap_package_polycyclic
    sage: autG = G.aut()                    # optional - gap_package_polycyclic
    Traceback (most recent call last):
    ...
    ValueError: only finite abelian groups are supported

Python

    >>> from sage.all import *
    >>> G = AbelianGroupGap([Integer(0),Integer(2)])        # optional - gap_package_polycyclic
    >>> autG = G.aut()                    # optional - gap_package_polycyclic
    Traceback (most recent call last):
    ...
    ValueError: only finite abelian groups are supported

AUTHORS:

- Simon Brandhorst (2018-02-17): initial version

class sage.groups.abelian_gps.abelian_aut.AbelianGroupAutomorphism(parent, x, check=True)

  Bases: `ElementLibGAP`

  Automorphisms of abelian groups with gap.

  INPUT:

  - `x` – a libgap element

  - `parent` – the parent `AbelianGroupAutomorphismGroup_gap`

  - `check` – boolean (default: `True`); checks if `x` is an element of the group

  EXAMPLES:

  Sage

      sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      sage: G = AbelianGroupGap([2,3,4,5])
      sage: f = G.aut().an_element()

  Python

      >>> from sage.all import *
      >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
      >>> f = G.aut().an_element()

  matrix()

    Return the matrix defining `self`.

    The \(i\)-th row is the exponent vector of the image of the \(i\)-th generator.

    OUTPUT: a square matrix over the integers

    EXAMPLES:

    Sage

        sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        sage: G = AbelianGroupGap([2,3,4])
        sage: f = G.aut().an_element()
        sage: f
        Pcgs([ f1, f2, f3, f4 ]) -> [ f1*f4, f2^2, f1*f3, f4 ]
        sage: f.matrix()
        [1 0 2]
        [0 2 0]
        [1 0 1]

    Python

        >>> from sage.all import *
        >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4)])
        >>> f = G.aut().an_element()
        >>> f
        Pcgs([ f1, f2, f3, f4 ]) -> [ f1*f4, f2^2, f1*f3, f4 ]
        >>> f.matrix()
        [1 0 2]
        [0 2 0]
        [1 0 1]

    Compare with the exponents of the images:

    Sage

        sage: f(G.gens()[0]).exponents()
        (1, 0, 2)
        sage: f(G.gens()[1]).exponents()
        (0, 2, 0)
        sage: f(G.gens()[2]).exponents()
        (1, 0, 1)

    [Python]

        >>> from sage.all import *
        >>> f(G.gens()[Integer(0)]).exponents()
        (1, 0, 2)
        >>> f(G.gens()[Integer(1)]).exponents()
        (0, 2, 0)
        >>> f(G.gens()[Integer(2)]).exponents()
        (1, 0, 1)

class sage.groups.abelian_gps.abelian_aut.AbelianGroupAutomorphismGroup(AbelianGroupGap)

  Bases: `AbelianGroupAutomorphismGroup_gap`

  The full automorphism group of a finite abelian group.

  INPUT:

  - `AbelianGroupGap` – an instance of `AbelianGroup_gap`

  EXAMPLES:

  Sage

      sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      sage: from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup
      sage: G = AbelianGroupGap([2,3,4,5])
      sage: aut = G.aut()

  Python

      >>> from sage.all import *
      >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      >>> from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup
      >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
      >>> aut = G.aut()

  Equivalently:

  Sage

      sage: aut1 = AbelianGroupAutomorphismGroup(G)
      sage: aut is aut1
      True

  [Python]

      >>> from sage.all import *
      >>> aut1 = AbelianGroupAutomorphismGroup(G)
      >>> aut is aut1
      True

  Element

    alias of `AbelianGroupAutomorphism`

class sage.groups.abelian_gps.abelian_aut.AbelianGroupAutomorphismGroup_gap(domain, gap_group, category, ambient=None)

  Bases: `CachedRepresentation`, `GroupMixinLibGAP`, `Group`, `ParentLibGAP`

  Base class for groups of automorphisms of abelian groups.

  Do not construct this directly.

  > INPUT:

  - `domain` – `AbelianGroup_gap`

  - `libgap_parent` – the libgap element that is the parent in GAP

  - `category` – a category

  - `ambient` – an instance of a derived class of `ParentLibGAP` or `None` (default); the ambient group if `libgap_parent` has been defined as a subgroup

  EXAMPLES:

  Sage

      sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      sage: from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup_gap
      sage: domain = AbelianGroupGap([2,3,4,5])
      sage: aut = domain.gap().AutomorphismGroupAbelianGroup()
      sage: AbelianGroupAutomorphismGroup_gap(domain, aut, Groups().Finite())
      <group with 6 generators>

  Python

      >>> from sage.all import *
      >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      >>> from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup_gap
      >>> domain = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
      >>> aut = domain.gap().AutomorphismGroupAbelianGroup()
      >>> AbelianGroupAutomorphismGroup_gap(domain, aut, Groups().Finite())
      <group with 6 generators>

  Element

    alias of `AbelianGroupAutomorphism`

  covering_matrix_ring()

    Return the covering matrix ring of this group.

    This is the ring of \(n \times n\) matrices over \(\ZZ\) where \(n\) is the number of (independent) generators.

    EXAMPLES:

    Sage

        sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        sage: G = AbelianGroupGap([2,3,4,5])
        sage: aut = G.aut()
        sage: aut.covering_matrix_ring()
        Full MatrixSpace of 4 by 4 dense matrices over Integer Ring

    Python

        >>> from sage.all import *
        >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
        >>> aut = G.aut()
        >>> aut.covering_matrix_ring()
        Full MatrixSpace of 4 by 4 dense matrices over Integer Ring

  domain()

    Return the domain of this group of automorphisms.

    EXAMPLES:

    Sage

        sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        sage: G = AbelianGroupGap([2,3,4,5])
        sage: aut = G.aut()
        sage: aut.domain()
        Abelian group with gap, generator orders (2, 3, 4, 5)

    Python

        >>> from sage.all import *
        >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
        >>> aut = G.aut()
        >>> aut.domain()
        Abelian group with gap, generator orders (2, 3, 4, 5)

  is_subgroup_of(G)

    Return if `self` is a subgroup of `G` considered in the same ambient group.

    EXAMPLES:

    Sage

        sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        sage: G = AbelianGroupGap([2,3,4,5])
        sage: aut = G.aut()
        sage: gen = aut.gens()
        sage: S1 = aut.subgroup(gen[:2])
        sage: S1.is_subgroup_of(aut)
        True
        sage: S2 = aut.subgroup(aut.gens()[1:])
        sage: S2.is_subgroup_of(S1)
        False

    Python

        >>> from sage.all import *
        >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
        >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
        >>> aut = G.aut()
        >>> gen = aut.gens()
        >>> S1 = aut.subgroup(gen[:Integer(2)])
        >>> S1.is_subgroup_of(aut)
        True
        >>> S2 = aut.subgroup(aut.gens()[Integer(1):])
        >>> S2.is_subgroup_of(S1)
        False

class sage.groups.abelian_gps.abelian_aut.AbelianGroupAutomorphismGroup_subgroup(ambient, generators)

  Bases: `AbelianGroupAutomorphismGroup_gap`

  Groups of automorphisms of abelian groups.

  They are subgroups of the full automorphism group.

  Note

  Do not construct this class directly; instead use `sage.groups.abelian_gps.abelian_group_gap.AbelianGroup_gap.subgroup()`.

  INPUT:

  - `ambient` – the ambient group

  - `generators` – tuple of gap elements of the ambient group

  EXAMPLES:

  Sage

      sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      sage: from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup_subgroup
      sage: G = AbelianGroupGap([2,3,4,5])
      sage: aut = G.aut()
      sage: gen = aut.gens()
      sage: AbelianGroupAutomorphismGroup_subgroup(aut, gen)
      Subgroup of automorphisms of Abelian group with gap, generator orders (2, 3, 4, 5)
      generated by 6 automorphisms

  Python

      >>> from sage.all import *
      >>> from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
      >>> from sage.groups.abelian_gps.abelian_aut import AbelianGroupAutomorphismGroup_subgroup
      >>> G = AbelianGroupGap([Integer(2),Integer(3),Integer(4),Integer(5)])
      >>> aut = G.aut()
      >>> gen = aut.gens()
      >>> AbelianGroupAutomorphismGroup_subgroup(aut, gen)
      Subgroup of automorphisms of Abelian group with gap, generator orders (2, 3, 4, 5)
      generated by 6 automorphisms

  Element

    alias of `AbelianGroupAutomorphism`