From b5c00b8a3d2ef5dd032da3a630c03269a7ccdb58 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 7 Jan 2017 17:22:44 +0100 Subject: [PATCH 01/14] grp: remove trailing newlines from errors --- grp/classic.gi | 10 +++++----- grp/suzuki.gd | 1 - grp/suzuki.gi | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/grp/classic.gi b/grp/classic.gi index 51c07ed94d..721722f1f1 100644 --- a/grp/classic.gi +++ b/grp/classic.gi @@ -1418,16 +1418,16 @@ InstallMethod( GeneralOrthogonalGroupCons, # must be -1, 0, +1 if e <> -1 and e <> 0 and e <> +1 then - Error( "sign must be -1, 0, +1\n" ); + Error( "sign must be -1, 0, +1" ); fi; # if = 0 then must be odd if e = 0 and d mod 2 = 0 then - Error( "sign = 0 but dimension is even\n" ); + Error( "sign = 0 but dimension is even" ); # if <> 0 then must be even elif e <> 0 and d mod 2 = 1 then - Error( "sign <> 0 but dimension is odd\n" ); + Error( "sign <> 0 but dimension is odd" ); fi; # construct the various orthogonal groups @@ -1945,11 +1945,11 @@ InstallMethod( OmegaCons, # if = 0 then must be odd if e = 0 and d mod 2 = 0 then - Error( "sign = 0 but dimension is even\n" ); + Error( "sign = 0 but dimension is even" ); # if <> 0 then must be even elif e <> 0 and d mod 2 = 1 then - Error( "sign <> 0 but dimension is odd\n" ); + Error( "sign <> 0 but dimension is odd" ); fi; # construct the various orthogonal groups diff --git a/grp/suzuki.gd b/grp/suzuki.gd index 0631ea7140..88b31faabb 100644 --- a/grp/suzuki.gd +++ b/grp/suzuki.gd @@ -66,4 +66,3 @@ DeclareSynonym( "Sz", SuzukiGroup ); ############################################################################# ## #E - diff --git a/grp/suzuki.gi b/grp/suzuki.gi index 198ae427f2..324f20f16a 100644 --- a/grp/suzuki.gi +++ b/grp/suzuki.gi @@ -32,7 +32,7 @@ function ( filter, q ) if not IsPrimePowerInt(q) or SmallestRootInt(q) <> 2 or LogInt(q,2) mod 2 = 0 - then Error(" must be a non-square power of 2\n"); fi; + then Error(" must be a non-square power of 2"); fi; f := GF(q); G := GroupByGenerators( @@ -74,7 +74,7 @@ function ( filter, q ) if not IsPrimePowerInt(q) or SmallestRootInt(q) <> 2 or LogInt(q,2) mod 2 = 0 - then Error(" must be a non-square power of 2\n"); fi; + then Error(" must be a non-square power of 2"); fi; f := GF(q); r := RootInt(2 * q); @@ -101,4 +101,4 @@ end ); ############################################################################# ## -#E suzuki.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here \ No newline at end of file +#E suzuki.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here From 222760470d6302cbcba83e2ea5d8aaa89eb52ec9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 7 Jan 2017 17:22:57 +0100 Subject: [PATCH 02/14] tests: add tests for various group constructors --- tst/testinstall/grp/classic-G.tst | 91 ++++++++++++++++++++ tst/testinstall/grp/classic-PG.tst | 76 +++++++++++++++++ tst/testinstall/grp/classic-PS.tst | 51 +++++++++++ tst/testinstall/grp/classic-S.tst | 101 ++++++++++++++++++++++ tst/testinstall/grp/glzmodmz.tst | 38 +++++++++ tst/testinstall/grp/perf.tst | 132 +++++++++++++++++++++++++++++ tst/testinstall/grp/ree.tst | 35 ++++++++ tst/testinstall/grp/suzuki.tst | 35 ++++++++ 8 files changed, 559 insertions(+) create mode 100644 tst/testinstall/grp/classic-G.tst create mode 100644 tst/testinstall/grp/classic-PG.tst create mode 100644 tst/testinstall/grp/classic-PS.tst create mode 100644 tst/testinstall/grp/classic-S.tst create mode 100644 tst/testinstall/grp/glzmodmz.tst create mode 100644 tst/testinstall/grp/perf.tst create mode 100644 tst/testinstall/grp/ree.tst create mode 100644 tst/testinstall/grp/suzuki.tst diff --git a/tst/testinstall/grp/classic-G.tst b/tst/testinstall/grp/classic-G.tst new file mode 100644 index 0000000000..e41cfe4ff6 --- /dev/null +++ b/tst/testinstall/grp/classic-G.tst @@ -0,0 +1,91 @@ +# +# Tests for the "general" group constructors: GL, GO, GU, GammaL +# +gap> START_TEST("classic-G.tst"); + +# +gap> GL(2,5); +GL(2,5) +gap> last = GL(2,GF(5)); +true +gap> GL(IsPermGroup,3,4); +Perm_GL(3,4) +gap> last = GL(IsPermGroup,3,GF(4)); +true +gap> GL(3); +Error, usage: GeneralLinearGroup( [, ], ) +gap> GL(3,6); +Error, usage: GeneralLinearGroup( [, ], ) + +# +gap> G := GO(3,5); +GO(0,3,5) +gap> G = GO(0,3,5); +true +gap> G = GO(3,GF(5)); +true +gap> G = GO(0,3,GF(5)); +true +gap> GO(IsPermGroup,3,5); +Perm_GO(0,3,5) + +# +gap> GO(3); +Error, usage: GeneralOrthogonalGroup( [, ][, ], ) +gap> GO(3,6); +Error, must be a prime or a finite field +gap> GO(-1,3,5); +Error, sign <> 0 but dimension is odd +gap> GO(+1,3,5); +Error, sign <> 0 but dimension is odd +gap> GO(2,3,5); +Error, sign must be -1, 0, +1 + +# +gap> GO(-1,4,9); +GO(-1,4,9) +gap> last = GO(-1,4,GF(9)); +true +gap> GO(IsPermGroup,-1,4,9); +Perm_GO(-1,4,9) + +# +gap> GO(1,4,9); +GO(+1,4,9) +gap> last = GO(+1,4,GF(9)); +true +gap> GO(IsPermGroup,1,4,9); +Perm_GO(+1,4,9) + +# +gap> GO(4,9); +Error, sign = 0 but dimension is even +gap> GO(0,4,9); +Error, sign = 0 but dimension is even + +# +gap> GU(3,5); +GU(3,5) +gap> GU(IsPermGroup,3,4); +Perm_GU(3,4) +gap> GU(3); +Error, usage: GeneralUnitaryGroup( [, ], ) +gap> GU(3,6); +Error, must be a prime or a finite field + +# +gap> GammaL(3,5); +GL(3,5) +gap> GammaL(3,9); +GammaL(3,9) +gap> GammaL(IsPermGroup,3,9); +Perm_GammaL(3,9) +gap> Size(last) / Size(GL(3,9)); +2 +gap> GammaL(3); +Error, usage: GeneralSemilinearGroup( [, ], ) +gap> GammaL(3,6); +Error, must be a prime or a finite field + +# +gap> STOP_TEST("classic-G.tst", 10000); diff --git a/tst/testinstall/grp/classic-PG.tst b/tst/testinstall/grp/classic-PG.tst new file mode 100644 index 0000000000..9759cc0537 --- /dev/null +++ b/tst/testinstall/grp/classic-PG.tst @@ -0,0 +1,76 @@ +# +# Tests for the "projective general" group constructors: PGL, POmega, PGU +# +gap> START_TEST("classic-PG.tst"); + +# +gap> PGL(4,5); + +gap> last = PGL(IsPermGroup,4,5); +true +gap> PGL(4,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveGeneralLinearGroupCons' on 3 \ +arguments +gap> PGL(3); +Error, usage: ProjectiveGeneralLinearGroup( [, ], ) +gap> PGL(3,6); +Error, usage: GeneralLinearGroup( [, ], ) + +# +gap> G := POmega(3,7); + +gap> G = POmega(0,3,7); +true +gap> G = POmega(IsPermGroup,3,7); +true + +# +gap> POmega(3,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveOmegaCons' on 4 arguments +gap> POmega(3); +Error, usage: ProjectiveOmega( [, ][, ], ) +gap> POmega(3,6); +Error, must be a prime or a finite field +gap> POmega(-1,3,5); +Error, sign <> 0 but dimension is odd +gap> POmega(+1,3,5); +Error, sign <> 0 but dimension is odd +gap> POmega(2,3,5); +Error, sign <> 0 but dimension is odd + +# +gap> POmega(-1,4,9); + +gap> last = POmega(IsPermGroup,-1,4,9); +true + +# +gap> POmega(1,4,9); + +gap> last = POmega(IsPermGroup,1,4,9); +true + +# +gap> POmega(4,9); +Error, sign = 0 but dimension is even +gap> POmega(0,4,9); +Error, sign = 0 but dimension is even + +# +gap> PGU(3,5); + +gap> last = PGU(IsPermGroup,3,5); +true +gap> PGU(3,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveGeneralUnitaryGroupCons' on 3\ + arguments +gap> PGU(3); +Error, usage: ProjectiveGeneralUnitaryGroup( [, ], ) +gap> PGU(3,6); +Error, must be a prime or a finite field + +# +gap> STOP_TEST("classic-PG.tst", 10000); diff --git a/tst/testinstall/grp/classic-PS.tst b/tst/testinstall/grp/classic-PS.tst new file mode 100644 index 0000000000..961b938607 --- /dev/null +++ b/tst/testinstall/grp/classic-PS.tst @@ -0,0 +1,51 @@ +# +# Tests for the "projective special" group constructors: PSL, PSU, PSp +# +gap> START_TEST("classic-PS.tst"); + +# +gap> PSL(4,5); + +gap> last = PSL(IsPermGroup,4,5); +true +gap> PSL(4,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveSpecialLinearGroupCons' on 3 \ +arguments +gap> PSL(3); +Error, usage: ProjectiveSpecialLinearGroup( [, ], ) +gap> PSL(3,6); +Error, usage: SpecialLinearGroup( [, ], ) + +# +gap> PSU(3,5); + +gap> last = PSU(IsPermGroup,3,5); +true +gap> PSU(3,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveSpecialUnitaryGroupCons' on 3\ + arguments +gap> PSU(3); +Error, usage: ProjectiveSpecialUnitaryGroup( [, ], ) +gap> PSU(3,6); +Error, must be a prime or a finite field + +# +gap> PSp(4,5); + +gap> last = PSp(IsPermGroup,4,5); +true +gap> PSp(3,5); +Error, the dimension must be even +gap> PSp(4,GF(5)); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ProjectiveSymplecticGroupCons' on 3 arg\ +uments +gap> PSp(4); +Error, usage: ProjectiveSymplecticGroup( [, ], ) +gap> PSp(4,6); +Error, must be a prime or a finite field + +# +gap> STOP_TEST("classic.tst-PS", 10000); diff --git a/tst/testinstall/grp/classic-S.tst b/tst/testinstall/grp/classic-S.tst new file mode 100644 index 0000000000..51c556cbea --- /dev/null +++ b/tst/testinstall/grp/classic-S.tst @@ -0,0 +1,101 @@ +# +# Tests for the "special" group constructors: SL, SO, SU, Sp, SigmaL +# +gap> START_TEST("classic-S.tst"); + +# +gap> SL(2,5); +SL(2,5) +gap> last = SL(2,GF(5)); +true +gap> SL(IsPermGroup,3,4); +Perm_SL(3,4) +gap> last = SL(IsPermGroup,3,GF(4)); +true +gap> SL(3); +Error, usage: SpecialLinearGroup( [, ], ) +gap> SL(3,6); +Error, usage: SpecialLinearGroup( [, ], ) + +# +gap> G := SO(3,5); +SO(0,3,5) +gap> G = SO(0,3,5); +true +gap> G = SO(3,GF(5)); +true +gap> G = SO(0,3,GF(5)); +true +gap> SO(IsPermGroup,3,5); +Perm_SO(0,3,5) + +# +gap> SO(3); +Error, usage: SpecialOrthogonalGroup( [, ][, ], ) +gap> SO(3,6); +Error, must be a prime or a finite field +gap> SO(-1,3,5); +Error, sign <> 0 but dimension is odd +gap> SO(+1,3,5); +Error, sign <> 0 but dimension is odd +gap> SO(2,3,5); +Error, sign must be -1, 0, +1 + +# +gap> SO(-1,4,9); +SO(-1,4,9) +gap> last = SO(-1,4,GF(9)); +true +gap> SO(IsPermGroup,-1,4,9); +Perm_SO(-1,4,9) + +# +gap> SO(1,4,9); +SO(+1,4,9) +gap> last = SO(+1,4,GF(9)); +true +gap> SO(IsPermGroup,1,4,9); +Perm_SO(+1,4,9) + +# +gap> SO(4,9); +Error, sign = 0 but dimension is even +gap> SO(0,4,9); +Error, sign = 0 but dimension is even + +# +gap> SU(3,5); +SU(3,5) +gap> SU(IsPermGroup,3,4); +Perm_SU(3,4) +gap> SU(3); +Error, usage: SpecialUnitaryGroup( [, ], ) +gap> SU(3,6); +Error, must be a prime or a finite field + +# +gap> Sp(4,5); +Sp(4,5) +gap> last = Sp(4,GF(5)); +true +gap> Sp(3,5); +Error, the dimension must be even +gap> Sp(4); +Error, usage: SymplecticGroup( [, ], ) +gap> Sp(4,6); +Error, must be a prime or a finite field + +# +gap> SigmaL(3,5); +SL(3,5) +gap> SigmaL(3,9); +SigmaL(3,9) +gap> Size(last) / Size(SL(3,9)); +2 +gap> SigmaL(3); +Error, usage: SpecialSemilinearGroup( [, ], ) +gap> SigmaL(3,6); +Error, must be a prime or a finite field + +# +gap> STOP_TEST("classic.tst-S", 10000); diff --git a/tst/testinstall/grp/glzmodmz.tst b/tst/testinstall/grp/glzmodmz.tst new file mode 100644 index 0000000000..dd980eae80 --- /dev/null +++ b/tst/testinstall/grp/glzmodmz.tst @@ -0,0 +1,38 @@ +gap> START_TEST("glzmodmz.tst"); + +# +gap> SizeOfGLdZmodmZ(2,2); +6 +gap> SizeOfGLdZmodmZ(2,4); +96 +gap> SizeOfGLdZmodmZ(2,1); +Error, GL(2,Integers mod 1) is not a well-defined group, resp. not supported. + + +# +gap> G:=GL(4,Integers mod 4); +GL(4,Z/4Z) +gap> H:=SL(4,Integers mod 4); +SL(4,Z/4Z) +gap> K:=Sp(4,Integers mod 4); +Sp(4,Z/4Z) + +# +gap> NrMovedPoints(Image(NiceMonomorphism(G : cheap)));; +gap> NrMovedPoints(Image(NiceMonomorphism(H : cheap)));; +gap> NrMovedPoints(Image(NiceMonomorphism(K : cheap)));; + +# +gap> IsSubgroup(G,H); IsSubgroup(H,K); IsSubgroup(G,K); +true +true +true + +# +gap> Size(G); Size(H); Size(K); +1321205760 +660602880 +737280 + +# +gap> STOP_TEST("glzmodmz.tst", 10000); diff --git a/tst/testinstall/grp/perf.tst b/tst/testinstall/grp/perf.tst new file mode 100644 index 0000000000..7af379da69 --- /dev/null +++ b/tst/testinstall/grp/perf.tst @@ -0,0 +1,132 @@ +gap> START_TEST("perfectgroups.tst"); + +# +gap> NumberPerfectGroups(30); +0 +gap> NumberPerfectGroups(60^6); +fail +gap> NumberPerfectLibraryGroups(60^6); +0 + +# +gap> SizesPerfectGroups(); +[ 1, 60, 120, 168, 336, 360, 504, 660, 720, 960, 1080, 1092, 1320, 1344, + 1920, 2160, 2184, 2448, 2520, 2688, 3000, 3420, 3600, 3840, 4080, 4860, + 4896, 5040, 5376, 5616, 5760, 6048, 6072, 6840, 7200, 7500, 7560, 7680, + 7800, 7920, 9720, 9828, 10080, 10752, 11520, 12144, 12180, 14400, 14520, + 14580, 14880, 15000, 15120, 15360, 15600, 16464, 17280, 19656, 20160, + 21504, 21600, 23040, 24360, 25308, 25920, 28224, 29120, 29160, 29760, + 30240, 30720, 32256, 32736, 34440, 34560, 37500, 39600, 39732, 40320, + 43008, 43200, 43320, 43740, 46080, 48000, 50616, 51840, 51888, 56448, + 57600, 57624, 58240, 58320, 58800, 60480, 61440, 62400, 64512, 64800, + 65520, 68880, 69120, 74412, 75000, 77760, 79200, 79464, 79860, 80640, + 84672, 86016, 86400, 87480, 92160, 95040, 96000, 100920, 102660, 103776, + 110880, 112896, 113460, 115200, 115248, 115320, 116480, 117600, 120000, + 120960, 122472, 122880, 126000, 129024, 129600, 131040, 131712, 138240, + 144060, 146880, 148824, 150348, 151200, 151632, 155520, 158400, 159720, + 160380, 161280, 169344, 172032, 174960, 175560, 178920, 180000, 181440, + 183456, 184320, 187500, 190080, 192000, 194472, 201720, 205200, 205320, + 216000, 221760, 223608, 225792, 226920, 230400, 232320, 233280, 237600, + 240000, 241920, 243000, 244800, 244944, 245760, 246480, 254016, 258048, + 259200, 262080, 262440, 263424, 265680, 276480, 285852, 288120, 291600, + 293760, 300696, 302400, 311040, 320760, 322560, 332640, 336960, 344064, + 345600, 352440, 357840, 360000, 362880, 363000, 364320, 366912, 367416, + 368640, 369096, 372000, 375000, 378000, 384000, 387072, 388800, 388944, + 393120, 393660, 410400, 411264, 411540, 417720, 423360, 432000, 435600, + 443520, 446520, 447216, 450000, 451584, 453600, 456288, 460800, 460992, + 464640, 466560, 468000, 475200, 480000, 483840, 489600, 491520, 492960, + 504000, 515100, 516096, 518400, 524880, 531360, 544320, 546312, 550368, + 552960, 571704, 574560, 583200, 587520, 589680, 600000, 604800, 604920, + 607500, 612468, 622080, 626688, 633600, 645120, 647460, 665280, 673920, + 675840, 677376, 685440, 688128, 691200, 693120, 699840, 704880, 712800, + 720720, 721392, 725760, 728640, 729000, 730800, 733824, 734832, 737280, + 748920, 768000, 774144, 777600, 786240, 787320, 806736, 816480, 820800, + 822528, 823080, 846720, 864000, 871200, 874800, 878460, 881280, 885720, + 887040, 892800, 900000, 903168, 907200, 912576, 921600, 921984, 929280, + 933120, 936000, 937500, 943488, 950400, 950520, 960000, 962280, 967680, + 976500, 979200, 979776, 983040, 987840 ] +gap> List(SizesPerfectGroups(), NrPerfectLibraryGroups); +[ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 7, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 3, 1, 1, 9, 4, 1, 1, 1, 1, 1, + 1, 3, 1, 7, 1, 1, 1, 1, 5, 22, 1, 3, 1, 1, 1, 1, 1, 4, 1, 1, 37, 2, 1, 1, + 4, 1, 1, 1, 4, 25, 3, 1, 1, 1, 3, 1, 1, 1, 2, 2, 2, 1, 2, 1, 3, 0, 1, 4, 1, + 1, 1, 4, 1, 4, 4, 3, 1, 1, 6, 1, 0, 1, 8, 2, 1, 3, 1, 1, 1, 1, 1, 1, 15, 3, + 1, 1, 1, 4, 5, 2, 0, 1, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 18, 1, 3, 1, 12, + 1, 0, 8, 1, 1, 1, 3, 1, 19, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 2, 1, 26, 3, 3, + 1, 17, 5, 1, 1, 2, 0, 1, 1, 4, 3, 2, 7, 1, 1, 2, 1, 3, 2, 3, 1, 3, 18, 1, + 27, 1, 1, 0, 3, 1, 1, 1, 6, 1, 1, 3, 3, 0, 1, 1, 11, 1, 1, 2, 2, 1, 1, 4, + 3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 3, 8, 1, 1, 25, 4, 3, 18, 1, 4, 17, 6, 1, 0, + 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 19, 1, 1, 7, 1, 1, 2, 3, 1, 4, 1, 12, 1, 2, + 41, 1, 1, 1, 3, 2, 1, 0, 23, 3, 2, 1, 1, 1, 1, 2, 3, 2, 1, 1, 3, 0, 1, 13, + 2, 5, 3, 16, 2, 2, 1, 3, 2, 3, 3, 2, 1, 2, 1, 1, 3, 1, 7, 6, 4, 1, 23, 8, + 2, 21, 3, 8, 1, 2, 1, 12, 1, 20, 1, 1, 4, 0, 1 ] +gap> List(SizesPerfectGroups(), NrPerfectGroups); +[ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 7, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 3, 1, 1, 9, 4, 1, 1, 1, 1, 1, + 1, 3, 1, 7, 1, 1, 1, 1, 5, 22, 1, 3, 1, 1, 1, 1, 1, 4, 1, 1, 37, 2, 1, 1, + 4, 1, 1, 1, 4, 25, 3, 1, 1, 1, 3, 1, 1, 1, 2, 2, 2, 1, 2, 1, 3, fail, 1, 4, + 1, 1, 1, 4, 1, 4, 4, 3, 1, 1, 6, 1, 52, 1, 8, 2, 1, 3, 1, 1, 1, 1, 1, 1, + 15, 3, 1, 1, 1, 4, 5, 2, fail, 1, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 18, 1, + 3, 1, 12, 1, fail, 8, 1, 1, 1, 3, 1, 19, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 2, + 1, 26, 3, 3, 1, 17, 5, 1, 1, 2, fail, 1, 1, 4, 3, 2, 7, 1, 1, 2, 1, 3, 2, + 3, 1, 3, 18, 1, 27, 1, 1, fail, 3, 1, 1, 1, 6, 1, 1, 3, 3, 46, 1, 1, 11, 1, + 1, 2, 2, 1, 1, 4, 3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 3, 8, 1, 1, 25, 4, 3, 18, + 1, 4, 17, 6, 1, fail, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 19, 1, 1, 7, 1, 1, 2, + 3, 1, 4, 1, 12, 1, 2, 41, 1, 1, 1, 3, 2, 1, fail, 23, 3, 2, 1, 1, 1, 1, 2, + 3, 2, 1, 1, 3, 54, 1, 13, 2, 5, 3, 16, 2, 2, 1, 3, 2, 3, 3, 2, 1, 2, 1, 1, + 3, 1, 7, 6, 4, 1, 23, 8, 2, 21, 3, 8, 1, 2, 1, 12, 1, 20, 1, 1, 4, fail, 1 ] + +# +gap> DisplayInformationPerfectGroups(60); +#I Perfect group 60: simple group A5 +#I size = 2^2*3*5 orbit size = 5 +#I Holt-Plesken class 1 (0,1) (occurs also in classes 2, 3, 4, 5) +gap> DisplayInformationPerfectGroups(960); +#I Perfect group 960.1: A5 2^4 +#I size = 2^6*3*5 orbit size = 16 +#I Holt-Plesken class 1 (4,1) +#I Perfect group 960.2: A5 2^4' +#I size = 2^6*3*5 orbit size = 10 +#I Holt-Plesken class 1 (4,2) (occurs also in class 7) +gap> DisplayInformationPerfectGroups(3840,1); +#I Perfect group 3840: A5 ( 2^4 E 2^1 A ) C 2^1 I +#I centre = 4 size = 2^8*3*5 orbit size = 64 +#I Holt-Plesken class 1 (6,1) +gap> DisplayInformationPerfectGroups([3840,2]); +#I Perfect group 3840: A5 ( 2^4 E 2^1 A ) C 2^1 II +#I centre = 4 size = 2^8*3*5 orbit size = 64 +#I Holt-Plesken class 1 (6,2) + +# +gap> SizeNumbersPerfectGroups("A8"); +[ [ 20160, 4 ], [ 40320, 3 ], [ 322560, 4 ], [ 322560, 5 ], [ 645120, 4 ], + [ 645120, 5 ] ] +gap> SizeNumbersPerfectGroups(3,"A7",2,3); +[ [ 453600, 1 ], [ 907200, 1 ], [ 907200, 2 ], [ 907200, 3 ], [ 907200, 4 ] ] +gap> SizeNumbersPerfectGroups("A7",18); +[ [ 453600, 1 ], [ 907200, 1 ], [ 907200, 2 ], [ 907200, 3 ], [ 907200, 4 ] ] +gap> SizeNumbersPerfectGroups("A8",-1); +Error, illegal order of abelian factor +gap> SizeNumbersPerfectGroups("S8"); +Error, illegal name of simple factor + +# +gap> PerfectIdentification(AlternatingGroup(5)); +[ 60, 1 ] +gap> PerfectIdentification(AlternatingGroup(4)); +fail + +# +# construct some perfect groups which exercise the different construction methods +# +gap> PerfectGroup(48000, 1); +A5 # 2^5 5^2 [1] +gap> PerfectGroup(56448, 1); +( L3(2) x L3(2) ) 2^1 [1] +gap> PerfectGroup(56448, 2); +( L3(2) x L3(2) ) 2^1 [2] +gap> PerfectGroup(77760, 1); +A5 # 2^4 3^4 [1] + +# +gap> STOP_TEST("perfectgroups.tst", 10000); diff --git a/tst/testinstall/grp/ree.tst b/tst/testinstall/grp/ree.tst new file mode 100644 index 0000000000..881fcd9544 --- /dev/null +++ b/tst/testinstall/grp/ree.tst @@ -0,0 +1,35 @@ +gap> START_TEST("ree.tst"); + +# +gap> G:=ReeGroup(3); +Ree(3) +gap> IsMatrixGroup(G); +true +gap> Size(G); +1512 +gap> ReeGroup(27); +Ree(27) +gap> Size(last); +10073444472 + +# +gap> H:=ReeGroup(IsPermGroup,3); +Perm_Ree(3) +gap> IsPermGroup(H); +true + +# +gap> ReeGroup(2); +Error, Usage: ReeGroup(,3^(1+2m)) +gap> ReeGroup(IsPermGroup,2); +Error, Usage: ReeGroup(,3^(1+2m)) +gap> ReeGroup(9); +Error, Usage: ReeGroup(,3^(1+2m)) + +# +gap> ReeGroup(IsFpGroup,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ReeGroupCons' on 2 arguments + +# +gap> STOP_TEST("ree.tst", 10000); diff --git a/tst/testinstall/grp/suzuki.tst b/tst/testinstall/grp/suzuki.tst new file mode 100644 index 0000000000..1a8f040bac --- /dev/null +++ b/tst/testinstall/grp/suzuki.tst @@ -0,0 +1,35 @@ +gap> START_TEST("suzuki.tst"); + +# +gap> G:=SuzukiGroup(2); +Sz(2) +gap> IsMatrixGroup(G); +true +gap> Size(G); +20 +gap> SuzukiGroup(8); +Sz(8) +gap> Size(last); +29120 + +# +gap> H:=SuzukiGroup(IsPermGroup,2); +Sz(2) +gap> IsPermGroup(H); +true + +# +gap> SuzukiGroup(3); +Error, must be a non-square power of 2 +gap> SuzukiGroup(IsPermGroup,3); +Error, must be a non-square power of 2 +gap> SuzukiGroup(4); +Error, must be a non-square power of 2 + +# +gap> SuzukiGroup(IsFpGroup,2); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `SuzukiGroupCons' on 2 arguments + +# +gap> STOP_TEST("suzuki.tst", 10000); From 1b56939c2a9b5c7ad9288374a553740612899882 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 16:16:19 +0100 Subject: [PATCH 03/14] tests: construct all perfect groups --- tst/testinstall/grp/perf.tst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tst/testinstall/grp/perf.tst b/tst/testinstall/grp/perf.tst index 7af379da69..2978cd8b8c 100644 --- a/tst/testinstall/grp/perf.tst +++ b/tst/testinstall/grp/perf.tst @@ -128,5 +128,15 @@ gap> PerfectGroup(56448, 2); gap> PerfectGroup(77760, 1); A5 # 2^4 3^4 [1] +# +# construct all perfect groups, to verify this works +# TODO: slow (takes a few seconds), move to teststandard? +# +gap> for n in SizesPerfectGroups() do +> for i in [1..NumberPerfectLibraryGroups(n)] do +> PerfectGroup(n, i); +> od; +> od; + # gap> STOP_TEST("perfectgroups.tst", 10000); From cacf73444541488c8e69da57b4bc38c082d88494 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 16:22:07 +0100 Subject: [PATCH 04/14] grp: fix GO(+1,4,5) --- grp/classic.gi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grp/classic.gi b/grp/classic.gi index 721722f1f1..505255ac62 100644 --- a/grp/classic.gi +++ b/grp/classic.gi @@ -403,7 +403,7 @@ BindGlobal( "Oplus45", function() # construct the group without calling 'Group' g := [ phi*tau2, tau*eichler*delta ]; - g:=List(g,i->ImmutableMatrix(f,i),true); + g:=List(g,i->ImmutableMatrix(f,i)); g := GroupWithGenerators( g ); SetDimensionOfMatrixGroup( g, 4 ); SetFieldOfMatrixGroup( g, f ); From 2b1ea6fbb891f715ee313a0a3ac1059cc128c8c1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 17:00:06 +0100 Subject: [PATCH 05/14] tests: verify forms of orthogonal and unitary groups --- tst/testinstall/grp/classic-forms.tst | 126 ++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tst/testinstall/grp/classic-forms.tst diff --git a/tst/testinstall/grp/classic-forms.tst b/tst/testinstall/grp/classic-forms.tst new file mode 100644 index 0000000000..cf888a3b92 --- /dev/null +++ b/tst/testinstall/grp/classic-forms.tst @@ -0,0 +1,126 @@ +# +# Tests invariant forms of classic groups +# TODO: also test quadratic forms +# +gap> START_TEST("classic-forms.tst"); + +# +gap> CheckGeneratorsInvertible := function(G) +> return ForAll(GeneratorsOfGroup(G), +> g -> not IsZero(Determinant(g))); +> end;; +gap> CheckGeneratorsSpecial := function(G) +> return ForAll(GeneratorsOfGroup(G), +> g -> IsOne(Determinant(g))); +> end;; +gap> CheckBilinearForm := function(G) +> local M; +> M := InvariantBilinearForm(G).matrix; +> return ForAll(GeneratorsOfGroup(G), +> g -> g*M*TransposedMat(g) = M); +> end;; +gap> frob := function(g,aut) +> return List(g,row->List(row,x->x^aut)); +> end;; +gap> CheckSesquilinearForm := function(G) +> local M, F, aut; +> M := InvariantSesquilinearForm(G).matrix; +> F := FieldOfMatrixGroup(G); +> aut := FrobeniusAutomorphism(F); +> aut := aut^(DegreeOverPrimeField(F)/2); +> return ForAll(GeneratorsOfGroup(G), +> g -> g*M*TransposedMat(frob(g,aut)) = M); +> end;; + +# odd-dimensional general orthogonal groups +gap> grps:=[];; +gap> for d in [3,5,7] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, GO(d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsInvertible); +true +gap> ForAll(grps, CheckBilinearForm); +true + +# even-dimensional general orthogonal groups +gap> grps:=[];; +gap> for d in [2,4,6,8] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, GO(+1,d,q)); +> Add(grps, GO(-1,d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsInvertible); +true +gap> ForAll(grps, CheckBilinearForm); +true + +# odd-dimensional special orthogonal groups +gap> grps:=[];; +gap> for d in [3,5,7] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, SO(d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsSpecial); +true +gap> ForAll(grps, CheckBilinearForm); +true + +# even-dimensional special orthogonal groups +gap> grps:=[];; +gap> for d in [2,4,6,8] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, SO(+1,d,q)); +> Add(grps, SO(-1,d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsSpecial); +true +gap> ForAll(grps, CheckBilinearForm); +true + +# +# unitary groups +# + +# general unitary groups +gap> grps:=[];; +gap> for d in [2..6] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, GU(d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsInvertible); +true +gap> ForAll(grps, CheckSesquilinearForm); +true + +# TODO: dimension 1 does not have InvariantSesquilinearForm set +gap> GU(1,2); +GU(1,2) +gap> GU(1,5); +GU(1,5) + +# special unitary groups +gap> grps:=[];; +gap> for d in [2..6] do +> for q in [2,3,4,5,7,8,9] do +> Add(grps, SU(d,q)); +> od; +> od; +gap> ForAll(grps, CheckGeneratorsInvertible); +true +gap> ForAll(grps, CheckSesquilinearForm); +true + +# TODO: dimension 1 does not have InvariantSesquilinearForm set +gap> SU(1,2); +SL(1,2) +gap> SU(1,5); +SL(1,5) + +# +gap> STOP_TEST("classic-forms.tst", 10000); From 54ba846f0bd7c3cb3939c8b4facc245d6e870961 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 17:00:42 +0100 Subject: [PATCH 06/14] tests: move some fast tests from teststandard to testinstall Also updated some comments explaining why certain tests are excluded from testinstall. --- tst/{teststandard => testinstall}/ctbl.tst | 2 -- tst/{teststandard => testinstall}/dict.tst | 0 tst/testinstall/eigen.tst | 2 -- tst/{teststandard => testinstall}/fldabnum.tst | 1 - tst/{teststandard => testinstall}/float.tst | 0 tst/{teststandard => testinstall}/mapphomo.tst | 0 tst/{teststandard => testinstall}/matblock.tst | 2 -- tst/{teststandard => testinstall}/package.tst | 2 -- tst/{teststandard => testinstall}/rwspcsng.tst | 2 -- tst/testinstall/set.tst | 2 -- tst/{teststandard => testinstall}/startendwith.tst | 0 tst/testinstall/unknown.tst | 2 -- tst/testinstall/vspcmali.tst | 2 -- tst/teststandard/grpconst.tst | 3 ++- tst/teststandard/grplatt.tst | 2 +- tst/teststandard/grpperm.tst | 2 +- tst/teststandard/grpprmcs.tst | 2 +- tst/teststandard/hash2.tst | 2 +- tst/teststandard/matrix.tst | 2 +- tst/teststandard/permgrp.tst | 2 +- tst/teststandard/reesmat.tst | 2 +- tst/teststandard/simplegrpit.tst | 3 ++- 22 files changed, 11 insertions(+), 26 deletions(-) rename tst/{teststandard => testinstall}/ctbl.tst (97%) rename tst/{teststandard => testinstall}/dict.tst (100%) rename tst/{teststandard => testinstall}/fldabnum.tst (99%) rename tst/{teststandard => testinstall}/float.tst (100%) rename tst/{teststandard => testinstall}/mapphomo.tst (100%) rename tst/{teststandard => testinstall}/matblock.tst (98%) rename tst/{teststandard => testinstall}/package.tst (98%) rename tst/{teststandard => testinstall}/rwspcsng.tst (99%) rename tst/{teststandard => testinstall}/startendwith.tst (100%) diff --git a/tst/teststandard/ctbl.tst b/tst/testinstall/ctbl.tst similarity index 97% rename from tst/teststandard/ctbl.tst rename to tst/testinstall/ctbl.tst index d2f53f21ca..82b1813665 100644 --- a/tst/teststandard/ctbl.tst +++ b/tst/testinstall/ctbl.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 1998, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("ctbl.tst"); # `ClassPositionsOf...' for the trivial group (which usually causes trouble) diff --git a/tst/teststandard/dict.tst b/tst/testinstall/dict.tst similarity index 100% rename from tst/teststandard/dict.tst rename to tst/testinstall/dict.tst diff --git a/tst/testinstall/eigen.tst b/tst/testinstall/eigen.tst index 9807ebb9fd..a781dccc7f 100644 --- a/tst/testinstall/eigen.tst +++ b/tst/testinstall/eigen.tst @@ -6,8 +6,6 @@ ## #Y Copyright (C) 1998, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("eigen.tst"); gap> A := GL(4,3).1; [ [ Z(3), 0*Z(3), 0*Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ], diff --git a/tst/teststandard/fldabnum.tst b/tst/testinstall/fldabnum.tst similarity index 99% rename from tst/teststandard/fldabnum.tst rename to tst/testinstall/fldabnum.tst index c131391c44..0edb32dff4 100644 --- a/tst/teststandard/fldabnum.tst +++ b/tst/testinstall/fldabnum.tst @@ -5,7 +5,6 @@ ## #Y Copyright (C) 1996, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? ## gap> START_TEST("fldabnum.tst"); gap> CF( 1 ); CF( 6 ); CF( 4 ); CF( 5 ); CF( 36 ); diff --git a/tst/teststandard/float.tst b/tst/testinstall/float.tst similarity index 100% rename from tst/teststandard/float.tst rename to tst/testinstall/float.tst diff --git a/tst/teststandard/mapphomo.tst b/tst/testinstall/mapphomo.tst similarity index 100% rename from tst/teststandard/mapphomo.tst rename to tst/testinstall/mapphomo.tst diff --git a/tst/teststandard/matblock.tst b/tst/testinstall/matblock.tst similarity index 98% rename from tst/teststandard/matblock.tst rename to tst/testinstall/matblock.tst index f6f38b1baa..164b86b662 100644 --- a/tst/teststandard/matblock.tst +++ b/tst/testinstall/matblock.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 1997, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("matblock.tst"); gap> m1 := BlockMatrix( [ [ 1, 1, [[1,1],[0,1]] ], > [ 1, 3, [[1,0],[0,1]] ], diff --git a/tst/teststandard/package.tst b/tst/testinstall/package.tst similarity index 98% rename from tst/teststandard/package.tst rename to tst/testinstall/package.tst index dc06e34955..419200d06d 100644 --- a/tst/teststandard/package.tst +++ b/tst/testinstall/package.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 2005, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("package.tst"); # CompareVersionNumbers( , [, \"equal\"] ) diff --git a/tst/teststandard/rwspcsng.tst b/tst/testinstall/rwspcsng.tst similarity index 99% rename from tst/teststandard/rwspcsng.tst rename to tst/testinstall/rwspcsng.tst index f1c3d821e7..fb98dd0d85 100644 --- a/tst/teststandard/rwspcsng.tst +++ b/tst/testinstall/rwspcsng.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 1996, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("rwspcsng.tst"); ############################################################################# diff --git a/tst/testinstall/set.tst b/tst/testinstall/set.tst index df1ee0a943..f03a05eb26 100644 --- a/tst/testinstall/set.tst +++ b/tst/testinstall/set.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 1996, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("set.tst"); gap> a:=Set([(1,3,2),(4,5)]);; gap> b:=[(1,2),(5,9,7)];; diff --git a/tst/teststandard/startendwith.tst b/tst/testinstall/startendwith.tst similarity index 100% rename from tst/teststandard/startendwith.tst rename to tst/testinstall/startendwith.tst diff --git a/tst/testinstall/unknown.tst b/tst/testinstall/unknown.tst index 157dc2f470..24218a6f9d 100644 --- a/tst/testinstall/unknown.tst +++ b/tst/testinstall/unknown.tst @@ -5,8 +5,6 @@ ## #Y Copyright (C) 1996, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? -## gap> START_TEST("unknown.tst"); gap> LargestUnknown:= 0;; gap> u:= Unknown(); diff --git a/tst/testinstall/vspcmali.tst b/tst/testinstall/vspcmali.tst index 05b3139382..2305aa326a 100644 --- a/tst/testinstall/vspcmali.tst +++ b/tst/testinstall/vspcmali.tst @@ -10,8 +10,6 @@ ## (The test files 'vspcrow.tst' and 'vspcmat.tst' should contain the same ## tests.) ## -## Exclude from testinstall.g: why? -## gap> START_TEST("vspcmali.tst"); ############################################################################# diff --git a/tst/teststandard/grpconst.tst b/tst/teststandard/grpconst.tst index 38e62c448b..7fb3cc46e3 100644 --- a/tst/teststandard/grpconst.tst +++ b/tst/teststandard/grpconst.tst @@ -5,7 +5,8 @@ ## #Y Copyright (C) 1999, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? +## Exclude from testinstall.g because it loads the grpconst package +## TODO: this should be moved into grpconst package ## gap> START_TEST("grpconst.tst"); diff --git a/tst/teststandard/grplatt.tst b/tst/teststandard/grplatt.tst index 2773e0b99d..03379ec37f 100644 --- a/tst/teststandard/grplatt.tst +++ b/tst/teststandard/grplatt.tst @@ -7,7 +7,7 @@ ## ## This file tests the subgroup lattice program ## -## Exclude from testinstall.g: why? +## Exclude from testinstall.g as it takes considerable time. ## gap> START_TEST("grplatt.tst"); gap> g:=PerfectGroup(IsPermGroup,95040);; diff --git a/tst/teststandard/grpperm.tst b/tst/teststandard/grpperm.tst index 629c76550d..029ff6e5cd 100644 --- a/tst/teststandard/grpperm.tst +++ b/tst/teststandard/grpperm.tst @@ -5,7 +5,7 @@ ## #Y Copyright (C) 1997 ## -## Exclude from testinstall.g: why? +## Exclude from testinstall.g as it takes considerable time. ## gap> START_TEST("grpperm.tst"); gap> G1 := TrivialSubgroup (Group ((1,2)));; diff --git a/tst/teststandard/grpprmcs.tst b/tst/teststandard/grpprmcs.tst index 22fb9fccdf..6bdf21fb68 100644 --- a/tst/teststandard/grpprmcs.tst +++ b/tst/teststandard/grpprmcs.tst @@ -5,7 +5,7 @@ ## #Y Copyright (C) 1998, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## -## Exclude from testinstall.g: why? +## Exclude from testinstall.g as it takes considerable time. ## gap> START_TEST("grpprmcs.tst"); diff --git a/tst/teststandard/hash2.tst b/tst/teststandard/hash2.tst index 30d311b4e2..cc574200f9 100644 --- a/tst/teststandard/hash2.tst +++ b/tst/teststandard/hash2.tst @@ -6,7 +6,7 @@ #Y Copyright (C) 1998, Lehrstuhl D für Mathematik, RWTH Aachen, Germany ## ## Test orbit algorithms, which use hashing -## Exclude from testinstall.g: why? +## Exclude from testinstall.g as it takes considerable time. ## gap> START_TEST("hash2.tst"); gap> g:=GL(20,2);; diff --git a/tst/teststandard/matrix.tst b/tst/teststandard/matrix.tst index 0fe8d3b52d..35a2a42e88 100644 --- a/tst/teststandard/matrix.tst +++ b/tst/teststandard/matrix.tst @@ -6,7 +6,7 @@ ## #Y (C) 1998 School Math. and Comp. Sci., University of St Andrews, Scotland ## -## Exclude from testinstall.g: why? +## Exclude from testinstall.g: why? (takes a few seconds to run) ## gap> START_TEST("matrix.tst"); gap> ## diff --git a/tst/teststandard/permgrp.tst b/tst/teststandard/permgrp.tst index d6e6851ea3..dd0b0c8324 100644 --- a/tst/teststandard/permgrp.tst +++ b/tst/teststandard/permgrp.tst @@ -4,7 +4,7 @@ ## ## ## -## Some tests for permutation groups and friends +## Some tests for permutation groups and friends(takes a few seconds to run) ## gap> START_TEST("permgrp.tst"); gap> Size(Normalizer(SymmetricGroup(100),PrimitiveGroup(100,1))); diff --git a/tst/teststandard/reesmat.tst b/tst/teststandard/reesmat.tst index d76f8a67b2..28b1e0595c 100644 --- a/tst/teststandard/reesmat.tst +++ b/tst/teststandard/reesmat.tst @@ -5,7 +5,7 @@ ## #Y Copyright (C) 2013 The GAP Group ## -## To be listed in testall.g +## To be listed in testall.g (takes a few seconds to run) ## gap> START_TEST("reesmat.tst"); diff --git a/tst/teststandard/simplegrpit.tst b/tst/teststandard/simplegrpit.tst index e1ce6352e9..6b99a9d3e0 100644 --- a/tst/teststandard/simplegrpit.tst +++ b/tst/teststandard/simplegrpit.tst @@ -7,7 +7,8 @@ ## ## -## The independence test is not really correct because the simple groups iterator is not required to output the finite simple groups in order. +## The independence test is not really correct because the simple groups +## iterator is not required to output the finite simple groups in order. gap> START_TEST("simplegrpit.tst"); gap> it := SimpleGroupsIterator(1); From ba25a69230734d3ec4430895475b6d2fb559e215 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 19:08:26 +0100 Subject: [PATCH 07/14] tests: cover two more ReeGroup/SuzukiGroup error messages These error message (and also those for the classical groups) seem to vary quite a bit. We may want to unify them at some point. --- tst/testinstall/grp/ree.tst | 2 ++ tst/testinstall/grp/suzuki.tst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tst/testinstall/grp/ree.tst b/tst/testinstall/grp/ree.tst index 881fcd9544..34d6347503 100644 --- a/tst/testinstall/grp/ree.tst +++ b/tst/testinstall/grp/ree.tst @@ -25,6 +25,8 @@ gap> ReeGroup(IsPermGroup,2); Error, Usage: ReeGroup(,3^(1+2m)) gap> ReeGroup(9); Error, Usage: ReeGroup(,3^(1+2m)) +gap> ReeGroup(3,9); +Error, usage: ReeGroup( [, ] ) # gap> ReeGroup(IsFpGroup,3); diff --git a/tst/testinstall/grp/suzuki.tst b/tst/testinstall/grp/suzuki.tst index 1a8f040bac..dc98931af5 100644 --- a/tst/testinstall/grp/suzuki.tst +++ b/tst/testinstall/grp/suzuki.tst @@ -25,6 +25,8 @@ gap> SuzukiGroup(IsPermGroup,3); Error, must be a non-square power of 2 gap> SuzukiGroup(4); Error, must be a non-square power of 2 +gap> SuzukiGroup(2,4); +Error, usage: SuzukiGroup( [, ] ) # gap> SuzukiGroup(IsFpGroup,2); From fffc58af07a82500813de2d21dafcd0ed2f428b0 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 19:16:25 +0100 Subject: [PATCH 08/14] grp: don't invoke constructors with too many arguments For some strange reasons, many group constructor wrapper allow the user to pass one more argument than documented. I could not find any methods supporting these extra arguments. Looking at the old repository, these extra calls already appear in the first GAP4 version of this code, added by Frank Celler 1997-01-15. So I think it's either a copy&paste mistake, or a remnant of GAP3. --- grp/basic.gd | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/grp/basic.gd b/grp/basic.gd index e3bdbb4f47..f1d4706afc 100644 --- a/grp/basic.gd +++ b/grp/basic.gd @@ -138,9 +138,6 @@ BindGlobal( "AbelianGroup", function ( arg ) if Length(arg) = 2 then return AbelianGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return AbelianGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: AbelianGroup( [, ] )" ); @@ -263,9 +260,6 @@ BindGlobal( "CyclicGroup", function ( arg ) if Length(arg) = 2 then return CyclicGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return CyclicGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: CyclicGroup( [, ] )" ); @@ -320,9 +314,6 @@ BindGlobal( "DihedralGroup", function ( arg ) if Length(arg) = 2 then return DihedralGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return DihedralGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: DihedralGroup( [, ] )" ); @@ -380,9 +371,6 @@ BindGlobal( "QuaternionGroup", function ( arg ) if Length(arg) = 2 then return QuaternionGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return QuaternionGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: QuaternionGroup( [, ] )" ); @@ -437,9 +425,6 @@ BindGlobal( "ElementaryAbelianGroup", function ( arg ) if Length(arg) = 2 then return ElementaryAbelianGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return ElementaryAbelianGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: ElementaryAbelianGroup( [, ] )" ); @@ -492,9 +477,6 @@ BindGlobal( "FreeAbelianGroup", function ( arg ) if Length(arg) = 2 then return FreeAbelianGroupCons( arg[1], arg[2] ); - - elif Length(arg) = 3 then - return FreeAbelianGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: FreeAbelianGroup( [, ] )" ); @@ -560,9 +542,6 @@ BindGlobal( "ExtraspecialGroup", function ( arg ) if Length(arg) = 3 then return ExtraspecialGroupCons( arg[1], arg[2], arg[3] ); - - elif Length(arg) = 4 then - return ExtraspecialGroupCons( arg[1], arg[2], arg[3], arg[4] ); fi; fi; Error( "usage: ExtraspecialGroup( [, ], )" ); @@ -616,9 +595,6 @@ BindGlobal( "MathieuGroup", function( arg ) if Length( arg ) = 2 then return MathieuGroupCons( arg[1], arg[2] ); - - elif Length( arg ) = 3 then - return MathieuGroupCons( arg[1], arg[2], arg[3] ); fi; fi; Error( "usage: MathieuGroup( [, ] )" ); From f1c3f33d874fa9670f23f74f2bc1fd5bec4af7e3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 19:49:37 +0100 Subject: [PATCH 09/14] grp: correct FreeAbelianGroup error message --- grp/basic.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grp/basic.gd b/grp/basic.gd index f1d4706afc..6c99793402 100644 --- a/grp/basic.gd +++ b/grp/basic.gd @@ -479,7 +479,7 @@ BindGlobal( "FreeAbelianGroup", function ( arg ) return FreeAbelianGroupCons( arg[1], arg[2] ); fi; fi; - Error( "usage: FreeAbelianGroup( [, ] )" ); + Error( "usage: FreeAbelianGroup( [, ] )" ); end ); From b504e5973a8a829c1591231f66e8fcc5457fedfe Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 20:03:32 +0100 Subject: [PATCH 10/14] grp: remove extra space from error messages --- grp/basic.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grp/basic.gd b/grp/basic.gd index 6c99793402..d018fae766 100644 --- a/grp/basic.gd +++ b/grp/basic.gd @@ -197,7 +197,7 @@ BindGlobal( "AlternatingGroup", function ( arg ) return AlternatingGroupCons( arg[1], arg[2] ); fi; fi; - Error( "usage: AlternatingGroup( [, ] )" ); + Error( "usage: AlternatingGroup( [, ] )" ); end ); @@ -659,7 +659,7 @@ BindGlobal( "SymmetricGroup", function ( arg ) return SymmetricGroupCons( arg[1], arg[2] ); fi; fi; - Error( "usage: SymmetricGroup( [, ] )" ); + Error( "usage: SymmetricGroup( [, ] )" ); end ); From 48acf389a9e57815538260b5acc0896090e7287b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 20:07:16 +0100 Subject: [PATCH 11/14] tests: add tests for basic group constructors --- tst/testinstall/grp/basic.tst | 250 ++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 tst/testinstall/grp/basic.tst diff --git a/tst/testinstall/grp/basic.tst b/tst/testinstall/grp/basic.tst new file mode 100644 index 0000000000..67b52e490b --- /dev/null +++ b/tst/testinstall/grp/basic.tst @@ -0,0 +1,250 @@ +# +# tests for grp/basic*.* +# +# groups appear in the order they appear in grp/basic.gd +# +gap> START_TEST("basic.tst"); + +# +# trivial groups +# +gap> TrivialGroup(); + +gap> TrivialGroup(IsPcGroup); + +gap> TrivialGroup(IsPermGroup); +Group(()) + +# +gap> TrivialGroup(1); +Error, usage: TrivialGroup( [] ) +gap> TrivialGroup(IsRing); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `TrivialGroupCons' on 1 arguments + +# +# abelian groups +# +gap> AbelianGroup([2,3]); + +gap> AbelianGroup(IsPcGroup,[2,3]); + +gap> AbelianGroup(IsPermGroup,[2,3]); +Group([ (1,2), (3,4,5) ]) +gap> AbelianGroup(IsFpGroup,[2,3]); + + +# +gap> AbelianGroup(2,3); +Error, usage: AbelianGroup( [, ] ) +gap> AbelianGroup(IsRing,[2,3]); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `AbelianGroupCons' on 2 arguments + +# +# alternating groups +# +gap> AlternatingGroup(4); +Alt( [ 1 .. 4 ] ) +gap> AlternatingGroup(IsPcGroup,4); + +gap> AlternatingGroup(IsPermGroup,4); +Alt( [ 1 .. 4 ] ) + +# not (yet?) supported +gap> AlternatingGroup(IsFpGroup,4); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `AlternatingGroupCons' on 2 arguments + +# +gap> AlternatingGroup(2,3); +Error, usage: AlternatingGroup( [, ] ) +gap> AlternatingGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `AlternatingGroupCons' on 2 arguments + +# +# cyclic groups +# +gap> CyclicGroup(4); + +gap> CyclicGroup(IsPcGroup,4); + +gap> CyclicGroup(IsPermGroup,4); +Group([ (1,2,3,4) ]) +gap> CyclicGroup(IsFpGroup,4); + + +# +gap> CyclicGroup(2,3); +Error, usage: CyclicGroup( [, ] ) +gap> CyclicGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `CyclicGroupCons' on 2 arguments + +# +# dihedral groups +# +gap> DihedralGroup(8); + +gap> DihedralGroup(IsPcGroup,8); + +gap> DihedralGroup(IsPermGroup,8); +Group([ (1,2,3,4), (2,4) ]) +gap> DihedralGroup(IsFpGroup,8); + + +# +gap> DihedralGroup(2,3); +Error, usage: DihedralGroup( [, ] ) +gap> DihedralGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `DihedralGroupCons' on 2 arguments + +# +# quaternion groups +# +gap> QuaternionGroup(8); + +gap> QuaternionGroup(IsPcGroup,8); + +gap> QuaternionGroup(IsPermGroup,8); +Group([ (1,5,3,7)(2,8,4,6), (1,2,3,4)(5,6,7,8) ]) +gap> QuaternionGroup(IsFpGroup,8); + + +# +gap> QuaternionGroup(2,3); +Error, usage: QuaternionGroup( [, ] ) +gap> QuaternionGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `QuaternionGroupCons' on 2 arguments + +# +# elementary abelian groups +# +gap> ElementaryAbelianGroup(8); + +gap> ElementaryAbelianGroup(IsPcGroup,8); + +gap> ElementaryAbelianGroup(IsPermGroup,8); +Group([ (1,2), (3,4), (5,6) ]) +gap> ElementaryAbelianGroup(IsFpGroup,8); + + +# +gap> ElementaryAbelianGroup(2,3); +Error, usage: ElementaryAbelianGroup( [, ] ) +gap> ElementaryAbelianGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ElementaryAbelianGroupCons' on 2 argume\ +nts + +# +# free abelian groups +# +gap> FreeAbelianGroup(2); + +gap> FreeAbelianGroup(IsFpGroup,2); + + +# +gap> FreeAbelianGroup(2,3); +Error, usage: FreeAbelianGroup( [, ] ) +gap> FreeAbelianGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `FreeAbelianGroupCons' on 2 arguments + +# +# extra special groups +# +gap> ExtraspecialGroup(27, 3); + +gap> ExtraspecialGroup(27, '+'); + +gap> ExtraspecialGroup(8, "-"); + +gap> ExtraspecialGroup(IsPcGroup, 125, 25); + + +# +gap> ExtraspecialGroup(8,3); +Error, must be '+', '-', "+", or "-" +gap> ExtraspecialGroup(27,2); +Error, must be

,

^2, '+', '-', "+", or "-" +gap> ExtraspecialGroup(9,3); +Error, order of an extraspecial group is a nonprime odd power of a prime +gap> ExtraspecialGroup(8); +Error, usage: ExtraspecialGroup( [, ], ) +gap> ExtraspecialGroup(IsRing,27,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `ExtraspecialGroupCons' on 3 arguments + +# +# Mathieu groups +# +gap> Transitivity(MathieuGroup(IsPermGroup, 24)); +5 +gap> Stabilizer(MathieuGroup(24),24) = MathieuGroup(23); +true + +# The following does *not* hold (probably for backwards compatibility?) +# gap> Stabilizer(MathieuGroup(23),23) = MathieuGroup(22); +# true +gap> IsomorphismGroups(Stabilizer(MathieuGroup(23),23), MathieuGroup(22)) <> fail; +true +gap> Stabilizer(MathieuGroup(22),22) = MathieuGroup(21); +true +gap> Size(Stabilizer(MathieuGroup(21),21)); +960 + +# +gap> Transitivity(MathieuGroup(IsPermGroup, 12)); +5 +gap> Stabilizer(MathieuGroup(12),12) = MathieuGroup(11); +true +gap> Stabilizer(MathieuGroup(11),11) = MathieuGroup(10); +true +gap> Stabilizer(MathieuGroup(10),10) = MathieuGroup(9); +true +gap> Size(Stabilizer(MathieuGroup(9),9)); +8 + +# not (yet?) supported +gap> MathieuGroup(IsFpGroup,12); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `MathieuGroupCons' on 2 arguments + +# +gap> MathieuGroup(13); +Error, degree must be 9, 10, 11, 12, 21, 22, 23, or 24 +gap> MathieuGroup(2,3); +Error, usage: MathieuGroup( [, ] ) +gap> MathieuGroup(IsRing,12); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `MathieuGroupCons' on 2 arguments + +# +# symmetric groups +# +gap> SymmetricGroup(3); +Sym( [ 1 .. 3 ] ) +gap> SymmetricGroup(IsPcGroup,3); + +gap> SymmetricGroup(IsPermGroup,3); +Sym( [ 1 .. 3 ] ) + +# not (yet?) supported +gap> SymmetricGroup(IsFpGroup,4); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `SymmetricGroupCons' on 2 arguments + +# +gap> SymmetricGroup(2,3); +Error, usage: SymmetricGroup( [, ] ) +gap> SymmetricGroup(IsRing,3); +Error, no method found! For debugging hints type ?Recovery from NoMethodFound +Error, no 1st choice method found for `SymmetricGroupCons' on 2 arguments + +# +gap> STOP_TEST("basic.tst", 10000); From 901749c034b194147c5d1481a42ebfa775774518 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 8 Jan 2017 20:18:34 +0100 Subject: [PATCH 12/14] grp: get rid of cache for perfect group data The whole data is only about 4.5 MB in RAM. The implemented caching logic was not very clever either (e.g. not using a "last recently used" approach, but rather always throwing away the first 25 loaded PERFGRP entries). --- grp/perf.gd | 1 - grp/perf.grp | 22 ++-------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/grp/perf.gd b/grp/perf.gd index 1e99e29954..5cb36bc586 100644 --- a/grp/perf.gd +++ b/grp/perf.gd @@ -11,7 +11,6 @@ PERFRec := fail; # indicator that perf0.grp is not loaded -PERFSELECT := []; PERFGRP := []; diff --git a/grp/perf.grp b/grp/perf.grp index bc3a1a2b74..af5e5e0f11 100644 --- a/grp/perf.grp +++ b/grp/perf.grp @@ -14,7 +14,7 @@ #F PerfGrpLoad() force loading of secondary files, return index ## InstallGlobalFunction( PerfGrpLoad, function(sz) -local p,sel,i,pos; +local p,pos; if PERFRec=fail then ReadGrp("perf0.grp"); fi; @@ -23,30 +23,12 @@ local p,sel,i,pos; if pos=fail then return fail; fi; - if PERFSELECT[pos] then + if IsBound(PERFGRP[pos]) then return pos; fi; # get the file number p:=PositionSorted(PERFRec.covered,pos); - if SizeBlist(PERFSELECT)>50 then - # throw away old to free memory - sel:=Filtered([1..PERFRec.length],i->PERFSELECT[i]); - sel:=sel{[1..Length(sel)-25]}; - for i in sel do - Unbind(PERFGRP[i]); - PERFSELECT[i]:=false; - od; - fi; ReadGrp(Concatenation("perf",String(p),".grp")); - # store loaded info - if p=1 then - p:=[0,PERFRec.covered[p]]; - else - p:=PERFRec.covered{[p-1,p]}; - fi; - for i in [p[1]+1..p[2]] do - PERFSELECT[i]:=true; - od; return pos; end ); From 30227dc5d244385c0d5ee69e16bada9c5e770a51 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 9 Jan 2017 14:56:28 +0100 Subject: [PATCH 13/14] grp: set invariant form for Sp(2n,Integers mod 2^k) --- grp/glzmodmz.gi | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/grp/glzmodmz.gi b/grp/glzmodmz.gi index 7370c4ce5e..4e835516be 100644 --- a/grp/glzmodmz.gi +++ b/grp/glzmodmz.gi @@ -127,7 +127,7 @@ local f,M2,o,e,MM,i; end); BindGlobal("SPRingGeneric",function(n,ring) -local t,geni,m,slmats,gens,f,rels,i,j,k,l,mat,mat1,mats,id,nh; +local t,geni,m,slmats,gens,f,rels,i,j,k,l,mat,mat1,mats,id,nh,g; nh:=n; n:=2*n; t:=function(i,j) @@ -136,7 +136,7 @@ local t,geni,m,slmats,gens,f,rels,i,j,k,l,mat,mat1,mats,id,nh; geni:=List([1..n],x->[]); mats:=[]; slmats:=[]; - id:=IdentityMat(n,One(ring)); + id:=IdentityMat(n,ring); m:=0; for i in [1..nh] do #t_{i,n+i} @@ -170,7 +170,10 @@ local t,geni,m,slmats,gens,f,rels,i,j,k,l,mat,mat1,mats,id,nh; od; od; - return Group(slmats); + g := Group(slmats); + mat := Concatenation(id{[nh+1..n]},-id{[1..nh]}); + SetInvariantBilinearForm(g,rec(matrix:=mat)); + return g; end); InstallGlobalFunction("ConstructFormPreservingGroup",function(arg) From 3a85e11e0ae837e0b9f094e609b3c9543a199352 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 9 Jan 2017 14:58:42 +0100 Subject: [PATCH 14/14] tests: construct more Sp & SO over ZmodnZ, check forms --- tst/testinstall/grp/glzmodmz.tst | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tst/testinstall/grp/glzmodmz.tst b/tst/testinstall/grp/glzmodmz.tst index dd980eae80..a47ac2323c 100644 --- a/tst/testinstall/grp/glzmodmz.tst +++ b/tst/testinstall/grp/glzmodmz.tst @@ -1,5 +1,33 @@ gap> START_TEST("glzmodmz.tst"); +# +gap> CheckGeneratorsInvertible := function(G) +> return ForAll(GeneratorsOfGroup(G), +> g -> not IsZero(Determinant(g))); +> end;; +gap> CheckGeneratorsSpecial := function(G) +> return ForAll(GeneratorsOfGroup(G), +> g -> IsOne(Determinant(g))); +> end;; +gap> CheckBilinearForm := function(G) +> local M; +> M := InvariantBilinearForm(G).matrix; +> return ForAll(GeneratorsOfGroup(G), +> g -> g*M*TransposedMat(g) = M); +> end;; +gap> frob := function(g,aut) +> return List(g,row->List(row,x->x^aut)); +> end;; +gap> CheckSesquilinearForm := function(G) +> local M, F, aut; +> M := InvariantSesquilinearForm(G).matrix; +> F := FieldOfMatrixGroup(G); +> aut := FrobeniusAutomorphism(F); +> aut := aut^(DegreeOverPrimeField(F)/2); +> return ForAll(GeneratorsOfGroup(G), +> g -> g*M*TransposedMat(frob(g,aut)) = M); +> end;; + # gap> SizeOfGLdZmodmZ(2,2); 6 @@ -12,10 +40,16 @@ Error, GL(2,Integers mod 1) is not a well-defined group, resp. not supported. # gap> G:=GL(4,Integers mod 4); GL(4,Z/4Z) +gap> CheckGeneratorsInvertible(G); +true gap> H:=SL(4,Integers mod 4); SL(4,Z/4Z) +gap> CheckGeneratorsSpecial(H); +true gap> K:=Sp(4,Integers mod 4); Sp(4,Z/4Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true # gap> NrMovedPoints(Image(NiceMonomorphism(G : cheap)));; @@ -34,5 +68,43 @@ gap> Size(G); Size(H); Size(K); 660602880 737280 +# +gap> K:=Sp(4,Integers mod 9); +Sp(4,Z/9Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true +gap> K:=Sp(6,Integers mod 16); +Sp(6,Z/16Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true + +# +gap> K:=GO(3,Integers mod 9); +GO(3,Z/9Z) +gap> CheckGeneratorsInvertible(K) and CheckBilinearForm(K); +true +gap> K:=GO(+1,4,Integers mod 9); +GO(1,4,Z/9Z) +gap> CheckGeneratorsInvertible(K) and CheckBilinearForm(K); +true +gap> K:=GO(-1,4,Integers mod 9); +GO(-1,4,Z/9Z) +gap> CheckGeneratorsInvertible(K) and CheckBilinearForm(K); +true + +# +gap> K:=SO(3,Integers mod 9); +SO(3,Z/9Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true +gap> K:=SO(+1,4,Integers mod 9); +SO(1,4,Z/9Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true +gap> K:=SO(-1,4,Integers mod 9); +SO(-1,4,Z/9Z) +gap> CheckGeneratorsSpecial(K) and CheckBilinearForm(K); +true + # gap> STOP_TEST("glzmodmz.tst", 10000);