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:
x
– a libgap elementparent
– the parentAbelianGroupAutomorphismGroup_gap
check
– bool (default:True
) checks ifx
is an element of the group
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:
AbelianGroupGap
– an instance ofAbelianGroup_gap
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:
domain
–AbelianGroup_gap
libgap_parent
– the libgap element that is the parent in GAPcategory
– a categoryambient
– an instance of a derived class ofParentLibGAP
orNone
(default); the ambient group iflibgap_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 ofG
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 groupgenerators
– a 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