Group Theory Updates in Maple 2020
Overview
Classification of Finite Simple Groups
Updates to Group Databases
New and Updated Commands
In Maple 2020, the Group Theory package has been extended to include new tools for classifying finite groups, more searchable properties for small groups, transitive groups, perfect groups, and Frobenius groups, and new commands for computation and analysis.
with( GroupTheory ):
The classification of finite simple groups has been implemented in Maple via the new ClassifyFiniteSimpleGroup command, as well as the introduction of a new CFSG object that serves as a finite simple group classifier. The ClassifyFiniteSimpleGroup command serves to locate a given finite simple group within a description of the classification.
c := ClassifyFiniteSimpleGroup( CyclicGroup( 19 ) );
c≔CFSG: Cyclic Group C19
This produces an object of type CFSG.
type( c, ':-CFSG' );
true
You can query the CFSG object for information about the simple group and its location within the classification. The main identifying methods are Family and Parameters. The Family( c ) command locates the given simple group classifier within one of the four main families of finite simple groups (cyclic, alternating, Lie type or sporadic). The Parameters( c ) command further identifies the group within the family.
Family( c );
cyclic
Parameters( c );
19
c := ClassifyFiniteSimpleGroup( Alt( 8 ) );
c≔CFSG: Alternating Group A8
alternating
8
For groups of Lie type, and for the sporadic finite simple groups, there is also a Subfamily method that further delineates the position of the group within the classification. (For cyclic and alternating groups, the Subfamily method returns the value undefined, as there are no sub-families defined for these types of groups.)
c := ClassifyFiniteSimpleGroup( PSU( 3, 3 ) );
c≔CFSG: Steinberg Group A22⁡3=PSU⁡3,3
Lie
Subfamily( c );
2A
In the case of a classical group, you can also query the classical sub-family.
ClassicalSubfamily( c );
PSU
The parameters for a group of Lie type are the Lie rank and the field size.
c := ClassifyFiniteSimpleGroup( PSp( 4, 3 ) );
c≔CFSG: Chevalley Group B2⁡3=PΩ⁡5,3
2,3
In the case of a classical group, you can also query the dimension of the associated linear group.
Dimension( c );
5
There is a GroupOrder method that you can use to query the order of the group associated with the classifier.
GroupOrder( c );
25920
In the event that a group is not simple, an exception is raised.
ClassifyFiniteSimpleGroup( MathieuGroup( 10 ) );
Error, (in GroupTheory:-ClassifyFiniteSimpleGroup) group is not simple
You can use the ClassifyFiniteSimpleGroup command to identify the composition factors of a finite group.
G := PerfectGroup( 1920, 1 );
G≔1,23,64,57,10,1,3,24,7,56,8,910,11,12,2,53,76,108,11,1,42,53,79,12,1,43,76,108,11,1,42,56,109,12,1,42,53,76,108,119,12
IsSimple( G );
false
cs := CompositionSeries( G );
cs≔1,23,64,57,10,1,3,24,7,56,8,910,11,12,2,53,76,108,11,1,42,53,79,12,1,43,76,108,11,1,42,56,109,12,1,42,53,76,108,119,12▹2,53,7,3,79,12,2,53,78,119,12,2,53,76,109,12,1,43,7▹…▹2,53,7▹
inds := [seq]( Index( cs[ i ], cs[ i - 1 ] ), i = 2 .. numelems( cs ) ):
map( ClassifyFiniteSimpleGroup, inds );
CFSG: Alternating Group A5,CFSG: Cyclic Group C2,CFSG: Cyclic Group C2,CFSG: Cyclic Group C2,CFSG: Cyclic Group C2,CFSG: Cyclic Group C2
Because the identity of a finite simple group is often determined solely by its order (and the fact of its simplicity), you can also pass a positive integer as an argument to the ClassifyFiniteSimpleGroup command.
ClassifyFiniteSimpleGroup( 14!/2 );
CFSG: Alternating Group A14
This is particularly useful for groups that cannot currently be constructed as such in Maple.
ClassifyFiniteSimpleGroup( 91091388821275796002896845335824055117112900038578882103005220458066774174756355172236381528808521951845631824767792833866989192878222394092251827671288376954168134609231184876844237947806050477334460416708128451382476800000 );
CFSG: Chevalley Group E8⁡8
In cases for which there are two non-isomorphic simple groups of the same order, an expression sequence of two CFSG objects is returned, one for each of the simple groups of the given order.
ClassifyFiniteSimpleGroup( 2211804011555567123299716393684253115102777246104915803836223275439545886426045766402326760994180464750362624000 );
CFSG: Chevalley Group B6⁡27=PΩ⁡13,27,CFSG: Chevalley Group C6⁡27=PSp⁡12,27
The new NumSimpleGroups( n ) command returns the number of simple groups of order n, for a positive integer n.
NumSimpleGroups( 1 );
0
NumSimpleGroups( 660 );
1
NumSimpleGroups( 20160 );
2
The new IsSimpleNumber command tests whether a positive integer is the order of a finite non-Abelian simple group.
IsSimpleNumber( 72 );
IsSimpleNumber( 360 );
You can use the cyclic option to cause the command to include the groups of prime order as well.
IsSimpleNumber( 30303030303031 );
IsSimpleNumber( 30303030303031, 'cyclic' );
The new TabulateSimpleGroups command generates a list of pairs of the form [ n, L ], where n is the order of a finite non-abelian simple group, and L is a list of strings providing a brief description of the simple groups of order n, and where n falls within a specified range. A number of options controls which simple groups are considered for inclusion in the resulting list.
TabulateSimpleGroups( 1 .. 1000 );
60,Alt(5),PSL(2,4),PSL(2,5),168,PSL(2,7),PSL(3,2),360,Alt(6),PSL(2,9),504,PSL(2,8),660,PSL(2,11)
TabulateSimpleGroups( 1 .. 10^6, 'minlierank' = 3, 'alternating' = false );
7920,M11,20160,PSL(4,2),25920,PSU(4,2),95040,M12,175560,J1,443520,M22,604800,J2
You can use TabulateSimpleGroups to generate a lot of simple numbers.
L := map2( op, 1, TabulateSimpleGroups( 1 .. 10^15 ) ):
Consider the first digits of these numbers.
F := map( n -> iquo( n, 10^(length(n) - 1) ), L ):
We compute the frequency of each leading digit.
A := evalf( [seq]( numboccur( F, i ), i = 1 .. 9 ) / nops( F ) ):
Now we can compare these frequencies with the distribution of Benford's Law.
B := [seq]( log10( 1.0 + 1/i ), i = 1 .. 9 ):
use Statistics in ColumnGraph( [ A, B ], 'legend' = [ "Simple Numbers", "Benford" ], 'offset' = 5/8 ) end use;
The plot above does suggest that the orders of non-abelian finite simple groups do not follow Benford's Law. We use a χ2-test to verify this, as follows.
Statistics:-ChiSquareSuitableModelTest( F, EmpiricalDistribution( [seq](1 .. 9), 'probabilities' = B ), 'bins' = 9, 'summarize' = 'embed' ):
Null Hypothesis:
Sample was drawn from specified probability distribution
Alternative Hypothesis:
Sample was not drawn from specified probability distribution
Bins
Degrees of Freedom
Distribution
Computed Statistic
Computed p-value
Critical Value
7.
6.
ChiSquare⁡6
473.256
0.
12.5916
Result:
Rejected: This statistical test provides evidence that the null hypothesis is false.
Several new searchable properties have been added to the databases of small groups, transitive groups, perfect groups and Frobenius groups.
The small groups database now includes the following numeric (integer) properties: frattinilength, orderclassnumber, elementordersum and maxelementorder. The boolean properties homocyclic and elementary have been added as well. You can access these properties by using the SearchSmallGroups command.
Find the groups of order at most 511 which have precisely two order classes and which are not elementary abelian.
L := [SearchSmallGroups]( 'orderclassnumber' = 2, 'elementary' = false );
L≔27,3,81,12,125,3,243,37,243,62,243,65,343,3
Check that they are all groups of prime power order.
andmap( IsPGroup @ SmallGroup, L );
Find the abelian groups in the database with exactly three order classes.
L := [SearchSmallGroups]( 'orderclassnumber' = 3, 'abelian' );
L≔4,1,8,2,9,1,16,2,16,10,25,1,27,2,32,21,32,45,49,1,64,55,64,192,64,260,81,2,81,11,121,1,125,2,128,997,128,2150,128,2319,169,1,243,31,243,61,256,6732,256,26973,256,55626,256,56082,289,1,343,2,361,1
Determine which among them is homocyclic.
select( IsHomocyclic @ SmallGroup, L );
4,1,9,1,16,2,25,1,49,1,64,55,81,2,121,1,169,1,256,6732,289,1,361,1
The database of perfect groups has been augmented with the following new properties: compositionlength, maxelementorder, elementordersum, frobenius and perfectorderclasses.
Use the SearchPerfectGroups command to query the database for groups satisfying combinations of these and other properties.
The composition lengths of the groups in the database of perfect groups vary. To gain an understanding of how they are distributed, use the form = "count" option together with a visualisation.
L := [seq]( i = SearchPerfectGroups( 'compositionlength' = i, 'form' = "count" ), i = 1 .. 12 );
L≔1=56,2=79,3=80,4=61,5=47,6=90,7=155,8=152,9=114,10=150,11=73,12=40
Statistics:-PieChart( L );
Another way to visualise the distribution of groups within the database with respect to a property is to use an accumulated total.
A := Array([]):
i := 0: do t := SearchPerfectGroups( 'maxelementorder' > ++i, form = "count" ); A ,= t; until t = 0:
numelems( A );
238
plots:-pointplot( A );
You can access additional examples of non-soluble Frobenius groups by locating them in the perfect groups database.
SearchPerfectGroups( 'frobenius' );
14520,1,43320,1,100920,1,115320,1,201720,1,288120,3,417720,1,446520,1,604920,1,748920,1,950520,1
Observe that the group with perfect group ID [14520, 1] has a different ID in the database of Frobenius groups.
G := PerfectGroup( 14520, 1 ):
IdentifyFrobeniusGroup( G );
14520,2
The larger Frobenius groups in the perfect groups database do not appear in the database of Frobenius groups, which is currently limited to groups of order at most 15000.
The database of Frobenius groups, first introduced in Maple 2019, has been augmented to include the following new properties: orderclassnumber, maxelementorder, elementordersum, rank, transitivity, primitive, elementarykernel, homocyclickernel.
As for the other databases, there is a search command SearchFrobeniusGroups that you can use to query the database for groups with these properties.
How many Frobenius groups in the database are primitive?
SearchFrobeniusGroups( 'primitive', 'form' = "count" );
2671
Of those, how many have a non-abelian Frobenius complement?
SearchFrobeniusGroups( 'primitive', 'abeliancomplement' = false, 'form' = "count" );
68
L := [SearchFrobeniusGroups]( 'transitivity' > 1 ):
map( Transitivity @ FrobeniusGroup, L );
3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
See GroupTheory[SearchSmallGroups], GroupTheory[SearchPerfectGroups], GroupTheory[SearchTransitiveGroups], and GroupTheory[SearchFrobeniusGroups] for details and more examples.
The IsHomocyclic command determines whether a finite permutation group is homocyclic (that is, a direct power of a cyclic group).
IsHomocyclic( CyclicGroup( 12 ) );
IsHomocyclic( Group( [ Perm( [[1,2]]), Perm([[3,4]]) ] ) );
IsHomocyclic( SmallGroup( 144, 2 ) );
IsHomocyclic( SmallGroup( 144, 3 ) );
The new PermGroupRank command computes the rank (number of sub-orbits) of a transitive permutation group.
PermGroupRank( Alt( 5 ) );
G := DihedralGroup( 5 ):
PermGroupRank( G );
3
S := Stabilizer( 1, G ):
nops( Orbits( S, {$1..5} ) );
The new GruenbergKegelGraph command computes the Gruenberg-Kegel graph (or prime graph) of a finite group. The vertices of the graph are the prime divisors of the order of the group, and two primes p and q are adjacent if the group has an element of order pq.
Here are the Gruenberg-Kegel graphs for all the sporadic finite simple groups, and the Tits group.
Spor := [ MathieuGroup(11), MathieuGroup(12), MathieuGroup(22), MathieuGroup(23), MathieuGroup(24), JankoGroup( 1 ), JankoGroup( 2 ), JankoGroup( 3 ), JankoGroup( 4 ), ConwayGroup( 1 ), ConwayGroup( 2 ), ConwayGroup( 3 ), FischerGroup( 22 ), FischerGroup( 23 ), FischerGroup( 24 ), HigmanSimsGroup(), McLaughlinGroup(), HeldGroup(), RudvalisGroup(), SuzukiGroup(), ONanGroup(), HaradaNortonGroup(), LyonsGroup(), ThompsonGroup(), BabyMonster(), Monster(), TitsGroup() ]:
SporNames := map(print_preprocess,Spor):
GK := map( GruenbergKegelGraph, Spor ):
use GraphTheory in for G in GK do HighlightVertex( G, SelfLoops( G ), 'stylesheet' = [ 'shape' = "pentagon", 'color' = "red" ] ); HighlightVertex( G, map( op, select( c -> nops(c)=1, ConnectedComponents( G ) ) ), 'stylesheet' = [ 'shape' = "7gon", 'color' = "green" ] ) end do end use:
GK := [seq]( GraphTheory:-DrawGraph( GK[ i ], 'title' = SporNames[ i ] ), i = 1 .. nops( Spor ) ):
GK := Matrix( 9, 3, GK ):
plots:-display( GK );
Several new commands related to orders of elements in finite groups have been introduced.
The OrderClassNumber command returns the number of order classes of a finite group.
OrderClassNumber( Symm( 5 ) );
6
The MaximumElementOrder command returns the largest order of an element in a finite group.
MaximumElementOrder( Alt( 4 ) );
The ElementOrderSum command returns the sum of the orders of the elements of a finite group.
ElementOrderSum( Alt( 4 ) );
31
The Suzuki2B2 command constructs a permutation group isomorphic to the Suzuki groupB22⁡q , where q is an odd power of 2 at most 512.
G := Suzuki2B2( 2 );
G≔Sz2
IsFrobeniusGroup( G );
20,1
IsSimple( Suzuki2B2( 128 ) );
Commands applying to permutations introduced in this release are PermAltSplit, PermRestrict and PermShift.
The PermShift command replaces each point acted on by a permutation by a point shifted by the indicated amount.
p := Perm( [[1,2,3],[4,6]] );
p≔1,2,34,6
PermShift( p, 3 );
4,5,67,9
The PermRestrict command returns the restriction of a given permutation to an invariant subset of its domain.
PermRestrict( p, {1,2,3} );
1,2,3
The PermAltSplit command returns true if the conjugacy class of a permutation in a containing symmetric group splits into two classes in the corresponding alternating group.
Perm( [[1,2,3]] ) in Alt( 4 );
PermAltSplit( Perm( [[1,2,3]] ) );
numelems( ConjugacyClass( Perm( [[1,2,3]] ), Symm( 4 ) ) );
numelems( ConjugacyClass( Perm( [[1,2,3]] ), Alt( 4 ) ) );
4
Perm( [[1,2],[3,4]] ) in Alt( 4 );
PermAltSplit( Perm( [[1,2],[3,4]] ) );
numelems( ConjugacyClass( Perm( [[1,2],[3,4]] ), Symm( 4 ) ) );
numelems( ConjugacyClass( Perm( [[1,2],[3,4]] ), Alt( 4 ) ) );
The PerfectGroup constructor and the FrobeniusGroup constructors now accept an argument ID in the form [ order, index ] as well as passing the order and index as separate arguments.
G := FrobeniusGroup( [ 4032, 2 ] ):
IsElementary( FrobeniusKernel( G ) );
PGroupPrime( FrobeniusKernel( G ) );
PerfectGroup( [ 60, 1 ], 'form' = "fpgroup" );
⁢a1,a2⁢∣⁢a12,a23,a1⁢a2⁢a1⁢a2⁢a1⁢a2⁢a1⁢a2⁢a1⁢a2⁢
Download Help Document