Automorphisms of abelian groups

This implements groups of automorphisms of abelian groups.

EXAMPLES:

sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
sage: G = AbelianGroupGap([2,6])
sage: autG = G.aut()
>>> 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: 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)
>>> 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: 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
>>> 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: 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 ])
>>> 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: autG.order()
12
>>> from sage.all import *
>>> autG.order()
12

or create subgroups and do the same for them:

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
>>> 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: 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
>>> 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)[source]

Bases: ElementLibGAP

Automorphisms of abelian groups with gap.

INPUT:

EXAMPLES:

sage: from sage.groups.abelian_gps.abelian_group_gap import AbelianGroupGap
sage: G = AbelianGroupGap([2,3,4,5])
sage: f = G.aut().an_element()
>>> 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()[source]

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: 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]
>>> 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: 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)
>>> 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)[source]

Bases: AbelianGroupAutomorphismGroup_gap

The full automorphism group of a finite abelian group.

INPUT:

EXAMPLES:

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()
>>> 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: aut1 = AbelianGroupAutomorphismGroup(G)
sage: aut is aut1
True
>>> from sage.all import *
>>> aut1 = AbelianGroupAutomorphismGroup(G)
>>> aut is aut1
True
Element[source]

alias of AbelianGroupAutomorphism

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

Bases: CachedRepresentation, GroupMixinLibGAP, Group, ParentLibGAP

Base class for groups of automorphisms of abelian groups.

Do not construct this directly.

INPUT:

  • domainAbelianGroup_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: 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>
>>> 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[source]

alias of AbelianGroupAutomorphism

covering_matrix_ring()[source]

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: 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
>>> 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()[source]

Return the domain of this group of automorphisms.

EXAMPLES:

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

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

EXAMPLES:

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

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: 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
>>> 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[source]

alias of AbelianGroupAutomorphism