[GAP Forum] Is it possible to step through the program, like GNU GDB debugger, against built-in functions(ex. DerivedSubgroup, ClosureSubgroupNC )?

buynnnmmm1 at yahoo.co.jp buynnnmmm1 at yahoo.co.jp
Thu Sep 18 02:47:06 BST 2014


Dear Alexander Konovalov,

Thank you very much for  your description with some execution examples!

I tried to run Copy and paste the example of you.It's very interesting.

I have not read the document you taught me yet, but I understand the point.
I think that is similar to polymorphism of object-oriented programming languages.

I was easier to read the document and source codes thanks to your explanation. 
Thank you very much.


With best regards
buynnnmmm1


----- Original Message -----
> From: Alexander Konovalov <alexk at mcs.st-andrews.ac.uk>
> To: buynnnmmm1 at yahoo.co.jp
> Cc: GAP Forum <forum at gap-system.org>
> Date: 2014/9/18, Thu 06:19
> Subject: Re: [GAP Forum] Is it possible to step through the program, like GNU GDB debugger, against built-in functions(ex. DerivedSubgroup, ClosureSubgroupNC )?
> 
> 
> On 17 Sep 2014, at 14:51, buynnnmmm1 at yahoo.co.jp wrote:
> 
>>  Dear Alexander Konovalov,
>> 
>>  Thank you very much for your help.
>> 
>>>  Not really - the method for IsSolvable did not evolve from the code 
> similar to 
>>>  myIsSolvable at all.
>>> 
>>>  Perhaps the key is to read about GAP method selection and learn the 
> concept of 
>>>  methods as bundles of functions:
>>> 
>>>  http://www.gap-system.org/Manuals/doc/tut/chap8.html#X7AEED9AB824CD4DA
>>> 
>>>  - that is, IsSolvable(G) will select the best available method to apply 
> to G, 
>>>  taking into account what's known about G at the moment. With 
> myIsSolvable, 
>>>  you enforce the calculation of DerivedSeries, while some of the methods 
> may need 
>>>  not to know the derived series at all to give an answer. The profile 
> below just 
>>>  illustrates this, since the number of methods involved in the calls to 
> GAP's 
>>>  IsSolvable is much smaller.
>> 
>>  IsSolvable in lib/grp.gi is the same as the method for determining whether 
> or not solvable group I have learned .
>>  I'll try to understand that the method for determining whether or not 
> solvable group I have learned is the same the built-in IsSolvable function.
>>  I think it will be the good study of group theory .
>>  I'll try to be able to understand "Operations and Methods of 
> GAP" with the document, too.
>>  Thank you very much for your help.
>> 
>>  With best regards
>>  buynnnmmm1
> 
> Note also that several lines above there is an immediate method which
> expresses the famous Feit–Thompson theorem stating that any group of 
> odd order is solvable:
> 
> 
> InstallImmediateMethod( IsSolvableGroup, IsGroup and HasSize, 10,
>     function( G )
>     G:= Size( G );
>     if IsInt( G ) and G mod 2 = 1 then
>       return true;
>     fi;
>     TryNextMethod();
>     end );
> 
> 
> The method to which you refer is generic, as its description says - like a
> fallback method that is deemed to work for any group:
> 
> 
> InstallMethod( IsSolvableGroup,
>     "generic method for groups",
>     [ IsGroup ],
>     function ( G )
>     local   S;          # derived series of <G>
> 
>     # compute the derived series of <G>
>     S := DerivedSeriesOfGroup( G );
> 
>     # the group is solvable if the derived series reaches the trivial group
>     return IsTrivial( S[ Length( S ) ] );
>     end );
> 
> 
> You may trace how the method selection works adding the optional argument 
> "full".
> For example, for S(3) the method ``IsSolvableGroup: for permgrp'' will 
> be used
> quite early:
> 
> gap> ApplicableMethod(IsSolvableGroup,[SymmetricGroup(3)],"full");
> #I  Searching Method for IsSolvableGroup with 1 arguments:
> #I  Total: 11 entries
> #I  Method 1: ``IsSolvableGroup: system getter'', value: 2*SUM_FLAGS+21
> #I   - 1st argument needs [ "Tester(IsSolvableGroup)" ]
> #I  Method 2: ``IsSolvableGroup: handled by nice monomorphism: 
> Attribute'', value: 360
> #I   - 1st argument needs [ "IsHandledByNiceMonomorphism", 
>   "Tester(IsHandledByNiceMonomorphism)" ]
> #I  Method 3: ``IsSolvableGroup: for permgrp'', value: 48
> #I  Function Body:
> function ( G )
>     local  pcgs;
>     pcgs := TryPcgsPermGroup( G, false, false, true );
>     if IsPcgs( pcgs )  then
>         SetIndicesEANormalSteps( pcgs, pcgs!.permpcgsNormalSteps );
>         SetIsPcgsElementaryAbelianSeries( pcgs, true );
>         if not HasPcgs( G )  then
>             SetPcgs( G, pcgs );
>         fi;
>         if not HasPcgsElementaryAbelianSeries( G )  then
>             SetPcgsElementaryAbelianSeries( G, pcgs );
>         fi;
>         return true;
>     else
>         return false;
>     fi;
>     return;
> endfunction( G ) ... end
> gap> 
> 
> To give an example of a group for which method selection descends to the 
> fallback method, let's construct a dihedral group of order 16 as a finitely 
> presented group:
> 
> gap> f:=FreeGroup("x","y");
> <free group on the generators [ x, y ]>
> gap> r:=ParseRelators(GeneratorsOfGroup(f),"x^8=y^2=1,yxy=x^-1");
> [ x^8, y^2, (x^-1*y^-1)^2 ]
> gap> G:=f/r;
> <fp group on the generators [ x, y ]>
> 
> Now after some information about other available methods, 
> the last one is precisely the generic method:
> 
> gap> ApplicableMethod(IsSolvableGroup,[G],"full");
> #I  Searching Method for IsSolvableGroup with 1 arguments:
> #I  Total: 11 entries
> #I  Method 1: ``IsSolvableGroup: system getter'', value: 2*SUM_FLAGS+21
> #I   - 1st argument needs [ "Tester(IsSolvableGroup)" ]
> #I  Method 2: ``IsSolvableGroup: handled by nice monomorphism: 
> Attribute'', value: 360
> #I   - 1st argument needs [ "IsHandledByNiceMonomorphism", 
>   "Tester(IsHandledByNiceMonomorphism)" ]
> #I  Method 3: ``IsSolvableGroup: for permgrp'', value: 48
> #I   - 1st argument needs [ "CategoryCollections(IsPerm)" ]
> #I  Method 4: ``IsSolvableGroup: for AffineCrystGroup, via PointGroup'', 
> value: 43
> #I   - 1st argument needs [ "IsAffineCrystGroupOnLeftOrRight", 
>   "Tester(IsAffineCrystGroupOnLeftOrRight)" ]
> #I  Method 5: ``IsSolvableGroup: for rational matrix groups (Polenta)'', 
> value: 40
> #I   - 1st argument needs [ "IsRationalMatrixGroup", 
> "Tester(IsRationalMatrixGroup)" ]
> #I  Method 
> 6: ``IsSolvableGroup: for matrix groups over a finte field (Polenta)'', 
> value: 38
> #I   - 1st argument needs 
> [ 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsNearAdditiveElementWithIn\
> verse)))", 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsAdditiveElement)))", 
> 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsMultiplicativeElement)))\
> ", 
> "CategoryCollections(CategoryCollections(CategoryCollections(IsFFE)))" 
> ]
> #I  Method 7: ``IsSolvableGroup: fallback method to test conditions'', 
> value: 38
> #I   - 1st argument needs 
> [ 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsNearAdditiveElementWithIn\
> verse)))", 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsAdditiveElement)))", 
> 
>   
> "CategoryCollections(CategoryCollections(CategoryCollections(IsMultiplicativeElement)))\
> ", 
> "CategoryCollections(CategoryCollections(CategoryCollections(IsCyclotomic)))" 
> ]
> #I  Method 8: ``IsSolvableGroup'', value: 27
> #I   - 1st argument needs [ "Tester(Size)" ]
> #I  Method 9: ``IsSolvableGroup: for direct products'', value: 26
> #I   - 1st argument needs [ "Tester(DirectProductInfo)" ]
> #I  Method 10: ``IsSolvableGroup: generic method for groups'', value: 25
> #I  Function Body:
> function ( G )
>     local  S;
>     S := DerivedSeriesOfGroup( G );
>     return IsTrivial( S[Length( S )] );
> endfunction( G ) ... end
> 
> However, if you create D_16 as permutation group, ApplicableMethod
> will return the same ``IsSolvableGroup: for permgrp'' as for S(3) 
> above:
> 
> gap> G:=Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ]);
> Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ])
> gap> ApplicableMethod(IsSolvableGroup,[G],"full");
> ...
> #I  Method 3: ``IsSolvableGroup: for permgrp'', value: 48
> #I  Function Body:
> function ( G )
>     local  pcgs;
>     pcgs := TryPcgsPermGroup( G, false, false, true );
> 
> ...
> 
> so as you may see, different methods may be used dependently on how the
> group is represented. Hope that clarifies some more details!
> 
> Alexander
> 



More information about the Forum mailing list